FILE MULTOS-8 USER IOT PROCESSOR TITLE IOT PROCESSOR EDIT NUMBER * * Copyright (C) 1978, 1979 by Computer Methods * 7822 Oakledge Road * Salt Lake City, UT 84121 * Phone 801-942-2300 * * Unauthorized reproduction in whole or in part * by any means whatsoever without written authorization * from Computer Methods is strictly prohibited by law. * FREE 1 FOR PATCHING * *EDIT EQU 797 14 JUL 1978 *SPLIT THE SOURCE FILE INTO SEVERAL SMALLER FILES. *OSB CONTAINS THE CODE FOR THE USER MODE IOT PROCESSOR. * EDIT2 EQU 386 23 Aug 79 *EDIT3 EQU 1 1 DEC 80 * * ADDED CODE TO RETURN TO LINE PRINTER QUEUE TO THE USER * * 7-JAN-81 * ADDED CODE TO PRINTER:CK SUBROUTINE TO ONLY ALLOW THE * LINE PRINTER SPOOLER TO ACCESS THE LINE PRINTER * *379 17 Nov 78 Maintenance *376 4 Nov 78 Added automatic memory size determination * EDIT HISTORY * *EDIT DATE REASON *324 1 OCT 78 MAINTENANCE *327 2 OCT 78 ADDED CAPABILITY TO USE NON-CONTIGUOUS MEMORY *335 3 OCT 78 ADDED PERTEC DKBO SUPPORT *341 3 OCT 78 ADDED 'CAF' TO 'UALONE' *342 4 OCT 78 ADDED DATA PRINTER MODEL V132 SUPPORT *359 5 OCT 78 ADDED USWAPJ SUBROUTINE *366 25 OCT 78 MAINTENANCE *367 1 NOV 78 MAINTENANCE *373 2 NOV 78 MAINTENANCE *374 4 Nov 78 Maintenance *380 23 Nov 78 Maintenance *381 24 Nov 78 Maintenance *382 4 Jan 79 Added '.END' Macro *384 12 Jul 79 Added extended time quantum for compute-bound jobs. *384 19 Aug 79 Added support for 6 terminals. *385 23 Aug 79 Maintenance. TITLE PAGE ZERO * DSEC * PCSV HLT POWER MIGHT FAIL BEFORE TIMESHARING BEGINS JMPI *+1 INTERRUPT SEQUENCE DC INTERRUPT DC POWER:UP POWER UP POINTER * ODT DC EDIT1 FOR ODT USE DC EDIT2 EDIT NUMBERS ESTABLISH IDENTITY DC EDIT3 DC EDIT4 * XR DC 0 AUTO-INDEX REGISTERS XR1 DC 0 XR2 DC 0 XR3 DC 0 XR4 DC 0 USED FOR OUTPUTTING MESSAGES XR5 DC 0 DITTO XR6 DC 0 AIF FLOPPY,.FLOPPY XR7 DC 0 AGO .NO:FLOPPY .FLOPPY ANOP RXQF DC RXQB-1 FLOPPY QUEUE BUFFER FILL POINTER .NO:FLOPPY ANOP * UJOB DC 0 CURRENT JOB * * INITIALIZATION CALLING CODE * INITNOR LDI 1 EXECUTIVE WAS ENTERED NORMALLY INITCHN CID %INITIALIZE JMPI *+1 DC INITIALIZE * * USER INTERRUPT REGISTER STORAGE * UFLSV QUT %*,INITNOR USER FLAGS UPCSV QUT %*,UFLSV+1 USER PC UACSV QUT %*,UPCSV+1 USER AC UMQSV QUT %*,UACSV+1 USER MQ UINST DC 0 USER INSTRUCTION STORED HERE ULOCK DC 0 SET TO -1 BY KM8E AND CLEARED BY KM8RET UTEMP DC 0 GENERAL PURPOSE TEMPORARIES UTEMP2 DC 0 UCNTR DC 0 GENERAL PURPOSE COUNTER UPNTR1 DC 0 GENERAL PURPOSE POINTERS UPNTR2 DC 0 UPNTR3 DC 0 PEND:CIF DC 0 BIT 10=1 INDICATES A PENDING FIELD CHANGE * BITS 6-8 INDICATE THE NEW RELATIVE FIELD JMSFLAG DC 0 0=PROCESSING A 'JMP' INSTRUCTION * -1=PROCESSING A 'JMS' INSTRUCTION * * POINTERS TO FIELD INFORMATION WORDS * UFPNTR DC 0 POINTER TO ONE OF FIELD INFO WORDS UFPNTR2 DC 0 POINTER TO ONE OF FIELD INFO WORDS RSFIELD DC 0 'RECENTLY SWAPPED FIELD' -- POINTS TO FIELD * IO WORD OF MOST RECENTLY SWAPPED FIELD * AIF NO:PTR,.PTR * * PR8-E STATUS REGISTER * RBE DC RB READER BUFFER EMPTY POINTER * .PTR ANOP * AIF NO:PTP,.PTP * * PP8-E STATUS REGISTER * PBF DC PB PUNCH BUFFER FILL POINTER * .PTP ANOP * * LA8-E LINE PRINTER STATUS REGISTER * LBF DC LPB LINE PRINTER BUFFER FILL POINTER * AIF NO:SPOOL,.NO:SPOOL * * SPOOL JOB STATUS REGISTERS * SPLJOB DC 0 SPOOL JOB BUSY FLAG: * BIT(S) MEANING * 0 ABORT PRINTING OF CURRENT SPOOL FILE * 1 UNUSED * 2-5 SPOOL DEVICE NUMBER * 6-8 UNUSED * 9-11 REQUESTING JOB NUMBER SPLQF DC SPLQ SPOOL QUEUE BUFFER FILL POINTER SPLQE DC SPLQ-1 SPOOL QUEUE BUFFER EMPTY POINTER SPLQCTR DC 0 SPOOL QUEUE ENTRY COUNTER LPTCNT DC 0 LINE PRINTER SEQUENCE COUNTER * .NO:SPOOL ANOP * AIF NO:MAGTAPE,.CONT * MTQF DC MTQB MAGTAPE QUEUE BUFFER FILL POINTER * .CONT ANOP * AIF NO:DECTAPE,.DECTAPE * DTQF DC DTQB DECTAPE QUEUE BUFFER FILL POINTER * .DECTAPE ANOP * * NEW INSTRUCTIONS * * CHANGE 'DF' TO USER 'DF' * UUCUDF DC 0 UCUDF HLT WILL BECOME A 'CDF X' JMPI UUCUDF * * CHANGE 'DF' TO USER 'IF' * UUCUIF DC 0 UCUIF HLT WILL BECOME A 'CDF X' JMPI UUCUIF * UPARAM EQU 04400+* GET A UINT JOB PARAMETER UUPARAM * * POINTERS AND MISCELLANEOUS * USUSP DC KM8SUSP POINTER TO USER SUSPEND ROUTINE * UXDISK DC UEXDISK POINTER TO DISK ENQUEUE SUBROUTINE * LOCATIONS USED BY UEXDISK UUFUNC DC 0 FUNCTION WORD UADDR DC 0 CORE ADDRESS UBLOCK DC 0 DISK SECTOR ADDRESS * MCNTR DC 0 MESSAGE CHARACTER COUNTER WAITS DC 0 WAIT BITS AFTER MESSAGE OUTPUT * MEMORY DC (TERMS.LS.6)+2 Used by USPR for memory size * * TEMPORARY STORAGE LOCATIONS USED BY 'URAN' * RAND DC 0 COMPUTED RANDOM NUMBER RMID DC 0 RLOW DC 0 RTEMP DC 0 RTEMP1 DC 0 RTEMP2 DC 0 MOD1 DC 0 MOD2 DC 0 SUBT1 DC 0 SUBT2 DC 0 * CPU:TEM EQU 0175 FOR USE ON PDP-8/I NON-EAE SYSTEMS CPU:AC EQU 0176 CPU:MQ EQU 0177 ISEC 0 ORG 0200 * INITN JMP INITNOR NORMAL ENTRY POINT INITC JMP INITCHN CHAIN ENTRY POINT * INTERRUPT DSI SINT A USER INTERRUPT ? JMP 1F NO JMP KM8E YES, MUST HAVE HIGHEST PRIORITY 1H JMPX NTRRPT SERVICE THE HARDWARE INTERRUPT * * USER PARAMETER POINTER FETCH ROUTINE (ION) * PART UUPARAM HLT CDF %* TAD UJOB ALWAYS USE CURRENT JOB MULT64 TAD =JOB1-USER:ST TADI UUPARAM GET THE PARAMETER INC UUPARAM BUMP RETURN DCA UPNTR1 JMPI UUPARAM TITLE USER INTERRUPT PROCESSOR * PART KM8E DI CINT CLEAR USER INTERRUPT DCA UACSV SAVE HARDWARE REGISTERS GTF AND =06177 STRIP OFF UNUSED HARDWARE FLAGS DCA UFLSV INC ULOCK SET USER INTERRUPT LOCK TAD PCSV GET ADDRESS OF USER INSTRUCTION ION ALLOW INTERRUPTS DCA UPCSV LDI -1 TAD UPCSV DCA UPNTR1 POINT TO CALLING IOT AIF NO:EAE.AN.PDP8I,.CONT SWP DCA UMQSV .CONT ANOP TAD UFLSV GET USER FLAGS AND =070 EXTRACT USER 'IF' TAD =KCDF FORM A 'CDF X' DCA UCUIF .CUIF 'DF' TO USER 'IF' TADI UPNTR1 GET THE USER INSTRUCTION CDF %* DCA UINST SAVE IT DCA PEND:CIF CLEAR PENDING 'CIF' FLAG TAD UINST RTL ROTATE BIT 2 TO BIT 0 SPA CLA IS THE OP CODE 6 OR 7 ? JMP OPCODE7 IT'S AN OPERATE INSTRUCTION TAD UINST GET THE USER INSTRUCTION AND =07704 TAD =-(KCDF-1) SZA CLA IS IT A 'CIF', 'CDF' OR 'CID' INSTRUCTION ? JMP 1F NO LDI 2 AND UINST SZA CLA IS IT A 'CIF' OR A 'CDF' INSTRUCTION ? TAD =UCIF-UCDF A 'CIF' TAD =UCDF JMP 3F * 1H TAD =IOT1-1 POINT TO IOT LIST TABLE DCA XR TAD UINST GET THE USER INSTRUCTION CIA DCA IOTBAD PUT ITS NEGATIVE IN THE IOT LIST TABLE 2H TADI XR GET AN IOT TABLE ENTRY TAD UINST COMPARE WITH USER INSTRUCTION SZA CLA A MATCH ? JMP 2B NO, TRY NEXT ENTRY TAD XR YES, GET THE IOT1 TABLE ADDRESS TAD =IOT2-IOT1 COMPUTE ITS IOT2 TABLE ENTRY DCA UPNTR1 TADI UPNTR1 GET ITS SERVICE SUBROUTINE ADDRESS 3H DCA UPNTR1 JMSI UPNTR1 EXECUTE IT * PART KM8RET SRQ IS AN INTERRUPT REQUEST PENDING ? JMP 1F NO ION YES, ALLOW IT TO BE SERVICED 1H CDF %JTIME IOF SENSITIVE CODE HERE TADI =JTIME SMA CLA IS THE TIME QUANTUM UP ? JMP 2F YES, SUSPEND DCA ULOCK NO, RELEASE THE USER LOCK AIF NO:EAE.AN.PDP8I,.CONT TAD UMQSV GET USER REGISTERS MQL .CONT ANOP TAD UFLSV AIF PDP8I,.I ROOM 7 .I ANOP RTF ION AIF PDP8I,.I AND =UM LOOK AT USER MODE BIT SNA CLA IS IT SET ? IOF NO, DISABLE INTERRUPT SYSTEM .I ANOP TAD UACSV GET THE USER AC ERM JMPI UPCSV RE-START THE CURRENT JOB * 2H CAM CLEAR ALL WAIT BITS * * SUSPEND A JOB WHICH JUST EXECUTED A USER INSTRUCTION * '.SUSPEND' IS AN EFFECTIVE 'JMP KM8SUSP' * PART KM8SUSP SZA Are any device wait bits set ? JMP 3F Yes, don't bother setting extended quantum bit. MQA No, check for logic waits. SNA Are any logic wait bits set ? LDI 1 No, set the extended time quantum bit. MQL New logic wait bits back to MQ. 3H DCA UTEMP STORE DEVICE WAIT BIT(S) (IF ANY) CDF %FLSV AIF PDP8E.OR.EAE,.MQ MQA GET THE MQ DCAI =CPU:MQ .MQ TAD UFLSV IOF DCAI =FLSV TAD UPCSV DCAI =QPCSV TAD UACSV DCAI =ACSV TAD UMQSV DCAI =MQSV DCA ULOCK CLEAR USER LOCK TAD UTEMP GET WAIT BIT(S) JMPX SCHEDULER CALL THE SCHEDULER * * THIS IS THE OP CODE 7 HANDLER. SINCE A USER INTERRUPT * CAUSED THIS, ONLY A GROUP II OPERATE INSTRUCTION IS * POSSIBLE. * OPCODE7 JMS OPCODE72 EXECUTE THE MICROINSTRUCTION JMP KM8RET * * EXECUTE AN OP CODE 7 GROUP II MICROINSTRUCTION * PART OPCODE72 SUB TAD UINST GET USER INSTRUCTION AND =07770 THROW AWAY 'OSR' AND/OR 'HLT' BITS DCA OPCODE7INST PUT IN CODING SEQUENCE TAD UFLSV GET USER FLAGS CLL RAL USER LINK TO MACHINE LINK DCA UFLSV TAD UACSV GET USER AC OPCODE7INST HLT EXECUTE THE INSTRUCTION JMP *+3 TAKES CARE OF SKIP INSTRUCTIONS ISZ UPCSV A SKIP -- BUMP USER PC NOP SAFETY DCA UACSV SAVE NEW USER AC TAD UFLSV RAR DCA UFLSV SAVE NEW USER FLAGS LDI 4 AND UINST LOOK AT 'OSR' BIT SNA CLA IS IT SET ? JMP 3F NO, FORGET IT .PARAM SR TADI UPNTR1 GET THE USER SWITCH REGISTER FLAG SNA CLA WHICH SWITCH REGISTER IS DESIRED ? JMP 1F THE HARDWARE SWITCH REGISTER INC UPNTR1 THE USER SWITCH REGISTER TADI UPNTR1 GET IT MQL TAD UACSV GET USER AC MQOR 'OR' THE USER SWITCH REGISTER JMP 2F 1H TAD UACSV GET USER AC OSR GET THE HARDWARE SWITCH REGISTER 2H DCA UACSV 3H LDI 2 AND UINST LOOK AT 'HLT' BIT SNA CLA IS IT SET ? RET OPCODE72 NO, FORGET IT * * OUTPUT A HALT MESSAGE * OP7HLT LDI -TERMS THIS JOB EXECUTED A 'HLT' INSTRUCTION TAD UJOB SMA SZA CLA IS THIS AN EXECUTIVE TASK ? JMS UIHLT YES, JUST SUSPEND WITH 'HALTW' BIT SET TAD =HALTW+ISUSPW SET 'HALT' AND 'INDEFINITE SUSPEND' WAIT BITS DCA WAITS TAD =HALT HALT MESSAGE ADDRESS * PART MESOUT CDF %* DCA MESPTR SAVE MESSAGE ADDRESS .PARAM OUTIOT TADI UPNTR1 GET OUTPUT IOT MQL INC UPNTR1 BUMP TO MF IOF THINGS GET TOUCHY IN HERE ! TADI UPNTR1 LOOK AT MOTION FLAG SNA CLA WAS THE TTY IN MOTION ? MQA NO, GET ITS OUTPUT IOT ROOM 4 DCA *+1 HLT WILL BE EITHER AN IOT OR ALL ZEROES INC UPNTR1 BUMP TO OBF TADI UPNTR1 GET OBF POINTER AND =07600 SAVE ONLY PAGE BITS DCAI UPNTR1 RESET OBF POINTER LDI 1 TAD UPNTR1 DCA UPNTR2 POINT TO OBE TADI UPNTR1 DCAI UPNTR2 RESET OBE POINTER LDI -1 BACK UP POINTER FOR INDEX TADI UPNTR1 ROOM 4 JMS MESSAGE OUTPUT THE MESSAGE MESPTR DC HALT TAD UFLSV GET USER FLAGS AND =070 EXTRACT USER PHYSICAL 'IF' CLL RAR ROTATE TO BITS 9-11 RTR TAD =FIELD0 DCA UFPNTR CDF %FIELD2 TADI UFPNTR GET THE FIELD INFO WORD AND =070 EXTRACT USER DATA FIELD NUMBER CLL RAR RTR TAD ='0.AN.0177 ADD ASCII BIAS DCAI XR5 INSTRUCTION FIELD DIGIT SENT TAD UFLSV GET USER FLAGS AND =07 EXTRACT USER PHYSICAL 'DF' TAD =FIELD0 DCA UFPNTR TADI UFPNTR GET FIELD INFO WORD AND =070 EXTRACT USER DATA FIELD NUMBER CLL RAR RTR TAD ='0.AN.0177 ADD ASCII BIAS DCAI XR5 DATA FIELD DIGIT SENT TAD =' .AN.0177 DCAI XR5 OUTPUT A SPACE TAD =-4 DCA UCNTR SET PC DIGIT COUNTER LDI -1 BACK UP USER PC TO ERROR CAUSING INSTRUCTION TAD UPCSV GET USER PC CLL RAL SKP 4H TAD UTEMP GET SHIFTED USER PC RAL RTL DCA UTEMP TAD UTEMP AND =07 TAD ='0.AN.0177 DCAI XR5 SEND A USER PC DIGIT ISZ UCNTR FINISHED OUTPUTTING 3 PC DIGITS ? JMP 4B NO TAD =CR DCAI XR5 TAD =LF DCAI XR5 CDF %TABLES TAD MCNTR GET THE MESSAGE COUNT TAD =9-128 COUNT THE CHARACTERS: E.G. '34 0123' + CR/LF INC UPNTR2 POINT TO OBC DCAI UPNTR2 BUFFER COUNT SET LDI 1 TAD XR5 COMPUTE NEW BUFFER ADDRESS DCAI UPNTR1 SET OBF TAD WAITS SET LOGIC WAIT BITS (IF ANY) MQL .SUSPEND * * OUTPUT A MESSAGE TO THE USER * PART ROOM 6 MESSAGE SUB DCA XR5 SAVE BUFFER ADDRESS CDF %* ALL CALLS ARE IN THIS FIELD TADI MESSAGE GET MESSAGE ADDRESS INC MESSAGE BUMP RETURN DCA XR4 DCA MCNTR CLEAR MESSAGE CHARACTER COUNTER 1H TADI XR4 GET A WORD OF THE MESSAGE MQL MQA RAR6 LEFT BYTE TO RIGHT BYTE JMS SEP SEND A CHARACTER MQA JMS SEP DITTO JMP 1B * * SEPARATE A SINGLE CHARACTER AND TRANSMIT IT * PART SEP SUB AND =077 SNA END OF MESSAGE ? RET MESSAGE YES TAD =-('_.AN.077) CDF %BUFFERS SNA OUTPUT A CR/LF COMBO ? JMP 2F YES TAD =('_.AN.077)-(' .AN.077) SPA ALPHABETIC OR NUMERIC ? TAD =0100 ALPHABETIC TAD =040 1H DCAI XR5 TRANSMIT THE CHARACTER TO BUFFER CDF %* INC MCNTR COUNT THE CHARACTER RET SEP * 2H TAD =CR SEND A CR/LF COMBO DCAI XR5 INC MCNTR COUNT THE CHARACTER TAD =LF JMP 1B TITLE IOT SIMULATIONS FOR 'SGT' AND 'CAF' * PART AIF NO:EAE.OR.PDP8I,.EAE * * 'SGT' SIMULATION - IOT 6006 * USGT SUB SKIP ON 'GREATER THAN' FLAG LDI 02000 AND UFLSV ROOM 6 SZA CLA WAS USER 'GT' FLAG SET ? ISZ UPCSV YES, BUMP USER PC RET USGT RET USGT SAFETY * .EAE ANOP * * 'CAF' SIMULATION - IOT 6007 * UCAF SUB CLEAR ALL FLAGS TAD =0177 CLEAR LINK, GT FLAG, AND AC AND UFLSV DCA UFLSV DCA UACSV AIF NO:EAE.OR.PDP8I,.EAE SWBA SET EAE TO MODE A .EAE ANOP JMS RELEASE RELEASE ALL ASSIGNABLE DEVICES RET UCAF AIF NO:PTR,.PTR TITLE IOT SIMULATIONS FOR PC8E PAPER TAPE READER * PART * * 'RSF' SIMULATION - IOT 6011 * URSF SUB SKIP ON READER FLAG ROOM 4 JMS READER:CK IS THE READER ASSIGNED TO THIS JOB ? ERM RET URSF NO, TREAT AS A 'NOP' TADI RBE LOOK IN THE READER BUFFER ROOM 4 SZA CLA ANYTHING THERE ? ISZ UPCSV YES, BUMP USER PC ERM RET URSF RET URSF SAFETY * * READER CHECK SUBROUTINE * CHECK READER ASSIGNMENT. IF READER IS AVAILABLE, * IT IS ASSIGNED TO THIS JOB. * PART ROOM 13 READER:CK SUB CDF %READER TADI =READER SNA IS READER ASSIGNED ? JMP 2F NO, ASSIGN IT TO THIS JOB TAD UJOB YES SNA CLA IS READER ASSIGNED TO THIS JOB ? ERM 1H INC READER:CK YES, BUMP RETURN POINTER RET READER:CK * 2H TAD UJOB ASSIGN READER TO THIS JOB CIA DCAI =READER JMP 1B * * 'RRB' SIMULATION - IOT 6012 * PART URRB SUB READ READER BUFFER ROOM 4 JMS READER:CK IS THE READER ASSIGNED TO THIS JOB ? RET URRB NO, TREAT AS A 'NOP' TADI RBE CHECK THE BUFFER SNA ANYTHING IN THE BUFFER ? RET URRB NO, TREAT AS A 'NOP' CLL RAL YES, STRIP OFF 'NON-ZERO' FLAG CLL RAR MQL TAD UACSV GET USER AC MQOR BRING UP THE READER CHARACTER DCA UACSV NEW USER AC RET URRB * * 'RFC' SIMULATION - IOT 6014 * PART URFC SUB FETCH READER CHARACTER ROOM 4 JMS READER:CK IS READER ASSIGNED TO THIS JOB ? RET URFC NO, TREAT AS A 'NOP' IOF NO INTERRUPTS TAD RBE RESET THE BUFFER POINTERS CDF %RBF DCAI =RBF TAD =-128 MQL MQA DCAI =RCNTR TAD =RB-1 .CLEAR CLEAR THE READER BUFFER IOT PR8,RFC START THE HARDWARE RET URFC * * 'RRC' SIMULATION - IOT 6016 * PART URRC SUB READ READER CHARACTER ROOM 4 JMS READER:CK IS READER ASSIGNED TO THIS JOB ? RET URRC NO, TREAT AS A 'NOP' TADI RBE GET A CHARACTER FROM THE READER BUFFER SNA ANYTHING THERE ? RET URRC NO CLL RAL YES, STRIP OFF 'NON-ZERO' FLAG CLL RAR MQL DCAI RBE CLEAR BUFFER POSITION TAD UACSV MQOR DCA UACSV NEW USER AC LDI 1 UPDATE THE READER BUFFER EMPTY POINTER TAD RBE AND =0177 TAD =RB DCA RBE TADI =RCNTR GET THE BUFFER COUNT SNA WAS THE BUFFER PREVIOUSLY FULL ? IOT PR8,RFC YES, RESTART THE READER TAD =-1 BACK UP THE BUFFER COUNT DCAI =RCNTR RET URRC * .PTR ANOP AIF NO:PTP,.PTP TITLE IOT SIMULATION FOR PAPER TAPE PUNCH * * 'PSF' SIMULATION - IOT 6021 * PART UPSF SUB SKIP ON PUNCH FLAG ROOM 4 JMS PUNCH:CK IS PUNCH ASSIGNED TO THIS JOB ? RET UPSF NO, TREAT AS A 'NOP' JMS UTSF JUST AN UNCONDITIONAL SKIP RET UPSF * * PUNCH CHECK SUBROUTINE * CHECK PUNCH ASSIGNMENT. IF PUNCH IS * AVAILABLE, IT IS ASSIGNED TO THIS JOB. * PART ROOM 13 PUNCH:CK SUB CDF %PUNCH TADI =PUNCH SNA IS PUNCH ASSIGNED ? JMP 2F NO, ASSIGN IT TO THIS JOB TAD UJOB YES SNA CLA IS IT ASSIGNED TO THIS JOB ? ERM 1H INC PUNCH:CK YES, BUMP RETURN POINTER RET PUNCH:CK * 2H TAD UJOB ASSIGN PUNCH TO THIS JOB CIA DCAI =PUNCH JMP 1B * * 'PPC' SIMULATION - IOT 6024 * 'PLS' SIMULATION - IOT 6026 * PART UPLS SUB PUNCH LOAD SEQUENCE ROOM 4 JMS PUNCH:CK IS PUNCH ASSIGNED TO THIS JOB ? RET UPLS NO, TREAT AS A 'NOP' IOF SENSITIVE CODE HERE TADI =PMF GET PUNCH MOTION FLAG SZA CLA IS PUNCH IN MOTION ? JMP UPLS2 YES TAD UACSV GET USER AC SNA IS CHARACTER ZERO ? LDI 04000 YES, MAKE IT NON-ZERO IOT PP8,LS PUNCH THE CHARACTER DCAI =PMF AND SET MOTION FLAG RET UPLS * UPLS2 TAD UACSV GET THE CHARACTER TO BE PUNCHED SNA IS IT ZERO ? LDI 04000 YES, MAKE IT NON-ZERO DCAI PBF STORE CHARACTER IN PUNCH BUFFER LDI 1 UPDATE PUNCH BUFFER FILL POINTER TAD PBF AND =0177 TAD =PB DCA PBF ISZI =PCNTR PUNCH BUFFER FULL ? RET UPLS NO MQL CLEAR LOGIC WAIT BITS LDI PUNW SET PUNCH WAIT BIT .SUSPEND * .PTP ANOP TITLE IOT SIMULATIONS FOR TTY KEYBOARD * * 'KSF' SIMULATION - IOT 6031 * PART UKSF SUB SKIP ON KEYBOARD FLAG JMS UKIN LOOK IN THE INPUT BUFFER SNA CLA ANYTHING THERE ? JMP UKSF2 NO ISZ UPCSV YES, BUMP USER PC RET UKSF RET UKSF SAFETY * UKSF2 LDI -1 SEE IF NEXT USER INST IS 'JMP *-1' TAD UPCSV AND =0177 KEEP ONLY RELATIVE PAGE BITS TAD =05200 'JMP CURRENT PAGE' CIA NEGATE .CUIF 'DF' TO USER 'IF' TADI UPCSV ADD IN NEXT USER INSTRUCTION SZA CLA WAS IT 'JMP *-1' ? RET UKSF NO, CONTINUE PROGRAM EXECUTION ISZ UPCSV YES, DON'T EXECUTE THAT IOT AGAIN ! NOP MQL CLEAR LOGIC WAIT BITS TAD =KEYW SET KEYBOARD WAIT .SUSPEND * * 'KCC' SIMULATION - IOT 6032 * UKCC SUB CLEAR AC AND KEYBOARD FLAG DCA UACSV CLEAR USER AC JMS UKIN LOOK IN THE INPUT BUFFER SZA CLA ANYTHING THERE ? JMS UKBUMP YES, THROW IT AWAY AND BUMP POINTER RET UKCC * * 'KRS' SIMULATION - IOT 6034 * PART UKRS SUB READ KEYBOARD STATIC JMS UKIN LOOK IN THE INPUT BUFFER SNA ANYTHING THERE ? RET UKRS NO, FORGET IT CLL RAL YES, STRIP THE 'NON-ZERO' FLAG CLL RAR MQL TAD UACSV GET USER AC MQOR 'OR' IN KEYBOARD CHARACTER DCA UACSV NEW USER AC RET UKRS * * 'KRB' SIMULATION - IOT 6036 * PART UKRB SUB READ KEYBOARD DYNAMIC JMS UKIN LOOK IN THE INPUT BUFFER SNA ANYTHING THERE ? JMP UKRB2 NO CLL RAL YES, DELETE NON-ZERO FLAG CLL RAR DCA UACSV LOAD USER AC JMS UKBUMP BUMP THE INPUT BUFFER EMPTY POINTER RET UKRB * UKRB2 LDI -1 BACK UP USER PC TO CATCH THIS IOT NEXT TIME TAD UPCSV DCA UPCSV MQL CLEAR LOGIC WAIT BITS TAD =KEYW SET KEYBOARD WAIT FLAG .SUSPEND * * KEYBOARD SUBROUTINE TO LOOK INTO THE INPUT BUFFER * PART UKIN SUB .PARAM IBE GET INPUT BUFFER EMPTY POINTER TADI UPNTR1 DCA UPNTR2 CDF %BUFFERS TADI UPNTR2 LOOK IN THE BUFFER RET UKIN * * KEYBOARD SUBROUTINE TO BUMP THE INPUT BUFFER POINTER * PART UKBUMP SUB DCAI UPNTR2 THROW AWAY THE LAST CHARACTER READ CDF %TABLES TADI UPNTR1 GET THE INPUT BUFFER EMPTY POINTER AND =07740 UPDATE IT MQL LDI 1 TADI UPNTR1 AND =037 MQA DCAI UPNTR1 STORE NEW INPUT BUFFER EMPTY POINTER RET UKBUMP TITLE IOT SIMULATIONS FOR TTY PRINTER * * 'TSF' SIMULATION - IOT 6041 * PART UTSF SUB SKIP ON TTY FLAG LDI -1 TAD UPCSV DCA UPNTR1 TAD =KSKP CHANGE 'TSF' TO 'SKP' .CUIF DCAI UPNTR1 ISZ UPCSV UNCONDITIONAL SKIP RET UTSF RET UTSF SAFETY * * 'TPC' SIMULATION - IOT 6044 * 'TLS' SIMULATION - IOT 6046 * PART UTLS SUB TTY LOAD SEQUENCE .PARAM MF GET MOTION FLAG POINTER IOF SENSITIVE CODE HERE TADI UPNTR1 GET MOTION FLAG SZA CLA IS TTY IN MOTION ? JMP UTLS2 YES, PUT CHARACTER IN OUTPUT BUFFER LDI OUTIOT-MF TAD UPNTR1 DCA UPNTR2 TADI UPNTR2 GET OUTPUT IOT DCA 1F TAD UACSV GET USER CHARACTER TO PRINT SNA ANYTHING THERE ? LDI 04000 NO, JUST SET NON-ZERO FLAG 1H HLT PRINT IT AND DCAI UPNTR1 SET MOTION FLAG RET UTLS * UTLS2 INC UPNTR1 2H TADI UPNTR1 GET OBF POINTER DCA UPNTR2 SAVE IT CDF %BUFFERS TAD UACSV GET USER AC SNA IS IT ZERO ? LDI 04000 YES, MAKE IT NON-ZERO DCAI UPNTR2 STORE CHARACTER IN OUTPUT BUFFER CDF %TABLES TAD UPNTR2 UPDATE THE OUTPUT BUFFER POINTER AND =07600 MQL LDI 1 TAD UPNTR2 AND =0177 MQA DCAI UPNTR1 STORE THE NEW POINTER INC UPNTR1 BUMP TO OBE INC UPNTR1 BUMP TO OBC ISZI UPNTR1 IS THE BUFFER FULL ? RET UTLS NO MQL CLEAR LOGIC WAIT BITS LDI TTYW YES, SET TTY OUTPUT WAIT BIT .SUSPEND AND SUSPEND TITLE EXECUTIVE REQUESTS * * 'TSS' SIMULATION - IOT 6107 * UTSSS EQU UTSF SKIP IF TIMESHARING (UNCONDITIONAL SKIP) TITLE FILE STRUCTURED DEVICE HANDLERS * * 'FSD' SIMULATION - IOT 6110 * PART UFSD SUB FILE STRUCTURED DEVICE HANDLER IOT CAL DCA UACSV CLEAR USER AC .CUIF 'DF' TO USER 'IF' TADI UPCSV GET DEVICE NUMBER AND =017 INSURE IT IS A DEVICE NUMBER SNA WAS A DEVICE SPECIFIED ? JMP UFSD3 NO, TAKE ERROR EXIT DCA UTEMP SAVE DEVICE NUMBER TAD UTEMP TAD =DEV:TAB-1 DCA UPNTR1 ISZ UPCSV POINT TO POINTER TO CALLING ADDRESS NOP TADI UPCSV GET POINTER TO CALLING ADDRESS DCA UPCSV TAD UFLSV GET USER FLAGS MQL MQA AND =070 EXTRACT USER PHYSICAL 'IF' CLL RAR COMPUTE FIELD INFO WORD ADDRESS RTR TAD =FIELD0 DCA UFPNTR CDF %FIELD2 LDI -(IF+1) REMOVE 'IF' RESIDENCY BIT ANDI UFPNTR DCAI UFPNTR MQA GET USER FLAGS AGAIN AND =07 EXTRACT USER PHYSICAL 'DF' TAD =FIELD0 COMPUTE FIELD INFO WORD ADDRESS DCA UFPNTR LDI IF SET 'IF' RESIDENCY BIT TADI UFPNTR DCAI UFPNTR MQA GET USER FLAGS AND =07 KEEP ONLY USER 'DF' CLL RAL RTL MQL MQA GET THE CALLING FIELD TAD =KCDF FORM A 'CDF' INST DCA UCUIF TAD UFLSV GET USER FLAGS AND =07707 THROW AWAY 'IF' MQA 'OR' IN CALLING FIELD TO BE NEW 'IF' DCA UFLSV NEW USER FLAGS CDF %TABLES TADI UPNTR1 LOOK IN VALID DEVICE TABLE SZA IS A DEVICE HANDLER AVAILABLE ? JMP UFSD5 YES UFSD3 LDI 3 BUMP USER PC TO ERROR RETURN SKP UFSD4 LDI -1 AND TAKE ERROR RETURN TAD UPCSV DCA UPCSV LDI 04000 DCA UACSV RET UFSD * UFSD5 DCA UPNTR1 SAVE HANDLER ADDRESS .CUIF 'DF' TO CALLING 'IF' TADI UPCSV GET FUNCTION WORD AND =07770 EXTRACT READ/WRITE, PAGE AND FIELD BITS DCA UUFUNC ISZ UPCSV BUMP TO CORE ADDRESS NOP TADI UPCSV GET CORE ADDRESS DCA UADDR ISZ UPCSV BUMP TO BLOCK NUMBER NOP TADI UPCSV GET USER BLOCK NUMBER DCA UBLOCK LDI 2 TAD UPCSV DCA UPCSV USER PC POINTING TO NORMAL RETURN CDF %* JMPI UPNTR1 JUMP TO DEVICE HANDLER ROUTINE * AIF NO:DECTAPE,.DECTAPE TITLE DECTAPE HANDLER * * DEVICE HANDLERS FOR DTA0 - DTA7 * DTA7 INC UUFUNC DTA7 ENTRY DTA6 INC UUFUNC DTA6 ENTRY DTA5 INC UUFUNC DTA5 ENTRY DTA4 INC UUFUNC DTA4 ENTRY DTA3 INC UUFUNC DTA3 ENTRY DTA2 INC UUFUNC DTA2 ENTRY DTA1 INC UUFUNC DTA1 ENTRY DTA0 TAD UBLOCK DTA0 ENTRY TAD =-737 SMA CLA IS IT A LEGAL DECTAPE BLOCK NUMBER ? JMP UFSD4 NO, TAKE ERROR EXIT * AIF TD8E,.TD8E * UTC08 HLT TC08 DECTAPE HANDLER * AGO .DECTAPE * .TD8E ANOP * UTD8E TAD UUFUNC GET THE FUNCTION WORD SMA CLA READ OR WRITE ? JMP 2F READ CDF %* TAD UUFUNC GET THE FUNCTION WORD AND =07 EXTRACT THE DECTAPE UNIT NUMBER TAD =DT:A0 DCA UPNTR1 TADI UPNTR1 GET JOB ASSIGNMENT FOR THIS DRIVE SZA IS THE DRIVE ASSIGNED ? TAD UJOB YES SZA CLA IS IT ALREADY ASSIGNED TO THIS JOB ? JMP UFSD4 NO, TAKE ERROR RETURN TAD UJOB ASSIGN/REASSIGN THE DRIVE TO THIS JOB CIA DCAI UPNTR1 2H TAD UJOB GET THE JOB NUMBER CDF %DTQB DCAI DTQF PUT THE REQUEST ON THE DECTAPE QUEUE INC DTQF BUMP THE POINTER TAD UUFUNC DCAI DTQF INC DTQF TAD UADDR DCAI DTQF INC DTQF TAD UBLOCK CONVERT OS/8 BLOCK TO DECTAPE LOGICAL BLOCK CLL RAL DCAI DTQF LDI 1 UPDATE THE DECTAPE QUEUE FILL POINTER TAD DTQF AND =017 TAD =DTQB DCA DTQF IOF SENSITIVE CODE HERE ! TADI =DTJOB SZA CLA IS THE DECTAPE CURRENTLY BUSY ? JMP 3F YES LDI -1 NO, SET THE TD8E DECTAPE INTERRUPT FLAG DCAI =DTFLAG 3H .FINDM SNA CLA ANY MEMORY AVAILABLE ? LDI NRESW NO, SWAP OUT THE JOB MQL SET/CLEAR LOGIC WAIT BITS LDI DTAW SET DECTAPE WAIT BIT .SUSPEND * .DECTAPE ANOP * AIF NO:RKO5,.RKO5 TITLE RK05 DISK HANDLER * * DEVICE HANDLERS FOR RK05 DRIVES 1-3 * PART RKB3 INC UUFUNC RKB3 ENTRY POINT RKA3 INC UUFUNC RKA3 ENTRY POINT RKB2 INC UUFUNC RKB2 ENTRY POINT RKA2 INC UUFUNC RKA2 ENTRY POINT RKB1 INC UUFUNC RKB1 ENTRY POINT RKA1 INC UUFUNC RKA1 ENTRY POINT INC UUFUNC DRIVE NUMBER IS IN BITS 9-10 LDI 0100 BUMP THE PAGE COUNT BY 1 TAD UUFUNC ADD IN THE FUNCTION WORD AND =03600 EXTRACT PAGE COUNT SNA AN ENTIRE FIELD ? LDI 04000 YES, SET PAGES TO 40(8) RAR6 CONVERT TO A BLOCK COUNT CLL RAR TAD UBLOCK TAD =-(RK:BIAS+1) SZL CLA OVERFLOW INTO NEXT LOGICAL DEVICE ? JMP UFSD4 YES, TAKE ERROR RETURN AIF SYS:DISK.NE.PERTEC,.CONT TAD UBLOCK GET THE BLOCK NUMBER TAD =06240 ADD CUC OS/8 OFFSET DCA UBLOCK TAD UUFUNC GET THE FUNCTION WORD AND =07772 REMOVE ALL BUT HIGH ORDER HEAD BIT DCA UUFUNC .CONT TAD =077 SET SEARCH MASK MQL TAD UUFUNC GET THE FUNCTION WORD AND =070 EXTRACT USER RELATIVE TRANSFER FIELD TAD UJOB ADD THE JOB NUMBER .FINDF SNA IS THE FIELD RESIDENT ? JMP RKNRES NO DCA UFPNTR YES, SAVE ADDRESS OF FIELD INFO WORD RKRES TAD UFPNTR TAD =-FIELD0 COMPUTE THE PHYSICAL FIELD CLL RAL RTL MQL TAD UUFUNC GET THE FUNCTION WORD AND =07707 REMOVE USER RELATIVE FIELD MQA BRING UP PHYSICAL FIELD DCA UUFUNC TAD UUFUNC GET THE FUNCTION WORD SMA A READ OR WRITE REQUEST ? JMP 1F READ -- DON'T ASSIGN THE DEVICE AND =07 EXTRACT LOGICAL DEVICE NUMBER TAD =RK:A1-2 FORM POINTER TO DEVICE ASSIGNMENT DCA UPNTR1 SAVE IT TADI UPNTR1 SZA IS THE DEVICE ASSIGNED ? TAD UJOB YES SZA CLA TO THIS JOB ? JMP UFSD4 NO, TREAT AS AN ERROR TAD UJOB GET THE CURRENT JOB NUMBER CIA DCAI UPNTR1 ASSIGN THIS DEVICE TO THIS JOB TAD UUFUNC GET THE FUNCTION WORD 1H CLL RAR SNL IS THE HIGH ORDER BIT SET ? JMP 2F NO CLL RAL CLEAR HIGH ORDER DISK ADDRESS BIT DCA UUFUNC TAD UBLOCK GET THE BLOCK NUMBER TAD =RK:BIAS ADD THE DISK OFFSET AIF SYS:DISK.NE.PERTEC,.CONT TAD =-020 ADD PERTEC DKB0 OFFSET .CONT DCA UBLOCK LOW ORDER PHYSICAL BLOCK COMPUTED SZL SET HIGH ORDER DISK ADDRESS BIT ? INC UUFUNC YES 2H CAL .EXDISK QUEUE THE DISK REQUEST MQL CLEAR LOGIC WAIT BITS .SUSPEND * RKNRES .FINDM SZA IS ANY MEMORY AVAILABLE ? JMP 3F YES TAD =06007 NO, SET FIELD SEARCH MASK MQL TAD UJOB FIND A FIELD OTHER THAN USER'S CALLING FIELD .FINDF SNA IS ONE RESIDENT ? JMP 4F NO DCA UFPNTR YES, SAVE IT'S FIELD INFO WORD ADDRESS LDI 04000 WRITE IT TO SWAP TRACKS .SWAPF SKP 3H DCA UFPNTR SAVE ADDRESS OF FIELD INFO WORD TAD UUFUNC GET THE FUNCTION WORD AND =070 EXTRACT USER RELATIVE TRANSFER FIELD TAD UJOB CDF %FIELD2 DCAI UFPNTR CLAIM OWNERSHIP .SWAPF JMS UJMS,RKRES,UCUIF,UFPNTR,UUFUNC,UADDR,UBLOCK,0 * 4H LDI NRESW JUST SWAP OUT THE JOB JMS UJMS,RKNRES,UCUIF,UUFUNC,UADDR,UBLOCK,0 * .RKO5 ANOP TITLE SYSTEM DEVICE HANDLER * * DEVICE HANDLER FOR SYS * PART SYS LDI 0100 BUMP PAGE COUNT BY 1 TAD UUFUNC ADD THE FUNCTION WORD AND =03600 EXTRACT PAGE COUNT (EXCEPT L O BIT) SNA A FULL FIELD TRANSFER ? LDI 04000 YES RAR6 CONVERT TO A BLOCK COUNT CLL RAR TAD UBLOCK ADD THE REQUESTED BLOCK NUMBER TAD =-(SWAP+1) SZL CLA IS IT WITHIN THE SYSTEM DEVICE AREA ? JMP UFSD4 NO, AN ERROR TAD =077 SET SEARCH MASK MQL TAD UUFUNC GET THE FUNCTION WORD AND =070 EXTRACT THE USER RELATIVE TRANSFER FIELD TAD UJOB ADD THE JOB NUMBER .FINDF SNA IS THE FIELD RESIDENT ? JMP SYSNRES NO DCA UFPNTR YES, SAVE ADDRESS OF FIELD INFO WORD SYSRES TAD UFPNTR COMPUTE PHYSICAL FIELD TAD =-FIELD0 CLL RAL RTL MQL TAD UUFUNC GET THE FUNCTION WORD AGAIN AND =07700 EXTRACT READ/WRITE AND PAGE BITS MQA BRING UP PHYSICAL FIELD DCA UUFUNC TAD UUFUNC GET THE FUNCTION WORD AGAIN SMA CLA IS THIS A WRITE REQUEST ? JMP 0F NO TAD UJOB YES, GET THE JOB NUMBER TAD =JSYS-1 DCA UPNTR1 POINT TO 'J' ASSIGNMENT TABLE TADI UPNTR1 GET THE ASSIGNED JOB NUMBER SZA IS THIS 'J' ASSIGNED ? TAD UJOB YES SZA CLA IS IT ASSIGNED TO THIS JOB ? JMP UFSD4 NO, TREAT AS AN ERROR TAD UJOB ASSIGN/RE-ASSIGN IT TO THIS JOB CIA DCAI UPNTR1 0H TAD UBLOCK TAD =-KBM:DA SNA IS THE KEYBOARD MONITOR REQUESTED ? JMP SYS:OK YES, RELEASE DEVICES TAD =KBM:DA-CD:DA SNA CLA IS THE COMMAND DECODER REQUESTED ? SYS:OK JMS RELEASE RELEASE ALL ASSIGNED DEVICES LDI -TERMS TAD UJOB SPA SNA CLA IS THIS AN EXECUTIVE JOB ? JMP 4F NO .PARAM CURJOB TADI UPNTR1 YES, GET THE ACTUAL JOB NUMBER SKP 4H TAD UJOB TAD =-1 SNA IS IT JOB 1 ? JMP 3F YES CLL CIA FORM -(JOB-1) DCA UCNTR 1H TAD =SWAP COMPUTE START OF JOB SYSTEM DEVICE ISZ UCNTR FINISHED ? JMP 1B NO TAD =JOBS*128 SWAP+(16*(7*TERMS+JOBS)) qqx TAD UBLOCK DCA UBLOCK HARDWARE BLOCK COMPUTED SZL A CARRY BIT ? INC UUFUNC YES, SET H.O. DISK SECTOR ADDRESS BIT 3H CAL .EXDISK ENQUEUE THE DISK REQUEST MQL CLEAR LOGIC WAIT BITS .SUSPEND * SYSNRES .FINDM SZA ANY MEMORY AVAILABLE ? JMP 4F YES TAD =06007 NO, SET FIELD SEARCH MASK MQL TAD UJOB FIND A FIELD OTHER THAN CALLING FIELD .FINDF SNA IS ONE RESIDENT ? JMP 5F NO DCA UFPNTR YES, SAVE ADDRESS OF FIELD INFO WORD LDI 04000 WRITE IT TO SWAP TRACKS .SWAPF SKP 4H DCA UFPNTR SAVE ADDRESS OF FIELD INFO WORD TAD UUFUNC GET THE FUNCTION WORD AND =070 EXTRACT USER RELATIVE TRANSFER FIELD TAD UJOB CDF %FIELD2 DCAI UFPNTR CLAIM OWNERSHIP .SWAPF JMS UJMS,SYSRES,UCUIF,UFPNTR,UUFUNC,UADDR,UBLOCK,0 * 5H LDI NRESW JUST SWAP OUT THE JOB JMS UJMS,SYSNRES,UCUIF,UUFUNC,UADDR,UBLOCK,0 TITLE 'J' DEVICE HANDLERS * * DEVICE HANDLERS FOR J1 - J4 * PART J6 IAC J6 ENTRY J5 IAC J5 ENTRY J4 IAC J4 ENTRY J3 IAC J3 ENTRY J2 IAC J2 ENTRY J1 DCA UTEMP2 J1 ENTRY TAD UBLOCK GET THE REQUESTED BLOCK NUMBER TAD =-SWAP SZL CLA IS IT A VALID BLOCK NUMBER ? JMP UFSD4 NO, TAKE ERROR RETURN LDI 0100 ROUND UP THE PAGE COUNT TAD UUFUNC AND =03600 EXTRACT ONLY THE TOTAL BLOCK COUNT SNA A FULL FIELD TRANSFER ? LDI 04000 YES CLL RAR MOVE TO LSB'S RAR6 TAD UBLOCK GET THE HIGHEST BLOCK NUMBER TAD =-(SWAP+1) SZL CLA IS IT A VALID BLOCK NUMBER ? JMP UFSD4 NO, TAKE ERROR RETURN TAD =077 SET FIELD SEARCH MASK MQL TAD UUFUNC GET THE FUNCTION WORD AND =070 EXTRACT USER RELATIVE TRANSFER FIELD TAD UJOB ADD THE JOB NUMBER .FINDF SNA IS THE FIELD RESIDENT ? JMP JNRES NO DCA UFPNTR YES, SAVE ADDRESS OF FIELD INFO WORD JRES TAD UFPNTR COMPUTE PHYSICAL FIELD TAD =-FIELD0 CLL RAL RTL MQL TAD UUFUNC GET THE FUNCTION WORD AGAIN AND =07700 EXTRACT READ/WRITE AND PAGE BITS MQA BRING UP THE PHYSICAL FIELD DCA UUFUNC TAD UUFUNC GET THE FUNCTION WORD SMA CLA IS THIS A WRITE REQUEST ? JMP 1F NO, DON'T BOTHER WITH ASSIGNMENT TAD =JSYS TAD UTEMP2 ADD OFFSET DCA UPNTR1 POINT TO 'JSYS' ASSIGNMENT TABLE TADI UPNTR1 SZA IS IT CURRENTLY ASSIGNED ? TAD UJOB YES SZA CLA IS IT ASSIGNED TO THIS JOB ? JMP UFSD4 NO, TREAT IT AS AN ERROR TAD UJOB ASSIGN/RE-ASSIGN IT TO THIS JOB CIA DCAI UPNTR1 1H TAD UTEMP2 GET THE 'J' HANDLER NUMBER SNA 'J1' HANDLER ? JMP 3F YES CLL CIA NO, MUST COMPUTE DISK OFFSET DCA UCNTR 2H TAD =SWAP COMPUTE THE DISK OFFSET ISZ UCNTR FINISHED ? JMP 2B NO TAD =JOBS*128 16*(7*TERMS+JOBS) qqx TAD UBLOCK LINK WILL BE CLEAR HERE DCA UBLOCK ABSOLUTE DISK BLOCK COMPUTED SZL SET THE H O DISK ADDRESS BIT ? INC UUFUNC YES 3H .EXDISK QUEUE THE DISK REQUEST MQL CLEAR LOGIC WAIT BITS .SUSPEND * JNRES .FINDM SZA ANY MEMORY AVAILABLE ? JMP 4F YES TAD =06007 NO, SET FIELD SEARCH MASK MQL TAD UJOB FIND A FIELD OTHER THAN CALLING FIELD .FINDF SNA IS ONE RESIDENT ? JMP 5F NO DCA UFPNTR YES, SAVE ADDRESS OF FIELD INFO WORD LDI 04000 WRITE IT TO SWAP TRACKS .SWAPF SKP 4H DCA UFPNTR SAVE ADDDRESS OF FIELD INFO WORD TAD UUFUNC GET THE FUNCTION WORD AND =070 EXTRACT USER RELATIVE TRANSFER FIELD TAD UJOB CDF %FIELD2 DCAI UFPNTR CLAIM OWNERSHIP .SWAPF JMS UJMS,JRES,UTEMP2,UCUIF,UFPNTR,UUFUNC,UADDR,UBLOCK,0 * 5H LDI NRESW JUST SWAP OUT THE JOB JMS UJMS,JNRES,UTEMP2,UCUIF,UUFUNC,UADDR,UBLOCK,0 * AIF NO:FLOPPY,.FLOPPY TITLE FLOPPY DISK HANDLER * * FLOPPY DISK HANDLERS RXA0, RXA1, R0 & R1 * * THE FORMAT ON THE FLOPPY DISK QUEUE IS AS FOLLOWS: * WORD BIT(S) DESCRIPTION * 1 0-8 UNUSED (MUST BE ZERO) * 9-11 JOB NUMBER * 2 0 R/W: 0 = READ; 1 = WRITE * 1-5 PAGES TO TRANSFER * 6-8 RELATIVE MEMORY FIELD * 9 UNUSED * 10 MODE: 0 = 12-BIT; 1 = 8-BIT * 11 DRIVE: 0 = DRIVE 0: 1 = DRIVE 1 * 3 0-11 TRANSFER MEMORY ADDRESS * 4 0-11 FLOPPY LOGICAL BLOCK NUMBER * PART R1 INC UUFUNC R1 ENTRY R0 INC UUFUNC R0 ENTRY RXA1 INC UUFUNC RXA1 ENTRY RXA0 LDI 2 RXA0 ENTRY AND UUFUNC GET THE MODE SZA CLA WHICH MODE ? TAD =494-667 8-BIT MODE TAD =-494 TAD UBLOCK SMA CLA IS IT A VALID FLOPPY BLOCK NUMBER ? JMP UFSD4 NO, TAKE ERROR RETURN TAD UUFUNC GET THE FUNCTION WORD SMA CLA READ OR WRITE ? JMP 2F READ CDF %* LDI 1 AND UUFUNC TAD =RX:A0 DCA UPNTR1 TADI UPNTR1 GET JOB ASSIGNMENT FOR THIS DRIVE SZA IS THE DRIVE ASSIGNED ? TAD UJOB YES SZA CLA IS IT ALREADY ASSIGNED TO THIS JOB ? JMP UFSD4 NO, TAKE ERROR RETURN TAD UJOB ASSIGN/REASSIGN THE DRIVE TO THIS JOB CIA DCAI UPNTR1 2H TAD UJOB ADD THE JOB NUMBER CDF %RXQB DCAI RXQF PUT THE REQUEST ON THE FLOPPY QUEUE TAD UUFUNC DCAI RXQF TAD UADDR DCAI RXQF LDI 2 AND UUFUNC GET MODE BIT CLL RTR ROTATE IT TO LINK TAD UBLOCK CONVERT OS/8 BLOCK TO RX8E LOGICAL BLOCK TAD UBLOCK TAD UBLOCK SNL WHICH MODE ? TAD UBLOCK 12-BIT DCAI RXQF LDI 1 CHECK THE FLOPPY QUEUE FILL POINTER TAD RXQF TAD =-(RXQB+020) SZA CLA TIME TO UPDATE IT ? JMP 3F NO TAD =RXQB-1 YES, RESET THE INDEX DCA RXQF 3H IOF SENSITIVE CODE HERE ! TADI =RXJOB SZA CLA IS THE FLOPPY CURRENTLY BUSY ? JMP 4F YES TAD =0130 A FAKE COMMAND TO FORCE DONE FLAG IOT RX8,LCD 4H .FINDM SNA CLA ANY MEMORY AVAILABLE ? LDI NRESW NO, SWAP OUT THE JOB MQL SET/CLEAR LOGIC WAIT BITS TAD =FLOPW SET FLOPPY WAIT .SUSPEND * .FLOPPY ANOP TITLE EXECUTIVE REQUESTS * * 'TSS' SIMULATION - IOT 6111 * UTSS EQU UTSF SKIP IF TIMESHARING (UNCONDITIONAL SKIP) * * 'SSR' SIMULATION - IOT 6112 * SET SWITCH REGISTER FLAG AND/OR SWITCH REGISTER * USSR SUB .PARAM SR LDI 04000 AND UFLSV GET THE USER LINK DCAI UPNTR1 STORE IT AS SWITCH REGISTER FLAG INC UPNTR1 TAD UACSV GET USER AC DCAI UPNTR1 STORE IT AS USER SWITCH REGISTER DCA UACSV CLEAR USER AC RET USSR * * 'RCR' SIMULATION - IOT 6113 * URCR SUB RETURN CLOCK RATE IN TICKS PER SECOND TAD =TICKS DCA UACSV RET URCR * * 'TOD' SIMULATION - IOT 6114 * USER AC(0): 0= RETURN H O TIME IN AC, L O TIME IN MQ * 1= RETURN TIME TO 'DF' LOCATION SPECIFIED BY * CONTENTS OF NEXT LOCATION * USER AC(11): 0= RETURN CLOCK TICKS SINCE MIDNIGHT * 1= RETURN NEGATED TICKS UNTIL MIDNIGHT * PART UTOD SUB RETURN TIME OF DAY CDF %TIME TADI =TIME GET NEGATED H O TICKS UNTIL MIDNIGHT DCA UTEMP TADI =TIME+1 GET NEGATED L O TICKS UNTIL MIDNIGHT DCA UTEMP2 LDI 1 AND UACSV SZA CLA WHICH TIME IS DESIRED ? JMP 1F NEGATED TICKS UNTIL MIDNIGHT TAD =MIDNLO TICKS SINCE LAST MIDNIGHT TAD UTEMP2 DCA UTEMP2 RAL TAD =MIDNHO TAD UTEMP DCA UTEMP 1H TAD UACSV SPA CLA WHERE IS TIME TO BE STORED ? JMP 2F IN LOCATION POINTED TO BY NEXT USER LOCATION TAD UTEMP IN USER AC,MQ DCA UACSV TAD UTEMP2 DCA UMQSV RET UTOD 2H .CUIF LDI -1 GET DESIRED TIME STORAGE LOCATION -1 TADI UPCSV DCA XR JMS SETDF .CUDF TAD UTEMP GET AND STORE THE TIME DCAI XR TAD UTEMP2 DCAI XR DCA UACSV CLEAR USER AC ISZ UPCSV BUMP USER PC PAST TIME POINTER RET UTOD RET UTOD SAFETY * * 'DATE' SIMULATION - IOT 6115 * USER AC = 0: AC(0-11) <-- L O SYSTEM DATE WORD * USER AC = 1: AC(0-2) <-- 0 * AC(3-4) <-- H O YEAR BITS * AC(5-11) <-- 0 * USER AC = 2: AC(0-11) <-- L O SYSTEM DATE WORD * MQ(0-2) <-- 0 * MQ(3-4) <-- H O YEAR BITS * MQ(5-11) <-- 0 * USER AC = 3: AC(0-5) <-- DAY * AC(6-11) <-- MONTH * MQ(0-11) <-- YEAR * PART UDATE SUB RETURN THE DATE TAD OSDATEH GET H O DATE WORD AND =0600 EXTRACT H O YEAR BITS MQL CDF %OSDATEL TADI =OSDATEL GET L O DATE WORD DCA UTEMP LDI -2 TAD UACSV SMA DETERMINE REQUESTED FORMAT JMP 2F IAC SNA CLA JMP 1F TAD UTEMP GET L O SYSTEM DATE WORD JMP 4F 1H MQA GET H O YEAR BITS JMP 4F 2H SZA CLA JMP 3F MQA GET H O YEAR BITS DCA UMQSV TAD UTEMP GET L O DATE WORD JMP 4F 3H MQA GET THE H O YEAR BITS CLL RTR ROTATE TO BITS 8-9 RTR MQL TAD UTEMP GET THE L O DATE WORD AND =7 EXTRACT L O YEAR BITS MQA BRING UP H O YEAR BITS TAD =1970 ADD IN BASE YEAR DCA UMQSV TAD UTEMP GET L O DATE WORD AND =0370 EXTRACT THE DAY CLL RAL ROTATE TO BITS 0-5 RTL MQL TAD UTEMP GET L O DATE WORD AND =07400 EXTRACT THE MONTH CLL RAL ROTATE TO BITS 6-11 RTL RTL MQA BRING UP THE DAY BITS 4H DCA UACSV RET UDATE * * 'TASK' SIMULATION - IOT 6116 * PART UTASK SUB RETURN TASK NUMBER IN USER AC LDI -TERMS TAD UJOB GET THE CURRENT JOB NUMBER SPA SNA CLA IS THIS AN EXECUTIVE TASK ? JMP 2F NO TAD UACSV YES, GET THE EXEC TASK AC SNA CLA WHAT TASK NUMBER DOES IT WANT ? JMP 2F ITS OWN .PARAM CURJOB TAD UACSV GET EXEC TASK AC AGAIN SMA A REQUEST TO STORE OR RETRIEVE A JOB NUMBER ? JMP 1F RETRIEVE AND =07 EXTRACT JOB NUMBER DCAI UPNTR1 JMP 3F CLEAR EXEC TASK AC * 1H CAL RETRIEVE A JOB NUMBER TADI UPNTR1 SKP 2H TAD UJOB GET THE CURRENT JOB'S TASK NUMBER 3H DCA UACSV RET UTASK * * 'IHLT' SIMULATION - IOT 6117 * PART UIHLT HLT HALT WITHOUT SENDING A MESSAGE AIF NO:SPOOL,.SPOOL LDI -TERMS TAD UJOB IOF SENSITIVE CODE HERE ! SPA SNA CLA IS THIS AN EXEC TASK ? JMP 1F NO TAD SPLJOB CHECK TO SEE WHETHER TO DISMISS FROM MEMORY SZA CLA OK TO DISMISS ? JMP 3F NO .SPOOL ANOP 1H TAD =-6 DCA UCNTR TAD =FIELD2 DCA UFPNTR TAD UJOB CIA DCA UTEMP CDF %FPNTR 2H TADI UFPNTR RELEASE THIS JOB'S MEMORY AND =07 TAD UTEMP SNA CLA THIS FIELD ASSIGNED TO THIS JOB ? DCAI UFPNTR YES, RELEASE IT INC UFPNTR BUMP THE POINTER ISZ UCNTR CHECKED ALL FIELDS YET ? JMP 2B NO 3H .PARAM LWAIT LDI HALTW JUST SET HALT WAIT BIT MQL DCAI UPNTR1 AND CLEAR REMAINDER .SUSPEND * * 'SYN' SIMULATION - IOT 6120 * USYN HLT MQL CLEAR LOGIC WAITS .SUSPEND * * 'STM' SIMULATION - IOT 6121 * RESTART USER JOB WHEN CLOCK HAS TICKED THE NUMBER OF * TIMES SPECIFIED BY THE CONTENTS OF A DOUBLE PRECISION * LOCATION IN THE USER'S DF POINTED TO BY THE CONTENTS * OF THE LOCATION FOLLOWING THE 'STM' INSTRUCTION. * THE H O DELAY TICK COUNT IS CONTAINED IN THE L O MEMORY * ADDRESS. * PART USTM HLT SUSPEND UNTIL SPECIFIED TIME .CUIF TADI UPCSV GET THE DELAY TICK COUNT POINTER ISZ UPCSV BUMP USER PC NOP SAFETY DCA UPNTR1 POINTER TO H O DELAY TICK COUNT TAD UPNTR1 POINTER -1 TO L O DELAY TICK COUNT DCA XR JMS SETDF .CUDF TADI XR GET L O DELAY TICK COUNT CLL CIA MQL CML RAL GET THE CARRY BIT TADI UPNTR1 GET H O DELAY TICK COUNT CIA DCA UTEMP .PARAM RESTART MQA SAVE L O DELAY TICK COUNT DCAI UPNTR1 INC UPNTR1 TAD UTEMP SAVE H O DELAY TICK COUNT DCAI UPNTR1 LDI NRESW+REALW SET NON-RESIDENT AND REAL TIME WAIT BITS MQL .SUSPEND * * 'RAN' SIMULATION - IOT 6122 * PART URAN SUB RANDOM NUMBER GENERATOR (DECUS 5-25) CDF %TIME BY P T BRADY TADI =TIME+1 GET THE L O TIME RAR L O BIT TO LINK CLA TAD RLOW RAL AND =07400 DCA RTEMP2 TAD RMID AND =0177 TAD RTEMP2 RTL RTL RAL DCA RTEMP TAD RLOW AND =0177 RTL RTL RAL TAD RMID DCA RTEMP1 ROOM 4 SNL ISZ RTEMP ERM NOP TAD RLOW CLL RAL ROOM 6 SNL ISZ RTEMP1 SKP ISZ RTEMP ERM NOP CLL TAD RLOW DCA RLOW TAD RMID RAL ROOM 4 SNL ISZ RTEMP ERM NOP CLL TAD RTEMP1 DCA RMID TAD RAND RAL TAD RAND TAD RTEMP DCA RAND TAD RAND GET THE GENERATED RANDOM NUMBER DCA UACSV LOAD THE USER AC RET URAN * * 'ALONE' SIMULATION - IOT 6123 * PART UALONE SUB RETURN TO STANDALONE OS/8 LDI -1 TAD UJOB SZA CLA IS JOB 1 REQUESTING STANDALONE OS/8 ? RET UALONE NO, TREAT AS A 'NOP' IOF YES, ALLOW I/O TIME TO SETTLE TAD =-25 DCA UPNTR1 DCA UPNTR2 1H ISZ UPNTR2 JMP 1B ISZ UPNTR1 JMP 1B CAF CLEAR ALL HARDWARE FLAGS JMP $07605 START STANDALONE OS/8 * * 'TALK' SIMULATION - IOT 6124 * PART UTALK SUB SEND A CHARACTER TO ANOTHER TERMINAL TAD UACSV GET USER AC AND =07000 EXTRACT DESTINATION TERMINAL NUMBER SNA TERMINAL # 0 REQUESTED ? RET UTALK YES, TREAT AS A 'NOP' TAD =-(TERMS.LS.9) SMA SZA CLA IS DESTINATION A VALID TERMINAL NUMBER ? RET UTALK NO, TREAT AS A 'NOP' TAD UACSV YES, GET USER AC AND =07000 EXTRACT DESTINATION TERMINAL NUMBER CLL RAR RTR TAD =JOB1-USER:ST+OUTIOT DCA UPNTR1 POINT TO OUTPUT IOT TADI UPNTR1 GET IT DCA 1F PUT IT IN CODING LINE INC UPNTR1 POINT TO MOTION FLAG IOF SENSITIVE CODE HERE TADI UPNTR1 GET IT SZA CLA IS DESTINATION TERMINAL IN MOTION ? JMP 2F YES TAD UACSV NO, GET THE CHARACTER 1H HLT TRANSMIT IT TO DESTINATION TERMINAL DCAI UPNTR1 AND SET MOTION FLAG JMP 3F * 2H INC UPNTR1 POINT TO OUTPUT BUFFER FILL POINTER TADI UPNTR1 GET IT DCA UPNTR2 CDF %BUFFERS TADI UPNTR2 LOOK IN DESTINATION TERMINAL OUTPUT BUFFER SZA CLA IS IT FULL ? RET UTALK YES, TREAT AS A 'NOP' TAD UACSV GET THE CHARACTER DCAI UPNTR2 STORE IT IN OUTPUT BUFFER CDF %* TAD UPNTR2 UPDATE BUFFER POINTER AND =07600 MQL LDI 1 TAD UPNTR2 AND =0177 MQA DCAI UPNTR1 INC UPNTR1 INC UPNTR1 POINT TO OUTPUT BUFFER CHARACTER COUNTER ISZI UPNTR1 BUMP THE CHARACTER COUNT NOP 3H ISZ UPCSV BUMP USER PC RET UTALK RET UTALK SAFETY * * 'SPR' SIMULATION - IOT 6125 * RETURN SYSTEM PARAMETERS TO A BLOCK IN THE USER'S DATA FIELD: * WORD CONTENTS * 0 USER'S TASK NUMBER * 1 NUMBER OF ENTRIES ON PRINT SPOOLER QUEUE * 2 BITS SET INDICATE CORRESPONDING TASKS LOGGED ON * 3 BITS SET INDICATE CORRESPONDING TASKS OUTPUTTING * TO THEIR OWN TERMINALS * 4 BITS 3-5 NUMBER OF TERMINALS ON THE SYSTEM * 6-8 NUMBER OF AVAILABLE MEMORY FIELDS * 9-11 NUMBER OF PHYSICAL SWAP MEMORY FIELDS * 5 STATUS OF JOB 1 * 6 PC OF JOB 1 * 7 STATUS OF JOB 2 * 10 PC OF JOB 2 * . . * . . * . . * 4+(2*N) WHAT'S IN FIELD 2. * 5+(2*N) WHAT'S IN FIELD 3. * . . * . . * . . * PART USPR SUB RETURN SYSTEM PARAMETERS .CUIF LDI -1 TADI UPCSV GET ADDRESS OF BUFFER DCA XR JMS SETDF .CUDF TAD UJOB GET THE JOB NUMBER DCAI XR SEND IT AIF NO:SPOOL,.SPOOL TAD SPLQCTR GET THE NUMBER OF ENTRIES ON THE SPOOLER QUEUE .SPOOL DCAI XR SEND IT CDF %* TAD =JOB1+LWAIT SET BITS INDICATING LOGGED-ON TASK NUMBERS DCA UPNTR1 LDI -JOBS DCA UCNTR LDI 02000 DCA UTEMP2 DCA UTEMP 1H TADI UPNTR1 GET A WAIT WORD SPA CLA IS THIS JOB ACTIVE ? JMP 2F NO TAD UTEMP2 YES, GET THE CORRESPONDING BIT TAD UTEMP DCA UTEMP 2H TAD UTEMP2 MOVE THE BIT TO NEXT TASK CLL RAR DCA UTEMP2 TAD UPNTR1 UPDATE POINTER TO NEXT TASK WAIT WORD TAD =USER:ST DCA UPNTR1 ISZ UCNTR CHECKED ALL JOBS ? JMP 1B NO .CUDF TAD UTEMP GET THE ACTIVE JOB BITS WORD DCAI XR SEND IT CDF %* LDI -JOBS SET BITS INDICATING TASKS WHICH ARE DCA UCNTR OUTPUTTING TO THEIR OWN TERMINALS TAD =JOB1+MF POINT TO MOTION FLAG DCA UPNTR1 LDI 02000 DCA UTEMP2 DCA UTEMP 3H TADI UPNTR1 GET A MOTION FLAG SNA CLA IS THE TERMINAL RECEIVING OUTPUT ? JMP 4F NO TAD UTEMP2 YES, SET ITS CORRESPONDING BIT TAD UTEMP DCA UTEMP 4H TAD UTEMP2 MOVE THE TASK BIT CLL RAR DCA UTEMP2 TAD UPNTR1 UPDATE POINTER TO NEXT TASK MOTION FLAG TAD =USER:ST DCA UPNTR1 ISZ UCNTR CHECKED ALL TASKS ? JMP 3B NO .CUDF TAD UTEMP YES, GET THE SET BITS WORD DCAI XR SEND IT TAD =FIELD2-1 DCA XR1 TAD =-6 DCA UCNTR DCA UTEMP CDF %FIELD2 2H TADI XR1 CHECK THE AVAILABLE MEMORY SNA CLA IS THIS FIELD AVAILABLE ? INC UTEMP YES, COUNT IT ISZ UCNTR CHECKED ALL MEMORY FIELDS ? JMP 2B NO .CUDF TAD UTEMP GET THE AVAILABLE FIELD COUNT CLL RAL ROTATE TO BITS 6-8 RTL TAD MEMORY Add terminal and memory size information DCAI XR SEND IT CDF %* RESET THE DATA FIELD  TAD =JOB1+DWAIT  .CUDF SET TO USER DATA FIELD  DCAI XR SEND THE INFORMATION  CDF %*  TAD =JOB1+PC SEND THE CURRENT PC LOCATION  .CUDF  DCAI XR SEND IT  CDF %* RESET THE DATA FIELD  TAD =JOB2+DWAIT  .CUDF SET TO USER DATA FIELD  DCAI XR SEND THE INFORMATION  CDF %*  TAD =JOB2+PC SEND THE CURRENT PC LOCATION  .CUDF  DCAI XR SEND IT  AIF TERMS.LT.3,.OKX  CDF %* RESET THE DATA FIELD  TAD =JOB3+DWAIT  .CUDF SET TO USER DATA FIELD  DCAI XR SEND THE INFORMATION  CDF %*  TAD =JOB3+PC SEND THE CURRENT PC LOCATION  .CUDF  DCAI XR SEND IT   AIF TERMS.LT.4,.OKX  CDF %*  TAD =JOB4+DWAIT  .CUDF  DCAI XR  CDF %*  TAD =JOB4+PC  .CUDF  DCAI XR  AIF TERMS.LT.5,.OKX  CDF %*  TAD =JOB5+DWAIT  .CUDF  DCAI XR  CDF %*  TAD =JOB5+PC  .CUDF  DCAI XR  AIF TERMS.LT.6,.OKX  CDF %*  TAD =JOB6+DWAIT  .CUDF  DCAI XR  CDF %*  TAD =JOB6+PC  .CUDF  DCAI XR .OKX ANOP  AIF NO:SPOOL,.OKY   CDF %*  TAD =JOBSPL+DWAIT  .CUDF  DCAI XR  CDF %*  TAD =JOBSPL+PC  .CUDF  DCAI XR .OKY ANOP  TAD =FIELD2-1  DCA XR1  TAD =-6  DCA UCNTR  DCA UTEMP 3H CDF %FIELD2  TADI XR1 CHECK THE AVAILABLE MEMORY  .CUDF  DCAI XR  ISZ UCNTR  JMP 3B ISZ UPCSV BUMP USER PC RET USPR RET USPR SAFETY TITLE IOT SIMULATION FOR 'CDF X' * * 'CDF' SIMULATION - IOT 62X1 * PART UCDF SUB CHANGE TO DATA FIELD X TAD =077 SET MASK FOR QFINDF MQL TAD UINST GET THE USER INSTRUCTION AND =070 EXTRACT DESIRED 'DF' TAD UJOB .FINDF FIND THE FIELD SNA IS IT RESIDENT ? JMP UCDFNR NO DCA UFPNTR YES, SAVE ADDRESS OF FIELD INFO WORD TAD UFLSV GET USER FLAGS AND =07 EXTRACT PHYSICCAL 'DF' TAD =FIELD0 COMPUTE ADDRESS OF FIELD INFO WORD DCA UPNTR1 CDF %FIELD2 LDI -(DF+1) ANDI UPNTR1 CLEAR OLD 'DF' RESIDENCY BIT DCAI UPNTR1 LDI DF TADI UFPNTR SET NEW 'DF' RESIDENCY BIT DCAI UFPNTR TAD UFPNTR TAD =-FIELD0 COMPUTE THE PHYSICAL FIELD MQL TAD UFLSV GET USER FLAGS AND =07770 DELETE OLD PHYSICAL 'DF' MQA BRING UP NEW PHYSICAL 'DF' DCA UFLSV NEW USER FLAGS RET UCDF * * COME HERE IF DESIRED FIELD IS NON-RESIDENT. IF MEMORY IS * AVAILABLE, SWAP IN THE NEW FIELD. IF NO MEMORY IS AVAILABLE, * GO TO UCDFNR2. * PART UCDFNR .FINDM COME HERE IF FIELD IS NON-RESIDENT SNA IS ANY MEMORY AVAILABLE ? JMP UCDFNR2 NO DCA UFPNTR SAVE ADDRESS OF NEW FIELD INFO WORD TAD UFLSV GET USER FLAGS AND =07 EXTRACT OLD RELATIVE USER DF TAD =FIELD0 DCA UFPNTR2 POINT TO OLD DF FIELD INFO WORD CDF %FIELD2 LDI -(DF+1) ANDI UFPNTR2 CLEAR DF RESIDENCY BIT DCAI UFPNTR2 TAD UINST GET THE USER INSTRUCTION AND =DF+070 EXTRACT NEW RELATIVE USER DF + TAD UJOB 'DF' RESIDENCY BIT DCAI UFPNTR STORE THE NEW FIELD INFO WORD .SWAPF SWAP IN THE NEW FIELD TAD UFPNTR COMPUTE PHYSICAL FIELD TAD =-FIELD0 MQL TAD UFLSV GET USER FLAGS AND =07770 MASK OUT OLD PHYSICAL DF MQA BRING UP NEW PHYSICAL DF DCA UFLSV NEW USER FLAGS JMP UCDFNR4 * * IF SUFFICIENT TIME TO SWAP IN NEW FIELD IS NOT AVAILABLE, THEN * JUST SUSPEND THE CURRENT JOB. IF SUFFICIENT TIME IS AVAILABLE, * THEN SWAP OUT AN UNUSED FIELD (ONE WITH 'IF', 'DF' AND 'LOCK' * BITS CLEARED). IF MEMORY IS NOW AVAILABLE, SWAP IN THE DESIRED * FIELD. OTHERWISE, COMPARE USER'S 'IF' AND 'DF'. IF THEY ARE * DIFFERENT, SWAP OUT THE USER'S 'DF' AND SWAP IN THE DESIRED * 'DF'. IF THEY ARE THE SAME, JUST SWAP OUT THE CURRENT JOB. * PART UCDFNR2 TAD =QUANTUM/2 CDF %JTIME TADI =JTIME SMA SZA CLA IS THERE TIME TO SWAP IN DESIRED FIELD ? JMP UCDFNR5 NO, JUST SUSPEND THE CURRENT JOB TAD =-6 DCA UCNTR TAD RSFIELD GET FIELD INFO WORD ADDRESS OF MOST RECENTLY SNA SWAPPED FIELD -- DOES ONE EXIST ? TAD =FIELD1 NO, JUST START WITH FIELD 2 IAC DCA UFPNTR 1H TAD UFPNTR TAD =-(FIELD2+6) SZA CLA IS THIS THE TOP FIELD'S INFO WORD ? JMP 2F NO TAD =FIELD2 YES, START OVER AT FIELD 2 DCA UFPNTR 2H TAD UFPNTR CIA TAD RSFIELD SNA CLA IS THIS THE MOST RECENTLY SWAPPED FIELD ? JMP 3F YES, LEAVE IT ALONE TADI UFPNTR NO, GET THE FIELD INFO WORD AGAIN AND =IF+DF+LOCK+N:EXIST SNA CLA IS IT SWAPPABLE ? JMP UCDFNR3 NO, IT CAN BE SWAPPED OUT 3H INC UFPNTR BUMP THE FIELD INFO WORD POINTER ISZ UCNTR LOOKED AT ALL FIELD INFO WORDS YET ? JMP 1B NO DCA RSFIELD CLEAR RECENTLY SWAPPED FIELD FLAG TAD UFLSV GET THE USER FLAGS AND =07 EXTRACT USER PHYSICAL 'DF' TAD =FIELD0 COMPUTE FIELD INFO WORD DCA UFPNTR TADI UFPNTR GET THE FIELD INFO WORD SMA CLA IS IT ALSO THE USER 'IF' ? JMP UCDFNR3 NO, SWAP IT OUT .SWAPJ SWAP OUT ALL OTHER JOBS JMP UCDFNR AND TRY AGAIN LDI -1 NO SWAP OCCURRED--BACK UP PC AND SUSPEND TAD UPCSV DCA UPCSV LDI NRESW SET NON-RESIDENT WAIT MQL TAD PEND:CIF SNA CLA IS A 'CIF' PENDING ? .SUSPEND NO LDI NRESW YES, SET NON-RESIDENT WAIT RET UCDF PART UCDFNR3 TAD UFLSV GET THE USER FLAGS AND =07 EXTRACT PHYSICAL DATA FIELD TAD =FIELD0 DCA UFPNTR2 LDI -(DF+1) ANDI UFPNTR2 REMOVE 'DF' RESIDENCY BIT DCAI UFPNTR2 LDI 04000 AT LAST, A FIELD CAN BE SWAPPED OUT ! .SWAPF CDF %FIELD2 TAD UINST GET THE USER INSTRUCTION AND =DF+070 EXTRACT DESIRED FIELD TAD UJOB PLUS 'DF' RESIDENCY BIT DCAI UFPNTR .SWAPF GET THE NEW DF TAD UFPNTR COMPUTE THE PHYSICAL FIELD TAD =-FIELD0 MQL TAD UFLSV GET USER FLAGS AND =07770 REMOVE OLD PHYSICAL 'DF' MQA BRING UP NEW PHYSICAL 'DF' DCA UFLSV NEW USER FLAGS TAD UFPNTR SET 'RECENTLY SWAPPED FIELD' FLAG DCA RSFIELD UCDFNR4 CAM CLEAR ALL WAIT BITS TAD PEND:CIF SNA CLA IS A 'CIF' PENDING ? .SUSPEND NO LDI -1 YES, BACK UP USER PC SO 'CIF' WILL BE TAD UPCSV CAUGHT AT NEXT TIME QUANTUM DCA UPCSV JMP UCDFNR6 YES * UCDFNR5 CAM CLEAR ALL WAIT BITS LDI -1 BACK UP THE USER PC TAD UPCSV DCA UPCSV TAD PEND:CIF SNA CLA IS A 'CIF' PENDING ? .SUSPEND NO UCDFNR6 TAD =EXECW YES, RETURN WITH A WAIT BIT SET RET UCDF TITLE IOT SIMULATION FOR 'CIF X' * * 'CIF' SIMULATION - IOT 62X2 * PART UCIF SUB CHANGE TO INSTRUCTION FIELD X UCIF2 TAD UINST AND =072 EXTRACT DESIRED 'IF' & USE BIT 10 AS FLAG DCA PEND:CIF SAVE THE NEW FIELD LDI 1 AND UINST SZA CLA IS THIS A 'CID' INSTRUCTION ? JMS UCDF YES, EXECUTE THE 'CDF' FIRST MQL STORE RETURN AC IN MQ TAD UFLSV GET USER FLAGS AND =070 EXTRACT USER PHYSICAL 'IF' CLL RAR RTR TAD =FIELD0 DCA UFPNTR CDF %FIELD2 TADI UFPNTR GET FIELD INFO WORD AND =070 EXTRACT USER RELATIVE 'IF' CIA TAD UINST COMPARE WITH 'CIF' JUST ISSUED AND =070 LOOK ONLY AT FIELD BITS SZA CLA A 'CIF' TO THE SAME FIELD ? JMP 1F NO SWP YES, GET THE 'CDF' RETURN AC, CLEAR MQ SZA CLA WAS A FIELD SWAP INITIATED ? .SUSPEND YES, JUST SUSPEND; PC IS OK RET UCIF NO, AVOID INSTRUCTION SIMULATION * 1H JMS SETDF MQA RETURN AC FROM 'CDF' SIMULATION * * THIS IS THE MAIN SIMULATION LOOP * PART X:INST ION SERVICE ANY PENDING INTERRUPTS ROOM 2 SZA WAS A FIELD TRANSFER INITIATED ? JMP 1F YES CDF %JTIME TADI =JTIME GET THE JOB TIME SPA CLA HAS THE TIME QUANTUM EXPIRED ? JMP X:INST2 NO 1H JMS UJMS,X:INST,UCUIF,UCUDF,PEND:CIF,0 * PART X:INST2 .CUIF 'DF' TO USER 'IF' TADI UPCSV GET NEXT INSTRUCTION DCA UINST SAVE IT ISZ UPCSV BUMP USER PC NOP SAFETY TAD UINST SMA IS IT A MEMORY REFERENCE INSTRUCTION ? JMP X:MRI YES CLL RTL SNL IS IT A 'JMS' OR 'JMP' ? JMP X:JMS:JMP YES CDF %* SPA CLA IS IT AN IOT ? JMP X:OPR NO, AN OPERATE INSTRUCTION * * SIMULATE AN IOT INSTRUCTION * PART X:IOT TAD UINST GET THE IOT AND =07706 TAD =-KCIF SNA CLA ANOTHER 'CIF' INSTRUCTION ? JMP UCIF2 YES, MUST CHANGE 'PEND:CIF' TAD UINST GET THE USER INSTRUCTION AND =07707 TAD =-KCDF SZA CLA IS IT A 'CDF' INSTRUCTION ? JMP 1F NO JMS UCDF EXECUTE IT MQL SAVE AC STATUS JMS SETDF SET UCUDF MQA GET UCDF AC STATUS JMP X:INST NO, GET NEXT USER INSTRUCTION * 1H TAD =IOT1-1 POINT TO IOT LIST TABLE DCA XR TAD UINST GET THE USER INSTRUCTION CIA DCA IOTBAD PUT ITS NEGATIVE IN THE IOT LIST TABLE 2H TADI XR GET AN IOT TABLE ENTRY TAD UINST COMPARE WITH USER INSTRUCTION SZA CLA A MATCH ? JMP 2B NO, TRY NEXT ENTRY TAD XR YES, GET THE IOT1 TABLE ADDRESS TAD =IOT2-IOT1 COMPUTE ITS IOT2 TABLE ENTRY DCA UPNTR1 TADI UPNTR1 GET ITS SERVICE SUBROUTINE ADDRESS DCA UPNTR1 JMSI UPNTR1 EXECUTE IT JMP X:INST GET NEXT INSTRUCTION * * SIMULATE AN OPERATE INSTRUCTION * PART X:OPR TAD UINST SIMULATE AN OPERATE INSTRUCTION AND =0401 LOOK AT BITS 3 AND 11 CLL RAR BIT 11 TO LINK SZA A GROUP I OPERATE MICROINSTRUCTION ? JMP 1F NO X:OPR1 TAD UINST YES, GET THE INSTRUCTION JMS EM:INST SIMULATE THE INSTRUCTION JMP X:INST GET NEXT INSTRUCTION * 1H SZL CLA A GROUP II OPERATE MICROINSTRUCTION ? JMP X:OPR3 NO, A GROUP III X:OPR2 JMS OPCODE72 SIMULATE THE INSTRUCTION JMP X:INST GET NEXT INSTRUCTION * X:OPR3 TAD UINST GET THE USER INSTRUCTION AGAIN AND =056 EXTRACT 'STRICTLY EAE' BITS SZA CLA IS THIS A 'STRICTLY EAE' INSTRUCTION ? JMP 2F YES, IT CANNOT BE HANDLED PROPERLY TAD UMQSV GET USER MQ MQL TAD UINST GET THE INSTRUCTION DCA *+2 PUT IT IN CODING LINE TAD UACSV GET USER AC HLT EXECUTE THE INSTRUCTION DCA UACSV SAVE RESULTING AC MQA DCA UMQSV AND MQ JMP X:INST GET NEXT INSTRUCTION * 2H LDI HALTW+NRESW NO EAE INSTRUCTIONS ALLOWED DCA WAITS SEND ERROR MESSAGE AND HALT JOB TAD =OP7EAE 'EAE INST BETWEEN CIF & JMS OR JMP' JMP MESOUT * * SIMULATE A MEMORY REFERENCE INSTRUCTION * PART X:MRI AND =07000 EXTRACT ONLY OP CODE TAD =0400+UPNTR2 FORM AN INDIRECT REFERENCE MQL JMS GET:ADR GET THE EFFECTIVE ADDRESS TAD UINST GET THE SIMULATED INSTRUCTION AND =0400 EXTRACT INDIRECT BIT SZA CLA AN INDIRECT REFERENCE ? .CUDF 'DF' TO USER 'DF' MQA GET THE INSTRUCTION JMS EM:INST PERFORM THE SIMULATION JMP X:INST GET NEXT INSTRUCTION * * SIMULATE A 'JMS' OR 'JMP' INSTRUCTION * PART X:JMS:JMP SMA CLA A 'JMS' OR 'JMP' INSTRUCTION ? LDI -1 A 'JMS' -- SET THE 'JMS' FLAG DCA JMSFLAG JMS GET:ADR GET ACTUAL JUMP ADDRESS TAD =077 MASK FOR FIELD SEARCH MQL LDI -2 REMOVE THE NON-ZERO FLAG TAD PEND:CIF FROM PEND:CIF TAD UJOB .FINDF SNA IS THE NEW FIELD RESIDENT ? JMP X:JNRES NO DCA UFPNTR YES, SAVE ADDRESS OF FIELD INFO WORD TAD UFLSV GET USER FLAGS AND =070 EXTRACT CURRENT PHYSICAL 'IF' CLL RAR RTR TAD =FIELD0 COMPUTE ADDRESS OF FIELD INFO WORD DCA UFPNTR2 CDF %FIELD2 LDI -(IF+1) ANDI UFPNTR2 CLEAR OLD 'IF' FLAG DCAI UFPNTR2 LDI IF TADI UFPNTR SET NEW 'IF' FLAG DCAI UFPNTR TAD UFPNTR COMPUTE NEW PHYSICAL FIELD TAD =-FIELD0 CLL RAL RTL MQL SAVE IN THE MQ TAD UFLSV GET USER FLAGS AND =07707 SAVE ALL EXCEPT OLD 'IF' MQA BRING UP NEW PHYSICAL 'IF' DCA UFLSV NEW USER FLAGS ISZ JMSFLAG IS THIS A 'JMS' OR 'JMP' INSTRUCTION ? JMP X:JUMP A 'JMP' MQA GET NEW PHYSICAL FIELD TAD =KCDF FORM A 'CDF' TO IT ROOM 3 DCA 1F ERM 1H HLT TAD UPCSV GET RETURN PC DCAI UPNTR2 RETURN PC SAVED IN SUBROUTINE FIRST ADDR LDI 1 NEW PC IS OLD PC +1 X:JUMP TAD UPNTR2 NEW PC DCA UPCSV RET UCIF * * DESIRED NEW 'IF' IS NON-RESIDENT * THIS ROUTINE IS ENTERED ONLY AS A RESULT OF A * NON-RESIDENT INSTRUCTION FIELD. IF A 'CID' HAD * BEEN ISSUED, THE DATA FIELD WOULD ALREADY HAVE BEEN * LOADED. SO JUST SET THE USER FLAGS TO THE NEW * RELATIVE 'IF' AND THE OLD RELATIVE 'DF' AND SWAP * OUT THE JOB TO DISK. * PART X:JNRES TAD JMSFLAG SMA CLA A 'JMS' OR 'JMP' INSTRUCTION ? JMP 1F A 'JMP' .PARAM JMSPC TAD UPCSV SAVE THE RETURN PC DCAI UPNTR1 1H TAD UPNTR2 GET THE NEW PC DCA UPCSV .FINDM CDF %FIELD2 SNA ANY MEMORY AVAILABLE ? JMP X:JSWAP NO, JUST SWAP OUT THE CURRENT JOB DCA UFPNTR YES, SAVE THE FIELD INFO WORD ADDRESS TAD UFPNTR COMPUTE ITS PHYSICAL FIELD NUMBER TAD =-FIELD0 CLL RAL RTL MQL TAD UFLSV GET USER FLAGS AND =070 EXTRACT CURRENT PHYSICAL 'IF' CLL RAR RTR TAD =FIELD0 DCA UFPNTR2 POINT TO ITS FIELD INFO WORD LDI -(IF+1) ANDI UFPNTR2 REMOVE 'IF' RESIDENCY BIT DCAI UFPNTR2 TAD UFLSV SET THE USER FLAGS AND =07707 REMOVE OLD 'IF' MQA BRING UP NEW 'IF' DCA UFLSV TAD =IF-2 SET UP THE FIELD INFO WORD TAD PEND:CIF GET THE RELATIVE FIELD NUMBER TAD UJOB INDICATE OWNERSHIP DCAI UFPNTR .SWAPF SWAP IN THE NEW FIELD MQL CLEAR LOGIC WAIT BITS ISZ JMSFLAG A 'JMS' INSTRUCTION ? .SUSPEND NO TAD =JMSW YES, SET THE 'JMS' WAIT BIT MQL .SUSPEND * PART X:JSWAP LDI -2 REMOVE THE PENDING 'CIF' FLAG BIT TAD PEND:CIF GET THE NEW USER RELATIVE 'IF' MQL TAD UFLSV GET USER FLAGS AND =07 EXTRACT PHYSICAL 'DF' TAD =FIELD0 DCA UFPNTR TADI UFPNTR AND =070 EXTRACT USER RELATIVE 'DF' CLL RAR RTR MQA TAD =RELBIT SET RELATIVE BIT SO SCHEDULER WON'T MQL SET THE RELATIVE FLAGS TAD UFLSV GET USER PHYSICAL FLAGS AND =07700 REMOVE 'IF' AND 'DF' INFO MQA BRING UP RELATIVE 'IF' AND 'DF' BITS DCA UFLSV TAD =-6 THROW OUT ALL UNUSED FIELDS DCA UCNTR TAD =FIELD2 DCA UFPNTR 1H TADI UFPNTR GET A FIELD INFO WORD SNA IS THIS FIELD IN USE ? JMP 2F NO AND =IF+DF+LOCK+N:EXIST SZA CLA IS IT NON-SWAPPABLE ? JMP 2F YES LDI 04000 NO, SWAP IT OUT .SWAPF CDF %FIELD2 DCAI UFPNTR RELEASE MEMORY 2H INC UFPNTR BUMP FIELD INFO WORD POINTER ISZ UCNTR CHECKED ALL FIELD INFO WORDS YET ? JMP 1B NO LDI NRESW THIS JOB WILL BE SWAPPED OUT ISZ JMSFLAG 'JMS' OR 'JMP' INSTRUCTION ? JMP 3F A 'JMP' TAD =JMSW SET 'JMS' WAIT BIT 3H MQL .SUSPEND * * GET EFFECTIVE ADDRESS FOR X:MRI OR X:JMS:JMP * ENTER WITH 'DF' SET TO USER 'IF' * EXITING 'DF' = ENTERING 'DF' * PART GET:ADR SUB TAD UINST GET USER INSTRUCTION AND =0177 EXTRACT RELATIVE PAGE BITS DCA UPNTR2 TAD UINST GET USER INSTRUCTION AND =0200 EXTRACT PAGE BIT CIA AC = 0000 (PAGE ZERO) OR 7600 (ANY OTHER PAGE) AND UPCSV PICK UP ABSOLUTE PAGE BITS TAD UPNTR2 ADD IN RELATIVE PAGE BITS DCA UPNTR2 TAD UINST GET USER INSTRUCTION AND =0400 EXTRACT INDIRECT BIT SNA CLA AN INDIRECTLY REFERENCED INSTRUCTION ? RET GET:ADR NO TAD UPNTR2 YES, CHECK FOR AUTO-INDEX AND =07770 TAD =-010 SZA CLA AN AUTO-INDEXED INDIRECT REFERENCE ? JMP 1F NO ISZI UPNTR2 YES, BUMP THE USER AUTO-INDEX NOP SAFETY 1H TADI UPNTR2 GET THE ABSOLUTE MEMORY ADDRESS DCA UPNTR2 RET GET:ADR * * THIS SUBROUTINE SIMULATES THE USER INSTRUCTION * PART EM:INST SUB SIMULATE A PDP-8 INSTRUCTION ROOM 7 DCA INST PUT THE INSTRUCTION IN CODING LINE TAD UFLSV GET USER FLAGS CLL RAL USER LINK TO MACHINE LINK MQL STORE USER FLAGS IN MQ TAD UACSV GET USER AC ERM INST HLT USER INSTRUCTION GOES HERE JMP 1F NO SKIP ISZ UPCSV A SKIP OCCURRED NOP SAFETY 1H DCA UACSV NEW USER AC MQA GET USER FLAGS RAR DCA UFLSV NEW USER FLAGS RET EM:INST TITLE IOT SIMULATIONS FOR 'RDF' AND 'RIF' * * 'RDF' SIMULATION - IOT 6214 * PART URDF SUB TAD UFLSV GET USER FLAGS AND =07 EXTRACT PHYSICAL FIELD NUMBER TAD =FIELD0 FORM POINTER TO FIELD INFO WORD DCA UFPNTR CDF %FIELD2 TADI UFPNTR GET THE FIELD INFO WORD AND =070 EXTRACT USER FIELD NUMBER MQL TAD UACSV GET USER AC MQA OR IN USER 'DF' DCA UACSV NEW USER AC RET URDF * * 'RIF' SIMULATION - IOT 6224 * URIF SUB TAD UFLSV GET USER FLAGS AND =070 EXTRACT PHYSICAL 'IF' CLL RAR RTR TAD =FIELD0 FORM POINTER TO FIELD INFO WORD DCA UFPNTR CDF %FIELD2 TADI UFPNTR GET THE FIELD INFO WORD AND =070 EXTRACT USER 'IF' MQL TAD UACSV GET USER AC MQA OR IN USER 'IF' DCA UACSV NEW USER AC RET URIF TITLE IOT SIMULATION FOR 'CUF' * * 'CUF' SIMULATION - IOT 6264 * THIS IOT WILL WORK ONLY FOR PROGRAMS WHICH ARE * EXECUTIVE TASKS (WITH JOB NUMBERS HIGHER THAN 'TERMS'). * UCUF SUB CLEAR USER MODE LDI -TERMS TAD UJOB SPA SNA CLA IS THIS AN EXECUTIVE JOB ? RET UCUF NO, TREAT IT AS A 'NOP' TAD UFLSV YES, CLEAR THE USER MODE BIT AND =07677 DCA UFLSV RET UCUF TITLE IOT SIMULATIONS FOR LINE PRINTER * AIF NO:SPOOL,.NO:SPOOL * * 'SPOOL' SIMULATION - IOT 6660 * THE CALLING SEQUENCE IS: * TAD =PRINT 'PRINT' IS IN USER DATA FIELD * DI 06660 * JMP NO:SPOOL SPOOL REQUEST REJECTED -- * AC CONTAINS ERROR CODE: * 1 = SPOOL QUEUE FULL * 2 = DEVICE ZERO SELECTED * PRINTER QUEUE RETURNED TO USER * (NORMAL RETURN) AC CLEARED * ... * PRINT (CONTROL WORD) BIT(S) MEANING * 0 0=QUEUE; 1=DE-QUEUE * 1 - 6 UNUSED * 7 FOLD LOWER CASE TO UPPER CASE * 8 - 11 DEVICE NUMBER * TEXT \PRINT1LS\ FILE NAME (8 STRIPPED ASCII CHARACTERS) * * PART USPOOL SUB SPOOL A PRINT FILE LDI -1 GET THE ARGUMENT ADDRESS TAD UACSV DCA XR DCA UACSV CLEAR USER AC JMS SETDF .CUDF ARGUMENTS ARE IN USER DATA FIELD LDI 04000 TADI XR QUEUE/DE-QUEUE BIT TO LINK AND =017 EXTRACT THE DEVICE NUMBER  SNA WAS A DEVICE SPECIFIED ? JMP USPLE2 NO, ERROR # 2 SNL QUEUE OR DE-QUEUE REQUEST ? JMP ENSPOOL A QUEUE REQUEST DESPOOL MULT64 A DE-QUEUE REQUEST -- PUT DEV # IN LEFT BYTE TAD UJOB ADD THE JOB NUMBER CIA DCA UACSV TADI XR GET THE FIRST TWO CHARACTERS OF FILE NAME CIA DCA UPNTR1 TADI XR NEXT 2 CIA DCA UPNTR2 TADI XR NEXT 2 CIA DCA UPNTR3 TADI XR LAST 2 CIA DCA UTEMP2 TAD SPLQE SET INDEX TO THE END POINTER DCA XR TAD XR CHECK THE POSITION OF THE POINTER TAD =-(SPLQ+(32*5)+1) SPA CLA IF ZERO RESET POINTER JMP 5F CONTINUE TAD =(SPLQ-1) RESET THE POINTER DCA XR 5H TAD =-32 DCA UCNTR CDF %SPLQ IOF TOUCHY CODE HERE TAD SPLJOB GET THE SPOOL BUSY FLAG SNA CLA IS IT BUSY ? JMP 1F NO TAD =077 SET SEARCH MASK MQL LDI TERMS+1 .FINDF FIND THE SPOOLER FIELD SNA Is the spooler resident ? JMP 1F No, just check the spooler queue TAD =-FIELD0 COMPUTE ITS PHYSICAL FIELD CLL RAL RTL TAD =KCDF FORM A 'CDF' TO IT DCA UCUDF .CUDF TAD SPLJOB GET THE SPOOL BUSY FLAG SPA IF POSITIVE THE FILE HAS NOT BEEN KILLED JMP 1F GO ON AND CHECK THE QUE....THIS JOB KILLED ! AND =01717 REMOVE 'FOLD' OPTION BIT TAD UACSV COMPARE WITH USER AC SZA CLA IS THE SPOOLER OUTPUTTING THIS USER'S FILE ? JMP 1F NO TAD =ZFILE-1 YES, POINT TO THE FILE NAME DCA XR1 TADI XR1 GET THE FILE NAME TAD UPNTR1 SZA CLA A MATCH ? JMP 1F NO TADI XR1 NEXT 2 TAD UPNTR2 SZA CLA A MATCH ? JMP 1F NO TADI XR1 NEXT 2 TAD UPNTR3 SZA CLA A MATCH ? JMP 1F NO TADI XR1 NEXT 2 TAD UTEMP2 SZA CLA A MATCH ? JMP 1F NO LDI 04000 YES, SET THE ABORT FLAG TAD SPLJOB DCA SPLJOB JMP 2F * 1H CDF %SPLQ SET TO THE FIELD OF THE QUEUE TADI XR GET A QUEUE ENTRY SPA CONTINUE CHECKING UNLESS ALREADY KILLED JMP 3F GET THE NEXT ENTRY AND =01717 REMOVE 'FOLD' OPTION BIT TAD UACSV SZA CLA A MATCH ? JMP 3F NO TADI XR YES, NOW COMPARE THE FILE NAMES TAD UPNTR1 SZA CLA A MATCH ? JMP 4F NO TADI XR YES, NEXT TAD UPNTR2 SZA CLA A MATCH ? JMP 5F NO TADI XR YES, NEXT TAD UPNTR3 SZA CLA A MATCH ? JMP 6F NO TADI XR YES, LAST TAD UTEMP2 SZA CLA A MATCH ? JMP 7F NO TAD XR TAD =-4 DCA UPNTR1 BACK UP TO FIRST WORD OF ENTRY TADI UPNTR1 GET THE ENTRY CLL RAL STL RAR SET THE ABORT FLAG DCAI UPNTR1 CDF %* RESET THE DATA FIELD 2H ION WE CAN BREATHE NOW ! DCA UACSV CLEAR USER AC ISZ UPCSV AND BUMP USER PC RET USPOOL RET USPOOL SAFETY * 3H INC XR BUMP THE QUEUE POINTER 4H INC XR 5H INC XR 6H INC XR 7H TAD XR CHECK FOR THE END OF THE QUEUE TAD =-(SPLQ+(32*5)-1) SPA CLA IF ZERO AT END ...RESET JMP 8F CONTINUE TAD =SPLQ-1 SET TO THE BEGINING OF THE QUEUE DCA XR 8H ISZ UCNTR CHECKED ALL QUEUE ENTRIES ? JMP 1B NO JMP 2B YES, FAKE A NORMAL RETURN * * ORGINAL CODE WAS THE NEXT LINE *USPLE2 INC UACSV DEVICE # 0 SPECIFIED * * NEW CODE ADDED HERE TO RETURN TO THE USER THE LINE PRINTER QUEUE * USPLE2 CAL  JMS SETDF SET THE DATA FIELD .CUIF LDI -1 SET AC = -1  TADI UPCSV GET THE AREA POINTED AT BY PC+1  DCA XR SAVE IN AUTO INDEX REG CDF %* RESET THE DATA FIELD TO FIELD 0 TADI =SPLQCTR GET THE SPOLL QUE ENTRY COUNTER SNA MUST BE NON ZERO TO READ OUT JMP 5F ZERO SO EXIT THE QUE  CIA NEGATE FOR THE NO OF ENTRIES TO MOVE DCA UTEMP CDF %SPLQE SET THE DATA FIELD TO THAT OF THE QUE TAD =-5 MUST RESET THE START BY 5 LOCATIONS TADI =SPLQE GET THE POINTER TO THE START OF THE QUE  DCA XR6 SAVE IT IN REG 6  TAD XR6 CHECK THE STARTING POINT TAD =-(SPLQ-1) IS IT LESS THAN THE START ? SMA CLA IF NEGITIVE THAN RESET JMP 1F TAD =(SPLQ-1)  DCA XR6 RESET TO START OF QUE ! 1H TAD XR6 CHECK TO SEE IF TOP EXCEEDED TAD =-(SPLQ+(32*5)+1) SPA CLA JMP 9F TAD =(SPLQ-1)  DCA XR6 RESET POINTER 9H TAD =-5 DCA UCNTR  INC XR6 BUMP AS WE ARE GOING AROUND TAD SPLJOB GET THE CURRENT STATUS OF THE JOB JMP 6F 2H TAD =-5 SET AC = -5 DCA UCNTR 3H CDF %SPLQ SET THE DATA FIELD TO THAT OF THE QUE  TADI XR6 6H .CUDF SET THE USER DATA FIELD  DCAI XR STASH IT CDF %* RESET THE DATA FIELD ISZ UCNTR MOVED ALL THE ENTRIES YET ? JMP 3B * * NOW CHECK FOR ALL THE ENTRIES IN THE QUE * ISZ UTEMP GOT ALL THE ENTRIES YET ? JMP 4F JMP 5F EXIT * * NOW CHECK IF THE END OF THE QUEUE HAS BEEN REACHED * 4H TAD XR6 TAD =-(SPLQ+(32*5)+1) SPA CLA JMP 2B TAD =(SPLQ-1) RESET THE POINTER TO THE START  TAD XR6 GET THE CURRNT POINTER POSITION  DCA XR6 JMP 2B * * BUMP THE PC FOR A NORMAL RETURN * 5H ISZ UPCSV INCREMENT FOR A NORMAL RETURN RET USPOOL RET USPOOL SAFETY * * ERROR EXIT * USPLE1 INC UACSV SPOOL QUEUE IS FULL RET USPOOL * * ENQUEUE A SPOOL REQUEST * PART ENSPOOL CAL TAD XR DCA UPNTR1 TADI UPNTR1 GET THE DEVICE WORD AGAIN AND =037 EXTRACT FOLD FLAG AND DEVICE NUMBER MULT64 MOVE TO LEFT BYTE TAD UJOB UJOB NUMBER TO RIGHT BYTE DCA UTEMP CDF %SPLQ TAD SPLQCTR GET THE SPOOL QUEUE ENTRY COUNTER TAD =-32 SNA CLA IS THE SPOOL QUEUE FULL ? JMP USPLE1 YES, RETURN AN ERROR CODE IN AC TAD SPLQF GET THE SPOOL QUEUE FILL POINTER TAD =-(SPLQ+(32*5)) SPA CLA TIME TO RESET THE POINTER ? JMP 2F NO TAD =SPLQ YES, RESET TO BOTTOM OF BUFFER DCA SPLQF 2H IOF TOUCHY CODE HERE INC SPLQCTR BUMP THE QUEUE COUNTER TAD UTEMP GET THE QUEUE ENTRY DCAI SPLQF INC SPLQF BUMP THE POINTER TAD =-4 DCA UCNTR 1H .CUDF TADI XR GET 2 CHARACTERS OF FILE NAME CDF %SPLQ DCAI SPLQF INC SPLQF BUMP THE POINTER ISZ UCNTR FINISHED STORING FILE NAME ? JMP 1B NO ISZ UPCSV BUMP USER PC TO INDICATE SPOOL ACCEPTED NOP SAFETY TAD SPLJOB GET THE SPOOL BUSY FLAG SZA CLA IS A SPOOL OPERATION IN PROGRESS ? RET USPOOL YES INC SPLJOB NO, BUMP BUSY FLAG TO PREVENT ANOTHER REQUEST CDF %TABLES TAD =JOBSPL-1 FROM SCHEDULING IT ALSO DCA XR DCAI XR CLEAR ITS DEVICE WAIT BITS LDI NRESW MAKE IT NON-RESIDENT, BUT RUNNABLE DCAI XR LDI UM CLEAR LINK, SET USER MODE, 'IF' = 'DF' = 0 DCAI XR DCAI XR SET STARTING ADDRESS = 0000 RET USPOOL * .NO:SPOOL ANOP * * 'LSF' SIMULATION - IOT 6661 * PART ULSF SUB SKIP ON LINE PRINTER FLAG ROOM 4 JMS UTSF JUST AN UNCONDITIONAL SKIP RET ULSF * * 'LSE' SIMULATION - IOT 6663 * PART ULSE SUB SKIP ON LINE PRINTER ERROR FLAG ROOM 4 JMS PRINTER:CK IS PRINTER ASSIGNED TO THIS JOB ? RET ULSE NO, TREAT AS A 'NOP' IOS LA8,SE IS THE HARDWARE ERROR FLAG SET ? RET ULSE NO ISZ UPCSV YES, BUMP USER PC RET ULSE RET ULSE SAFETY * * PRINTER CHECK SUBROUTINE * CHECK PRINTER ASSIGNMENT. IF PRINTER IS * AVAILABLE, IT IS ASSIGNED TO THIS JOB. * PART ROOM 13 PRINTER:CK SUB CDF %PRINTER TADI =PRINTER SNA IS PRINTER ASSIGNED ? JMP 2F NO, ASSIGN IT TO THIS JOB TAD UJOB YES, GET ITS JOB NUMBER SNA CLA IS IT ASSIGNED TO THIS JOB ? ERM 1H INC PRINTER:CK YES, BUMP RETURN POINTER 3H RET PRINTER:CK * 2H TAD =JOBS ALLOW ONLY LPTSPL JOB TO BE ASSIGNED CIA TAD UJOB ASSIGN PRINTER TO THIS JOB SZA CLA ONLY IF UJOB = LPTSPL CAN ASSIGNMENT BE MADE JMP 3B RETURN AND TREAT INSTRUCTION AS A NOP TAD UJOB CIA DCAI =PRINTER JMP 1B AIF V132,.V132 * * 'LPC' SIMULATION - IOT 6664 * 'LLS' SIMULATION - IOT 6666 * PART ULLS SUB LINE PRINTER LOAD SEQUENCE ROOM 4 JMS PRINTER:CK IS PRINTER ASSIGNED TO THIS JOB ? RET ULLS NO, TREAT AS A 'NOP' IOF SENSITIVE CODE HERE TADI =LMF GET LINE PRINTER MOTION FLAG SZA CLA IS PRINTER IN MOTION ? JMP ULLS2 YES, STORE CHARACTER IOS LA8,SE IS THE HARDWARE ERROR FLAG SET ? JMP 1F NO LDI 04000 YES, SET MOTION FLAG SO PRINTER DCAI =LMF CAN BE STARTED LATER JMP ULLS2 STORE THE CHARACTER IN BUFFER * 1H TAD UACSV NO, GET USER CHARACTER, SNA IS CHARACTER ZERO ? LDI 04000 YES, MAKE IT NON-ZERO IOT LA8,LS Print it, LDI 1 and set printer motion flag DCAI =LMF RET ULLS * ULLS2 TAD UACSV GET USER CHARACTER SNA IS CHARACTER ZERO ? LDI 04000 YES, MAKE IT NON-ZERO DCAI LBF STORE IT IN LINE PRINTER BUFFER LDI 1 UPDATE BUFFER POINTER TAD LBF AND =0177 TAD =LPB DCA LBF ISZI =LCNTR BUFFER FULL ? RET ULLS NO MQL CLEAR LOGIC WAIT BITS LDI LPTW YES, SET PRINTER WAIT .SUSPEND * AGO .PRINT * .V132 ANOP * * 'LLS' SIMULATION - IOT 6666 * PART ULLS SUB LINE PRINTER LOAD SEQUENCE ROOM 4 JMS PRINTER:CK IS PRINTER ASSIGNED TO THIS JOB ? RET ULLS NO, TREAT AS A 'NOP' TAD UACSV GET USER AC AND =0177 STRIP PARITY TAD =-0140 SMA IS CHARACTER GREATER THAN 0137 ? JMP ULLS3 YES, IGNORE IT TAD =0140-FF SNA IS IT A FORM FEED ? JMP UFF YES IAC IAC SNA IS IT A LINE FEED ? JMP ULF YES TAD =LF-040 SPA IS IT LESS THAN 040 ? JMP ULLS3 YES, IGNORE IT TAD =040+02000 RESTORE AND INSURE NON-ZERO JMP 1F * UFF LDI 0100 FORM FEED CONTROL CODE = 0101 ULF IAC RAL LINE FEED CONTROL CODE = 1 STL RAR SET CONTROL CODE BIT FLAG 1H MQL IOF SENSITIVE CODE HERE TADI =LMF CHECK PRINTER MOTION FLAG SZA CLA IS PRINTER IN MOTION ? JMP ULLS2 YES DSI LSRF IS THE RUN FLAG TRUE ? JMP ULLS2 NO MQA YES, GET THE CHARACTER SPA IS IT A CONTROL CHARACTER ? JMP 2F YES DI LPBC LOAD THE PRINTER BUFFER RET ULLS * 2H DI LIP INITIATE PRINTING DCAI =LMF AND SET MOTION FLAG DI LRLC REQUEST LOAD CYCLE RET ULLS * ULLS2 MQA GET THE CHARACTER DCAI LBF STORE IT IN THE PRINTER BUFFER LDI 1 UPDATE PRINTER BUFFER FILL POINTER TAD LBF AND =0177 TAD =LPB DCA LBF ISZI =LCNTR IS THE BUFFER FULL ? RET ULLS NO MQL YES, CLEAR LOGIC WAIT BITS LDI LPTW SET LINE PRINTER WAIT .SUSPEND * ULLS3 CAL THROW THE CHARACTER AWAY RET ULLS * .PRINT ANOP * AIF NO:MAGTAPE,.CONT * * 'LWCR' SIMULATION - IOT 6701 * PART ULWCR SUB LOAD WORD COUNT REGISTER .PARAM MTWC POINT TO MAGTAPE WORD COUNT TAD UACSV GET THE WORD COUNT FROM THE USER AC DCAI UPNTR1 SAVE IT DCA UACSV CLEAR THE USER AC RET ULWCR * * 'CWCR' SIMULATION - IOT 6702 * PART UCWCR SUB CLEAR THE WORD COUNT REGISTER .PARAM MTWC DCAI UPNTR1 RET UCWCR * * 'LCAR' SIMULATION - IOT 6703 * PART ULCAR SUB LOAD CURRENT ADDRESS REGISTER .PARAM MTCA POINT TO MAGTAPE CURRENT ADDRESS TAD UACSV GET THE CURRENT ADDRESS FROM USER AC DCAI UPNTR1 SAVE IT DCA UACSV CLEAR THE USER AC RET ULCAR * * 'CCAR' SIMULATION - IOT 6704 * PART UCCAR SUB CLEAR CURRENT ADDRESS REGISTER .PARAM MTCA DCAI UPNTR1 RET UCCAR * * 'LCMR' SIMULATION - IOT 6705 * PART ULCMR SUB LOAD COMMAND REGISTER .PARAM MTCM POINT TO MAGTAPE COMMAND TAD UACSV GET THE COMMAND FROM USER AC DCAI UPNTR1 SAVE IT DCA UACSV CLEAR THE USER AC RET ULCMR * * 'LFGR' SIMULATION - IOT 6706 * IN THIS SIMULATION, WHEN THE FUNCTION AND GO * COMMAND HAS BEEN GIVEN TO THE HARDWARE, OR IF THE * MAGTAPE REQUEST HAS BEEN PLACED ON THE MAGTAPE * QUEUE, THE MTA WAIT BIT IS SET AND THE JOB IS * SUSPENDED. * PART ULFGR SUB LOAD 'FUNCTION AND GO' REGISTER .PARAM MTCM POINT TO THE COMMAND TADI UPNTR1 GET THE COMMAND AND =07000 EXTRACT THE TRANSPORT NUMBER CLL RTL ROTATE TO L O BITS RTL TAD =MT:A0 DCA UPNTR2 TADI UPNTR2 CHECK ASSIGNMENT SZA IS THE TRANSPORT ASSIGNED ? TAD UJOB YES SZA CLA IS IT ASSIGNED TO THIS JOB ? JMP ULFGR2 NO, TREAT THIS AS A CONTROLLER BUSY TAD UJOB THIS TRANSPORT IS AVAILABLE TO THIS JOB CIA DCAI UPNTR2 ASSIGN/RE-ASSIGN IT TO THIS JOB CDF %MTJOB IOF SENSITIVE CODE HERE ! TADI =MTJOB LOOK AT THE MAGTAPE BUSY FLAG SNA CLA IS THE CONTROLLER BUSY ? JMP 1F NO TAD UJOB YES, GET THE CURRENT JOB NUMBER DCAI MTQF PUT IT ON THE MAGTAPE QUEUE LDI 1 UPDATE THE QUEUE FILL POINTER TAD MTQF AND =3 TAD =MTQB DCA MTQF MQL CLEAR LOGIC WAIT BITS LDI MTAW SET THE MAGTAPE WAIT BIT .SUSPEND * ULFGR2 TAD =MTMSR-MTCM TAD UPNTR1 DCA UPNTR1 POINT TO MAGTAPE MAIN STATUS TAD =04001 SET ERROR AND CONTROLLER BUSY BITS DCAI UPNTR1 DCA UACSV CLEAR USER AC RET ULFGR * 1H DI CLT CLEAR THE TRANSPORT TAD UJOB NOTE THE MAGTAPE JOB NUMBER DCAI =MTJOB CDF %TABLES TAD UACSV GET THE MAGTAPE FUNCTION/GO WORD AND =07000 EXTRACT THE FUNCTION CLL RTL ROTATE TO BITS 9 - 11 RTL TAD =-4 SNA IS IT A WRITE FUNCTION ? JMP 2F YES IAC SNA IS IT A READ/COMPARE FUNCTION ? JMP 2F YES IAC SZA CLA IS IT A READ FUNCTION ? JMP 3F NO, THERE IS NO NEED TO SWAP IN A FIELD 2H TAD =077 SET SEARCH MASK MQL TADI UPNTR1 GET THE COMMAND AGAIN AND =070 EXTRACT DESIRED TRANSFER FIELD TAD UJOB ADD JOB NUMBER .FINDF FIND THE FIELD SNA IS THE TRANSFER FIELD RESIDENT ? JMP ULFGR3 NO TAD =-FIELD0 YES, COMPUTE ITS PHYSICAL FIELD NUMBER CLL RAL ROTATE TO BITS 6 - 8 RTL 3H MQL DSI SKTR IS THE TRANSPORT READY ? JMP ULFGR4 NO, BACK UP USER PC AND TRY AGAIN LATER TADI UPNTR1 GET THE COMMAND AGAIN INC UPNTR1 BUMP TO POINT TO WORD COUNT AND =07407 EXTRACT TRANSPORT, PARITY AND BPI TAD =0300 ADD INTERRUPT ENABLE BITS MQA BRING UP THE PHYSICAL TRANSFER FIELD DI LCMR LOAD THE COMMAND INTO THE HARDWARE TADI UPNTR1 GET THE WORD COUNT INC UPNTR1 BUMP TO POINT TO CURRENT ADDRESS DI LWCR TADI UPNTR1 GET THE CURRENT ADDRESS DI LCAR TAD UACSV GET THE FUNCTION/GO WORD AND =07700 DELETE THE EMA INCREMENT BIT, IF PRESENT DI LFGR START THE TRANSPORT DCA UACSV CLEAR THE USER AC MQL CLEAR LOGIC WAIT BITS LDI MTAW SET THE MAGTAPE WAIT BIT .SUSPEND * * MAGTAPE NON-RESIDENT TRANSFER FIELD HANDLER * ULFGR3 TADI UPNTR1 GET THE COMMAND WORD AGAIN MQL .FINDM SNA ANY MEMORY AVAILABLE ? JMP ULFGR4 NO, BACK UP USER PC AND TRY AGAIN LATER DCA UFPNTR YES, SAVE ITS FIELD INFO WORD ADDRESS MQA GET THE COMMAND WORD AND =070 EXTRACT DESIRED TRANSFER FIELD TAD =LOCK ADD THE FIELD 'LOCK' BIT CDF %MTJOB TADI =MTJOB ADD THE JOB NUMBER DCAI UFPNTR .SWAPF LDI -1 BACK UP USER PC AND WAIT FOR NEXT EXECUTION TAD UPCSV DCA UPCSV CDF %MTJOB DCAI =MTJOB CLEAR MT JOB MQL CLEAR LOGIC WAIT BITS .SUSPEND * ULFGR4 LDI -1 SWAP OUT THIS JOB AND TRY AGAIN LATER TAD UPCSV DCA UPCSV CDF %MTJOB DCAI =MTJOB CLEAR MT JOB LDI NRESW SWAPPING OUT WILL KILL TIME MQL .SUSPEND * * 'RWCR' SIMULATION - IOT 6711 * PART URWCR SUB CLEAR AC AND READ WORD COUNT .PARAM MTWC TADI UPNTR1 GET THE USER'S WORD COUNT REGISTER DCA UACSV RET URWCR * * 'CLT' SIMULATION - IOT 6712 * PART UCLT SUB CLEAR TRANSPORT'S MASTER REGISTERS .PARAM MTCM-1 TAD UPNTR1 USE AUTO-INDEX DCA XR DCAI XR CLEAR MAGTAPE COMMAND DCAI XR CLEAR MAGTAPE WORD COUNT DCAI XR CLEAR MAGTAPE CURRENT ADDRESS DCAI XR CLEAR MAGTAPE MAIN STATUS DCAI XR CLEAR MAGTAPE FUNCTION RET UCLT * * 'RCAR' SIMULATION - IOT 6713 * PART URCAR SUB CLEAR AC AND READ THE CURRENT ADDRESS .PARAM MTCA TADI UPNTR1 GET THE USER'S MT CURRENT ADDRESS DCA UACSV RET URCAR * * 'RMSR' SIMULATION - IOT 6714 * PART URMSR SUB CLEAR AC AND READ MAIN STATUS REGISTER .PARAM MTMSR POINT TO THE USER'S MAIN STATUS REGISTER TADI UPNTR1 GET THE LAST STATUS DCA UACSV LOAD IT INTO THE USER AC RET URMSR * * 'RCMR' SIMULATION - IOT 6715 * PART URCMR SUB CLEAR AC AND READ COMMAND REGISTER .PARAM MTCM TADI UPNTR1 DCA UACSV RET URCMR * * 'RFSR' SIMULATION - IOT 6716 * PART URFSR SUB CLEAR AC AND READ RUNCTION AND .PARAM MTFN 2ND STATUS REGISTER TADI UPNTR1 DCA UACSV RET URFSR * * 'SKEF' SIMULATION - IOT 6721 * PART USKEF SUB SKIP IF ERROR FLAG IS SET .PARAM MTMSR POINT TO THE USER'S MAIN STATUS REGISTER TADI UPNTR1 GET THE LAST MAIN STATUS ROOM 6 SPA CLA IS THE ERROR FLAG SET ? ISZ UPCSV YES, BUMP USER PC RET USKEF RET USKEF SAFETY * * 'SKJD' SIMULATION - IOT 6723 * USKJD EQU UTSF SKIP WHEN JOB DONE * UNCONDITIONAL SKIP DUE TO THE FACT THE * USER IS SUSPENDED UNTIL THE JOB IS DONE * * 'SKTR' SIMULATION - IOT 6724 * USKTR EQU UTSF SKIP IF TAPE UNIT READY * UNCONDITIONAL SKIP DUE TO THE FACT THAT * ULFGR INSURES TAPE UNIT READY * * 'CLF' SIMULATION - IOT 6725 * UCLF EQU UCLT CLEAR TRANSPORT CONTROLLER AND * MASTER REGISTERS * .CONT ANOP * * SIMULATION FOR AN ILLEGAL IOT * PART UBAD SUB JUST TREAT AS A 'NOP' RET UBAD TITLE USER IOT PROCESSOR SUBROUTINES * * SET 'CUDF' SUBROUTINE TO USER 'DF' * SETDF SUB TAD UFLSV GET USER FLAGS AND =07 EXTRACT USER PHYSICAL 'DF' CLL RAL RTL TAD =KCDF DCA UCUDF RET SETDF * * SAVE VITAL REGISTERS AND RETURN ADDRESS FOR EXEC SPECIAL WAIT * ONE RETURN ADDRESS PLUS SIX (MAX) ITEMS MAY BE SAVED. TO * INCREASE ITEM CAPACITY, INCREASE VALUE OF 'JMSAVE' BY 2 FOR * EACH ADDITIONAL ITEM TO BE ADDED. ANY ITEM MAY BE SAVED * EXCEPT XR, XR1 AND UPNTR3 WHICH ARE USED IN THIS SUBROUTINE. * PART UJMS HLT CDF %* MQL SAVE THE LOGIC WAIT BIT(S) LDI -1 TAD UJMS DCA XR TAD UJOB GET THE JOB NUMBER MULT64 TAD =JOB1-USER:ST+JMSAVE-1 DCA XR1 TADI XR GET THE RETURN ADDRESS DCAI XR1 SAVE IT 1H TADI XR GET THE VITAL REGISTER LOCATIONS SNA END OF LIST ? JMP 2F YES DCA UPNTR3 TAD UPNTR3 DCAI XR1 SAVE THE LOCATION TADI UPNTR3 DCAI XR1 SAVE THE CONTENTS OF THE LOCATION JMP 1B * 2H TAD =EXECW MQOR BRING UP ANY OTHER LOGIC WAIT BITS MQL .SUSPEND * * RELEASE ALL ASSIGNED DEVICES * * -- ENTERING -- -- EXITING -- * (INT) UNDEFINED OFF * (DF) ANYTHING %* * (L) ANYTHING UNDEFINED * (AC) 0000 000 * (MQ) ANYTHING UNCHANGED * PART RELEASE SUB IOF NO INTERRUPTS WHILE CHECKING ASSIGNMENTS TAD =JSYS POINT TO ASSIGNMENT TABLE DCA UPNTR1 LDI -TERMS DCA UCNTR CDF %TABLES 1H TADI UPNTR1 GET A JSYS ASSIGNMENT TAD UJOB SNA CLA WAS IT ASSIGNED TO THIS JOB ? DCAI UPNTR1 YES, RELEASE IT INC UPNTR1 BUMP TO NEXT JSYS ASSIGNMENT LOCATION ISZ UCNTR CHECKED THE WHOLE TABLE ? JMP 1B NO CDF %PRINTER AIF NO:PTR,.PTR TAD UJOB RELEASE DEVICES ASSIGNED TO THIS JOB TADI =READER SNA CLA READER ASSIGNED ? DCAI =READER YES, RELEASE IT .PTR ANOP AIF NO:PTP,.PTP TAD UJOB TADI =PUNCH SNA CLA PUNCH ASSIGNED ? DCAI =PUNCH YES, RELEASE IT .PTP ANOP TAD UJOB TADI =PRINTER SNA CLA PRINTER ASSIGNED ? DCAI =PRINTER YES, RELEASE IT CDF %TABLES AIF NO:RKO5,.RK05 TAD =-6 INITIALIZE TO CHECK ON RK05 LOGICAL DCA UCNTR DEVICE ASSIGNMENTS TAD =RK:A1 DCA UPNTR1 SKP 2H INC UPNTR1 BUMP TO POINT TO NEXT LOGICAL DEVICE TADI UPNTR1 TAD UJOB SNA CLA ASSIGNED TO THIS JOB ? DCAI UPNTR1 YES, RELEASE IT ISZ UCNTR CHECK ALL RK05'S ? JMP 2B NO .RK05 ANOP AIF NO:DECTAPE,.DECTAPE TAD =-8 INITIALIZE TO CHECK DECTAPE ASSIGNMENTS DCA UCNTR TAD =DT:A0 DCA UPNTR1 SKP 3H INC UPNTR1 BUMP TO POINT TO NEXT LOGICAL DEVICE TADI UPNTR1 TAD UJOB SNA CLA ASSIGNED TO THIS JOB ? DCAI UPNTR1 YES, RELEASE IT ISZ UCNTR CHECK ALL TC08 DECTAPES ? JMP 3B NO .DECTAPE ANOP AIF NO:MAGTAPE,.MAGTAPE TAD =-8 INITIALIZE TO CHECK MAGTAPE ASSIGNMENTS DCA UCNTR TAD =MT:A0 DCA UPNTR1 SKP 4H INC UPNTR1 BUMP TO POINT TO NEXT LOGICAL DEVICE TADI UPNTR1 TAD UJOB SNA CLA ASSIGNED TO THIS JOB ? DCAI UPNTR1 YES, RELEASE IT ISZ UCNTR CHECKED ALL TM8E MAGTAPES ? JMP 4B NO .MAGTAPE ANOP RET RELEASE * * .CLEAR * CLEAR A FIELD 1 BUFFER * * -- ENTERING -- -- EXITING -- * (INT) OFF/ON OFF * (DF) ANYTHING %* * (L) ANYTHING UNCHANGED * (AC) BUFFER ADDRESS -1 0000 * (MQ) -(BUFFER SIZE) UNCHANGED * MODIFIED: XR2, UCNTR * PART UCLEAR SUB CLEAR A FIELD 1 BUFFER DCA XR2 CDF %BUFFERS MQA GET THE WORD COUNT DCA UCNTR IOF 1H DCAI XR2 CLEAR THE BUFFER ISZ UCNTR FINISHED ? JMP 1B NO RET UCLEAR * * .FINDM * FIND AN AVAILABLE MEMORY FIELD * * -- ENTERING -- -- EXITING -- * (INT) OFF/ON OFF * (DF) ANYTHING %* * (L) ANYTHING UNCHANGED * (AC) 0000 0000 IF NO MEMORY AVAILABLE * ADDR OF FIELD INFO IF MEMORY AVAILABLE * (MQ) ANYTHING UNCHANGED * MODIFIED: XR2, UCNTR * PART UFINDM SUB TAD =FIELD1 INITIALIZE DCA XR2 TAD =-6 DCA UCNTR CDF %FIELD2 IOF 1H TADI XR2 LOOK FOR AN AVAILABLE FIELD SNA CLA FOUND ONE YET ? JMP 2F YES ISZ UCNTR LOOKED AT ALL FIELDS YET ? JMP 1B NO SKP 2H TAD XR2 GET THE ADDRESS OF THE FIELD INFO WORD CDF %* RET UFINDM * * .FINDF * FIND A FIELD FROM INFO CONTAINED IN THE AC AND MQ * * -- ENTERING -- -- EXITING -- * (INT) OFF/ON OFF * (DF) ANYTHING %* * (L) ANYTHING UNDEFINED * (AC) MATCH BIT PATTERN 0000 IF NO MATCH FOUND * ADDR OF FIELD INFO IF MATCH FOUND * (MQ) MATCH MASK UNCHANGED * MODIFIED: XR2, UTEMP, UCNTR * PART UFINDF SUB CIA DCA UTEMP SAVE NEGATED MATCH BIT PATTERN TAD =FIELD1 DCA XR2 TAD =-6 DCA UCNTR CDF %FIELD2 IOF 1H MQA GET THE MASK ANDI XR2 MASK THE FIELD INFO WORD TAD UTEMP SNA CLA A MATCH ? JMP 2F YES ISZ UCNTR CHECKED ALL FIELD INFO WORDS ? JMP 1B NO SKP 2H TAD XR2 GET THE ADDR OF THE FIELD INFO WORD CDF %* RET UFINDF * * .SWAPF * SWAP A FIELD TO/FROM DISK SWAP BLOCKS * * -- ENTERING -- -- EXITING -- * (INT) OFF/ON OFF * (DF) ANYTHING %* * (L) ANYTHING UNDEFINED * (AC) 0000 IF READ 0000 * 4000 IF WRITE * (MQ) ANYTHING QUEUE JOB NUMBER * FPNTR ADDR OF AFFECTED * FIELD INFO WORD * MODIFIED: FPNTR * PART USWAPF SUB CLL RAL READ/WRITE BIT TO LINK TAD UFPNTR GET THE FIELD INFO WORD ADDRESS CDF %FPNTR IOF SENSITIVE CODE HERE DCAI =FPNTR CDF %* RAR GET THE READ/WRITE BIT JMSX QSWAPF RET USWAPF * * .EXDISK * ENQUEUE A DISK REQUEST * * -- ENTERING -- -- EXITING -- * (INT) OFF/ON OFF * (DF) ANYTHING %* * (L) ANYTHING UNDEFINED * (AC) 0000 0000 * (MQ) ANYTHING QUEUE JOB NUMBER * * MODIFIED: XR, QFUNC, QADDR, QBLOCK * PART UEXDISK SUB CDF %QFUNC TAD =QFUNC-1 DCA XR TAD UUFUNC GET THE FUNCTION WORD IOF SENSITIVE CODE DCAI XR STORE IT TAD UADDR GET THE MEMORY ADDRESS DCAI XR STORE IT TAD UBLOCK GET THE DISK BLOCK NUMBER DCAI XR STORE IT CDF %* JMSX QEXDISK QUEUE THE DISK REQUEST RET UEXDISK * * .SWAPJ * SWAP OUT ALL JOBS EXCEPT THE CURRENT JOB * * -- ENTERING -- -- EXITING -- * (INT) OFF/ON OFF * (DF) ANYTHING %* * (L) ANYTHING UNDEFINED * (AC) 0000 0000 * (MQ) ANYTHING UNDEFINED * * MODIFIED: UCNTR, UFPNTR, UTEMP, UPNTR1 * PART USWAPJ SUB TAD =-6 INITIALIZE TO CHECK ALL INFO WORD DCA UCNTR TAD =FIELD2 DCA UFPNTR DCA UTEMP IOF 1H CDF %FIELD2 TADI UFPNTR GET A FIELD INFO WORD AND =LOCK+N:EXIST SZA CLA IS IT LOCKED OR NON-EXISTANT ? JMP 4F YES, IGNORE IT TADI UFPNTR NO, GET IT AGAIN AND =07 EXTRACT THE JOB NUMBER CIA TAD UJOB SNA CLA IS IT THE CURRENT JOB ? JMP 4F YES, IGNORE IT LDI 04000 .SWAPF INC UTEMP BUMP 'SWAPPED A FIELD' FLAG CDF %FIELD2 TADI UFPNTR GET THE FIELD INFO WORD AGAIN AND =07 EXTRACT THE JOB NUMBER MULT64 TAD =JOB1-USER:ST+LWAIT DCA UPNTR1 TAD =NRESW+REALW SET NON-RESIDENT AND REAL TIME WAITS MQL CDF %TABLES TADI UPNTR1 GET CURRENT WAITS, IF ANY MQOR DCAI UPNTR1 INC UPNTR1 BUMP POINTER TO JOB FLAGS CDF %FPNTR2 TADI UFPNTR GET THE FIELD INFO WORD SMA CLA IS IT AN INSTRUCTION FIELD ? JMP 2F NO AND =070 EXTRACT THE USER RELATIVE FIELD MQL CDF %TABLES TADI UPNTR1 GET THE JOB FLAGS AND =07707 REMOVE PHYSICAL FIELD NUMBER MQA BRING UP RELATIVE FIELD DCAI UPNTR1 REPLACE THE JOB FLAGS CDF %FIELD2 2H LDI DF ANDI UFPNTR LOOK AT THE FIELD INFO WORD DF BIT SNA CLA IS IT SET ? JMP 3F NO TADI UFPNTR YES, GET THE FIELD INFO WORD AND =070 EXTRACT THE RELATIVE FIELD CLL RAR RTR MQL CDF %TABLES TADI UPNTR1 GET THE JOB FLAGS WORD AND =07770 REMOVE THE PHYSICAL DF VALUE MQA BRING UP THE RELATIVE DF DCAI UPNTR1 SAVE THE NEW JOB FLAGS 3H CDF %TABLES LDI RESTART-FLAGS-1 TAD UPNTR1 DCA XR SET INDEX TAD =-QUANTUM*JOBS*2 DCAI XR Allow plenty of time for many accesses LDI -1 DCAI XR CDF %FIELD2 DCAI UFPNTR RELEASE THE PHYSICAL MEMORY FIELD 4H INC UFPNTR BUMP THE FIELD INFO WORD POINTER ISZ UCNTR CHECKED ALL FIELDS YET ? JMP 1B NO CDF %* TAD UTEMP YES, GET 'SWAPPED A FIELD' FLAG SNA CLA WAS AT LEAST ONE FIELD SWAPPED OUT ? INC USWAPJ NO, BUMP RETURN POINTER RET USWAPJ AIF PDP8E.OR.(PDP8I.AN.EAE),.MQ * * SOFTWARE SIMULATION OF CERTAIN 'MQ' FUNCTIONS * UMQOR SUB 'OR' AC WITH 'MQ' DCA CPU:TEM STORE AC TEMPORARILY TAD CPU:MQ CMA AND CPU:TEM TAD CPU:MQ RET UMQOR * UCAM SUB CLEAR AC AND 'MQ' CLA DCA CPU:MQ RET UCAM * USWP SUB 'SWP' AND AND 'MQ' DCA CPU:TEM SAVE AC TEMPORARILY TAD CPU:MQ DCA CPU:AC TAD CPU:TEM DCA CPU:MQ TAD CPU:AC RET USWP * .MQ ANOP TITLE TIMESHARE RESIDENT OS/8 * DSEC * PART OS8RES JMPI (*+1).AN.0177 GET THE PASSWORD FIRST DC GETPW-OS8RES ICLEAR DCAI CLPNTR.AN.0177 DESTROY OS/8 INITIALIZATION CODE ISZ CLCNTR.AN.0177 AND CLEAR USER FIELD ZERO JMP (*-2).AN.0177 DCA CLPNTR.AN.0177 BOMB THE AUTO-INDEX JMPI (*+1).AN.0177 START OS/8 DC 07605 DESTRUCTIVE ENTRY CLCNTR DC -(07600-((*+2).AN.0177)) CLPNTR DC *.AN.0177 AUTO-INDEX 011 DC 0177 INDEX CONSTANT FOR START OF FIELD 0 RES DC 07577 INDEX CONSTANT FOR START OF FIELD 1 RES DC (DHRTAB-1).AN.0177 DC ((DHRTAB-1).AN.0177)+07600 FIELD 1 LOADING ADDRESS AS 3,KHLT OS8L DI DATE GET THE OS/8 DATE DCA OS8D.AN.0177 STORE IT OS8LC TADI $012 MOVE THE CODE DCAI $013 TADI $014 CDF 1 DCAI $015 CDF 0 TAD $013 SZA CLA FINISHED ? JMP OS8LC.AN.0177 NO, CONTINUE LOADING JMP ICLEAR.AN.0177 YES, NOW CLEAR USER FIELD ZERO AS 10,07402 * * DEVICE HANDLER RESIDENCY TABLE * DHRTAB DC 07607 SYS DC 07607 DSK AS 015 * OS8D AS 1 DATE WORD * * LOAD THE KEYBOARD MONITOR * DC 06202,04207,01000,0,7,07746 DC 06203,05677,0400 * * USR CALL AND RETURN AREA * DC 0,03340,06214,01275,03336,06201,01674,07010 DC 06211,07630,05321,06202,04207,05010,0,027 DC 07402,06202,04207,0610,0,013,07402,05020 DC 06202,04207,01010,0,027,07402,0,05700,0 * * USER DEVICE NAME TABLE * AS 15 * * DEVICE CONTROL WORD TABLE * DCWTAB DC 04570 SYS DC 04570 DSK AS 13 * * LAST WORD RESERVED FOR FUTURE OS/8 EXPANSION * AS 1 * * END OF TIMESHARE FIELD 1 RESIDENT OS/8 * * FIELD 0 RESIDENT OS/8 * * OS/8 NON-DESTRUCTIVE ENTRY * OS80 DC 04207,05000,0,033,07602 * * OS/8 DESTRUCTIVE ENTRY * DC 06213,05267 * OS8ENTRY INC DEVNUM DEV # 1 ENTRY INC DEVNUM DEV # 2 INC DEVNUM DEV # 3 INC DEVNUM DEV # 4 INC DEVNUM DEV # 5 INC DEVNUM DEV # 6 INC DEVNUM DEV # 7 INC DEVNUM DEV # 10 INC DEVNUM DEV # 11 INC DEVNUM DEV # 12 INC DEVNUM DEV # 13 INC DEVNUM DEV # 14 INC DEVNUM DEV # 15 INC DEVNUM DEV # 16 INC DEVNUM DEV # 17 CLA TAD DEVNUM CIA RELATIVE ADDRESS 0030 TAD K15 DCA 3F SAVE DEVICE NUMBER TAD 3F TAD TAD:ENTRY DCA 1F TO ENABLE GETTING RETURN ADDRESS LDI 02000 TAD 1F DCA 2F TO REPLACE 'INC DEVNUM' INST 1H HLT DCA 4F SAVE CALLING ADDRESS TAD INC:DEVNUM REPLACE 'INC DEVNUM' INST 2H HLT DCA DEVNUM CLEAR FOR NEXT CALL DC FSD FILE STRUCTURED DEVICE HANDLER IOT 3H HLT DEVICE NUMBER STORED HERE 4H DC 0 CALLING ADDRESS STORED HERE * DEVNUM DC 0 K15 DC 15 INC:DEVNUM INC DEVNUM TAD:ENTRY TAD OS8ENTRY-1 RELATIVE ADDRESS 0054 * AS OS80+0144-*,07402 * * CURRENT STARTING ADDRESS * DC 06203 DC 0200 * * JOB STATUS WORD * AS 1 * * LAST BLOCK ACCESSED BY SYSTEM DEVICE HANDLER * AS 1 * * DATA BREAK LOCATIONS * AS 6,07402 * * PROGRAM SET UP AREA * DC 07607,04756,03700,0,0222,07402,05372 DC 04207,0300,07000,035,07402,06203,06042,05775,0200,0 * * HIGH ORDER DATE AND CORE INFORMATION WORD * CORINFO DC 0 H O DATE AND NUMBER OF FIELDS * * PASSWORD PROCESSING CONSTANTS * PW:CR DC CR PW:LF DC LF-CR PW:ANG DC ('>.AN.0177)-LF PW:PO1 DC PASSPNTR-OS8RES-1 PW:177 DC 0177 PW:MCR DC -CR * * PASSWORD PROCESSING TEMPORARIES * PWPNTR HLT POINTER TO THIS JOB'S PASSWORD PWTEMP HLT TEMPORARY FOR HOLDING USER'S RESPONSE * ADDED CODE TO OUTPUT A SHORT MESSAGE INSTEAD OF THE ANGLE * ON LOGIN OTXT SUB 1H TADI OTXT SNA RET OTXT EXIT INC OTXT JMS WRTTY JMP 1B * WRTTY SUB IOS TTY1,SF JMP *-1 IOT TTY1,LS CLA RET WRTTY * * * * PASSWORD SEQUENCE * GET THE PASSWORD FROM THE USER. IF IT IS CORRECT, CLEAR * USER FIELD 0 AND START OS/8. IF IT IS INCORRECT, LOG-OFF * WITHOUT GIVING A MESSAGE. THE PASSWORD IS NOT ECHOED. * PART GETPW CAL TAD PW:CR IOT TTY1,LS TAD PW:LF IOT TTY1,LS IOT TTY1,LS * TAD PW:ANG * IOT TTY1,LS CLL CLA .OTXT DI TASK GET THE JOB NUMBER TAD PW:PO1 DCA PWPNTR TADI PWPNTR GET THE PASSWORD ADDRESS DCA PWPNTR 1H IOT KEY1,LS GET A USER RESPONSE CHARACTER AND PW:177 STRIP PARITY DCA PWTEMP TADI PWPNTR GET A CHARACTER OF PASSWORD INC PWPNTR BUMP THE POINTER SNA END OF PASSWORD JMP 3F YES CIA TAD PWTEMP COMPARE WITH USER RESPONSE CHARACTER SNA CLA A MATCH ? JMP 1B YES, GET NEXT CHARACTER 2H DI IHLT NO, JUST HALT WITH NO MESSAGE * 3H TAD PWTEMP END OF PASSWORD -- CHECK FOR USER CR TAD PW:MCR SZA CLA DID USER TYPE A CR ? JMP 2B NO, JUST HALT JMP OS8L.AN.0177 YES, NOW LOAD RESIDENT TIMESHARE OS/8 * * PASSWORD POINTER LIST * PASSPNTR AS TERMS,PASSWORDS-OS8RES PASSWORD POINTER LIST * * PASSWORD'S STORAGE AREA * PASSWORDS DC 0 THIS AREA IS SET UP BY 'INITIALIZE' * AS ((*+0400).AN.07400)-*,KHLT TITLE LEGAL IOT LIST TABLE * * THESE IOT'S ARE (HOPEFULLY) ARRANGED IN ORDER OF THEIR * FREQUENCY OF USE WITH THE MOST USED IOT'S AT THE START * OF THE LIST. * IOT1 .IOT 06034,UKRS IOT KEY,KRS .IOT 06666,ULLS IOT LA8,LLS .IOT 06031,UKSF IOS KEY,KSF .IOT 06036,UKRB IOT KEY,KRB .IOT 06046,UTLS IOT TTY,TLS .IOT 06032,UKCC IOT KEY,KCC AIF NO:PTR,.PTR .IOT 06011,URSF IOS PR8,RSF .IOT 06016,URRC IOT PR8,RRC .IOT 06012,URRB IOT PR8,RRB .IOT 06014,URFC IOT PR8,RFC .PTR ANOP .IOT 06214,URDF RDF AIF NO:PTP,.PTP .IOT 06026,UPLS IOT PP8,PLS .PTP ANOP .IOT 06110,UFSD DI FSD .IOT 06224,URIF RIF AIF NO:MAGTAPE,.MAG .IOT 06701,ULWCR LWCR .IOT 06703,ULCAR LCAR .IOT 06705,ULCMR LCMR .IOT 06706,ULFGR LFGR .IOT 06712,UCLT CLT .IOT 06721,USKEF SKEF .IOT 06723,USKJD SKJD .IOT 06724,USKTR SKTR .IOT 06714,URMSR RMSR .MAG ANOP .IOT 06663,ULSE IOS LA8,LSE AIF NO:SPOOL,.SPOOL .IOT 06660,USPOOL IOT LA8,SPOOL .SPOOL ANOP .IOT 06007,UCAF CAF AIF NO:EAE.OR.PDP8I,.EAE .IOT 06006,USGT SGT .EAE ANOP AIF NO:PTP,.PTP .IOT 06021,UPSF IOS PP8,PSF .IOT 06024,UPLS IOT PP8,PPC .PTP ANOP .IOT 06041,UTSF IOS TTY,TSF .IOT 06044,UTLS IOT TTY,TPC .IOT 06107,UTSSS DSI TSSS .IOT 06111,UTSS DSI TSS .IOT 06112,USSR DI SSR .IOT 06113,URCR DI RCR .IOT 06114,UTOD DI TOD .IOT 06115,UDATE DI DATE .IOT 06116,UTASK DI TASK .IOT 06117,UIHLT DI IHLT .IOT 06120,USYN DI SYN .IOT 06121,USTM DI STM .IOT 06122,URAN DI RAN .IOT 06123,UALONE DI ALONE .IOT 06124,UTALK DSI TALK .IOT 06125,USPR DI SPR .IOT 06661,ULSF IOS LA8,LSF .IOT 06664,ULLS IOT LA8,LPC .IOT 06264,UCUF CUF AIF NO:MAGTAPE,.MAG .IOT 06702,UCWCR CWCR .IOT 06704,UCCAR CCAR .IOT 06711,URWCR RWCR .IOT 06713,URCAR RCAR .IOT 06715,URCMR RCMR .IOT 06716,URFSR RFSR .IOT 06725,UCLF CLF .MAG ANOP IOTBAD .IOT 0,UBAD ILLEGAL IOT * * IOT SERVICE SUBROUTINE POINTER TABLE * IOT2 .GEN TITLE EXECUTIVE TABLES * TABLES QUT %*,* * * FILE STRUCTURED HANDLERS TABLE OF DEVICES * DEV:TAB DC SYS DEVICE: SYS DC SYS DEVICE: DSK AS 13 THE REMAINDER OF THE TABLE IS * FILLED DURING INITIALIZATION * THE FINAL NULL IS A SENTINEL * * SYSTEM DEVICE ASSIGNMENT TABLE * JSYS AS TERMS * AIF NO:MAGTAPE,.MAGTAPE * * TM8-E MAGTAPE TRANSPORT ASSIGNMENT LOCATIONS * MT:A0 AS 8 INITIALLY NONE ASSIGNED * .MAGTAPE ANOP * AIF NO:DECTAPE,.DECTAPE * * DECTAPE UNIT ASSIGNMENT LOCATIONS * DT:A0 AS 8 INITIALLY NONE ASSIGNED * * DECTAPE TRANSPORT CURRENT BLOCK TABLE * DTBTAB AS 8 INITIALLY BLOCK 0 ON ALL TRANSPORTS * .DECTAPE AIF NO:FLOPPY,.FLOPPY * * RX01 FLOPPY DISK ASSIGNMENT LOCATIONS * RXA0 AND R0 ARE PHYSICALLY THE SAME FLOPPY DISK DRIVE. * THE SAME IS TRUE FOR RXA1 AND R1. THE UNITS ARE ASSIGNED * BY PHYSICAL DRIVE NUMBER AND NOT BY DEVICE NAME. * RX:A0 AS 2 INITIALLY NONE ASSIGNED * .FLOPPY ANOP * AIF NO:RKO5,.RK05 * * RK05 LOGICAL DEVICE ASSIGNMENT LOCATIONS * RK:A1 AS 2*3 INITIALLY NONE ASSIGNED * .RK05 ANOP * * MAX DAYS PER MONTH TABLE * DAYTAB QUT %*,*-1 DC -(31.LS.3) JANUARY DC -(28.LS.3) FEBRUARY DC -(31.LS.3) MARCH DC -(30.LS.3) APRIL DC -(31.LS.3) MAY DC -(30.LS.3) JUNE DC -(31.LS.3) JULY DC -(31.LS.3) AUGUST DC -(30.LS.3) SEPTEMBER DC -(31.LS.3) OCTOBER DC -(30.LS.3) NOVEMBER DC -(31.LS.3) DECEMBER AS 2 SAFETY TITLE EXECUTIVE TEXT MESSAGES * * TEXT MESSAGES * A LEFT ARROW '_' WILL OUTPUT A CR/LF COMBO * HALT EQU *-1 TEXT \_HALT AT @\ * OP7EAE EQU *-1 TEXT \_EAE INST BETWEEN CIF & JMS OR JMP. PROGRAM STOPPED AT @\ TITLE JOB STATUS AREAS * * USER STATUS AREAS * * JOB 1 STATUS AREA * JOB1 DC 0 DEVICE WAIT BITS DC HALTW LOGIC WAIT BITS DC 0 FLAGS DC 0 PC DC 0 AC DC 0 MQ DC 0 SC AS 2 SR FLAG AND SR AS 2 RESTART TIME DC JOB1IB IBF DC JOB1IB IBE IOT 4,6 OUTPUT IOT DC 0 MOTION FLAG DC JOB1OB OBF DC JOB1OB OBE DC -128 OBC AS JOB1+USER:ST-* * * JOB 2 STATUS AREA * JOB2 DC 0 DEVICE WAIT BITS DC HALTW LOGIC WAIT BITS DC 0 FLAGS DC 0 PC DC 0 AC DC 0 MQ DC 0 SC AS 2 SR FLAG AND SR AS 2 RESTART TIME DC JOB2IB IBF DC JOB2IB IBE IOT TTY2,6 OUTPUT IOT DC 0 MOTION FLAG DC JOB2OB OBF DC JOB2OB OBE DC -128 OBC AS JOB2+USER:ST-* * AIF TERMS.LT.3,.CONT * * JOB 3 STATUS AREA * JOB3 DC 0 DEVICE WAIT BITS DC HALTW LOGIC WAIT BITS DC 0 FLAGS DC 0 PC DC 0 AC DC 0 MQ DC 0 SC AS 2 SR FLAG AND SR AS 2 RESTART TIME DC JOB3IB IBF DC JOB3IB IBE IOT TTY3,6 OUTPUT IOT DC 0 MOTION FLAG DC JOB3OB OBF DC JOB3OB OBE DC -128 OBC AS JOB3+USER:ST-* * AIF TERMS.LT.4,.CONT * * JOB 4 STATUS AREA * JOB4 DC 0 DEVICE WAIT BITS DC HALTW LOGIC WAIT BITS DC 0 FLAGS DC 0 PC DC 0 AC DC 0 MQ DC 0 SC AS 2 SR FLAG AND SR AS 2 RESTART TIME DC JOB4IB IBF DC JOB4IB IBE IOT TTY4,6 OUTPUT IOT DC 0 MOTION FLAG DC JOB4OB OBF DC JOB4OB OBE DC -128 OBC AS JOB4+USER:ST-* * AIF TERMS.LT.5,.CONT * * JOB 5 STATUS AREA * JOB5 DC 0 DEVICE WAIT BITS DC HALTW LOGIC WAIT BITS DC 0 FLAGS DC 0 PC DC 0 AC DC 0 MQ DC 0 SC AS 2 SR FLAG AND SR AS 2 RESTART TIME DC JOB5IB IBF DC JOB5IB IBE IOT TTY5,6 OUTPUT IOT DC 0 MOTION FLAG DC JOB5OB OBF DC JOB5OB OBE DC -128 OBC AS JOB5+USER:ST-* * AIF TERMS.LT.6,.CONT * * JOB 6 STATUS AREA * JOB6 DC 0 DEVICE WAIT BITS DC HALTW LOGIC WAIT BITS DC 0 FLAGS DC 0 PC DC 0 AC DC 0 MQ DC 0 SC AS 2 SR FLAG AND SR AS 2 RESTART TIME DC JOB6IB IBF DC JOB6IB IBE IOT TTY6,6 OUTPUT IOT DC 0 MOTION FLAG DC JOB6OB OBF DC JOB6OB OBE DC -128 OBC AS JOB6+USER:ST-* * .CONT ANOP AIF NO:SPOOL,.SPOOL * * SPOOL JOB STATUS AREA * JOBSPL DC 0 DEVICE WAIT BITS DC HALTW LOGIC WAIT BITS DC 0 FLAGS DC 0 PC DC 0 AC DC 0 MQ AS JOBSPL+USER:ST-* * .SPOOL ANOP * * Compute highest address used in this field. * .END * * Compute highest address used in this field. * .END