; UPADTE 9/30/72 FLIST.S14 ; UPDATE 9/25/72 FLIST.S13 ; UPDATE 9/25/72 FLIST.S12 ; UPDATE 9/21/72 FLIST.S11 ; UPDATE 9/9072 FLIST.S10 ; UPDATE FLIST.S09 ; UPDATE 6/22/72 FLIST.S08 ; UPDATE 5/4/72 FLIST.S07 ; UPDATE 5/2/72 FLIST.S06 ; UPDATE 4/27/72 FLIST.S05 ; UPDATE 4/25/72 FLIST.S04 ; UPDATE 4/25/72 ; UPDATE 9/23/72 INITD.S03 ; 1PDATE 9/9/72 INITD.S02 ; UPDATE INITD.S01 .TITLE $$TSK3 (INITD) ;*********************************************************************** ;* * ;* TASK TO INITIALIZE THE DISC FOR A ROS DISC * ;* SYSTEM. CALLED BY OPERATOR INPUT "DI" COMMAND. * ;* ; UPDATE 9/30/72 FLMGMT.S14 ; UPDATE 9/21/72 FLMGMT.S13 ; UPDATE 9/21/72 FLMGMT.S12 ; UPDATE 9/9/72 FLMGMT.S11 ; UPDATE FLMGMT.S10 ; UPDATE 6/27/72 FLMGMT.S09 ; UPDATE 4/10/72 FLMGMT.S08 ; UPDATE 4/5/72 FLMGMT.S07 ; UPDATE 3/31/72 FLMGMT.S06 ; UPDATE 3/23/72 FLMGMT.S05 ; UPDATE 3/21/72 FLMGMT.S04 ; UPDATE 3/21/72  ; UPDATE 9/30/72 COMPRS.S11 ; UPDATE 9/25/72 COMPRS.S10 ; UPDATE 9/23/72 COMPRS.S09 ; UPDATE 9/21/72 COMPRS.S08 ; UPDATE 9/9/72 COMPRS.S07 ; UPDATE COMPRS.S06 ; UPDATE 6/22/72 COMPRS.S05 ; UPDATE 5/2/72 COMPRS.S04 ; UPDATE 4/10/72 COMPRS.S03 ; UPDATE 4/5/72 COMPRS.S02 ; UPDATE 4/4/72 COMPRS.S01 .TITLE COMPRS FLIST.S03 ; UPDATE 4/21/72 FLIST.S02 ; UPDATE 4/11/72 FLIST.S01 .TITLE FLIST ;*********************************************************************** ;* * ;* FLIST IS THE ROS FILE LIST PROGRAM. THIS WILL BE INITIALTED * ;* VIA INPUT BY: * ;* FL,XXX * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** .DEF INIDSC,INITD,$STK03 .REF FNEXT,FLAST,FINIT,AULIST,CDILST,PHYDEV .REF LOGMAX FLMGMT.S03 ; UPDATE 3/20/72 FLMGMT.S02 ; UPDATE 3/20/72 FLMGMT.S01 .TITLE FLMGMT ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. FLMGMT; ROS FILE MANAGEMENT. * ;* DEFINE, CATALOG NUMBER ; * ;* DELETE , CATALOG NUMBER ; * ;* PR ;*********************************************************************** ;* * ;* COMPRS * ;* * ;* PROGRAM IDENTIFICATION. COMPRS, CATALOG NUMBER ; * ;* COMPRESS A ROS FILE TYPE DISC SECTION. * ;* WHERE XXX IS THE FILE TYPE(FILE TYPE 0 NOT ALLOWED). * ;* OR: * ;* FL * ;* TO LIST ALL ROS FILE ENTRYS. * ;* * ;* THE LISTING WILL BE PRINTED ON THE LINE PRINTER UNLESS * ;* IT DOESN'T EXIST IN WHICH CASE IT WILL BE LISTED ON THE * ;*,FILE,CDEND ; ; .CSECT ; ROSGET = 56 PFRITE = 57 TTYOUT = 13 EXIT = 4 STKSZ = 50. ; .BOUND ; ; DISC INITIALIZATION TASK HEADER ; INIDSC = . .WORD 1 ; THREAD WORD .WORD $INITD ; TASK NUMBER .BYTE 20 ; SYSTEM TASK .BYTE 1 ; RUN AT PRIORITY 1 .WORD INITD-RELOC ; TASK ENTRY POINT .WORD 0,0 TCT,CATALOG NUMBER ; * ;* UNPRCT, CATALOG NUMBER . * ;* * ;* PURPOSE. THE ROS FILE MANAGEMENT PROGRAM CONSISTS OF FOUR * ;* CORE RESIDENT SUBROUTINES WHOSE PURPOSE IS TO PROVIDE A * ;* BASIC DISC FILE UTILITY PACKAGE IN A ROS II OR III SYSTEM. * ;* FLMGMT WILL BE RESPONSIBLE FOR THE QUEUEING AND DIS- * ;* * ;* PURPOSE. COMPRS IS A ROS SYSTEM TASK THAT WHEN ACTIVATED WILL * ;* COMPRESS A SECTION OF A DISC DEVICE DESIGNATED BY A FILE TYPE. * ;* COMPRS MAY BE CALLED VIA THE OPERATOR DEMAND TASK 'INPUT' * ;* WITH THE COMMAND: * ;* CM,T * ;* WHERE T IS THE FILE TYPE AREA TO BE COMPRESSED. FILES THAT * ;* ARE COMPRESSED ARE IN ESSENCE ASSIGNED NEW START SYSTEM TELETYPE. * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;******************************************************************* ; NO MAX. TIME .WORD STKSZ ; STACK SIZE .WORD 0,0,0 .IFNZ $KT11C .WORD 012006 ; 21 BLOCKS / READ-WRITE ACCESS-TPDR0 .WORD 0,0,0,0,0,0,0 ; OTHER PDR'S UNDEFINED $STK03: .WORD STK ; TPAR0 .WORD 0,0,0,0,0,0,0 ; OTHER PAR'S UNDEFINED . = .+12. RELOC = . .ENDC .IFZ $KT11C RELOC = 0 .ENDC STK = . . = .+STKSZ+ PATCHING OF FILE MANAGEMENT REQUESTS. THE OPERATOR * ;* DEMAND FILE UTILITY PACKAGE (ODFUP) IS NOT CONTAINED * ;* IN FILE MANAGEMENT, BUT USES THESE COMMON SUBROUTINES. * ;* ODFUP IS PART OF THE OPERATOR DEMAND TASK 'INPUT'. * ;* * ;* THE FOUR SUBROUTINE ENTRY POINTS PROVIDED FOR * ;* IN FLMGMT ARE:  SECTOR * ;* ADDRESSES AND THE UNUSED DISC SPACES THAT MAY EXIST BETWEEN * ;* THE FILES ARE "SQUEEZED" OUT. * ;* * ;* PROGRAM USAGE. TO QUEUE COMPRS BY OPERATOR DEMAND,TYPE * ;* THE COMMAND: * ;* CM,T * ;* WHERE T IS THE FILE TYPE TO COMPRESS. OT**** ; .DEF FLSTHD,FLIST .REF DOD,FSTAT,PHYDEV LPRNTR = 25 TTYOUT = 13 DISCIO = 23 EXIT = 4 NOCKPT = 30 BINASC = 16 ROSGET = 56 ; .PAGE ; ; EQUATES FOR RELATIVE FILE POSITIONS ; SCTR = 2. ; START SECTOR FTYPE = 4. ; FILE TYPE PDVCE = 5. ; PROTECT STATUS AND DEVICE LGTH = 6. ; FILE LENGTH CKSAVE = 8.STKSZ ; RESERVE SPACE FOR STACK .PAGE ; ; ; ; FILE SIZE TABLE ; FLSIZE = . .WORD $FS000 .WORD $FS001 .WORD $FS002 .WORD $FS003 .WORD $FS004 .WORD $FS005 .WORD $FS006 .WORD $FS007 .WORD $FS008 .WORD $FS009 .WORD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; RESERVE ROOM FOR BLANK ; ; FILE TYPES .=FLSI * ;* * ;* DEFINE - SUBROUTINE TO ALLOCATE A FILE SPACE AND * ;* CREATE A FILE DIRECTORY ENTRY. * ;* DELETE - SUBROUTINE THAT WILL DELETE A FILE DIRECTORY * ;* ENTRY. * ;* PRTCT - SUBROUTINE THAT WILL SET THE PROTECT STATUS * ;* IN A DIRECTORY ENTRY. HERWISE, QUEUING * ;* COMPRS VIA QUEUE AND PASSING T AS AN ARGUMENT MAY * ;* BE USED * ;* * ;* WHEN COMPRESSION IS COMPLETE, IT WILL TYPE: * ;* * ;* "FILE COMPRESSION COMPLETE" * ;*  ; CHECKPOINT SECTOR ADDRESS .IFNZ $BATCH ; ; BATCH ELEMENT DIRECTORY EQUATES ; NAME1 = 0. NAME2 = 2. STATUS = 4. BTYPE = 5. BHOUR = 6. BMIN = 7. BSEC = 8. BYEAR = 9. BDAY = 10. BMNTH = 11. BSTRTS = 12. BLGTH = 14. ; .ENDC ; ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ZE+$FTMAX+$FTMAX ; USE ONLY SPACE NEEDED ; .IFNZ DRESDI ; ; DISC I/O PARAMETER LIST FOR DISC DIRECTORY INITIALIZATION ; .BOUND DLIST = . .WORD 1 ; THREAD WORD DEVNO: .BYTE 0 ; DEVICE NO.-SET DYNAMICALLY .BYTE 1 ; USE EXIT TYPE 1 .WORD 0 ; NO I/O COMPLETE .BYTE 0 ; SYSTEMS .BYTE 1 ; DISC I/O LEVEL 1 DERRWD:  * ;* UNPRCT - SUBROUTINE THAT WILL RESET THE PROTECT STATUS * ;* IN A DIRECTORY ENTRY. * ;* * ;* PROGRAM USAGE. THE LINKAGE TO SUBROUTINE DEFINE IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT DEFINE  * ;* APPROPRIATE ERROR MESSAGES WILL ALSO BE TYPED WHEN * ;* ERRORS OCCUR. COMPRS WILL THEN BE TERMINATED. * ;* * ;* PROGRAMMER: 54 * ;* DATE * ;* REVISION * ;*  ; PRIORITY LOCKOUT MASK FLSSIZ = 50. ; FILE LIST TASK SIZE YES = 131 ; ASCII Y NO = 116 ; ASCII N .PAGE ; ; FLIST TASK HEADER WHEN CORE RESIDENT FOR CHECKOUT ; FLSTHD = . .WORD 1 ; THREAD WORD .WORD $FLTNO ; TASK NO .BYTE 20 ; TASK ACCESS-SYSTEM TASK .BYTE PRIBKG-1 ; PRIORITY ONE HIGHER THAN BACKGROUND .WORD 0 ; DISC ERROR WORD .WORD 0 ; SYSTEM .WORD DBUF-RELOC ; DISC BUFFER ADDRESS .WORD 0,0 ; DBUF = . .WORD 0 ; FILE ID-SET DYNAMICALLY .BYTE 0 ; USE RLSECT AND NWORD .BYTE 1 ; I/O FUNCTION -WRITE .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 0 ; RELATIVE SECTOR - SET DYNAMICALLY .WORD 64.  * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL FORTRAN(LIST) * ;* * ;* THE LINKAGE TO SUBROUTINE DELETE IS: * ;* * ;*********************************************************************** ; .DEF CMPRHD,COMPRS .REF FSTAT,PHYDEV,NODREQ,CMPTMR,CPRSIP .REF FINIT,PFRITE,FILE,CDILST .REF DQFRST,DQLAST,NDPRTY,HPRIRQ,CALLED,DIHA50,FMFRST .REF FMLAST,FNEXT,AULIST,IOSTAT,NOFMRQ,FMACTV,COMPID .REF HEADER,DOD NOCKPT = 30 QTIME = 7 SUSPND = 2 UNSPND = 3 TTYOUT = 13 EXIT! .WORD FLIST ; ENTRY POINT .WORD 0,0 ; NO MAX. EXECUTION TIME .WORD FLSSIZ ; STACK SIZE .WORD 5 ; FILE TYPE .WORD 0,0 .IFNZ $KT11C .WORD 022006 ; 36 DEC. BLOCKS / READ-WRITE ACCESS .WORD 0,0,0,0,0,0,0 ; PDR 1-7 NOW EXISTEND .WORD STK ; TPAR0 .WORD 0,0,0,0,0,0,0 ; PAR 1-7 NON EXISTENT . = .+12. .ENDC " ; ONE SECTORS LENGTH BUFFER = . . = .+128. ; RESERVE 64 WORD BUFFER .ENDC ; ; .BOUND TTYLST = . .WORD 1 ; THREAD .BYTE 0 ; DEVICE 0 .BYTE 1 ; EXIT TYPE .WORD 0 .BYTE 0 .BYTE 1 ; PRIORITY OUTPUT .WORD 0,0 .WORD TTYBUF-RELOC ; BUFFER ADDRESS .WORD 0,0 ; TTYBUF = . # * ;* MOV #LIST,-(SP) * ;* EMT DELETE * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL DELETE(LIST) * ;* $ = 4 BINASC = 16 ROSGET = 56 PFRITE = 57 GETHDR = 63 DIOA65 = 64 ; FLMB00 = 65 ; .PAGE ; ; EQUATES FOR RELATIVE FILE POSITIONS ; SCTR = 2. ; START SECTOR FTYPE = 4. ; FILE TYPE PDVCE = 5. ; PROTECT STATUS AND DEVICE LGTH = 6. ; FILE LENGTH CKSAVE = 8. ; CHECKPOINT SECTOR ADDRESS ; ; % .CSECT BOD STK = . .WORD 200 . = .+FLSSIZ+FLSSIZ-2 ; SET TASK STACK ; .PAGE ; .IFNZ DRESDI!$BATCH ; ; DISC I/O PARAMETER LIST AND BUFFER ; .BOUND DLIST = . .WORD 1 ; THREAD WORD DEVNO: .BYTE 0 ; DEVICE NO. .BYTE 2 ; EXIT TYPE 2 .WORD 0 ; NO I/O COMPLETE SUBROUTINE .BYTE 0 ; NO E& .WORD 28. ; NO. OF CHARACTERS IN OPERATOR MESSAGE .WORD 0 ; RESERVED FOR TTYI/O .ASCII /ROS DISC SYSTEM INITIALIZED/ .BYTE 15 ; CARRIAGE RETURN ; ; .PAGE INITD = . .IFNZ $KT11C EMT ROSGET ; SET-UP SO I CAN ADDRESS ROS .ENDC MOV #-$FTMAX-$FTMAX,R0 ; INDEX FOR LOOP CLR R1 ; USED TO ACCUMULATE FNEXT'S MOV ' * ;* THE LINKAGE TO SUBROUTINE PRTCT IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT PRTCT * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* ( ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ; PRIORITY LOCK-OUT MASK CSTKSZ = 75. ; COMPRS STACK SIZE RDLEV = 3 ; DISC LEVEL AT WHICH TO READ UDLEV = 1 ; DISC LEVEL AT WHICH TO UPDATE CSS = SCTR ; COMPRESSION START SECTOR LEVEL = 7. ; RELATIVE POSITION OF PRIORITY ; ; LE)RROR TASK .BYTE 3 ; DISC LEVEL 3 DERRWD: .WORD 0 ; DISC ERROR WORD .WORD 0 ; FOR SYSTEM .WORD DODID ; ADDRESS OF DISC I/O BUFFER .WORD 0,0 DODID: .WORD 0 ; DOD FILE ID-SET DYNAMICALLY .BYTE 0 ; USE RLSECT AND NWORD .BYTE 0 ; READ DISC I/O FCN .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 0 ; RELA* FLSIZE,R2 ; USE TO ACCUMULATE DEC R2 ; FLAST'S INIA10 = . MOV R1,$ROSM+FNEXT+$FTMAX+$FTMAX(R0) ; ; SET FNEXT THIS TYPE MOV R1,$ROSM+FINIT+$FTMAX+$FTMAX(R0) ; ; SET INITIAL VALUE THIS TYPE MOV R2,$ROSM+FLAST+$FTMAX+$FTMAX(R0) ; ; SET FLAST THIS TYPE ADD FLSIZE+$FTMAX+$FTMAX-RELOC(R0),R1 ; CALCULATE NEXT FNEX+ * ;* CALL PRTCT(LIST) * ;* * ;* THE LINKAGE TO SUBROUTINE UNPRCT IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT UNPRCT * ;* ,VEL IN I/O LIST DATA = 12. ; RELATIVE ADDRESS OF I/O BUFFER ; ; IN I/O LIST DATA1 = 16. ; SVA OF DATA BUFFER DATA2 = 14. ; ASR6 FOR ABOVE DUSE3 = 8. ; THIRD RESERVED FOR DISCIO WORD ; ; IN DISC DATA BUFFER TPAR1 = 46 ; TPAR2 = 50 ; TPDR1 = 26 ; TPDR2 = 30 -TIVE SECTOR .WORD 64. ; ONE SECTORS LENGTH BUFFER = . . = .+128. ; RESERVE 64. WORDS FOR BUFFER ; .ENDC FLTYPE: .WORD 0 ; USED TO SAVE FILE TYPE WORKWD: .WORD 0 WORKWA = WORKWD-5 PAGCTL: .WORD 0 ; USED FOR PAGE CONTROL .IFNZ $BATCH ASCII: .WORD 0,0,0 ; USED FOR ASCII CONVERSION ; BETPTB = . .ASCII /OBJECT / .ASCII /LOAD / .A.T ADD #2,R0 ; BUMP REGISTER BGE INIA20 ; FINISHED ADD FLSIZE+$FTMAX+$FTMAX-RELOC(R0),R2 ; CALCULATE NEXT FLAST BR INIA10 ; DO FOR REST OF TABLE INIA20: MOV @#$ROSM+FLAST,@#$ROSM+FNEXT ; ; SET TYPE 0 FULL AS IT SHOULD ; ; ALWAYS BE. MOV @#$ROSM+FLAST,@#$ROSM+FINIT MOV #$ROSM+AULIST,-(SP) ; LIST ADDRESS TO STACK / * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL UNPRCT(LIST) * ;* * ;* WHERE IN ALL CASES, LIST IS THE FILE MANAGEMENT * ;* REQUEST LIST. THIS LIST IS CONSTRUCTED AS FOLLOWS: * ;* 0; .PAGE ; ; THE FOLLOWING IS THE TASK HEADER FOR COMPRS WHEN ; IT IS CORE RESIDENT FOR CHECKOUT PURPOSES. ; CMPRHD = . .WORD 1 ; THREAD WORD .WORD $CPTNO ; TASK NUMBER .BYTE 20 ; TASK ACCESS-SYSTEM TASK .BYTE PRIBKG-1 ; PRIORITY ONE HIGHER THAN BACKGROUND FMQEP: .WORD COMPRS ; ENTRY POINT-USED AS FILE MGMT. ; ; QUEUE ENTRY POINT 1SCII /SYMBOLIC/ .ASCII /ASM SYM / .ASCII /FOR SYM / .ASCII /DATA / ; MNTHTB = .-3 ; NO. ZERO MONTH .ASCII /JAN/ .ASCII /FEB/ .ASCII /MAR/ .ASCII /APR/ .ASCII /MAY/ .ASCII /JUN/ .ASCII /JUL/ .ASCII /AUG/ .ASCII /SEP/ .ASCII /OCT/ .ASCII /NOV/ .ASCII /DEC/ ; STTBL = . .ASCII /FREE / .ASCII2 .IIF NZ $KT11C BIS #$ROSM,AULIST+12. EMT PFRITE ; DOIT- IGNORE PROCESSING ERROR ; ; OTHER THAN DISCIO PRINTOUT INIA25: CMP #1,@#$ROSM+AULIST ; I/O COMPLETE BNE INIA25 ; SPIN UNTIL COMPLETE .IIF NZ $KT11C BIC #$ROSM,AULIST+12. MOV #$ROSM+FILE,R0 ; ADDRESS OF CORE DIRECTORY USER AREA INIA26: CLR (R0)+ ; CLEAR USER'S AREA OF CORE DIR. CMP R0,#$ROS3 * ;* WORD 0: THREAD - THREAD WORD. NOMINALLY = 1 * ;* WORD 1, BYTE 0: ERROR - CONTAINS ERROR STATUS * ;* ON RETURN FROM FLMGMT. * ;* , BYTE1: RESERVED FOR SYSTEM USE * ;* WORD 2: RESERVED FOR SYSTEM USE * ;* WORD 3: FILEID - FILE'S ID ON WHICH TO PERFORM * ;* 4 .WORD 0,0 ; NO MAX. EXECUTION TIME .WORD CSTKSZ ; TASK'S STACK SIZE .WORD 5 ; FILE TYPE .WORD 0 DSCQEP: .WORD 0 ; ARG - USED AS DISC QUEUE ; ; ENTRY POINT .IFNZ $KT11C .WORD 022006 ; 36 DEC. BLOCKS / READ-WRITE ACCESS ; ; TPDR0 .WORD 0,0,0,0,0,0 ; USED AS SCRATCH .WORD 07745 /READ / .ASCII /WRITE / .ASCII /DELETED / ; .ENDC ; ; THE FOLLOWING IS THE FILE LIST PRINT LIST ; .BOUND PRTLST = . .WORD 1 ; THREAD WORD .IFNZ NLP .BYTE 3 ; USE LINE PRINTER .ENDC .IFZ NLP .BYTE SYSTTY ; USE SYSTEM TELETYPE .ENDC .BYTE 2 ; EXIT TYPE .WORD 0 .BYTE 0 6M+CDEND ; FINISHED? BLT INIA26 ; NO MOV #$ROSM+CDILST,-(SP) ; PUT INITIALIZE CORE DIR. IMAGE INIA27: CMP #1,@#$ROSM+CDILST ; I/O COMPLETE? BNE INIA27 ; SPIN UNTIL COMPLETE ; ; NOTE: CAN DO SINCE MASKED .IFNZ DRESDI MOV #-128.,R0 ; INDEX TO CLEAR BUFFER INIA30: CLR BUFFER+128.-RELOC(R0) ; SET BUFFER ADD #2,R0 ; EQUAL BLT 7 FILE MANAGEMENT. * ;* WORD 4, BITS 0-6: FILE TYPE - OF WHICH FILE TYPE * ;* DOES SUBJECT FILE BELONG. 0 THRU 127. * ;* ,BIT 7: C-STATUS, REQUIRED BY 'DEFINE' ONLY. * ;* 1=MAKE ENTRY INTO CORE DIRECTORY. * ;* 0= ENTRY INTO DISC DIRECTORY ONLY. * ;* ,BYTE 1: RESERVED FOR SYSTEM USE. H06 ; 4K / READ-WRITE ACCESS ; ; TPDR7- DEVICE PAGE .WORD STK ; TPAR0 .WORD 0,0,0,0,0,0 ; USED AS SCRATCH .WORD 007600 ; DEVICE PAGE - TPAR7 . = .+12. .ENDC .CSECT BOD STK = . .WORD 201 . = .+CSTKSZ+CSTKSZ-2 ; RESERVE TASK'S STACK ; .PAGE ; ; THE FOLLOWING IS THE LIST AND BUFFER USED FOR DISCIO ; REE .BYTE 1 ; PRIORITY LEVEL 1 .WORD 0,0 PRTBUF: .WORD 0 ; PRINT BUFFER ADDRESS .WORD 0,0 ; ; HDR1 = . .WORD 72. .WORD 0 .ASCII /FILE ID START FILE LOGICAL FILE CKSAVE/ .ASCII / PROTECT CORE DIR. IFD/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; HDR2 = . .WORD 62. .WORD 0 .ASCII / SECTOR TYPE DEVICE FINIA30 ; ALL ZEROS CLR R1 ; INDEX THRU PHYDEV INIA40: MOV $ROSM+PHYDEV(R1),R2 ; INDEX THRU PHYDEV BMI INIA70 ; DEVICE NOT AVAILABLE BIC #170377,R2 ; ISOLATE TYPE CMP R2,#400 ; TYPE 1?-DISC DEVICE BNE INIA70 MOVB $ROSM+PHYDEV(R1),DBUF ; DOD FILE ID TO INC DBUF ; INITIALIZE ASR R1 ; LOGICAL DEVICE MOG * ;* WORD 5: LENGTH - REQUIRED BY 'DEFINE' ONLY. * ;* LENGTH,IN SECTORS, OF FILE TO BE * ;* DEFINED. NOTE: IF LENGTH=0,THEN * ;* DEFINE WILL ALLOCATE LARGEST * ;* AVAILABLE AREA IN FILE TYPE AREA * ;* TO FILE. THIS WORD WILL CONTAIN * ;* LENGTH OF FILE JUST DEFINED. """"""" """"""""""""""""DDDDDDD@D """"!"""""""""""""""""DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDfADDB Ci'y{/y:}{Nm'-{\}%f{T{R~MZ{x: PX |?$Da ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & I LENGTH 0=NONE/ .ASCII ' Y/N Y/N' .BYTE 15 ; CARRIAGE RETURN .EVEN ; HDR3 = . .WORD 73. .WORD 0 .ASCII /******************************************************/ .ASCII /******************/ .BYTE 15 ; CARRIAGE RETURN .EVEN BLNKLN = . .WORD 3,0 .ASCII / / .BYTE 15 .EVEN ; OUTBUF = . .WORD 70JVB R1,DEVNO ; TO LIST CLR RLSECT ; ZERO RELATIVE SECTOR 0 FIRST INIA50: MOV #DLIST-RELOC,-(SP) ; DISC LIST TO STACK EMT PFRITE ; ZERO 1 SECTOR DISC DIRECTORY INIA55: CMP #1,DLIST ; I/O COMPLETE? BNE INIA55 ; SPIN INC RLSECT ; GET READY FOR NEXT SECTOR OF ; ; DISC DIRECTORY INITIALIZATION CMP #9.,DERRWD ; DO COMPLETE DIRECTORK * ;* IF THE CALL IS TO DEFINE, WORD 2 WILL CONTAIN THE IFD * ;* OF THE FILE (CORE ENTRY ONLY) ENTRY JUST DEFINED UPON * ;* RETURN. * ;* UPON RETURN, THE VALUE OF ERROR WILL CONTAIN ONE OF THE * ;* FOLLOWING: * ;* 0 = REQUEST PROCESSED SUCCESSFULLY * ;* 1 = LIST NOT THREADABLE LADS, WRITES, AND UPDATES ; .BOUND DLIST = . .WORD 1 ; THREAD WORD DEVNO: .BYTE 0 ; DEVICE NUMBER-SET DYNAMICALLY EXTYP: .BYTE 0 ; EXIT TYPE-SET DYNAMICALLY IOCOMP: .WORD 0 ; I/O COMPLETE ADDRESS IF EXIT TYPE 3 .BYTE 0 ; NO ERROR TASK DLVL: .BYTE 0 ; DISC I/O LEVEL DERRWD: .WORD 0 ; DISC ERROR WORD .WORD 0 ; RESERVED FM. .WORD 0 .ASCII /XXXX/ OB1: .ASCII /X XXXXX/ OB2: .ASCII /X XX/ OB3: .ASCII /X XX/ OB4: .ASCII /X XXXXX/ OB5: .ASCII /X XXXXX/ OB6: .ASCII /X / OB7: .ASCII /X / OB8: .ASCII /X XXX/ OB9: .ASCII /X/ .BYTE 15 ; CARRIAGE RETURN .EVEN IFDCLR = OB8+7 ; EJECT = . .WORD 2. .WORD 0 .BYTE 14 ; FORM FEED .BYTNY YET? BNE INIA50 ; NO-KEEP GOING INIA60: INC R1 ; BUMP LOGICAL DEVICE CMP R1,@#$ROSM+LOGMAX ; SEARCHED ALL OF PHYDEV? BGT INIB00 ; YES ASL R1 ; WORD INDEX BR INIA40 ; LOOK FOR OTHER DISC DEVICES INIA70: ASR R1 ; LOGICAL DEVICE BR INIA60 ; ; DISC(S) ARE INITIALIZED ; INIB00 = . .ENDC MOV #TTYLST-REO * ;* 2 = FILE ID NOT VALID * ;* 3 = FILE TYPE NOT VALID * ;* 4 = PHYSICAL UNIT ON WHICH FILE TYPE RESIDES * ;* NOT VALID. * ;* 5 = FLMGMT NOT CALLED BY A TASK * ;* 6 = NO AVAILABLE SPACE IN CORE RESIDENT DIRECTORY * ;* FOR NEW ENTRY POR SYSTEM .WORD 0,0 ; CPRBUF = . .WORD 0 ; FILE ID-SET DYNAMICALLY .BYTE 0 ; USE RLSECT AND NWORD IOFCN: .BYTE 0 ; I/O FUNCTION-SET DYNAMICALLY .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 0 ; RELATIVE SECTOR-SET DYNAMICALLY .WORD 64. ; ONE SECTORS LENGTH BUFFER = . . = .+128. ; RESERVE 64 WORD BUFFER. ; ; ; ; QE 15 ; CARRIAGE RETURN .EVEN ; .IFNZ $BATCH BTCH1 = . .WORD 62. .WORD 0 .ASCII / ELEMENT / .ASCII /CREATED START/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; BTCH2 = . .WORD 73. .WORD 0 .ASCII / NAME TYPE STATUS DATE / .ASCII /TIME SECTOR LENGTH/ .BYTE LOC,-(SP) ; TELL OPERATOR FINISHED EMT TTYOUT EMT EXIT ; EXIT FROM TASK ; ; EXIT WILL UNMASK TASK LOCKOUT ; .END S * ;* 7 = FILE ALREADY DEFINED (DEFINE) * ;* 8 = CANNOT FIND ENOUGH DISC SPACE TO DEFINE FILE * ;* WITH LENGTH REQUESTED. * ;* 9 = FILE NOT DEFINED(DELETE,PRTCT,UNPRCT) * ;* . * ;* . * ;* . T TELETYPE I/O PARAMETER LIST ; .BOUND TTYLST = . .WORD 1 ; THREAD WORD .BYTE 0 ; LOGICAL DEVICE .BYTE 2 ; EXIT TYPE .WORD 0 .BYTE 0 .BYTE 0 ; NORMAL OUTPUT .WORD 0,0 TTYBUF: .WORD 0 ; TELETYPE BUFFER, SET DYNAMICALLY .WORD 0,0 ; ; ; ; COMPRESSION COMPLETE MESSAGE ; CCMSG = . .WORD U15 ; CARRIAGE RETURN .EVEN ; BTCHBF = . .WORD 72. .WORD 0 .ASCII / / BENAME: .ASCII /.NAME. / BETYPE: .ASCII /OBJECT / BESTAT: .ASCII /FREE / DATE1: .ASCII /02/ .ASCII /-/ DATE2: .ASCII /JAN/ .ASCII /-/ DATE3: .ASCII /72 / TIM1: .ASCII /23/ .ASCII /:/ TIM2: .ASCII /17/ .ASCII /:/ TIM3: .ASCII /59 00546/ SS: .ASCII /6 00010/ LG: .ASCII V; UPDATE CREAD.011 09.24.72 ; UPDATE 9/12/72 CREAD.S10 ; UPDATE CREAD.009 07.14.72 11/45 VERSION, FIRST ASSEMBLY ; UPDATE CREAD.008 06.21.72 ; UPDATE CREAD.007 04.12.72 .TITLE CREAD ;********************************************************************** ;* ** ;* C R E A D ** ;* W * ;* 15 = DISC READ OR WRITE ERROR OCCURRED * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;*****************************X 35. .WORD 0 .ASCII /COMPRESSION COMPLETE-FILE TYPE / CCEDIT: .ASCII /XXX/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; FILE TYPE NOT VALID MESSAGE ; NVMSG = . .WORD 31. .WORD 0 .ASCII /COMPRS-FILE TYPE / NVEDIT: .ASCII /XXX NOT VALID/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; COMPRESS NOT ALLOWED MESSAGE ; NAMSG = . .WORD 33. Y/0/ .BYTE 15 .EVEN ; BCHERR = . .WORD 45. .WORD 0 .ASCII /DISC ERROR-BATCH FILE ELEMENT DIRECTORY READ/ .BYTE 15 .EVEN ; .ENDC DISCER = . .WORD 26. .WORD 0 .ASCII /DISC DIRECTORY READ ERROR/ .BYTE 15 .EVEN ; .PAGE ; FLIST = . MOV R0,FLTYPE ; SAVE PASSED ARG. EMT NOCKPT ; SET TASKZ ** ;* PROGRAM IDENTIFICATION. CARD READER INPUT SUBROUTINE, ** ;* CATALOG NUMBER ** ;* ** ;* PURPOSE. THIS GENERAL PURPOSE SUBROUTINE PROVIDES FOR ** ;* CARD READER INPUT. INPUT REQUESTS ARE QUEUED IF THE ** ;* DEVICE IS BUSY. SINCE THE CARD READER IS A SEQUENTIAL ** ;* INPU[****************************************** ; .DEF FMFRST,FMLAST,FSTAT,DEFINE,DELETE,PRTCT,UNPRCT .DEF FNEXT,FLAST,AULIST,AUFCN,INIDSC,FLMB00 .DEF CDILST,CMPTMR,FINIT,NOFMRQ,FMACTV .DEF AUBUF ; .REF PUSHR,POPR,PHYDEV,$CTASK,IOSTAT,QSAVEI .REF DSPTCH,CPRSIP,DISCIO,PFRITE,UNSPND,RELTSK,DOD .REF QUEUE,LOGMAX,TTYOUT,EXIT,CDIHDR,CDEND,FILE,HEADER .REF IOCOMX,TSK.PC .IFNZ $KT11C .R\ .WORD 0 .ASCII /COMPRS NOT ALLOWED-FILE TYPE / NAEDIT: .ASCII /XXX/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; DISC DIRECTORY SEARCH ERROR MESSAGE ; DSMSG = . .WORD 35. .WORD 0 .ASCII /COMPRS-DIRECTORY SEARCH DISC ERROR/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; DISC TRANSFER ERROR MESSAGE ; XEMSG = . .WORD 37. .WORD 0 ] NOT CHECKPOINTABLE .IFNZ $KT11C EMT ROSGET ; SO WE CAN ADDRESS ROS .ENDC .IFNZ $BATCH TST FLTYPE ; BATCH FILE LIST BMI FLIA70 ; YES .ENDC JSR PC,ROSHDR ; PRINT ROS FILE LIST HEADER MOV FLTYPE,R0 ; GET ARGUMENT PASSED BNE FLIC00 ; LIST SPECIFIED ONE .IFNZ DRESDI MOV #$ROSM+DOD,R1 ; ADDRESS OF FIRST DOD TO SCAN^T DEVICE, ALL REQUESTS ARE QUEUED ON A FIRST-COME ** ;* FIRST-SERVE BASIS. ** ;* ** ;* TWO MODES OF INPUT ARE SUPPORTED: ALPHANUMERIC AND BINARY. ** ;* CREAD ACCEPTS BOTH 026 AND 029 CARD CODE (HOLLERITH AND ** ;* EBCDIC) FOR INPUT IN THE ALPHANUMERIC MODE AND WILL CONVERT ** ;* EITHER TO AN INTERNAL REPRESENTATION OF ASCII OR EBCDIC. ** ;* _EF PPASV5,PPASV6,SVPPA .ENDC .PAGE ; .CSECT FMTBLS ; ; THE FOLLOWING IS USED TO THREAD FILE MANAGEMENT REQUESTS ; .QUE FMF,FML,1 FMFRST = FMF+4 FMLAST = FML+4 ; ; THE FOLLOWING LIST IS USED TO UPDATE THE FILE TYPE ; ALLOCATION DIRECTORY. ; .BOUND AULIST = . .WORD 1 ; THREAD WORD .BYTE 1 ; LOG. DEVICE 1 .BYTE 1 ; EXIT` .ASCII /COMPRS-FILE XFER ERROR-FILE TYPE / XEEDIT: .ASCII /XXX/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; DIRECTORY UPDATE DISC ERROR MESSAGE ; DUMSG = . .WORD 35. .WORD 0 .ASCII /COMPRS-DIRECTORY UPDATE DISC ERROR/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; .PAGE .QUE CPDF,CPDL,1 CPDFST = CPDF+4 ; COMPRESS WAIT QUEUE FOR CPDLST = CPDLa FLIA20: MOVB PDVCE(R1),R2 BIC #177600,R2 ; ISOLATE LOGICAL DEVICE MOVB R2,DEVNO ; SET DEVICE NO. IN LIST MOV (R1),DODID ; SET ID IN LIST FLIA25: CLR RLSECT ; START AT RELATIVE SECTOR 0 FLIA30: MOV #DLIST,-(SP) EMT DISCIO ; READ A SECTOR OF THE DIRECTORY CMP #9.,DERRWD ; FINISHED FILE? BEQ FLIB00 TST DERRWD ; DISC ERROR? BNE FLIB20 b ** ;* THE THREE GENERAL I/O EXITS ARE AVAILABLE TO THE CALLING ** ;* PROGRAM. CREAD WILL PROCESS REQUESTS FOR ANY NUMBER OF ** ;* LIKE CARD READERS, SINCE THE SUBROUTINE IS REENTRANT. ** ;* MOREOVER, IN THE ALPHANUMERIC MODE, INPUT CAN BE SWITCHED ** ;* FROM THE C/R TO THE TTY AND BACK AGAIN. ** ;* *c TYPE 1 .WORD 0 ; NO I/O COMPLETE .BYTE 0 ; SYSTEMS .BYTE UDLEV ; HIGH PRIORITY UPDATE .WORD 0 ; DISC ERROR WORD .WORD 0 ; SYSTEM USE .WORD AUBUF ; DATA BUFFER ADDRESS DATA2: .WORD 0 ; ASR6 FOR DATA BUFFER SVA DATA1: .WORD 0 ; SVA OF DATA BUFFER ; AUBUF: .WORD NDISCS+2 ; ID FOR FTDIR .BYTE 1 d+4 ; DISCIO REQUESTS .QUE CPFF,CPFL,1 CPFFST = CPFF+4 ; COMPRESS WAIT QUEUE FOR CPFLST = CPFL+4 ; FLMGMT REQUESTS ; FLTYPE: .WORD 0 ; USED TO SAVE FILE TYPE TO COMPRESS HITFLG: .WORD 0 ; USED TO FLAG DIRECTORY SEARCH SUCCESS SBUFLN: .WORD 0 ; SEARCH BUFFER LENGTH-CONTAINS END ; ; ADDRESS OF DIRECTORY SEARCH BUFFER SORTSC: .WORD 0 e; YES REPORT MOV #BUFFER,R2 ; START BUFFER ADDRESS MOV #120.,R3 ; LENGTH OF SCAN OR SEARCH .ENDC .IFZ DRESDI FLIA40: MOV #$ROSM+FILE,R2 ; START BUFFER ADDRESS MOV #NCRLOC-$ROSFW-$ROSFW,R3 ; LENGTH OF SCAN OR SEARCH .ENDC ADD R2,R3 ; EXTENT OF SEARCH FLIA50: TST (R2) ; FILE ACTIVE? BEQ FLIA60 ; NO MOV FLTYPE,R0 ; GET FILE TYPE BEf* ;* USAGE. THE ASSEMBLER CODE IS: ** ;* MOV #LIST,-(SP) ** ;* EMT CREAD ** ;* BNE LIST ERROR ONLY ** ;* THE FORMAT OF THE DATA BUFFER IS: ** ;* WORD 1 NWORD ** ;* 2 NREAD g ; WRITE COMPLETE FILE AUFCN: .BYTE 1 ; WRITE I/O FCN .WORD 0,0,0 ; ; THE FOLLOWING TABLE IS USED TO CONTAIN THE NEXT AND LAST ; POINTERS FOR EACH FILE TYPE. THEY WILL BE INITIALIZED DURING ; ROS IPL. ; FNEXT = . . = .+$FTMAX+$FTMAX FLAST = . . = .+$FTMAX+$FTMAX ; RESERVE $FTMAX WORDS FINIT = . . = .+$FTMAX+$FTMAX ; RESERVE $FTMAX WORDS . = $FTDRL*64.*2+FNEXT h ; SORT SECTOR-USED TO FIND LOWEST ; ; START SECTOR OF A FILE IN A ; ; FILE TYPE AREA. SORTID: .WORD 0 ; SORT ID-USED TO SAVE ID RELATED ; ; TO SORTSC ENTRY SORTLN: .WORD 0 ; SORT LENGTH-USED TO SAVE LENGTH ; ; RELATED TO SORTSC ENTRY SORTAD: .WORD 0 ; SORT ADDRESS-USED TO SAVE ADDRESS ; iQ FLID00 ; PRINT ALL MOVB FTYPE(R2),R4 ; ISOLATE FILE BIC #177600,R4 ; TYPE CMP R0,R4 ; ONE WE WANT BEQ FLID00 ; YES FLIA60: ADD #10.,R2 ; BUMP FILE ENTRY POINTER CMP R2,R3 ; FINISHED BUFFER? BLT FLIA50 ; NO .IFNZ DRESDI INC RLSECT ; READ NEXT SECTOR BR FLIA30 .ENDC .IFZ DRESDI j ** ;* 3+ DATA ** ;* WHERE: NWORD > 0 = NUMBER CHARACTERS TO READ (80 CHAR MAX) ** ;* < 0 = NUMBER BINARY WORDS TO READ (60 WDS MAX)** ;* NREAD = NUMBER CHARACTERS/WORDS ACTUALLY READ ** ;* (STORED BY CREAD) ** ;* ** ;* PROGRAMMER: 55 k; RESERVE A MULTIPLE OF 64 WORDS ; ; THE FOLLOWING IS THE COMPRESS TIMER MODULE. IT IS ; LOCATED HERE SO COMPRS CAN BE CHECKPOINTED DURING ; ITS SUSPENSION DUE TO TIME-OUT. ; .BOUND CMPTMR = . .WORD 1 ; THREAD WORD .WORD 0,0,0 .BYTE MSECR ; RESOLUTION .BYTE 200 ; SUSPEND .WORD 100. ; 100 MILLISECOND TIMER ; ; .PAGE ; ; LIST TO UPDATEl ; IN BUFFER RELATED TO SORTSC ; ; ENTRY ; ; ; PHYUNT: .WORD 0 ; USED TO SAVE PHYSICAL UNIT THAT ; ; CONTAINS TYPE TO BE COMPRESSED ; .IFNZ DRESDI DODID: .WORD 0 ; USED TO SAVE DOD ID OF DEVICE ON ; ; WHICH COMPRESSION IS ACTIVE SORTRS: .WORD 0 ; SORT RELATIVE SECTOR - USED TO SAVE ; m BR FLIB10 ; DONE .ENDC .IFNZ $BATCH FLIA70: JMP FLBA00 ; FILE LIST FOR BATCH ELEMENTS .ENDC ; ; .IFNZ DRESDI FLIB00 = . TST FLTYPE ; DO THEM ALL? BNE FLIB10 ; NO-FINISHED ADD #10.,R1 ; BUMP TO NEXT DOD CMP (R1),#NDISCS ; DONE ALL OF THEM? BLE FLIA20 ; NO-PRINT THIS ONE TOO .ENDC FLIB10 = . n ** ;* DATE: 01.10.72 ** ;* REVISION: ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* o THE CORE DIRECTORY IMAGE ON DISC ; .BOUND CDILST = . .WORD 1 ; THREAD WORD .BYTE 1 ; LOG DEVICE 1 .BYTE 1 ; EXIT TYPE 1 .WORD 0 ; NO I/O COMPLETE .BYTE 0 ; SYSTEMS .BYTE UDLEV ; I/O PRIORITY LEVEL 1 .WORD 0 ; DISC ERROR WORD .WORD 0 ; SYSTEM USE .WORD CDIHDR ; ADDRESp ; RELATIVE SECTOR OF ENTRY ; ; RELATED TO SORTSC ENTRY UPDFLG: .WORD 0 ; UPDATE FLAG - USED TO DIRECT CONTROL ; ; OF DISC DIRECTORY UPDATE UPDERR: .WORD 0 ; UPDATE ERROR - USED TO FLAG DISC ; ; ERROR DURING DIRECTORY UPDATE .ENDC ; CNVERT = . .WORD 0,0,0 ; SIX BYTE FIELD FOR BINARY TO ; q EMT EXIT ; EXIT FROM TASK ; ; REPORT DISC ERROR ; FLIB20 = . MOV #DISCER,PRTBUF JSR PC,PRINT BR FLIB10 ; EXIT ; ; LIST SPECIFIED FILE TYPES ; FLIC00 = . .IFZ DRESDI BR FLIA40 .ENDC .IFNZ DRESDI MOVB $ROSM+FSTAT(R0),R5 ; GET FILE TYPE STATUS BIC #177740,R5 ; ISOLATE LOGICAL DEVICE MOVB R5,DEVNO ASr ** ;* ** ;* G U L F E L E C T R O N I C S S Y S T E M S ** ;* ** ;********************************************************************** ; ; .PAGE ;********************************************************************** ;* ;* C R E A D P A R A M E T E R S ;* .IFG NCR sS OF CORE DIRECTORY IMAGE .WORD 0 .WORD CDIHDR ; ; BUFFER HEADER ; .PAGE ; ; FILE STATUS INFORMATION IS CONTAINED IN THE FOLLOWING ; TABLE ; FSTAT = . .BYTE $FD000 .BYTE $FD001 .BYTE $FD002 .BYTE $FD003 .BYTE $FD004 .BYTE $FD005 .BYTE $FD006 .BYTE $FD007 .BYTE $FD008 .BYTE $FD009 .IFL t ; ASCII CONVERSION .IFNZ $KT11C SVHDRA: .WORD 0 ; USED TO SAVE THIS HEADERS VIRTUAL ADDRESS .ENDC .PAGE ; COMPRS = . .IFNZ $KT11C EMT ROSGET ; SO WE CAN ADDRESS ROS EMT GETHDR ; SET UP TO ADDRESS HEADER MOV (SP)+,SVHDRA ; SAVE HEADER ADDRESS .ENDC MOV R0,FLTYPE ; FILE TYPE TO COMPRESS FROM PASSED ARG. CMP R0,#$FTMuL R5 ; WORD INDEX CLR R4 BISB $ROSM+PHYDEV(R5),R4 ; GET PHYSICAL UNIT INC R4 MOV R4,DODID ; DOD ID TO USE JMP FLIA25 ; START SCAN .ENDC ; ; PRINT FILE DIRECTORY INFORMATION ; FLID00 = . MOVB #NO,OB7 ; SET UP NO RESPONSES MOVB #NO,OB8 ; TO PROTEC AND CORE DIR. MOVB #' ,IFDCLR ; RESET MOVB #' ,IFDCLRv ;DON'T ASSEMBLE THIS ROUTINE IF THERE ;ISN'T AT LEAST ONE C/R IN SYSTEM .DEF CREAD,CRINIT .IFNZ TTYSW .DEF CRDON,CRDOFF .REF TTYIN,SAVE .REF RESTOR .ENDC .REF UNSPND,DQTIME,TTYOUT,QTIME .REF ACTIVE,QSAVEI,DSPTCH,ROSTOP .REF $CTASK,IOQTME,IODQTM,IOSTAT .REF PHYDEV,ALTDEV,LOGMAX .IFNZ BCD .REF O26ASC .IFNZ INEBC w 10.-$FTMAX XXXXXXXX ; ONLY SET UP FOR 10 FILE TYPES .ENDC . = FSTAT+$FTMAX ; ALLOCATE AREA FOR REST OF FSTAT .EVEN ; ; FILE MANAGEMENT CONTROL INFORMATION TABLE ; FMACTV: .WORD 0 ; FILE MANAGEMENT ACTIVE SWITCH ; TPCALL = . .WORD DEFA00 ; DEFINE PROCESSOR .WORD DELA00 ; DELETE PROCESSOR .WORD PRTA00 ; PROTECT PROCESSOR .WORD UNPA00 xAX ; FILE TYPE VALID? BHIS CMPA70 ; NO, ERROR-CAN'T COMPRESS MOVB $ROSM+FSTAT(R0),R5 ; GET FILE TYPE STATUS BIT #40,R5 ; COMPRESSION ALLOWED? BNE CMPA72 ; NO, ERROR-CAN'T COMPRESS BIC #177740,R5 ; ISOLATE LOGICAL DEVICE ASL R5 ; COMPUTE ITS WORD INDEX CLR R1 BISB $ROSM+PHYDEV(R5),R1 ; PHYSICAL DISC UNIT ON WHICH ; y+1 ; IFD MOVB #' ,IFDCLR+2 ; IN PRINT MOVB #' ,IFDCLR+3 ; BUFFER MOV (R2),R5 ; FILE ID MOV #OB1,R4 ; END EDIT ADDRESS MOV #5.,R0 ; 5 CHARACTERS JSR PC,B2ONTA ; CONVERT AND EDIT MOV SCTR(R2),R5 ; START SECTOR MOV #OB2,R4 ; END EDIT ADDRESS JSR PC,BIN2OC ; CONVERT ALL SIX CHARACTERS MOVB FTYPE(R2),R5 ; FIz .REF O26EBC .ENDC .IFNZ EXEBC .REF O29ASC .IFNZ INEBC .REF O29EBC .ENDC .ENDC .ENDC .IFNZ OVRLAY .REF RELTSK .ENDC PSR = PS ;ADDRESS OF PSR .IFNZ $KT11C .REF PPASV5,PPASV6,TVPPA,IOCOMX .REF SVPPA,TSK.PC .ENDC BELL = 07 ;'BELL' ASCII CODE LF = 12 ;LINE FEED A{ ; UNPROTECT PROCESSOR ; NOFMRQ = . .WORD 0 ; NO. FILE MGMT. REQUESTS IN QUEUE CDAVAL: .WORD 0 ; USED TO SAVE ADDRESS OF AVAILABLE ; ; ENTRY IN CORE DIRECTORY CDIFD: .WORD 0 ; USED TO SAVE IFD AVAILABLE CORE ENTRY NEWSS: .WORD 0 ; USED TO SAVE NEW START SECTOR OF FILE SCHIDX: .WORD 0 ; USED TO SAVE INDEX INTO SEARCH BUFFER OF ; | ; TYPE RESIDES ASL R1 ; COMPUTE WORD INDEX CMPA10: MOVB #PLOCK,@#PSR ; SET PRIORITY LOCKOUT TST $ROSM+NODREQ(R1) ; DEVICE HAVE ANY REQUESTS PENDING? BMI CMPB00 ; NO CMPA20: CLRB @#PSR ; YES-RESET LOCKOUT ; ; NOTE: SINCE THIS IS A TASK, PSR MAY BE RESET WITH PRI. 0 ; MOV #CMPTMR,-(SP) ; THREAD 100 MSEC TIMER MOV #100.,-(SP) ; TIME DELAY EMT QTIME }LE TYPE BPL FLID10 ; NO CORE DIRECTORY ENTRY MOV R5,-(SP) ; SAVE MOV R4,-(SP) ; REGISTERS MOV R3,-(SP) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV (R2),R0 ; ID TO R0 MOVB PDVCE(R2),WORKWD ; SET DEVICE NO IN BIC #177600,WORKWD ; WORK WORD MOV #WORKWA,R1 ; ADDRESS OF DEVICE-5 SO WE CAN USE CDSRCH JSR ~SCII CODE CR = 15 ;CARRIAGE RETURN ASCII CODE NREAD = 2 ;NREAD WORD OF DATA BUFFER AVAIL = 100000 ;'AVAILABLE' BIT IN PHYSICAL DEVICE TABL ALT = 040000 ;'ALTERNATE DEVICE' BIT IN PHYSICAL DEV TBL CRDEV = 2 ;PHYSICAL DEVICE TABLE CODE FOR C/R DEVICES .PAGE ;********************************************************************** ;* ;* C R E A D D A T A T A B L E S ;* ;*; A DELETED FILE WHOSE REMAINING ; ; LENGTH IS BEING USED TO DEFINE ; ; A NEW FILE. SBUFLN: .WORD 0 ; LENGTH OF BUFFER DURING CORE/DISC ; ; DIRECTORY SEARCH. LNREQ: .WORD 0 ; USED TO SAVE LENGTH REQUIRED FOR ; ; FILE DURING DIRECTORY SEARCH SORTLN: .WORD 0 ; USED TO SORT LARGEST LENGTH OF A DELETED ; SUSPEND FOR 100 MSEC. TST (SP)+ ; IGNORE ERROR BR CMPA10 ; TRY AGAIN ; ; CMPA70: JMP CMPER1 CMPA72: JMP CMPER2 ; ; NO DISC REQUESTS PENDING-START COMPRESSION ; R0 = FILE TYPE ; R1 = PHYSICAL DEVICE WORD INDEX ; R5 = LOGICAL DEVICE WORD INDEX ; CMPB00 = . TSTB $ROSM+FSTAT(R0) ; FILE MANAGEMENT IN PROGRESS BMI CMPA20 ; YES-WAIT PC,CDSRCH ; FIND IFD OF ENTRY MOV R4,R5 ; IFD TO CONVERT MOV #OB9,R4 MOV #4,R0 JSR PC,B2ONTA MOVB #YES,OB8 ; YES CORE DIRENTORY MOV (SP)+,R0 ; RESTORE MOV (SP)+,R1 ; REGISTERS MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 MOV (SP)+,R5 FLID10: BIC #177600,R5 ; ISOLATE FILE TYPE MOV #OB3,R4 ********************************************************************* ; ; COUNT: ;CONTAINS CURRENT BYTE INDEX TO .=.+NCR+NCR ;CALLER'S DATA BUFFER ; ERRCR: ;CONTAINS COUNTER OF NUMBER OF RETRIES .=.+NCR+NCR ;BEFORE ABORTING REQUEST ; MXCNT: ;MAXIMUM NUMBER OF BYTES TO STORE: .=.+NCR+NCR ;2*NWORD FOR BINARY, NWORD FOR ALPHANUM. ; .BOUND ; CRFR; ; TYPE IN A DIRECTORY. .IFNZ DRESDI CRRSCT: .WORD 0 ; USED TO SAVE CURRENT REQUESTS RELATIVE ; ; SECTOR OF FILE ENTRY CRREAD: .WORD 0 ; CURRENT REQUEST'S ENTRY ADDRESS IN I/O BUFFER LNODOD: .WORD 0 ; USED TO SAVE LENGTH OF DOD DURING ; ; IT'S SEARCH .ENDC .IFNZ $KT11C CFMSVA: .WORD 0 ; USED TO MOV R0,@#$ROSM+CPRSIP ; NO-SET COMPRESSION IN PROGRESS ; ; FOR THIS TYPE .IFZ $KT11C MOV #FMGMTQ,FMQEP ; SET UP RE-QUEUE ENTRY POINTS IN MOV #DISCQ,DSCQEP ; HEADER FOR FLMGMT AND DISCIO .ENDC .IFNZ $KT11C MOV SVHDRA,R2 ; GET TZSK HEADER ADDRESS MOV #FMGMTQ,6.(R2) ; PUT REQUEUE FOR FLMGMT ; ; IN ENTRY POI MOV #3,R0 JSR PC,B2ONTA MOVB PDVCE(R2),R5 ; LOGICAL DEVICE BPL FLID20 MOVB #YES,OB7 ; SET PROTECT = Y FLID20: BIC #177600,R5 ; ISOLATE MOV #OB4,R4 MOV #3,R0 JSR PC,B2ONTA MOV LGTH(R2),R5 ; FILE LENGTH MOV #OB5,R4 JSR PC,BIN2OC MOV CKSAVE(R2),R5 ; CKSAVE IF REQUIRED MOV #OB6,R4 JSR PC,BIN2OC ST = . ;POINTER TO BEGINNING OF QUEUE CRLAST = .+2 ;POINTER TO END OF QUEUE .REPT NCR .WORD 0 .IIF NE $KT11C .PACK .-2 .IIF EQ $KT11C .WORD .-2 .ENDR .IFNZ $KT11C ; VRFRST: .=.+NCR+NCR ;CONTAINS SYS VIRTUAL EQUIVALENT OF CRFRST ; VRKPR5: .=.+NCR+NCR ;CONTAINS KPAR5 BASE REQUIRED BY VRFRST .ENDC ; CRBUSY: .=SAVE CURRENT FILE MGMT. SVA FMPAR5: .WORD 0 ; USED TO SAVE KERNEL ASR5 OF SVA .ENDC .PAGE .IFNZ DRESDI ; ; DISC I/O PARAMETER LIST FOR DIRECTORY READS AND ; UPDATES. ; .BOUND DLIST = . .WORD 1 ; THREAD WORD DEVNO: .BYTE 0 ; DEVICE NO. -SET DYNAMICALLY DEXIT: .BYTE 3 ; USE EXIT TYPE 3 IOCOMP: .WORD 0 ; I/O COMPLETE ADDRESS - SET DYNAMICALLYNT MOV #DISCQ,18.(R2) ; PUT REQUEUE FOR DISCIO IN ARG .ENDC EMT NOCKPT ; SET TASK NOT CHECKPOINTABLE FOR ; ; REST OF IT'S EXECUTION CLRB @#PSR ; RESET LOCKOUT ASR R5 MOVB R5,DEVNO ; SAVE LOGICAL DEVICE NO. ASR R1 MOV R1,PHYUNT ; SAVE PHYSICAL DISC NO. .IFNZ DRESDI INC R1 ; DOD ID FOR PHYSICAL DEVICE MOV #OUTBUF,PRTBUF JSR PC,PRINT ; PRINT LINE JMP FLIA60 ; GET NEXT PRINT LINE ; ; ; DIRECT PRINTING OF BUFFER WHOSE ADDRESS HAS BEEN SET ; IN PRTLST. ; PRINT = . MOV #PRTLST,-(SP) ; I/O LIST TO STACK .IFNZ NLP EMT LPRNTR ; USE LINE PRINTER DEC PAGCTL BNE PRNT20 .IFNZ $BATCH TST FLTYPE ; ROS OR BATCH BMI PRNT.+NCR+NCR ;0 = C/R NOT IN USE, 1 = C/R IN USE ; CRDATA: .=.+NCR+NCR ;ADDRESS OF CURRENT DATA BUFFER ; CRTASK: .=.+NCR+NCR ;TASK NO. FOR CURRENT I/O - 0=NON-TASK RQST ; IGNORE: .=.+NCR+NCR ;1 = IGNORE REMAINDER OF CARD BEING READ ; REPEAT: .=.+NCR+NCR ;1 = READ ANOTHER CARD [LAST ONE WAS CONTROL] ; .IFNZ BCD TABLE: .=.+NCR+NCR ;CONTAINS THE ADDRESS OF THE A .BYTE 0 ; SYSTEMS DLVL: .BYTE 0 ; DISC PRIORITY LEVEL - SET DYNAMICALLY DERRWD: .WORD 0 ; DISC ERROR WORD .WORD 0 ; RESERVED FOR SYSTEM .WORD DBUF ; ADDRESS OF DISC BUFFER .WORD 0 .WORD DBUF ; DBUF = . .WORD 0 ; USED FOR FILE ID - SET DYNAMICALLY .BYTE 0 ; USE RLSECT AND NWORD IOFCN: .BYTE 0 MOV R1,DODID ; SAVE .ENDC MOV #$ROSM+COMPID,R1 ; ADDRESS OF COMPRESSION ; ; DIRECTORY ENTRY MOVB DEVNO,PDVCE(R1) ; SET DEVICE NO. IN COMPID MOVB R0,FTYPE(R1) ; SET APPROPRIATE FILE TYPE IN ENTRY ASL R0 ; FILE TYPE WORD INDEX MOV $ROSM+FINIT(R0),CSS(R1) ; SET INITIAL SECTOR THIS TYPE ASR R0 ; ; COMPRESSIO10 ; BATCH .ENDC JSR PC,ROSHDR BR PRNT20 .IFNZ $BATCH PRNT10: JSR PC,BTCHDR .ENDC PRNT20 = . .ENDC .IFZ NLP EMT TTYOUT ; USE TELETYPE .ENDC RTS PC ; IGNORE ERROR AND RETURN ; ; ; SUBROUTINE BINARY TO OCTAL ASCII CONVERSION. ; INPUT R5 = BINARY NUMBER ; R4 = DESTINATION END ADDRESS ; LPHANUMERIC ;CONVERSION TABLE CURRENTLY IN USE .ENDC ; .IFNZ TTYSW CRBKUP: .=.+NCR+NCR ;1 = BACK UP C/R WITH TTY .ENDC .BOUND ; CRMOD: ;CARD READER TIMER MODULES .WORD 1,0,0,0 .BYTE $RES,120 ;ARGUMENT AND JSR OPTIONS FOR TIMERS .WORD 0,0,0, ;(THE ARGUMENT IS THE C/R NUMBER .IFG NCR-1 .WORD 1,0,0,0 ; I/O FCN - SET DYNAMICALLY .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 0 ; RELATIVE SECTOR-SET DYNAMICALLY .WORD 64. ; ONE SECTORS LENGTH BUFFER = . . = .+128. ; RESERVE 64 WORD BUFFER ; ; .ENDC .PAGE ; ; EQUATES FOR RELATIVE FILE POSITIONS ; SCTR = 2. ; START SECTOR FTYPE = 4. ; FILE TYPE PDVCE = 5. ; PRN START SECTOR CMPB10 = . MOV #-1.,SORTSC ; INITIALIZE SORT SECTOR CLR HITFLG ; RESET HIT FLAG .IFNZ DRESDI CLR RLSECT ; START AT RELATIVE SECTOR 0 CMPB15: MOVB #2.,EXTYP ; EXIT TYPE 2 DISC I/O MOVB #RDLEV,DLVL ; DISC I/O PRIORITY MOV DODID,CPRBUF ; SEARCH DISC RESIDENT DIRECTORY CLRB IOFCN ; READ FUNCTION CMPB20: MOV #DLIST,-(SP) ; LIST ADDRESS TO STAC R0 = ITERATION LENGTH IF B2ONTA ENTERED ; BIN2OC = . MOV #6,R0 ; SET UP ITERATION LENGTH B2ONTA: INC R4 B2LOOP: MOVB R5,-(R4) BICB #370,(R4) BISB #060,(R4) ; CHANGE TO ASCII CODE ASR R5 ; BEGIN SHIFTING FOR NEXT OCTAL DIGIT BIC #100000,R5 ; PREVENT SIGN PROPAGATION ASR R5 ASR R5 DEC R0 ; MORE TO GO? BGT B2LO;C/R 2 .BYTE $RES,120 .WORD 0,2,0 .IFG NCR-2 .WORD 1,0,0,0 ;C/R 3 .BYTE $RES,120 .WORD 0,4,0 .IFG NCR-3 .WORD 1,0,0,0 ;C/R 4 .BYTE $RES,120 .WORD 0,6,0 .ENDC .ENDC .ENDC .BOUND ; CRLIST: .WORD 1 ;C/R ERROR MESSAGE I/O LISTS .BYTE 0,3 ;C/R # 1 .WORD CRTTY,0,0,0,0 .WORD 0,OTECT STATUS AND DEVICE LGTH = 6. ; FILE LENGTH CKSAVE = 8. ; CHECK POINT SECTOR ADDRESS ; ; EQUATES FOR FLMGMT PARAMETER LIST ; THREAD = 0. ; THREAD WORD ERROR = 2. ; ERROR INDICATOR ERRTSK = 3. ; RESERVED FOR FLMGMT SYSTEM = 4. ; RESERVED FOR FLMGMT FILEID = 6. ; FILE ID FLTYPE = 8. ; FILE TYPE SYSTMB = K EMT PFRITE ; START DISC I/O CMP #9.,DERRWD ; SEARCHED COMPLETE DIRECTORY? BEQ CMPB80 ; YES-SEE IF WE GOT A HIT TST DERRWD ; DISC ERROR OCCUR? BNE CMPB70 ; YES-DO SOMETHING MOV #BUFFER,R2 ; START ADDRESS OF SEARCH BUFFER MOV #120.,SBUFLN ; SEARCH 60 WORDS/120 BYTES .ENDC .IFZ DRESDI MOV #$ROSM+FILE,R2 ; START ADDRESS OF SEARCH OP ; BACK FOR MORE RTS PC ; ; PRINT ROS FILE LIST HEADER AND SET UP PAGE CONTROL ; ROSHDR = . .IFNZ NLP MOV #$NLINE,PAGCTL ; SET UP FOR PAGE CONTROL .ENDC MOV #EJECT,PRTBUF JSR PC,PRINT ; FORM FEED PRINT DEVICE MOV #HDR1,PRTBUF JSR PC,PRINT ; PRINT MOV #HDR2,PRTBUF JSR PC,PRINT ; FILE LIST MOV #HDR3,PRTBUF 0 .IFG NCR-1 .BOUND .WORD 1 ;C/R # 2 .BYTE 0,3 .WORD CRTTY,0,0,0,0 .WORD 0,0 .IFG NCR-2 .BOUND .WORD 1 ;C/R # 3 .BYTE 0,3 .WORD CRTTY,0,0,0,0 .WORD 0,0 .IFG NCR-3 .BOUND .WORD 1 ;C/R # 4 .BYTE 0,3 .WORD CRTTY,0,0,0,0 .WORD 0,0 .ENDC .ENDC 9. ; RESERVED FOR FLMGMT LENGTH = 10. ; LENGTH OF FILE TO DEFINE ; ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ; PRIORITY LOCKOUT MASK RDLEV = 3. ; DISC LEVEL AT WHICH TO READ UDLEV = 1. ; DISC LEVEL AT WHICH TO UPDATE ; .PAGE .CSECT FMCODE ; ; DEFINE = . JSR R5,PUSHR ; SAVE REGISTERSBUFFER MOV #NCRLOC-$ROSFW-$ROSFW,SBUFLN ; SEARCH BUFFER LENGTH ; ; DON'T LOOK AT SYSTEM ENTRYS .ENDC ADD R2,SBUFLN ; END ADDRESS TO SEARCH IN BUFFER CMPB30: MOVB FTYPE(R2),R3 ; GET FILE TYPE OF ENTRY BIC #177600,R3 ; ISOLATE CMP R0,R3 ; SAME AS FILE TYPE TO COMPRESS? BEQ CMPC00 ; YES CMPB40: ADD #10.,R2 ; BUMP TO NEXT ENTRY IN SEARCH BUFFER JSR PC,PRINT ; HEADER MOV #BLNKLN,PRTBUF JSR PC,PRINT ; SPACE ONE LINE RTS PC ; .IFNZ $BATCH ; ; PRINT BATCH ELEMENT HEADER AND SET UP PAGE CONTROL ; BTCHDR = . .IFNZ NLP MOV #$NLINE,PAGCTL ; SET UP FOR PAGE CPNTROL .ENDC MOV #EJECT,PRTBUF JSR PC,PRINT ; FORM FEED FRINT DEVICE MOV #BTCH1,PRTBUF JSR PC,P .ENDC ; CRMDAD: .WORD CRMOD,CRMOD+16.,CRMOD+32.,CRMOD+48. .=CRMDAD+NCR+NCR ;TABLE USED TO GET ADDRESS OF TIMER ;MODULE USING C/R INDEX .PAGE ; ; CRIOLS: .WORD CRLIST,CRLIST+18.,CRLIST+36.,CRLIST+54. .=CRIOLS+NCR+NCR ;TABLE USED TO GET ADDRESS OF TTY I/O LIST ;USING C/R INDEX .IFNZ BIN ; BYTE: ;USED IN BINARY MODE T CLR R0 ; DEFINE ENTRY BR FLMA10 ; PROCESS ; DELETE = . JSR R5,PUSHR ; SAVE REGISTERS MOV #1,R0 ; DELETE ENTRY BR FLMA10 ; PROCESS ; PRTCT = . JSR R5,PUSHR ; SAVE REGISTERS MOV #2,R0 ; PRTCT ENTRY BR FLMA10 ; PROCESS ; UNPRCT = . JSR R5,PUSHR ; SAVE REGISTERS MO CMP R2,SBUFLN ; COMPLETE BUFFER SEARCHED BLT CMPB30 ; NO-KEEP LOOKING .IFNZ DRESDI INC RLSECT ; READ NEXT SECTOR OF DIRECTORY BR CMPB20 ; ; CMPB70: JMP CMPER3 .ENDC CMPB80: JMP CMPD00 ; SEE IF WE GOT A HIT ; ; FOUND AN ACTIVE ENTRY OF APPROPRIATE FILE TYPE. ; DETERMINE IT'S POSITION IN FILE TYPE AREA. ; R0 = FILE TYPE ; R1 = ADDRESS OF RINT ; PRINT MOV #BTCH2,PRTBUF JSR PC,PRINT ; HEADER TO LIST MOV #HDR3,PRTBUF JSR PC,PRINT ; BATCH ELEMENTS MOV #BLNKLN,PRTBUF JSR PC,PRINT ; SPACE ONE LINE RTS PC ; ; ; TWO DIGIT ASCII NO. TO BUFFER ; R1 = BINARY NUMBER ; R3 = TWO DIGIT ASCII ADDRESS ; TOBUFR = . MOV R1,-(SP) MOV #ASCII,-(SP) EMT O INDICATE WHICH .=.+NCR+NCR ;SET OF BITS TO USE FROM NEXT COLUMN ; BINARY: ;USED IN BINARY MODE; CONTAINS 4 BITS .=.+NCR+NCR ;CARRIED OVER FROM PREVIOUS COLUMNS ; CRMODE: .=.+NCR+NCR ;1 = CURRENT REQUEST IS IN BINARY .ENDC .PAGE ; ; C / R S T A T U S B I T S ( C R S ) ; CRERR = 100000 ;C/R ERROR DONE = 040000 ;CARD DONE HOPPER = V #3,R0 ; UNPRCT ENTRY ; FLMA10 = . MOV 14.(SP),R1 ; GET FLMGMT PARAMETER LIST .IFNZ $KT11C MOV R1,-(SP) JSR PC,SVPPA MOV (SP),R5 ; SAVE .ENDC MOVB R0,ERRTSK(R1) ; SAVE ENTRY POINT MOV @#PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK MOV #1.,R0 ; PRESET ERROR TYPE REGISTER .LOCK DEC (R1) ; IS LIST THREADABLE? COMPID ; R2 = ENTRY'S ADDRESS ; CMPC00 = . TST (R2) ; ENTRY ACTIVE? BNE CMPC05 ; YES .IFNZ DRESDI BR CMPC30 .ENDC .IFZ DRESDI CLR LGTH(R2) ; NO-SET LENGTH EQUAL TO ZERO SO ; ; DEFINE WON'T USE THE SPACE BR CMPB40 ; KEEP LOOKING .ENDC CMPC05: MOV SCTR(R2),R3 ; GET FILE'S START SECTOR BINASC MOVB ASCII+4,(R3)+ MOVB ASCII+5,(R3)+ RTS PC ; ; ; LIST BATCH FILE ELEMENTS ; FLBA00 = . JSR PC,BTCHDR ; PRINT BATCH FILE ELEMENT HEADER MOV #$BCHID,DODID ; ID TO USE FOR BATCH MOVB #1.,DEVNO ; SET DEVICE NO. FOR BATCH FILES CLR RLSECT ; START AT SECTOR ZERO FLBA10: MOV #DLIST,-(SP) EMT DISCIO ; READ ONE SECTOR TST DERR 020000 ;INPUT HOPPER EMPTY / OUTPUT HOPPER FULL CHECK = 010000 ;C/R CHECK ERROR TIMING = 004000 ;C/R TIMING ERROR ONLINE = 002000 ;TRANSITION TO ON-LINE BUSY = 001000 ;HOPPER EMPTY READY = 000400 ;C/R READY COLUMN = 000200 ;COLUMN READY ENABLE = 000100 ;INTERRUPT ENABLE EJECT = 000002 ;SUPPRESS COLUMN READY (EJECT CARD) START = 000001 BNE FLMA30 ; NO - ERROR TYPE 1 MOVB (SP),@#PSR ; RESET PRIORITY LOCKOUT INC R0 ; BUMP ERROR TYPE REGISTER CMP #NDISCS+$SYSFL,FILEID(R1) ; FILE ID VALID? BHIS FLMA35 ; NO- NDISCS+1 < FILE ID <= $IDMAX CMP #$IDMAX,FILEID(R1) ; OTHERWISE BLO FLMA35 ; ERROR TYPE 2 INC R0 ; BUMP ERROR TYPE REGISTER JSR PC,GFTYPE ; GET FILE TYPE CMP R3,CSS(R1) ; DOES FILE NEED COMPRESSION? BLO CMPB40 ; NO-KEEP LOOKING BEQ CMPC10 ; NO-BUT ADJUST CSS CMP R3,SORTSC ; MAYBE-HAVE WE FOUND ONE LOWER? BHI CMPB40 ; YES-KEEP LOOKING INC HITFLG ; FOUND SOMETHING-SET HIT FLAG MOV R3,SORTSC ; SAVE FILE'S START SECTOR MOV (R2),SORTID ; SAVE FILE'S ID MOV LGTH(R2),SORTLN ; SAVE FILE'S LENGTHWD ; DISC ERROR? BNE FLBA20 ; YES-REPORT MOV #BUFFER,R2 ; DATA BUFFER ADDRESS TST RLSECT ; FIRST SECTOR OF DIRECTORY BNE FLBA16 ; NO-DON'T IGNORE ENTRY 0 FLBA15: ADD #16.,R2 ; BUMP TO ELEMENT DIRECTORY FLBA16: CMP R2,#BUFFER+128. ; DONE WITH THIS BUFFER? BLT FLBB00 ; NO INC RLSECT ; YES/BUMP RELATIVE SECTOR CMP #31.,RLSECT ; SEARCH ;START I/O SWITCH = 6004 ;BINARY CODE FOR SWITCH TO TTY (12-11-7 ) EOD = 6003 ;LOGICAL END-OF-DATA (12-11-8-9) $029 = 6002 ;029 CARD CODE (12-11-8 ) $026 = 6001 ;026 CARD CODE (12-11-9 ) THREAD = 0. ;* DEVICE = 2. ;* S Y S T E M TYPE = 3. ;* $EXIT = 4. ;* LEVEL = 6. ;* FROM LIST CMP R2,#$FTMAX ; IS IT VALID IN THIS SYSTEM? BHI FLMA35 ; NO-ERROR TYPE 3 INC R0 ; BUMP ERROR TYPE MOVB FSTAT(R2),R3 ; GET LOGICAL DISC FOR THIS TYPE BIC #177740,R3 ; ISOLATE MOVB R3,SYSTMB(R1) ; SAVE ASL R3 ; USE AS WORD INDEX TST PHYDEV(R3) ; IS DEVICE AVAILABLE? BMI FLMA35 ; NO - ERROR TYPE 4 INC MOV R2,SORTAD ; SAVE ADDRESS OF ENTRY .IFNZ DRESDI MOV RLSECT,SORTRS ; SAVE RELATIVE SECTOR OF ENTRY .ENDC BR CMPB40 ; SEARCH COMPLETE DIRECTORY ; CMPC10 = . ADD LGTH(R2),CSS(R1); BUMP COMPRESS START SECTOR .IFNZ $TMSLC!CHKPTC BITB #100,$ROSM+FSTAT(R0) ; CKSAVE AREA REQUIRED? BEQ CMPC20 ; NO ADD LGTH(R2),CSS(R1); YES-BUMP CSS BY LENGTH AGAED COMPLETE BFUP DIRECTORY BGE FLBA10 ; NO-KEEP GOING FLBA17: EMT EXIT ; YES-EXIT FROM FILE LIST FLBA20: MOV #BCHERR,PRTBUF JSR PC,PRINT ; PRINT ERROR MESSAGE EMT EXIT ; ; FLBB00 = . TST (R2) ; NAME VALID? BEQ FLBA17 ; NO-DONE WITH LIST ; ; SET UP PRINT BUFFER ; MOV #BENAME,-(SP) ; ASCII STRING ADDRESS MOV R2,-(SP) ; ADDR I / O L I S T ERRTSK = 7. ;* ERROR = 8. ;* SYSTEM = 10. ;* E Q U A T E S DATA = 12. ;* DTPAR = 14. ;KPAR6 VALUE OFR VIRTUAL DATA BUFFER ADDRESS DTVIRT = 16. ;SYSTEM VIRTUAL EQUIVALENT OF DATA BUFFER ADDRSS .IIF NE $KT11C RET.PC = 18. .IIF EQ $KT11C RET.PC = 14. .IIF NE $KT11C CRFRPK: .PACK CRFRST ; ; C/R0 ; BUMP ERROR TYPE CMP 14.(SP),#TSK.PC BNE FLMA35 ; NOT A TASK-CAN'T SUSPEND-ERROR TYPE 5 MOV $CTASK,R3 ; GET CALLING TASK NUMBER INCB IOSTAT(R3) ; SET TASK'S I/O STATUS MOV R3,SYSTEM(R1) ; SAVE TASK NUMBER FOR UNSPND .LOCK .IFZ $KT11C MOV R1,@FMLAST ; THREAD REQUEST IN MOV R1,FMLAST ; FILE MANAGEMENT QUEUE .ENDC .IIN .ENDC CMPC20: JMP CMPB10 ; START DIRECTORY SEARCH OVER .IFNZ DRESDI ; ; FOUND A FILE DIRECTORY ENTRY THAT WAS DELETED. MAKE SURE ; ITS LENGTH IS ZERO SO DEFINE CAN'T USE THE SPACE. ; CMPC30 = . MOV R2,UPDFLG ; SAVE FOR I/O COMPLETE MOVB #3.,EXTYP ; EXIT TYPE MOV #CMPC40,IOCOMP ; FIRST I/O COMPLETE ADDRESS MOVB #UDLEV,DLVL ; HIGHEST PRI. DISC LEVEL MOVB #4.,IOESS OF RAD50 NAME EMT 39. ; RAD 50 UNPACK MOVB BTYPE(R2),R1 ; GET ELEMNT TYPE BIC #177600,R1 ; ISOLATE ASL R1 ; TIMES TWO ASL R1 ; TIMES FOUR ADD R1,R1 ; TIMES EIGHT MOV BETPTB(R1),BETYPE TST (R1)+ MOV BETPTB(R1),BETYPE+2 ; PUT IN ELEMENT TYHPE TST (R1)+ MOV BETPTB(R1),BETYPE+4 TST (RR TABLES OF ADDRESSES. THE C/R INDEX SERVES AS AN INDEX INTO ; THESE TABLES TO GET THE ADDRESS OF THE REQUIRED TABLE FOR THE ; CURRENT CARD READER. ; CRADDR: .BYTE CR1 ;ADDRESSES OF CARD READERS .BYTE CR2 .BYTE CR3 .BYTE CR4 .=CRADDR+NCR .EVEN ; CRS: .WORD CRS.1 ;ADDRESS OF CARD READER STATUS WORDS .WORD CRS.2 .WORD CRS.3 .WORD CRS.4 .=CRS+NCR+NCR ; CRB1: .WFNZ $KT11C MOV FMLAST,-(SP) JSR PC,PPASV6 ; GET AN SVA MOV R5,@(SP)+ ; THREAD REQUEST IN MOV R5,FMLAST ; FILE MGMT. QUEUE .ENDC INC NOFMRQ ; INCREMENT NO. REQUESTS IN QUEUE MOVB (SP)+,@#PSR ; RESET LOCKOUT AND POP STACK JSR R5,POPR ; RESTORE REGISTERS MOV @#PSR,2.(SP) ; SET PS ON STACK FOR QSAVEI CLR -(SP) ; REQUEST VOFCN ; UPDATE DISC I/O MOV #DLIST,-(SP) ; START UPDATE EMT PFRITE TST DERRWD ; ERROR IN REQUEST PROCESSING BNE CMPC70 ; YES-REPORT DIR. UPDATE ERROR EMT SUSPND ; SUSPEND THIS TASK ; ; UNSUSPENDED HERE ; TST UPDERR ; DISC ERROR OCCUR DURING DIR. UPDATE? BNE CMPC70 ; YES- REPORT DIR. UPDATE ERROR JMP CMPB15 ; RE-START SEARCH OF P1)+ MOV BETPTB(R1),BETYPE+6 MOVB STATUS(R2),R1 ; GET STATUS BPL FLBB10 NEG R1 ; SET POSITIVE INC R1 ; BUMP TO MAKE VALID INDEX FLBB10: ASL R1 ASL R1 ADD R1,R1 ; TIME EIGHT MOV STTBL(R1),BESTAT TST (R1)+ MOV STTBL(R1),BESTAT+2 TST (R1)+ ; PUT IN ELEMENT STATUS MOV STTBL(R1),BESTAT+4 TST ORD CRB1.1 ;ADDRESS OF C/R BINARY BUFFERS .WORD CRB1.2 .WORD CRB1.3 .WORD CRB1.4 .=CRB1+NCR+NCR ; CRB2: .WORD CRB2.1 ;ADDRESS OF C/R COMPRESSED DATA BUFFER .WORD CRB2.2 .WORD CRB2.3 .WORD CRB2.4 .=CRB2+NCR+NCR ; .IFNZ NCR-1 CRVECT: .WORD CRVC.1 ;INTERRUPT VECTOR ADDRESSES C/R # 1 .WORD CRVC.2 ;C/R # 2 .WORD CRVC.3 ;C/R # 3 LUNTARY SUSPENSION OF TASK JSR PC,QSAVEI ; DO IT MOV #DSPTCH,-(SP) ; RETURN TO DISPATCHER WHEN THROUGH MOV @#PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK .LOCK TST FMACTV ; FILE MGMT. CURRENTLY PROCESSING REQUESTS? BEQ FLMB00 ; NO FLMA20: MOVB (SP)+,@#PSR ; YES - RESET PRIROITY LOCKOUT RTS PC ; FLMA30: JMP ERRA00 FLMA35: JMP ERRA10 ; FLMB00 = . INC REVIOUS SECTOR ; ; FIRST I/O COMPLETE FOR DELETED ENTRY CLEAN-UP ; CMPC40 = . TST DERRWD ; DISC ERROR? BNE CMPC60 ; YES MOV UPDFLG,R2 ; ADDRESS OF ENTRY IN DISC BUFFER CLR LGTH(R2) ; SET IT'S LENGTH TO ZERO MOV #CMPC50,IOCOMP ; NEXT I/O COMPLETE RTS PC ; RETURN TO PFRITE ; ; SECOND I/O COMPLETE FOR DELETED FILE CLEAN-UP ; CMPC50 = . (R1)+ MOV STTBL(R1),BESTAT+6 MOVB BDAY(R2),R1 ; GET BINARY DAY MOV #DATE1,R3 JSR PC,TOBUFR MOVB BMNTH(R2),R1 ; GET BINARY MONTH MOV R1,R3 ASL R1 ADD R3,R1 ; TIMES THREE MOVB MNTHTB(R1),DATE2 TSTB (R1)+ MOVB MNTHTB(R1),DATE2+1 ; PUT IN MONTH TSTB (R1)+ MOVB MNTHTB(R1),DATE2+2 MOVB BYEAR(R2),R1 ; GET BI .WORD CRVC.4 ;C/R # 4 .=CRVECT+NCR+NCR .ENDC .IFZ NCR-1 CRVECT = CRVC.1 .ENDC .PAGE ; ; CREAD OPERATOR ACTION MESSAGES ; ; ERMSGE: .IFG NCR-1 .WORD ERMS,ERMS+16.,ERMS+32.,ERMS+48. .=ERMSGE+NCR+NCR ERMS: .ENDC .WORD 12.,0 .BYTE CR,LF .ASCII 'CR 1 ERROR' .IFG NCR-1 .WORD 12.,0 .BYTE CR,LF .ASCII 'CR 2 ERROR' FMACTV ; SET FILE MANAGEMENT ACTIVE FLMB10 = . MOVB (SP),@#PSR ; RESET PRIORITY LOCKOUT .IFZ $KT11C MOV FMFRST,R1 ; ADDRESS OF FIRST REQUEST IN QUEUE .ENDC .IFNZ $KT11C MOV FMFRST,-(SP) ; PPA OF FIRST REQUEST JSR PC,PPASV5 MOV (SP)+,R1 ; SVA OF FIRST REQUEST MOV R1,CFMSVA ; SAVE MOV $KPAR5,FMPAR5 ; TOO .ENDC TST DERRWD ; DISC ERROR? BNE CMPC60 ; YES JMP UPD020 ; SET NO ERROR-UNSUSPEND COMPRS ; CMPC60 = . JMP UPD030 ; SET ERROR-UNSUSPEND COMPRS ; CMPC70: JMP CMPER5 .ENDC ; ; ; DETERMINE IF A FILE WAS FOUND THAT NEEDS TO BE "SQUEEZED" ; TOWARDS FRONT OF FILE TYPE AREA. ; R0=FILE TYPE ; R1=COMPID ADDRESS ; CMPD00 = . TST HITFLGNARY YEAR MOV #DATE3,R3 JSR PC,TOBUFR MOVB BHOUR(R2),R1 ; GET BINARY HOUR MOV #TIM1,R3 JSR PC,TOBUFR MOVB BMIN(R2),R1 ; GET BINARY MINUTE MOV #TIM2,R3 JSR PC,TOBUFR MOVB BSEC(R2),R1 ; GET BINARY SECOND MOV #TIM3,R3 JSR PC,TOBUFR MOV BSTRTS(R2),R5 ; START SECTOR MOV #SS,R4 JSR PC,BIN2OC MOV BLGT .IFG NCR-2 .WORD 12.,0 .BYTE CR,LF .ASCII 'CR 3 ERROR' .IFG NCR-3 .WORD 12.,0 .BYTE CR,LF .ASCII 'CR 4 ERROR' .ENDC .ENDC .ENDC ; ; RANDOM: .IFG NCR-1 .WORD RAND,RAND+20.,RAND+40.,RAND+60. .=RANDOM+NCR+NCR RAND: .ENDC .WORD 16.,0 .BYTE CR,LF .ASCII 'CR 1 SPUR INT ' .IFG NCR-1 .WORD 16.,JSR PC,GFTYPE ; GET FILE TYPE .LOCK CMP R2,CPRSIP ; COMPRESSION IN PROGRESS THIS FILE TYPE? BEQ FLMC00 ; YES-PUT IN WAIT QUEUE BISB #200,FSTAT(R2) ; SET FILE MGMT. IN PROGRESS THIS TYPE MOVB (SP),@#PSR ; RESET PRIORITY LOCKOUT MOVB ERRTSK(R1),R0 ; GET ENTRY POINT TO FLMGMT ASL R0 ; WORD INDEX JMP @TPCALL(R0) ; GO TO APPROPRIATE PROCESSOR ; ; COMP ; FIND SOMETHING TO SQUEEZE BEQ CMPE00 ; NO-DONE WITH COMPRESSION MOV SORTLN,LGTH(R1) ; SET LENGTH OF FILE TO MOVE CLR RLSECT ; START AT RELATIVE SECTOR 0 CMPD10: CLRB IOFCN ; SET TO READ MOV SORTID,CPRBUF ; READ 1 SECTOR OLD FILE MOV #DLIST,-(SP) ; DISC LIST TO STACK EMT PFRITE ; READ 1 SECTOR OF FILE TST DERRWD ; DISC ERROR OCCUR? BNE H(R2),R5 ; LENGTH MOV #LG,R4 JSR PC,BIN2OC MOV #BTCHBF,PRTBUF JSR PC,PRINT ; PRINT ELEMENT INFO. JMP FLBA15 ; NEXT---- ; .ENDC ; ; CDSRCH WILL PERFORM A CORE DIRECTORY SEARCH FOR ; THE FILE ID FOUND IN R0. IF R0=0, THEN IT WILL ; SEARCH FOR AN AVAILABLE ENTRY. ; R0= FILE ID ; R1 = DEVICE NO. ; UPON RETURN: ; R3= ADDRESS OF ENTRY IF 0 .BYTE CR,LF .ASCII 'CR 2 SPUR INT ' .IFG NCR-2 .WORD 16.,0 .BYTE CR,LF .ASCII 'CR 3 SPUR INT ' .IFG NCR-3 .WORD 16.,0 .BYTE CR,LF .ASCII 'CR 4 SPUR INT ' .ENDC .ENDC .ENDC .MACRO SAV.56 .IFNZ $KT11C MOV @#$KPAR5,-(SP) MOV @#$KPAR6,-(SP) .ENDC .ENDM .MACRO RST.56 .IFNZ $KT1RESSION IN PROGRESS FOR THIS FILE TYPE. COMPRS IS AN ; OVERLAY TASK THAT IS NOT CHECKPOINTABLE. THEREFORE IT WILL ; BE CORE RESIDENT WHILE CPRSIP NOT EQUAL =1. THUS THE LOGIC ; TO TAKE A REQUEST OUT OF THE FLMGMT QUEUE AND PUT IT IN ; A COMPRS WAIT QUEUE WILL BE FOUND IN COMPRS. ; ENTRY POINT IN COMPRS WHERE LOGIC IS CONTAINED IS ; IN COMRRS' TASK HEADER "ENTRY" WORD - USE IOCOMX ; R1 = FLMGMT LIST ADDRESS ; FLMC00 = . MOV CMPD70 ; YES-TAKE CARE OF IT MOVB #3.,IOFCN ; PERFORM WRITE/WRITE CHECK OF SECTOR MOV (R1),CPRBUF ; SET ID FOR NEW FILE-NDISCS+1 - COMPID MOV #DLIST,-(SP) ; DISC LIST TO STACK EMT PFRITE ; WRITE 1 SECTOR OF FILE TST DERRWD ; DISC ERROR OCCUR? BNE CMPD70 ; YES-REPORT INC RLSECT ; BUMP RELATIVE SECTOR OF FILE CMP RLSECT,SORTLN ; MOVED COMPLEFOUND ; = 0, ENTRY NOT FOUND ; R4 = IFD OF ENTRY IF FOUND ; CONDITION CODES SET ON R3 ; NOTE: USES R5 AS WORK REGISTER ; CDSRCH = . CLR R4 ; INITIALIZE IFD COUNTER MOV #-NCRLOC,R3 ; USED AS INDEX THROUGH CORE ; ; RESIDENT DIRECTORY CDSR10: CMP R0,$ROSM+DOD+NCRLOC(R3) ; ; SEARCH CORE DIRECTORY FOR MATCH BEQ CD1C MOV (SP)+,@#$KPAR6 MOV (SP)+,@#$KPAR5 .ENDC .ENDM .PAGE ;********************************************************************** ;* ** ;* C R E A D ** ;* ** ;********************************************************************** ; ; CREAD: MOV #2*$CPTNO,R0 ; COMPRESS TASK NO. WORD INDEX .IFZ $KT11C MOV HEADER(R0),R0 ; COMPRS TASK HEADER ADDRESS .ENDC .IFNZ $KT11C MOV HEADER(R0),-(SP) JSR PC,PPASV6 ; GET SVA USING ASR6 MOV (SP)+,R0 .ENDC TST (R0)+ ; BUMP TO LOOK LIKE I/O LIST MOV R0,-(SP) ; LIST ADDRESS MOV #$CPTNO,-(SP) ; TASK NO. MOV FMFRST,R5 ; LIST PHYSICAL ADTE FILE? BLO CMPD10 ; NO-KEEP TRANSFERING .IFNZ DRESDI MOVB #3.,EXTYP ; USE EXIT TYPE 3 MOV #UPDATE,IOCOMP ; I/O COMPLETE SUBROUTINE MOVB #UDLEV,DLVL ; UPDATE DIRECTORY-DISC PRIORITY 1 MOV DODID,CPRBUF ; DISC RESIDENT DIRECTORY ID MOVB #4.,IOFCN ; UPDATE FUNCTION MOV SORTRS,RLSECT ; RELATIVE SECTOR TO UPDATE CLR UPDFLG ; RESET UPDATE FLAG MOSR30 ; FOUND IT? CDSR20: INC R4 ; BUMP IDF ADD #10.,R3 ; BUMP INDEX BNE CDSR10 ; TRY AGAIN CLR R3 ; SET NOT FOUND RTS PC ; RETURN CDSR30: TST R0 ; SEARCHING FOR AVAILABLE ENTRY? BEQ CDSR40 ; YES MOVB $ROSM+DOD+NCRLOC+PDVCE(R3),R5 ; ; NO- GET LOG. DEVICE OF FILE BIC #177600,R5 ; ISR1,-(SP) ;SAVE MOV R2,-(SP) ; THE MOV R3,-(SP) ; CALLING MOV R4,-(SP) ; PROGRAM'S MOV R5,-(SP) ; REGISTERS MOV 12.(SP),R1 ;GET I/O LIST ADDRESS, PUT IN R1 MOV 10.(SP),12.(SP) ;PUT PC AT BOTTOM OF STACK FOR EASY EXIT MOV R0,10.(SP) ;THEN SAVE R0. STACK NOW LOOKS LIKE: ; DRESS JSR PC,IOCOMX ; DO IT- NOTE: CALLED UNDER LOCKOUT JMP DEFB25 ; SEE IF ANY MORE REQUESTS ; ; ERRB06 = . MOV #6.,R0 ; REPORT ERROR TYPE 6 JMP ERRB99 ; ERRB07 = . MOV #7.,R0 ; REPORT ERROR TYPE 7 JMP ERRB99 ; ; DEFINE A FILE ; R1 = PARAMETER LIST-SVA ; R2 = FILE TYPE ; DEFA00 = . .IFNZ DRESDI TSV #DLIST,-(SP) ; LIST ADDRESS TO STACK EMT PFRITE ; START UPDATE TST DERRWD ; REQUEST PROCESS ERROR OCCUR? BNE CMPD72 ; YES-DO SOMETHING APPROPRIATE EMT SUSPND ; SUSPEND TASK ; ; UNSUSPENDED HERE AFTER UPDATE ; TST UPDERR ; DISC ERROR DURING DIR.UPDATE? BNE CMPD72 ; YES CMP #2.,UPDFLG ; CORE RESIDENT DIRECTORY EXIST? BNE CMOLATE CMPB R5,PDVCE(R1) ; DEVICE SAME? BNE CDSR20 ; NO-KEEP LOOKING CDSR40: ADD #$ROSM+DOD+NCRLOC,R3 ; ; ADDRESS OF ENTRY FOUND RTS PC ; RETURN TO CALLER WITH GOOD NEWS ; ; .=.+200 ; FORCR LOADE- TO DO +T -+GHT. *******''*''''''' ; .END ; PC (BOTTOM) ; R0 ; R1 ; R2 ; R3 ; R4 ; R5 (TOP) ; SAV.56 .IFZ $KT11C MOV DATA(R1),R0 ;GET DATA BUFFER ADDRESS .ENDC .IFNZ $KT11C MOV TB FLTYPE(R1) ; CORE RESIDENT ENTRY REQUESTED? BPL DEFA10 ; NO .ENDC CLR R0 ; REQUEST SEARCH OF CORE DIRECTORY JSR PC,CDSRCH ; FOR AVAILABLE ENTRY BEQ ERRB06 ; NO SPACE AVAIL.- ERROR TYPE 6 MOV R3,CDAVAL ; SAVE ENTRY'S ADDRESS MOV R4,CDIFD ; SAVE ENTRY'S IFD DEFA10 = . MOV FILEID(R1),R0 ; GET FILE ID # TO DEFINE .IFZ PD30 ; NO MOV SORTID,R0 ; FILE ID TO SEARCH FOR JSR PC,CDSRCH ; SEARCH CORE DIRECTORY BEQ CMPD30 ; NOT THERE-IGNORE MOV R3,SORTAD ; SET FOR DIRECTORY CHANGE MOV FLTYPE,R0 ; GET FILE TYPE OF COMPRESSION .ENDC MOV SORTAD,R2 ; ENTRY'S ADDRESS TO CHANGE JSR PC,CHGDIR ; CHANGE DIRECTORY MOV #CDILST,-(SP) ; UPDATE CORE DIRECTORY IMAGE ON DISC .IFNZ DRESDI JSR PC,DDREAD ; SET-UP FOR DISC DIRECTORY READ MOV #DEFA20,IOCOMP ; SET-UP I/O COMPLETE ADDRESS MOVB #RDLEV,DLVL ; PRIORITY OF DISC I/O CLRB IOFCN ; REQUEST READ MOV CRRSCT,RLSECT ; SET-UP RELATIVE SECTOR MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,DISCIO ; READ APPROPRIATE SECTOR OF DIRECTORY BR FLMA20 ; EXIT-WAIT FOR I/O DTVIRT(R1),R0 ;GET SYSTEM VIRTUAL DATA BUFFER ADDRESS .ENDC ; ; THIS SECTION CHECKS THE VALIDITY OF THE CALLER'S LIST AND DATA ; BUFFER VARIABLES. ; ; JSR PC,CRCHEK BNE CRDAXX MOVB DEVICE(R1),R2 ;GET DEVICE NO. CLR R3 ; CRDA00: CMPB R2,CRADDR(R3) ;COMPARE TO VALID DEVICE NUMBERS * BEQ CRDA10 ;BRANCH IF OK * C .IFG NCR-1 TST (R3)+ DRESDI JSR PC,CDSRCH ; DOES FILE ALREADY EXIST? .ENDC .IFNZ DRESDI JSR PC,DDREAD ; SET-UP FOR DISC DIRECTORY READ MOV #DEFA20,IOCOMP ; SET-UP I/O COMPLETE ADDRESS MOVB #RDLEV,DLVL ; PRIORITY OF DISC I/O CLRB IOFCN ; REQUEST READ MOV CRRSCT,RLSECT ; SET-UP RELATIVE SECTOR MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,DISCIO ; READ APPRO ; UPDATE LPRNTR.013 09.24.72 ; UPDATE 9/21/72 LPRNTR.S12 ; UPDATE 9/12/72 LPRNTR.S11 ; UPDATE LPRNTR.010 07.19.72 11/45 VERSION FIRST ASSEMBLY ; UPDATE LPRNTR.009 06.21.72 ; UPDATE LPRNTR.008 05.12.72 ; UPDATE LPRNTR.007 05.03.72 ROS SYSTEM VERSION .TITLE LPRNTR ;********************************************************************** ;* C EMT PFRITE ; EXIT TYPE 1- IGNORE ERROR CMPD30: MOV R1,R2 ; BOTH EQUAL TO COMPID ADDRESS JMP CMPC10 ; UPDATE COMPRESS START SECTOR ; ; AND CONTINUE "SQUEEZE" ; CMPD70: JMP CMPER4 CMPD72: JMP CMPER5 ; ; FINISHED WITH COMPRESSION OF A FILE TYPE-RELEASE ; DISCIO THEN FLMGMT. ; R0=FILE TYPE ; R1=COMPID ADDRESS ; CMPE00 = . ASL R0CMP R3,#NCR+NCR BNE CRDA00 * R .ENDC ; CRDW01: MOV #1,R4 ;ILLEGAL DEVICE NUMBER BR CRDAXX ; CRDW06: MOV (SP)+,@#PSR MOV #6,R4 ;LIST NOT THREADABLE BR CRDAXX ; CRDW09: MOV #9.,R4 ;LIST IS IN ROS BR CRDAXX ; CRDW10: MOV #10.,R4 ;DEVICE NOT AVAILABLE ; CRDAXX: PRIATE SECTOR OF DIRECTORY BR FLMA20 ; EXIT-WAIT FOR I/O COMPLETE ; ; DIRECTORY READ I/O COMPLETE ; DEFA20 = . JSR PC,GRQUST ; GET CURRENT REQUEST ADDRESS JSR PC,TSTDER ; TEST FOR DISC ERROR TST @CRREAD ; ENTRY AVAILABLE .ENDC BNE ERRB07 ; FILE ALREADY DEFINED-ERROR TYPE 7 .IFNZ DRESDI JSR PC,GFTYPE ; GET FILE TYPE .ENDC ** ;* L P R N T R ** ;* ** ;* PROGRAM IDENTIFICATION. LPRNTR - LINE PRINTER OUTPUT ** ;* SUBROUTINE. ** ;* ** ;* PURPOSE. THIS SUBROUTINE PERFORMS THE OUTPUT PROCESSING ** ;* AND CONTROL FUNCTIONS FOR EVERY LINE ; FILE TYPE WORD INDEX MOV CSS(R1),$ROSM+FNEXT(R0) ; SET NEW NEXT SECTOR AVAILABLE MOV #$ROSM+AULIST,-(SP) ; THIS TYPE AND UPDATE FILE EMT PFRITE ; TYPE ALLOCATION DIRECTORY MOV #-1.,@#$ROSM+CPRSIP ; RESET COMPRESSION IN PROGRESS MOVB #$CPTNO,R5 ; COMPRS TASK NO. INCB $ROSM+IOSTAT(R5) ; SET IOSTAT SO CANNOT ABORT MOV PHYUNT,R5 ; GET PHYSICAL DISC MOV R4,ERROR(R1) ;STORE USER'S ERROR CODE MOV (SP)+,R5 ;RESTOORE HIS REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RST.56 RTS PC ;THEN EXIT BACK TO CALLER ; CRDA10: ; CRDA13: MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 MOV #340,@#PSR ;SET CPU LEVEL = 7 (11/20) .ENDC .IFNZ $1145 MOV LENGTH(R1),R0 ; GET LENGTH OF FILE TO DEFINE BEQ DEFC01 ; ZERO-LOOK FOR LARGEST AREA AVAILABLE .IFNZ $TMSLC!CHKPTC BITB #100,FSTAT(R2) ; CHECKPOINT AREA REQUIRED? BEQ DEFA25 ; NO ADD R0,R0 ; YES-DOUBLE LENGTH REQUIRED .ENDC DEFA25: ASL R2 ; FILE TYPE WORD INDEX MOV FLAST(R2),R3 ; LAST SECTOR AVAIL. THIS TYPE MOV FNEXT(R2),R4 ; NEXT SECTOR AVAI PRINTER IN THE ** ;* SYSTEM. ALL OUTPUT REQUESTS ARE QUEUED ON A PRIORITY ** ;* BASIS, THEREBY PERMITTING THE LINE PRINTER TO BE USED ** ;* IN REAL-TIME APPLICATIONS FOR PRIORITY ALARM MESSAGES, ** ;* ETC. THE INTERNAL MESSAGE FORMAT ACCEPTED BY LPRNTR ** ;* IS EITHER ASCII OR EBCDIC. NON-PRINTABLE CHARACTERS ARE ** ;* CONVERTED TO BLANKS, ALTHOUGH THE CHARACTER IS SYSGENABLE ** ;* TO ANY OTHER PRINTABLE CHARAUNIT MOV R5,R0 ASL R0 ; COMPUTE DCUWX-DISC CONTROLLER ; ; WORD INDEX MOV #-1.,HITFLG ; USED TO COUNT NO. OF REQUESTS CMPE10: MOV $ROSM+DQLAST(R0),R3 ; ADDRESS OF DEVICES LAST LIST MOV CPDFST,R1 ; GET A REQUEST THAT IS WAITING BEQ CMPE40 ; NONE LEFT-EMPTY .IFNZ $KT11C MOV R1,-(SP) ; SAVE PPA FOR QUEUEING MOV R1,-(SP) SPL 7 ;SET CPU LEVEL = 7 (11/45) .ENDC DEC (R1) ;TEST THREAD WORD OF LIST BNE CRDW06 ;AND BRANCH IF NOT ONE (THAT'S A NO-NO) .IFZ $KT11C ASL R3 ;CONVERT TO DOUBLEWORD INDEX MOV R1,@CRLAST(R3) ;QUEUE THE REQUEST MOV R1,CRLAST(R3) ASR R3 .ENDC .IFNZ $KT11C ASL R3 ;FIRST, CONVERT C/R INDEX FOR DOUBL. THIS TYPE SUB R4,R3 ; NO. SECTORS AVAIL. THIS TYPE CMP R0,R3 ; ENOUGH SECTORS AVAIL. THIS WAY? BHI DEFC00 ; NO-SEARCH FOR DELETED ENTRYS ; ; R0 = LENGTH OF FILE ; R1 = PARAMETER LIST ADDRESS -SVA ; R2 = FILE TYPE WORD INDEX ; R4 = NEW START SECTOR ; DEFA27: MOV R4,NEWSS ; SAVE NEW START SECTOR ADD R0,FNEXT(R2) ; UPDATE NEXT APPROPRIATELY ASR R2 CTER. ALL THREE GENERAL I/O ** ;* EXITS ARE SUPPORTED BY LPRNTR. ** ;* ** ;* USAGE. THE ASSEMBLER LINKAGE TO LPRNTR IS: ** ;* ** ;* MOV #LIST,-(SP) ;PUSH LIST ADDRESS ON STACK ** ;* EMT LPRNTR ** ;* ; FOR CONVERSION JSR PC,PPAUV1 ; TO AN SVA MOV (SP)+,R1 ADD #$ROSM,R3 ; ADDRESS THROUGH USER'S ASRS .ENDC .IFZ $KT11C MOV DATA(R1),R4 ; ADDRESS OF DATA BUFFER .ENDC .IFNZ $KT11C MOV DATA1(R1),R4 ; DBUFFER SVA BIC #160000,R4 BIS #040000,R4 ; FOR UV2 MOV DATA2(R1),-(SP) ; GET ASR JSR PC,SETUV2 .ELE WORD INDEXI MOV R1,-(SP) ;THEN, JSR PC,SVPPA ; CONVERT THE ADDRESS TO PACKED PHYSICAL MOV CRLAST(R3),-(SP);CONVERT CURRENT LAST QUEUE ENTRY JSR PC,PPASV6 ;TO SYSTEM VIRTUAL MOV 2(SP),@(SP)+ ; AND FINALLY PLACE THIS ADDRESS MOV (SP)+,CRLAST(R3);IN THE CARD READER QUEUE MOV DTPAR(R1),@#$KPAR6 ;AND RESTORE KERNEL KPAR 6 ASR R3 .ENDC CMP #TSK.PC,RE; FILE TYPE MOV #AULIST,-(SP) ; UPDATE ALLOCATION FILE ON DISC MOV #AUBUF,DATA1 CLR DATA2 ; JSR PC,PFRITE ; EXIT 1-IGNORE ERRORS DEFA28 = . .IFNZ DRESDI MOV #DEFA30,IOCOMP ; ADDRESS OF I/O COMPLETE MOVB #UDLEV,DLVL ; UPDATE DIRECTORY AT HIGHEST LEVEL MOVB #4.,IOFCN ; PERFORM UPDATE FUNCTION MOV CRRSCT,RLSECT ; SECTOR OF DIRECTORY TO UPDATE ** ;* THE FORTRAN EQUIVALENT CALL IS: ** ;* ** ;* CALL LPRNTR (IADDR(LIST)) ** ;* ** ;* THE FORMAT OF THE DATA BUFFER, DATA, IS: ** ;* ** ;* ----NDC CLR DUSE3(R4) ; INITIALIZE SO DIRECTORY SEARCH ; ; IS DONE AGAIN MOVB LEVEL(R1),R2 ; DISC LEVEL OF REQUEST MOV (R1),CPDFST ; PULL REQUEST FROM COMPRS QUEUE BNE CMPE20 ; NOT LAST ONE MOV #CPDFST,CPDLST ; LAST ONE-RESET .IFNZ $KT11C CLC ROR CPDLST ; MAKE CLC ROR CPDLST ; PPA .ENDC ; T.PC(SP) BNE CRDA15 MOV $CTASK,R4 ;OTHERWISE, GET THE TASK NUMBER INCB IOSTAT(R4) ;INCREMENT THE TASK'S 'I/O IN PROGRESS' FLAG MOV R4,SYSTEM(R1) ;STORE THE TASK NO. FOR USE WHEN I/O IS COMPLT BR CRDA16 ;BRANCH IF 'TIS ; CRDA15: CLR SYSTEM(R1) ; ZERO MEANS REQUESTOR IS NOT A TASK ; CRDA16: TST CRBUSY(R3) ;SEE IF THE I/O SHOULD BE STARTED BEQ CRDC00 MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; START DIRECTORY UPDATE RTS PC ; RETURN TO DISCIO ; ; FIRST I/O COMPLETE FOR DISC DIRECTORY UPDATE ; DEFA30 = . JSR PC,GRQUST ; GET CURRENT REQUEST ADDRESS JSR PC,TSTDER ; TEST FOR DISC ERROR JSR PC,GFTYPE ; GET FILE TYPE OF REQUEST MOV CRREAD,R3 ; ADDRESS OF FILE'S ENTRY JSR PC,C------------------------------- ** ;* WORD 1 ! NWORD ! ** ;* ----------------------------------- ** ;* WORD 2 ! RESRVD ! ** ;* ----------------------------------- ** ;* WORD 3 ! CHAR 1 ! CNTRL ! ** ;* ----------------------------------- ** ;* . NOTE: NOT NECESSARY TO DO ABOVE UNDER LOCKOUT SINCE ; NO QUEUEING IN CPDFST IS BEING DONE. CMPE20: CLR (R1) ; SET THREAD WORD TO 0 MOVB #PLOCK,@#PSR ; SET PRIORITY LOCKOUT CMPB R2,$ROSM+HPRIRQ(R5) ; WILL THIS BE HIGHEST ; ; PRIORITY REQUEST? BHIS CMPE30 ; NO MOVB R2,$ROSM+HPRIRQ(R5) ; YES-SET APPROPRIATELY CMPE30: ASL R2 ; LEVEL DOUBLE - WORD ;BRANCH IF IT IS .PAGE ;********************************************************************** ;* ;* ;* THIS SECTION OF THE CODE PREPARES TO EXIT. IF EXIT TYPE 2 IS ;* REQUESTED, THE CALLING TASK IS SUSPENDED. OTHERWISE, CONTROL ;* IS RETURNED TO THE CALLER. ;* ;********************************************************************** ;* ; CRDB05: MOV (SP)+,@#PSR ;FIRST, RESET THE CPU INTERRUPT LEVEL ; CRDB06: CMPB #2,TYPE(R1) ;THEN REATE ; CREATE FILE'S ENTRY INTO DIRECTORY MOV #DEFA40,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN TO DISCIO ; ; SECOND I/O COMPLETE FOR DISC DIRECTORY UPDATE ; DEFA40 = . JSR PC,GRQUST ; GET CURRENT REQUEST ADDRESS JSR PC,TSTDER ; TEST FOR DISC ERROR JSR PC,GFTYPE ; GET FILE TYPE OF REQUEST TSTB FLTYPE(R1) ; CORE DIRECTORY ENTRY REQUESTED? BPL . ** ;* . . ** ;* . . ** ;* ----------------------------------- ** ;* WORD X ! CHAR N ! CHAR N-1 ! ** ;* ----------------------------------- ** ;* ** ;* ASL R2 ; INDEX ADD R2,R3 ; GET TO PROPER 'LAST' ADDRESS+1 .IFZ $KT11C MOV R1,@(R3) ; THREAD LIST BACK INTO MOV R1,(R3) ; DISC PRIORITY QUEUE .ENDC .IFNZ $KT11C MOV (R3),-(SP) JSR PC,PPAUV2 MOV 2.(SP),@(SP)+ ; THREAD LIST BACK INTO MOV (SP)+,(R3) ; DISC PRIORITY QUEUE .ENDC INC $RSEE IF WE'RE IN A TYPE 2 RETURN BNE CRDB10 ;BRANCH IF NO TST ACTIVE ;ELSTWISE, MAKE SURE A TASK IS CALLING BEQ CRDB10 ;BRANCH IF NO - SOMEBODY GOOFED SEZ ;SET CONDITION CODE TO ZERO BR CRSAVE ;AND SUSPEND CALLER ; CRDB10: ;WE MUST RETURN TO THE CALLER RST.56 MOV (SP)+,R5 ;FIRST, MOV (SP)+,R4 ; RESTORE DEFB00 ; NO .ENDC ; ; R1 = REQUEST LIST ADDRESS - SVA ; R2 = FILE TYPE ; NEWSS = START SECTOR OF FILE TO DEFINE ; MOV CDAVAL,R3 ; ADDRESS OF AVAILABLE CORE ENTRY JSR PC,CREATE ; CREATE FILE'S ENTRY IN DIRECTORY MOV #CDILST,-(SP) ; UPDATE CORE DIR. IMAGE JSR PC,PFRITE ; EXIT 1-IGNORE ERRORS MOV CDIFD,SYSTEM(R1); SET IFD IN LIST FOR USER ; ; FINISHED PROCESSING REQU WHERE: ** ;* ** ;* NWORD = NUMBER OF CHARACTERS TO PRINT (INCLUDING THE ** ;* CONTROL CHARACTER, CNTRL), AND ** ;* NWORD > 0 FOR ASCII STRINGS ** ;* NWORD < 0 FOR EBCDIC STRINGS ** ;* RESRVD = RESERVED FOR SYSTEM USE *OSM+NODREQ(R0) ; BUMP NO. OF DISC REQUESTS INC HITFLG ; BUMP REQUEST COUNT CLRB @#PSR ; RESET LOCKOUT BR CMPE10 ; RETHREAD THEM ALL CMPE40: MOV HITFLG,R3 ; GET NO. REQUESTS THAT WAITED BMI CMPF00 ; NONE-CHECK FLMGMT REQUESTS MOVB #PLOCK,@#PSR ; SET PRIORITY LOCKOUT CMP R3,$ROSM+NODREQ(R0) ; ALL REQUESTS MAKE BY COMPRESS? BNE CMPF00 ; NO-WILL RE MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV (SP)+,R1 ; REGISTERS MOV (SP)+,R0 ; SEZ ;SET NO-ERROR CONDITION CODE RTS PC ;RETURN TO CALLER ; ; THIS LITTLE SUBROUTINE SUSPENDS THE CALLING TASK. LINKAGE IS ; ; SEZ SET Z BIT IN CONDITION CODE ; -OR- CLZ IF Z IS TOEST ; R1 = LIST ADDRESS-SVA ; R2 = FILE TYPE ; DEFB00 = . CLRB ERROR(R1) ; SET NO ERROR DEFB05: BICB #200,FSTAT(R2) ; SET F.M.NOT IN PROGRESS THIS FILE TYPE MOV SYSTEM(R1),R0 ; TASK NO. OF SUSPENDED CALLER MOV R0,-(SP) ; TASK NO. TO STACK CLR -(SP) ; IMMEDIATE RETURN JSR PC,UNSPND ; UNSUSPEND TASK .IFZ DRESDI TST (SP)+ ; IGNORE E* ;* CNTRL = CARRIAGE CONTROL: 0 - NO LINE FEED ** ;* N - SKIP N LINES (N=1,2,3) ** ;* FF- EJECT PAGE ** ;* LF- SKIP 1 LINE (SAME AS N=1) ** ;* CHAR K = MESSAGE IN ASCII OR EBCDIC ** ;* ** ;* FF, LF AND HT MAY BE IMBEDDED IN THE TEXT FOR MULTIPLECOVER BY ITSELF MOVB #-1.,$ROSM+CALLED(R5) ; SET CALLED BY TIME-OUT CLRB @#PSR ; RESET LOCKOUT EMT DIOA65 ; GIVE DISCIO A "PUSH" ; ; DETERMINE IF FLMGMT REQUESTS ARE WAITING ; CMPF00 = . CLRB @#PSR ; MAKE SURE LOCKOUT NOT SET MOV CPFFST,R1 ; GET A REQUEST THAT IS WAITING BEQ CMPF30 ; NONE LEFT-EMPTY .IFNZ $KT11C MOV R1,-(SP) BE ZERO ; JMP CRSAVE (OR BR, IF CLOSE ENOUGH) ; ; CRSAVE: RST.56 MOV @#PSR,-(SP) ;SAVE CONDITION CODE MOV 12.(SP),R0 ;RESTORE R0 MOV 14.(SP),12.(SP) ;MOVE OLD PC UP ONE NOTCH IN STACK MOV (SP)+,12.(SP) ;MOVE CC JUST ONE NOTCH BELOW PC MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 ;STACK NOW LOOKS LIKE: PSR (CC) MOV (SP)+,R2 ; RROR .ENDC .IFNZ DRESDI MOV @#PSR,(SP) ; IGNORE ERROR AND SAVE PROCESSOR STATUS .ENDC .LOCK MOV (R1),FMFRST ; PULL REQUEST FROM THREAD BNE DEFB10 MOV #FMFRST,FMLAST ; EMPTIED QUEUE-LAST POINTS TO FIRST .IFNZ $KT11C CLC ROR FMLAST ; MAKE PACKED CLC ROR FMLAST ; PHYSICAL .ENDC DEFB10: MOV #1.,(R1) ; SET LINES.** ;* TAB (HT) POSITIONS ARE: 1, 9, 17, ..., 8N + 1, ... ** ;* ** ;* PROGRAMMER: 55 ** ;* DATE: 01.17.71 ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ; SAVE PPA FOR QUEUEING MOV R1,-(SP) ; FOR CONVERSION JSR PC,PPAUV1 ; TO SVA MOV (SP)+,R1 .ENDC MOV (R1),CPFFST ; PULL REQUEST FROM COMPRS QUEUE BNE CMPF20 ; NOT LAST ONE MOV #CPFFST,CPFLST ; LAST ONE RESET .IFNZ $KT11C CLC ROR CPFLST ; MAKE CLC ROR CPFLST ; PPA .ENDC CMPF20: CLR (R1) PC (TASK) MOV (SP)+,R1 ; TOP OF STACK =====> PC (RETURN) CLR -(SP) ;SET CODE TO RETURN TO DSPTCH MOV #DSPTCH,-(SP) ; JMP QSAVEI ;SUSPEND TASK; QSAVEI WILL EXIT TO DSPTCH .PAGE ;********************************************************************** ;* ;* AT THIS POINT, THE CURRENT REQUEST IS THE FIRST REQUEST IN THE ;* QUEUE. IF THE C/R IS READY, THEN I/O WILL BE INITIATED. ;*REQUEST THREADABLE DECB IOSTAT(R0) ; RESET TASK'S I/O STATUS .IFNZ OVRLAY BNE DEFB20 ; NOT LAST ONE MOVB (SP),@#PSR ; RESET PRIORITY LOCKOUT MOV R0,-(SP) ; TASK NO TO STACK JSR PC,RELTSK ; RELEASE TASK IF OVERLAY DEFB20 = . .LOCK .ENDC DEFB25: DEC NOFMRQ ; DECR. NO. FILE MGMT. REQUESTS BNE DEFB30 ; PROCESS OTHER REQUESTS CLR ** ;* ALL RIGHTS RESERVED ** ;* ** ;********************************************************************** ; .IFG NLP .DEF LPRNTR .DEF LPINIT .REF QSAVEI,SAVE,TTYOUT,DSPTCH .REF RESTOR .REF QUEUE,IOQTME,IODQTM,IOSTAT .REF ASCLP,ACTIVE,UNSPND,$CTASK .REF PHYDEV,ALTDEV,LOGMAX ; SET THREAD WORD TO 0 ; NOTE: NOT NECESSARY TO DO ABOVE UNDER LOCKOUT SINCE ; NO QUEUEING IN CPFFST IS BEING DONE. MOVB #PLOCK,@#PSR ; SET PRIORITY LOCKOUT .IFZ $KT11C MOV R1,@FMLAST ; PUT REQUEST INTO MOV R1,FMLAST ; FLMGMT THREAD .ENDC .IFNZ $KT11C MOV @#$ROSM+FMLAST,-(SP) JSR PC,PPAUV2 MOV 2.(SP),@(SP)+ ; PUT REQUEST INTO OTHERWISE, OPERATOR ACTION WILL BE REQUIRED. CRDC00 IS ;* ENTERED WITH INTERRUPTS MASKED. ;* ;* ;********************************************************************** ; ; CRDC00: INC CRBUSY(R3) MOV (SP)+,@#PSR ;RESTORE PREVIOUS PSR (ENABLE INTERRUPTS) .IFNZ $KT11C MOV R1,VRFRST(R3) ;AND THE VIRTUAL LIST ADDRESS MOV @#$KPAR5,VRKPR5(R3) ; AND ITS VIRTUAL PAR .ENDC .IFNZ BCD FMACTV ; SET FILE MGMT. NOT ACTIVE JMP FLMA20 ; EXIT DEFB30: JMP FLMB10 ; ; SEARCH FILE DIRECTORY FOR AVAILABLE DISC SPACE ; R0= LENGTH REQUIRED FOR FILE ; = 0, LOOK FOR LARGEST AVAILABLE AREA ; R1 = PARAMETER LIST ADDRESS-SVA ; R2 = FILE TYPE - DEFC01 ; FILE TYPE WORD INDEX - DEFC00 ; DEFC00 = . ASR R2 ; CALCULATE FILE TYP .DEF LPON,LPOFF .IFNZ INEBC .REF EBCLP .ENDC .IFNZ LPBACK .DEF LPTTY .ENDC .IFNZ OVRLAY .REF RELTSK .ENDC .IFNZ $KT11C .REF PPASV5,PPASV6,TSK.PC .REF SVPPA,IOCOMX .ENDC ;* ;* S Y S T E M E Q U A T E P A R A M E T E R S ;* THREAD = 0. ;LIST THREAD DEVICE = 2. ;LOGICAL DEVICE NUMBER TYPE = MOV (SP)+,@#$ROSM+FMLAST ; FLMGMT THREAD .ENDC INC @#$ROSM+NOFMRQ ; BUMP APPROPRIATELY BR CMPF00 ; RE-THREAD THEM ALL CMPF30: MOVB #PLOCK,@#PSR ; SET PRIORITY LOCKOUT TST @#$ROSM+FMACTV ; FILE MANAGEMENT CURRENTLY ACTIVE? BNE CMPG00 ; YES-WILL TAKE CARE OF ITSELF TST @#$ROSM+NOFMRQ ; DID WE PUT ANYTHING IN ; ; FLMGMT QUEUE BEQ CM TST TABLE(R3) ;IF TABLE IS NON-ZERO, THEN A MODE BNE CRDC05 ;HAS ALREADY BEEN DEFINED .IFNZ INEBC TSTB LEVEL(R1) ;SEE IF CALLER WANTS ASCII OR EBCDIC BNE CRDC04 .ENDC MOV #O26ASC,TABLE(R3) ;ASSUME 026 TO ASCII CONVERSION .IFNZ INEBC BR CRDC05 ; CRDC04: MOV #O26EBC,TABLE(R3) .ENDC ; CRDC05: .ENDC JSR PC,CRSIO E DEFC01 = . CLR SORTLN ; INITIALIZE SORT LENGTH MOV R0,LNREQ ; SAVE LENGTH REQUIRED .IFZ DRESDI MOV #DOD,R3 ; START OF CORE DIRECTORY SEARCH MOV #NCRLOC,SBUFLN ; SEARCH BUFFER LENGTH .ENDC .IFNZ DRESDI MOV DBUF,R0 ; DOD ID CURRENTLY USING JSR PC,CDSRCH ; GET DOD'S ADDRESS IN CORE MOV LGTH(R3),LNODOD ; LENGTH OF DOD FOR SEARCH  3. ;EXIT TYPE $EXIT = 4. ;I/O COMPLETE ADDR ERRTSK = 6. ;ERROR TASK NO. LEVEL = 7. ;I/O PRIORITY ERROR = 8. ;ERROR PARAMETER SYSTEM = 10. ;RESERVED DATA = 12. ;ADDRESS OF DATA DTPAR = 14. ;VALUE OF KPAR6 FOR DATA BUFFER DTVIRT = 16. ;SYSTEM VIRTUAL EQUIVALENT OF DATA BUFFER ADDR PSR = PS ;CPU SPG00 ; NO MOV #CMPG00,-(SP) ; SET RETURN ON STACK CLR -(SP) ; SET PSR TO RESET LOCKOUT EMT FLMB00 ; GIVE FLMGMT A "PUSH" ; ; FINISHED-SET UP TO EXIT FROM COMPRS ; CMPG00 = . CLRB @#PSR ; RESET LOCKOUT IF SET MOV #$CPTNO,R0 ; TASK NO. DECB $ROSM+IOSTAT(R0) ; RESET I/O STATUS MOV #CCEDIT,R0 ; PUT FILE TYPE IN JSR PC,MSGEDT ;OTHERWISE, START UP C/R .IFZ $KT11C ASL R3 MOV CRFRST(R3),R1 ;RESTORE LIST ADDRESS ASR R3 .ENDC .IFNZ $KT11C MOV VRFRST(R3),R1 ;RESTORE VIRTUAL LIST ADDRESS MOV VRKPR5(R3),@#$KPAR5 ; .ENDC BR CRDB06 ; CRDC10: MOV #ERMSGE,-(SP) ;PUT ADDRESS OF ERROR MESSAGE ON STACK JSR PC,CRMSGE ;PRINT MESSAGE MOV #MXTIME,COUNT(R3) ;S MOV #DEFC10,IOCOMP ; I/O COMPLETE ADDRESS MOVB #RDLEV,DLVL ; SET UP DISC READ LEVEL CLRB IOFCN ; REQUEST READ CLR RLSECT ;START AT RELATIVE SECTOR 0 DEFC05: MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,DISCIO ; READ THE BUFFER RTS PC ; RETURN ; ; I/O COMPLETE FOR DIRECTORY SEARCH ; DEFC10 = . JSR PC,GRQUST ; ADDRESS OF REQUEST LIST TATUS REGISTER AVAIL = 100000 ;'AVAILABLE' BIT IN PHYSICAL DEVICE TABLE ALT = 040000 ;'ALTERNATE DEVICE' BIT IN PHYSICAL DEVICE TBL LPDEV = 3 ;PHYSICAL DEVICE TABLE CODE FOR L/P DEVI ;* ;* L P R N T R E Q U A T E P A R A M E T E R S ;* ID = 100000 ;INTERRUPT ON L/P DONE IE = 040000 ;INTERRUPT ON PARITY OR PAPER LOW ERRORS SB = 004000 ;SET L/P BUSY (START I/O) DONE ; COMPRESSION COMPLETE MOV #CCMSG,TTYBUF ; MESSAGE CMPG10: MOV #TTYLST,-(SP) ; AND EMT TTYOUT ; TYPE EMT EXIT ; EXIT FROM COMPRS ; ; COMPRESS ERROR 1- FILE TYPE TO COMPRESS NOT VALID ; CMPER1 = . MOV #NVEDIT,R0 ; PUT FILE TYPE JSR PC,MSGEDT ; IN MESSAGE MOV #NVMSG,TTYBUF BR CMPG10 ; ET UP FOR MAXIMUM TIME DELAY .IFZ NCR-1 ; . MOV #CRMOD,R5 ;GET TIMER MODULE ADDRESS FOR NCR = 1 .ENDC ; .IFG NCR-1 MOV CRMDAD(R3),R5 ;GET TIMER MODULE ADDRESS FOR NCR > 1 .ENDC ; . MOV #CRDLAY,14.(R5) ;STORE ADDRESS OF CRDLAY IN TIMER MODULE MOV R5,-(SP) ;ADDRESS OF TIMER MODULE ONTO STACK MOV #$1SEC,-(SP) ;REQUEST 1 SECONJSR PC,TSTDER ; TEST FOR DISC ERROR MOV #BUFFER,R3 ; START OF DISC BUFFER SEARCH MOV #120.,SBUFLN ; SEARCH 60 WORDS/120 BYTES JSR PC,GFTYPE ; GET FILE TYPE .ENDC ADD R3,SBUFLN ; END ADDRESS OF SEARCH DEFC20: TST (R3) ; DELETED ENTRY? BNE DEFC30 ; NO MOVB FTYPE(R3),R5 ; YES-GET IT'S FILE TYPE BIC #177600,R5 ; ISOLATE CMP R2,R5  = 100000 ;DONE STATUS BIT BUSY = 040000 ;BUSY STATUS BIT PARITY = 000030 ;PARITY ERROR STATUS BITS READY = 000004 ;PRINTER READY STATUS BIT ONLINE = 000002 ;PRINTER ON-LINE STATUS BIT PLOW = 000001 ;PAPER LOW STATUS BIT NWORD = 0 ;NO. OF CHARACTERS (1ST WORD OF DATA) RESRVD = 2 ;RESERVED (2ND WORD OF DATA) TEXT = 4 TYPE AND EXIT ; ; COMPRESS ERROR2- FILE TYPE NOT ALLOWED COMPRESSION ; CMPER2 = . MOV #NAEDIT,R0 ; PUT FILE TYPE JSR PC,MSGEDT ; IN MESSAGE MOV #NAMSG,TTYBUF BR CMPG10 ; TYPE AND EXIT ; ; COMPRESS ERROR 3- DIR. SEARCH DISC ERROR ; CMPER3 = . MOV #DSMSG,TTYBUF BR CMPG10 ; TYPE AND EXIT ; ; COMPRESS ERROR 4- FILE TRANSFER ERROR ; CMPER4 D DELAY JSR PC,IOQTME TST (SP)+ BR CRDB05 .PAGE ;********************************************************************** ;* ** ;* C R I N T ** ;* ** ;* CARD READER INTERRUPT ROUTINE. THIS ROUTINE GETS ENTERED ** ;* FOR THE FOLLOWING REASONS:  ; SAME AS TYPE IN REQUEST? BNE DEFC30 ; NO MOV LNREQ,R0 ; GET LENGTH OF FILE NEEDED BNE DEFD00 ; SEE IF ADEQUATE CMP SORTLN,LGTH(R3) ; GREATER THAN SORT LENGTH? BGE DEFC30 ; NO-KEEP LOOKING MOV LGTH(R3),SORTLN ; SAVE FILE'S LENGTH MOV R3,SCHIDX ; SAVE IT'S INDEX INTO SEARCH BUFFER .IFNZ DRESDI MOV RLSECT,NEWSS ; SAVE RELATIVE SECTOR IN  ;BEGINNING OF MESSAGE (3RD WORD OF DATA) HT = 11 ;HORIZONTAL TAB * CARRIAGE LF = 12 ;LINE FEED * FF = 14 ;FORM FEED (PAGE EJECT) * CONTROL CR = 15 ;CARRIAGE RETURN * STAY = 0 ;NO LINE FEED * SKIP1 = 1 ;SKIP ONE LINE * CHARACTERS SKIP2 = 2 ;SKIP TWO LINES * SKIP3 =  = . MOV #XEEDIT,R0 ; PUT FILE TYPE JSR PC,MSGEDT ; IN MESSAGE MOV #XEMSG,TTYBUF BR CMPG10 ; TYPE AND EXIT ; ; COMPRESS ERROR 5 - DIRECTORY UPDATE ERROR ; CMPER5 = . MOV #DUMSG,TTYBUF BR CMPG10 ; TYPE AND EXIT ; ; ; ; MSGEDT WILL EDIT THE FILE TYPE INTO THE MESSAGES ; COMPRS TYPES ; R0 = START ADDRESS OF THREE BYTE FIELD ;  ** ;* ** ;* 1. CARD DONE INTERRUPT ** ;* 2. COLUMN READY INTERRUPT ** ;* 3. CARD READER ERROR ** ;* 4. TRANSITION TO ON-LINE ** ;* 5. A BERSERK CARD READER DOING THINGS IT SHOULDN'T ** ;* OUGHTA DO. WHICH FOUND .ENDC DEFC30: ADD #10.,R3 ; BUMP TO NEXT ENTRY CMP R3,SBUFLN ; SEARCHED COMPLETE BUFFER? BLT DEFC20 ; NO-KEEP LOOKING .IFNZ DRESDI INC RLSECT ; BUMP RELATIVE SECTOR OF DISC DIRECTORY CMP RLSECT,LNODOD ; DONE WITH IT? BLT DEFC05 ; NO-READ NEXT SECTOR AND SEARCH IT .ENDC TST LNREQ ; REQUEST LENGTH =0? BNE DEFC40  3 ;SKIP TWREE LINES * AUTOLF = 1 ;CONTROL FOR AUTO LINE FEED MODE DELAY = 10. ;POSITION OF DELAY COUNTER IN TIMER MODULE INDEX = 12. ;POSITION OF ARGUMENT IN TIMER MODULE JSRSUB = 14. ;POSITION OF JSR SUBROUTINE ADDRESS MAXCC = 14 ;MAX(HT,LF,FF,STAY,SKIP1,SKIP2,SKIP3) LPBLNK = 240 ;ASCII BLANK CLEAR = 100 .IIF EQ $KT11C LIST =  FLTYPE = FILE TYPE ; ; MSGEDT = . MOV FLTYPE,-(SP) ; INTEGER TO CONVERT TO STACK MOV #CNVERT,-(SP) ; SIX BYTE FIELD ADDRESS EMT BINASC ; CONVERT TO ASCII MOVB CNVERT+3,(R0)+ ; SET ASCII MOVB CNVERT+4,(R0)+ ; FILE TYPE MOVB CNVERT+5,(R0)+ ; IN MESSAGE RTS PC ; RETURN ; ; .IFNZ DRESDI ; ; I/O COMPLETE SUBROUTINE FOR DISC DIRECTO ** ;* ** ;* OUR MISSION, SHOULD WE DECIDE TO ACCEPT IT, IS TO DETERMINE ** ;* WHAT CAUSED THE INTERRUPT, AND TAKE CARE OF IT. ** ;* ** ;********************************************************************** ; CRINT1: JSR R5,SAVE ;LET ROS SAVE THE WORLD .IFZ NCR-1  ; NOPE ASL R2 ; FILE TYPE WORD INDEX MOV FLAST(R2),R3 ; DOES DISC ALLOCATOR MOV FNEXT(R2),R4 ; PROVIDE MORE AREA SUB R4,R3 ; THAN FOUND? MOV SORTLN,R0 CMP R0,R3 BGT DEFC40 ; NO MOV R3,R0 ; YES MOV R0,LENGTH(R1) ; SET LENGTH IN REQUEST JMP DEFA27 ; USE ALLOCATOR'S STUFF DEFC40 = 14. ;POSITION OF LIST ON STACK .IIF NE $KT11C LIST = 14.+4. ; DEPENDS OF WHETHER KPAR'S RET.PC = LIST-2 ;ARE SAVED .PAGE ;********************************************************************** ;* ** ;* L P R N T R D A T A T A B L E S ** ;* ** ;* THE FOLLOWING RY UPDATE ; UPDATE = . TST DERRWD ; DID DISC ERROR OCCUR? BNE UPD030 ; YES-PROCESS TST UPDFLG ; FIRST OR SECOND TIME THRU? BNE UPD020 ; SECOND MOV SORTAD,R2 ; FIRST-GET ADDRESS OF ENTRY MOV #COMPID,R1 ; ADDRESS OF COMPRESSION DIR. ENTRY MOV FLTYPE,R0 ; FILE TYPE OF COMPRESSION JSR PC,CHGDIR ; CHANGE DIRECTORY APPROPRIATELY  CLR R3 .ENDC .IFG NCR-1 ;...FOR C/R # 1 MOV #0,R3 ; BR CRIA00 ; CRINT2: JSR R5,SAVE ;...FOR C/R 2 MOV #2,R3 ; .ENDC .IFG NCR-2 BR CRIA00 ; CRINT3: JSR R5,SAVE ;......FOR C/R 2 MOV #4,R3 .ENDC .IFG NCR-3 BR CRIA00 ; CRINT4: JSR R5,SAVE ;... . ASR R2 ; FILE TYPE TST SORTLN ; DID WE FIND ANYTHING? BEQ ERRB08 ; NO- ERROR TYPE 8 - CAN'T DEFINE ; ; FILE WITH LENGTH REQUESTED .IFNZ DRESDI MOV #DEFC50,IOCOMP ; I/O COMPLETE ADDRESS MOVB #UDLEV,DLVL ; SET LEVEL 1 FOR UPDATE MOVB #4.,IOFCN ; UPDATE DISC I/O FUNCTION MOV NEWSS,RLSECT ; SECTOR SAVED DURTABLE AND BUFFER DEFINITIONS ASSUME A ** ;* MAXIMUM OF FOUR (4) LINE PRINTERS WILL EVER BE USED. IF ** ;* NLP > 4, THEN SOME CODE WILL HAVE TO BE ADDED. ** ;* ** ;********************************************************************** ; LPBUSY: .=.+NLP+NLP ;1 = L/P CURRENTLY IN USE ; LPDATA: .=.+NLP+NLP ;ADDRESS OF ACTIVE DATA BUFFER ; ; LP TSTB FTYPE(R2) ; CORE RESIDENT ENTRY EXIST? BPL UPD010 ; NO INC UPDFLG ; YES UPD010: INC UPDFLG ; BUMP FOR SECOND TIME RTS PC ; RETURN TO PFRITE ; ; SECOND I/O COMPLETE FROM DIRECTORY UPDATE ; UPD020 = . CLR UPDERR ; SET NO ERROR UPD025: MOV #$CPTNO,-(SP) ; UNSUSPEND COMPRS CLR -(SP) ; IMMEDIATE RETURN REQUESTED EMT UNSPND ......FOR C/R 4 MOV #6,R3 .ENDC ; CRIA00: MOV #RESTOR,R5 TST CRBUSY(R3) ;SEE IF CREAD EXPECTED AN INTERRUPT BNE CRIB00 ; MOV #RANDOM,-(SP) JSR PC,CRMSGE ;PRINT 'CR K SPUR INT ' JMP (R5) ;EXIT TO RESTOR TO CLEAR INTERRUPT ; ; NOW FIGURE OUT WHY WE GOT AN INTERRUPT ; CRIB00: TST IGNORE(R3) ;SEE IF THIS INTERRUPT SHOULD BE IGNORED ING SEARCH MOV #DLIST,-(SP) ; DISC I/O LIST TO STACK JSR PC,PFRITE ; START DIRECTORY UPDATE RTS PC ;WAIT FOR I/O COMPLETE ; ; FIRST I/O COMPLETE FOR UPDATE OF DELETED ENTRY ; DEFC50 = . JSR PC,GRQUST ; GET CURRENT PARAMETER LIST JSR PC,TSTDER ; TEST FOR DISC ERROR .ENDC MOV SCHIDX,R3 ; ADDRESS OF ENTRY TO MODIFY MOV SCTR(R3),NEWSS ; GET FRST = . ;ADDRESS OF FIRST LIST IN THREAD LPLAST = .+2 ;ADDRESS OF LAST LIST IN THREAD .REPT NLP*NLPRTY .WORD 0 .IIF NE $KT11C .PACK .-2 .IIF EQ $KT11C .WORD .-2 .ENDR ; ; THE ABOVE PRIORITY TABLES ARE STORED AS: ; ; PRIORITY 1 'FIRST' * ; PRIORITY 1 'LAST' * ; PRIORITY 2 'FIRST' * L/P NUMBER 1 ; PRIORITY 2 'LAST' * ;  TST (SP)+ ; IGNORE ERROR RTS PC ; RETURN TO PFRITE ; ; DISC ERROR OCCURRED ; UPD030 = . INC UPDERR ; SET UPDATE ERROR BR UPD025 ; ; .ENDC ; ; CHGDIR WILL CHANGE THE DIRECTORY ENTRY AFTER A FILE ; HAS BEEN COMPRESSED. ; R0 = FILE TYPE ; R1 = COMPID ADDRESS ; R2 = ENTRY ADDRESS TO CHANGE ; ; R5 USED AS WORK REGISTER ; BEQ CRIB10 ;BRANCH IF NO .IFZ NCR-1 ;OTHERWISE, SEE IF END OF CARD HAS BIT #DONE,@#CRS.1 ;COME AND GONE .ENDC ; .IFG NCR-1 ; BIT #DONE,@CRS(R3) .ENDC BNE CRCLOS ;BRANCH TO CLOSE OUT THIS REQUEST JMP (R5) ; CRIB10: .IFZ NCR-1 ;GET MOV @#CRS.1,R0 ; THE TST ERRCR ; CURRENT NEW START SECTOR FOR DEF. ADD SORTLN,SCTR(R3) ; UPDATE DELETED ENTRY'S START SECTOR SUB SORTLN,LGTH(R3) ; UPDATE DELETED ENTRY'S LENGTH .IFNZ DRESDI MOV #DEFC60,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN ; ; SECOND I/O COMPLETE FOR UPDATE OF DELETED ENTRY ; DEFC60 = . JSR PC,GRQUST ; GET CURRENT REQUEST LIST JSR PC,TSTDER ; TEST FOR DISC ERROR .END  . * ; . * ; . * ; PRIORITY NLPRTY 'LAST' * ; . * ; . * ; . * ; REPEAT FOR EACH L/P ; ; LPTASK: .=.+NLP+NLP ;THE TASK NO. WHO INITIATED THE CURRENT RQST ; LPCNT: .=.+NLP+NLP ;INDEX INTO TEXT OF CURRENT REQUEST ; LPMAX: .=.+NLP+NLP ;MAXIMUM VAL!CHGDIR = . MOV CSS(R1),R5 ; CURRENT START SECTOR MOV R5,SCTR(R2) ; SET NEW START SECTOR .IFNZ $TMSLC!CHKPTC BITB #100,$ROSM+FSTAT(R0) ; CKSAVE AREA REQUIRED? BEQ CHGD10 ; NO ADD LGTH(R2),R5 ; START SECTOR OF CKSAVE MOV R5,CKSAVE(R2) ; SET IN ENTRY .ENDC CHGD10: RTS PC ; RETURN TO CALLER ; ; ; ; DISCQ IS CALLED BY DISCIO WHEN A DISC REQUEST IS" .ENDC ; STATUS .IFG NCR-1 ; OF THE MOV @CRS(R3),R0 ; CARD READER TST ERRCR(R3) ; AND TEST FOR A .ENDC ; PREVIOUS ERROR ; CRIB12: BEQ CRIB20 ;BRANCH IF NO PREVIOUS ERROR ; CRIB13: JMP (R5) ;OTHERWISE, EXIT TO RESTOR ; CRIB15: JMP CRID00 ;THIS IS HER#C MOV SORTLN,LENGTH(R1) ; SET LENGTH FOUND IN LIST JMP DEFA28 ; CREATE NEW FILE'S ENTRY ; ; DETERMINE IF LENGTH IN DELETED ENTRY AFFORDS ENOUGH ; ROOM TO DEFINE A NEW FILE. ; DEFD00 = . CMP R0,LGTH(R3) ; ENOUGH ROOM FOR REQUEST BGT DEFC30 ; NO-KEEP LOOKING MOV R0,SORTLN ; YES- SET REQUIRED LENGTH IN HIT WORD MOV R3,SCHIDX ; SAVE IT'S INDEX INTO SEARCH BUFFER$UE OF LPCNT (= NWORD) ; LPRTRY: .=.+NLP+NLP ;NO. OF ATTEMPTS OF CURRENT REQUEST ; LPRIOR: .=.+NLP+NLP ;PRIORITY INEDX FOR CURRENT REQUEST ; LPMODE: .=.+NLP+NLP ;0 = CARRIAGE CTRL MODE; 1 = AUTO LINE FEED ; LPWORD: .=.+NLP+NLP ;THIS WORD CONTAINS THE LENGTH OF THE ;CURRENT L/P BUFFER BEING OUTPUT (WHICH ;IS NOT NECESSARILY THE SAME AS TH% FOUND ; FOR AN AREA THAT HAS COMPRESSION IN PROGRESS. ; R4 = I/O LIST ADDRESS - PPA ; R5 = DISC CONTROLLER UNIT NUMBER ; *** NOTE: MUST BE CALLED UNDER LOCKOUT ; DISCQ = . ASL R5 ; CALCULATE DCUWX MOV #1.,R2 ; SET R2 FOR PRIORITY LEVEL 1 MOV $ROSM+DQFRST(R5),R0 ; ADDRESS OF THIS DEVICE'S FIRST LIST MOV $ROSM+DQLAST(R5),R1 ; ADDRESS OF THIS DEVICES LAST LIST &E 'CAUSE A BRANCH WON'T REACH ; CRIB20: BIT #CRERR,R0 ;SEE IF WE GOT ANY KIND OF ERROR BNE CRIB30 ;AND BRANCH IF WE DID BIT #COLUMN,R0 ;TEST FOR COLUMN READY BNE CRIB15 ;BRANCH IF A COLUMN OF DATA IS READY BIT #DONE,R0 ;TEST FOR CARD DONE BNE CRIC00 ;BRANCH IF END OF CARD BIT #ONLINE,R0 ;TEST FOR TRANSITION TO ON-LINE BNE CRIB13 ; CRIB30: ' .IFNZ DRESDI MOV RLSECT,NEWSS ; SAVE RELATIVE SECTOR IN WHICH FOUND .ENDC BR DEFC40 ; CONTINUE WITH GOOD NEWS. ; ERRB08 = . MOV #8.,R0 ; REPORT ERROR TYPE 8 JMP ERRB99 ; ; .PAGE ; ; DELETE A FILE ; R1 = PARAMETER LIST ADDRESS-SVA ; R2= FILE TYPE ; DELA00 = . MOV #IDCLR,NEWSS ; PROCESSES SUBROUTINE FOR DELETE (E CALLER'S ;BUFFER LENGTH) ; LPBUF: .=LPSIZE+2*NLP+. ;BUFFERS FOR LINE PRINTER OUTPUT .BOUND ; LPLIST: .REPT NLP .BOUND .WORD 1,1400,TYDONE,0,0,0,0,0,0 ;TTYOUT LISTS FOR L/P ERROR MESSAGES .ENDR .BOUND ; .MACRO .LPTMR N .BOUND .WORD 1,0,0,0 .BYTE $RES .BYTE 220 ;ARGUMENT AND JSR OPTIONS .WORD 0,N,LPTIME ) .IFNZ $KT11C MOV R4,-(SP) ; SAVE PPA FOR QUEUEING MOV R4,-(SP) ; FOR CONVERSION JSR PC,PPAUV1 ; TO SVA MOV (SP)+,R4 ADD #$ROSM,R0 ; GET TO ADD #$ROSM,R1 ; USER'S ASRS .ENDC MOVB LEVEL(R4),R3 ; CURRENT PRIORITY OF REQUEST ASL R3 ; DOUBLE-WORD ASL R3 ; INDEX ADD R3,R1 * MOV R0,ERRCR(R3) ;ASSUME C/R ERROR AND SAVE STATUS .IFZ NCR-1 MOV #CRMOD,R0 ;PUT ADDRESS OF TIMER MODULE IN R0 .ENDC .IFG NCR-1 ;AND, IF NCR > 1..... MOV CRMDAD(R3),R0 ;GET ADDRESS OF C/R TIMER .ENDC MOV #CRTIME,14.(R0) ;SET TIMEOUT ADDRESS TO DR MOV #CRTIME,14.(R0) ;SET TIMEOUT ADDRESS TO CRDERR MOV R0,-(SP) MOV #$500MS,-(SP) ;SET UP 500 MS DELAY + BR DPUA00 ; DO IT ; ; PROTECT A FILE ; R1 = PARAMETER LIST ADDRESS-SVA ; R2= FILE TYPE ; PRTA00 = . MOV #SETP,NEWSS ; PROCESS SUBROUTINE FOR PROTECT BR DPUA00 ; DO IT ; ; UNPROTECT A FILE ; R1 = PARAMETER LIST ADDRESS ; R2= FILE TYPE ; UNPA00 = . MOV #CLEARP,NEWSS ; PROCESS SUBROUTINE FOR PROTECT ; ; , .ENDM ; LPMOD = . .LPTMR 0 ;L/P 1 TIMER MODULE .IIF GE NLP-2 .LPTMR 2 ;L/P 2 TIMER MODULE .IIF GE NLP-3 .LPTMR 4 ;L/P 3 TIMER MODULE .IIF GE NLP-4 .LPTMR 6 ;L/P4 TIMER MODULE LPUNIT: .BYTE 3,0,0,0 ;VALID LOGICAL DEVICE ADDRESSES .=LPUNIT+NLP .EVEN .IFG NLP-1 ; LPIOLS: .WORD LPLIST ;ADDRESS OF LINE PRINTER .WORD LPLIST+20.-; ADDRESS OF CURRENT LEVEL'S LAST LIST ADD R0,R3 ; ADDRESS OF CURRENT LEVEL'S FIRST LIST ASR R5 MOV (R4),(R3) ; PULL REQUEST OUT OF QUEUE THREAD BNE DSCQ10 ; DIDN'T EMPTY PRIORITY LIST MOV R3,(R1) ; EMPTY-LAST POINTS TO FIRST .IFNZ $KT11C CLC ROR (R1) ; MAKE CLC ROR (R1) ; PPA .ENDC DSCQ10: ADD #4.,R0 . JSR PC,IOQTME ;START TIMER TST (SP)+ .IFZ NCR-1 ;SUPPRESS FURTHER INTERRUPTS FROM C/R BIC #ENABLE,@#CRS.1 ; . .ENDC ; . .IFG NCR-1 ; . BIC #ENABLE,@CRS(R3); . .ENDC ; . JMP (R5) ;EXIT TO RESTOR .PAGE ;*****************************************/DO IT ; DPUA00 = . MOV FILEID(R1),R0 ; GET SUBJECT FILE ID NO. .IFZ DRESDI JSR PC,CDSRCH ; DOES FILE EXIST? .ENDC .IFNZ DRESDI JSR PC,DDREAD ; SET UP FOR DISC DIRECTORY READ MOV #DPUA10,IOCOMP ; I/O COMPLETE ADDRESS MOVB #UDLEV,DLVL ; USE DISC UPDATE LEVEL-PRIORITY 1 MOVB #4.,IOFCN ; REQUEST UPDATE MOV CRRSCT,RLSECT ; SET UP RELATIVE SECTOR 0 ;TTY MESSAGE I/O LIST ADDRESSES FOR QUICK ACCESS .WORD LPLIST+40. .WORD LPLIST+60. .=LPIOLS+NLP+NLP ; LPMDAD: .WORD LPMOD ;TIMER MODULE ADDRESSES .WORD LPMOD+16. .WORD LPMOD+32. .WORD LPMOD+48. .=LPMDAD+NLP+NLP .ENDC ; ; .IFNZ LPBACK ; LPTTY: .WORD 0 ;SWITCH FOR LINE PRINTER BACKUP BY TTY .WORD 0 ; .WORD 0 1 BNE DSCQ20 ; HIGHEST PRIORITY LEFT-GOT IT! INC R2 ; CHECK NEXT REQUEST LEVEL CMPB R2,$ROSM+NDPRTY(R5) ; QUEUE EMPTY? BLE DSCQ10 ; NO-SCAN SOME MORE MOV #-1.,R2 ; YES-RESET HPRIRQ DSCQ20: MOVB R2,$ROSM+HPRIRQ(R5) ; UPDATE HPRIQ APPROPRIATELY CLR (R4) ; SET THREAD WORD EQUAL ZERO .IFZ $KT11C MOV R4,@CPDLST ; SET REQUEST IN MOV 2***************************** ;* ;* ;* AT THIS POINT, ONE FULL CARD HAS BEEN READ. IF THE 'READ ANOTHER ;* CARD' FLAG (REPEAT) HAS BEEN SET, THEN ANOTHER REQUEST WILL BE ;* INITIATED IMMEDIATELY. THIS USUALLY HAPPENS WHEN A CONTROL CARD ;* HAS BEEN READ. ;* ;* CRIC00: CLR IGNORE(R3) TST REPEAT(R3) ;SHOULD WE READ ANOTHER CARD? BEQ CRCLOS ;BRANCH IF IT ISN'T ; CRIC10: .IFZ $KT11C MOV CRFRST(R3),R1 3 MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; START UPDATE OF DIRECTORY MOVB (SP)+,@#PSR ; POP STACK RTS PC ; RETURN TO CALLER-WAIT FOR ; ; I/O COMPLETE ; ; FIRST I/O COMPLETE DURING DELETE, PROTECT OR UNPROTECT ; DIRECTORY UPDATE. ; DPUA10 = . JSR PC,GRQUST ; ADDRESS OF CURRENT REQUEST JSR PC,TSTDER ; TEST FOR DISC ER4 ; 0 = PRINT ON L/P .WORD 0 ; 1 = PRINT ON TTY .=LPTTY+NLP+NLP .ENDC ; LPARTY: .IFG NLP-1 .WORD LPRTY ;ADDRESSES OF DATA BUFFERS FOR .WORD LPRTY+24. ;EACH LINE PRINTER .WORD LPRTY+48. ; .WORD LPRTY+72. .=LPARTY+NLP+NLP LPRTY: .ENDC .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 1 PARITY ERROR' .IFG NLP-5 R4,CPDLST ; COMPRESS DISC QUEUE .ENDC .IFNZ $KT11C MOV CPDLST,-(SP) JSR PC,PPAUV2 ; GET AN SVA MOV 2.(SP),@(SP)+ ; SET REQUEST IN MOV (SP)+,CPDLST ; COMPRESS QUEUE .ENDC MOV PC,R4 ; NOTE: R4 DOES NOT EQUAL ZERO, THEREFORE CALLED BY ; COMPRS IS ESTABLISHED FOR DISCIO RTS PC ; TO DIHA50 EVENTUALLY ; ; ; FMGMTQ IS CALL6;GET I/O LIST ADDRESS .ENDC .IFNZ $KT11C MOV VRFRST(R3),R1 ;LOAD SYSTEM VIRTUAL LIST MOV VRKPR5,@#$KPAR5 ;ADDRESS (USES KPAR5) .ENDC JSR PC,CRSIO ;OTHERWISE, START THE I/O CLR REPEAT(R3) ; CARD' FLAG JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ;* ;* THIS SECTION CLOSES OUT A7ROR MOV CRREAD,R3 ; ADDRESS OF ENTRY TST (R3) ; ENTRY DEFINED? .ENDC BEQ ERRC09 ; NO-ERROR TYPE 9 JSR PC,@NEWSS ; PERFORM APPROPRIATE FUNCTION .IFNZ DRESDI TSTB FTYPE(R3) ; CORE DIRECTORY ENTRY EXIST? BPL DPUA15 ; NO MOV FILEID(R1),R0 ; GET FILE'S ID JSR PC,CDSRCH ; FIND IT'S ADDRESS JSR PC,@NEWSS ; PERFOR81 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 2 PARITY ERROR' .IFG NLP-2 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 3 PARITY ERROR' .IFG NLP-3 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 4 PARITY ERROR' .ENDC .ENDC .ENDC ; LPRDY: .IFG NLP-1 .WORD LPRD ;ADDRESSES OF EACH LINE PRINTER DATA BUFFER .WORD LPRD+22. .WOR9ED BY FLMGMT WHEN A FILE MANAGEMENT REQUEST ; IS FOUND FOR AN AREA THAT HAS COMPRESSION IN PROGRESS. ; R5 = FLMGMT LIST ADDRESS - PPA ; *** NOTE: MUST BE CALLED UNDER LOCKOUT ; FMGMTQ = . .IFNZ $KT11C MOV R5,-(SP) ; SAVE FOR QUEUEING MOV R5,-(SP) ; FOR CONVERSION JSR PC,PPAUV1 ; TO SVA MOV (SP)+,R5 .ENDC MOV (R5),@#$ROSM+FMFRST ; PULL REQUEST FRO: READ REQUEST AND, IF NECESSARY, ;* UNSUSPENDS THE CALLER OR JSR'S TO THE I/O COMPLETE ROUTINE ;* ;* ;********************************************************************** ; ; CRCLOS: MOV @#PSR,-(SP) ;SAVE CURRENT PRIORITY LEVEL .IFZ NCR-1 ;CODE FOR ONLY ONE C/R .IFZ $KT11C MOV CRFRST,R0 ;GET LIST ADDRESS =====>R0 .ENDC .IFNZ $KT11C MOV VRFRST,R0 ;LOAD SYSTEM VIRTUAL LIST ADDRESS, ;M ON IT .ENDC MOV #CDILST,-(SP) ; UPDATE CORE DIR. IMAGE JSR PC,PFRITE ; EXIT 1-IGNORE ERRORS .IFNZ DRESDI DPUA15: MOV #DPUA20,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN ; ; SECOND I/O COMPLETE DURING DELETE, PROTECT OR UNPROTECT ; DIRECTORY UPDATE ; DPUA20 = . JSR PC,GRQUST ; ADDRESS OF CURRENT REQUEST JSR PC,TSTDER ; TEST FOR DISC ERROR <D LPRD+44. .WORD LPRD+66. .=LPRDY+NLP+NLP LPRD: .ENDC .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 1 NOT READY' .EVEN .IFG NLP-1 .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 2 NOT READY' .EVEN .IFG NLP-2 .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 3 NOT READY' .EVEN .IFG NLP-3 .WORD 17.,0 .BYTE CR,LF =M THREAD BNE FMGQ10 MOV #FMFRST,@#$ROSM+FMLAST ; EMPTIED QUEUE-SET LAST=FIRST .IFNZ $KT11C CLC ROR @#$ROSM+FMLAST ; MAKE CLC ROR @#$ROSM+FMLAST ; PPA .ENDC FMGQ10: CLR (R5) ; SET THREAD WORD = 0 .IFZ $KT11C MOV R5,@CPFLST ; THREAD REQUEST IN MOV R5,CPFLST ; COMPRESS WAIT QUEUE .ENDC .IFNZ $KT11C MOV > MOV VRKPR5,@#$KPAR5 ;ITS ASSOCIATED PAR MOV DTPAR(R0),@#$KPAR6 ;AND THE DATA BUFFER PAR MOV DTVIRT(R0),R1 .ENDC .IFZ $KT11C MOV CRDATA,R1 ;GET DATA ADDRESS =====>R1 .ENDC MOV COUNT,NREAD(R1) .IFNZ BIN .IFNZ BCD TST CRMODE ;IF IT'S BINARY DATA WE READ .IFZ $RASM BEQ CRCA05 .ENDC .IFNZ $RASM BEQ ? JSR PC,GFTYPE ; GET FILE TYPE .ENDC JMP DEFB00 ; FINISHED PROCESSING REQUEST ; ; IDCLR IS THE PROCESS SUBROUTINE THAT WILL DELETE ; AN ENTRY IN A DIRECTORY. ; R3= ADDRESS OF ENTRY ; IDCLR = . CLR (R3) ; SET ID TO DELETE STATUS .IFNZ $TMSLC!CHKPTC MOVB FTYPE(R3),R2 ; GET ENTRY'S FILE TYPE BIC #177600,R2 ; ISOLATE BITB #100,FSTAT(R2) @ .ASCII 'L/P 4 NOT READY' .EVEN .ENDC .ENDC .ENDC ; LPXXXX: .IFG NLP-1 .WORD LPXX .WORD LPXX ;ADDRESSES OF LINE PRINTER ABORT .WORD LPXX+20. ;MESSAGE DATA BUFFERS .WORD LPXX+40. ; .WORD LPXX+60. ; .=LPXXXX+NLP+NLP LPXX: .ENDC .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 1 ABORTED' .EVEN A CPFLST,-(SP) JSR PC,PPAUV2 MOV 2.(SP),@(SP)+ ; THREAD REQUEST IN MOV (SP)+,CPFLST ; COMPRS WAIT QUEUE .ENDC RTS PC ; RETURN TO FLMGMT ; ; ; ; CDSRCH WILL PERFORM A CORE DIRECTORY SEARCH FOR ; THE FILE ID FOUND IN R0. IF R0=0, THEN IT WILL ; SEARCH FOR AN AVAILABLE ENTRY. ; R0 = FILE ID ; R1 = ADDRESS OF COMPRS DIRECTORY-COMPID ; UPON RETURN: ; B CRCA01 .ENDC .ENDC ASR NREAD(R1) ;THEN CONVERT NO. BYTES TO NO. WORDS .IFNZ BCD .IFNZ $RASM BR CRCA05 ; CRCA01: CMP (R1),#82. ;IF USER WANTED 82 CHARACTERS, STORE BNE CRCA05 ;THE LAST TWO AS CR, LF MOV #LF*256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 MOV #340,@#PSR ;INHIBIT INTERRUPTS C; CHECKPOINT FILE TYPE BEQ IDC010 ; NO ADD LGTH(R3),LGTH(R3) ; YES-DOUBLE LENGTH CLR CKSAVE(R3) ; RESET-CHECKPOINT START ADDRESS .ENDC IDC010: RTS PC ; RETURN ; ; SETP IS THE PROCESS SUBROUTINE THAT WILL SET THE PROTECT ; BIT IN AN ENTRY IN A DIRECTORY. ; R3=ENTRY ADDRESS ; SETP = . BISB #200,PDVCE(R3) ; SET PROTECT STATUS BIT RTS PC ; D.IFG NLP-1 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 2 ABORTED' .EVEN .IFG NLP-2 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 3 ABORTED' .EVEN .IFG NLP-3 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 4 ABORTED' .EVEN .ENDC .ENDC .ENDC ; LPBUFR: .WORD LPBUF ;ADDRESSES OF L/P PRINT BUFFERS .WORD LPBUF+LPE R3 = ADDRESS OF ENTRY IF FOUND ; = 0, ENTRY NOT FOUND ; R4 = IFD OF ENTRY IF FOUND ; CONDITION CODES SET ON R3 ; NOTE: USES R5 AS WORK REGISTER ; CDSRCH = . CLR R4 ; INITIALIZEIFD COUNTER MOV #-NCRLOC,R3 ; USED AS INDEX THRU CORE ; ; RESIDENT DIRECTORY CDSR10: CMP R0,$ROSM+DOD+NCRLOC(R3) ; ; SEARCH CORE DIRECTORF.ENDC ; . .IFNZ $1145 ; . SPL 7 ; . .ENDC ; . MOV (R0),R2 ;DEQUEUE THE REQUEST MOV R2,CRFRST ;SAVE ADDRESS OF NEXT LIST BNE CRCA20 ;BRANCH IF QUEUE ISN'T EMPTY ; CRCA10: .IFZ $KT11C MOV #CRFRST,CRLAST ;CLEAN UP QUEUE .ENDC .IFNZ $KT11C MOV CRFRPK,CRLAST GRETURN ; ; CLEARP IS THE PROCESS SUBROUTINE THAT WILL RESET THE ; PROTECT BIT IN AN ENTRY IN A DIRECTORY ; R3 = ENTRY ADDRESS ; CLEARP = . BICB #200,PDVCE(R3) ; RESET PROTECT STATUS BIT RTS PC ; RETURN ; ; .PAGE ; ; ERROR HANDLING LOGIC ; ERRA00 = . INC (R1) ; SET LIST THREAD WORD BACK AGAIN ERRA10: MOVB (SP)+,@#PSR ; RESET PRIORITY LOCKOUT MOVB R0HSIZE .WORD LPBUF+LPSIZE+LPSIZE .WORD LPBUF+LPSIZE+LPSIZE+LPSIZE .WORD LPBUF+LPSIZE+LPSIZE+LPSIZE+LPSIZE .=LPBUFR+NLP+NLP+2 .PAGE .IFG NLP-1 ; LPSTS: .WORD STAT.1 ;ADDRESS OF L/P STATUS REGISTERS - L/P # 1 .WORD STAT.2 ;L/P # 2 .WORD STAT.3 ;L/P # 3 .WORD STAT.4 ;L/P # 4 .=LPSTS+NLP+NLP ; LPCMD: .WORD CMD.1 ;ADDRESS OF L/P COIY FOR MATCH BEQ CDSR30 ; FOUND IT? CDSR20: INC R4 ; BUMP IFD ADD #10.,R3 ; BUMP INDEX BNE CDSR10 ; TRY AGAIN CLR R3 ; SET NOT FOUND RTS PC ; RETURN CDSR30: TST R0 ; SEARCHING FOR AVAILABLE ENTRY? BEQ CDSR40 ; YES MOVB $ROSM+DOD+NCRLOC+PDVCE(R3),R5 ; ; NO-GET LOG. DEVICE OF FILE J ;SET CRLAST = PACKED PHYSICAL .ENDC ; ADDRESS OF CRFRST ; CRCA20: MOV (SP)+,@#PSR ;RESTORE ORIGINAL CPU LEVEL MOV CRTASK,R4 ;SET R4 = TASK NO. OF CALLER (0=NO TASK) .ENDC ; ;********** .IFG NCR-1 ;CODE FOR MORE THAN ONE C/R ASL R3 .IFZ $KT11C MOV CRFRST(R3),R0 ;GET LIST ADDRESS =====>R0 .ENDC ASR R3 .IFNZ $KT11C K,ERROR(R1) ; REPORT ERROR JSR R5,POPR ; RESTORE REGISTERS MOV (SP)+,(SP) ; PUT RETURN IN PROPER PLACE ON STACK RTS PC ; RETURN TO REQUESTOR ; ; ; ; ; TEST FOR DISC ERROR ; R1 = PARAMETER LIST ADDRESS ; TSTDER = . TST DERRWD ; DISC ERROR OCCUR? BNE ERRB15 ; YES-REPORT RTS PC ; NO-RETURN ; ERRB15 = . TST LMMAND REGISTER - L/P # 1 .WORD CMD.2 ;L/P # 2 .WORD CMD.3 ;L/P # 3 .WORD CMD.4 ;L/P # 4 .=LPCMD+NLP+NLP ; LPWDCT: .WORD CNT.1 ;ADDRESS OF L/P WORD COUNT REGISTER - L/P # 1 .WORD CNT.2 ;L/P # 2 .WORD CNT.3 ;L/P # 3 .WORD CNT.4 ;L/P # 4 .=LPWDCT+NLP+NLP ; LPFEED: .WORD LFRG.1 ;ADDRESS OF L/P LINE FEED REGISTER / L/PM BIC #177600,R5 ; ISOLATE CMPB R5,PDVCE(R1) ; DEVICE SAME? BNE CDSR20 ; NO-KEEP LOOKING CDSR40: ADD #$ROSM+DOD+NCRLOC,R3 ; ; ADDRESS OF ENTRY FOUND RTS PC ; RETURN TO CALLER WITH GOOD NEWS ; ; .IFNZ $KT11C PPAUV1 = . MOV R0,-(SP) ; SAVE REGISTER 0 MOV 4.(SP),R0 ; GET PACKED PHYSICAL ADDRESS TO CONVERT ASH #-4,R0 N MOV VRFRST(R3),R0 ;LOAD SYSTEM VIRTUAL LIST ADDRESS, MOV VRKPR5(R3),@#$KPAR5 ;ITS ASSOCIATED PAR MOV DTPAR(R0),@#$KPAR6 ;AND THE DATA BUFFER PAR .ENDC MOV CRDATA(R3),R1 ;GET DATA ADDRESS =====>R1 MOV COUNT(R3),NREAD(R1) ;STORE NO. CHARACTERS READ .IFNZ BIN .IFNZ BCD TST CRMODE(R3) ;SEE WHICH MODE WE'RE IN .IFZ $RASM BEQ CRCA05 ;BRAO (SP)+ ; POP RETURN PC OFF STACK MOV #15.,R0 ; REPORT ERROR TYPE 15- DISCIO ERROR ; ERRB99 = . MOVB R0,ERROR(R1) ; REPORT ERROR ERRBXX: JSR PC,GFTYPE ; GET REQUEST'S FILE TYPE JMP DEFB05 ; FINISH REQUEST ; ; ERRC09 = . MOV #9.,R0 ; REPORT ERROR TYPE 9 MOVB R0,ERROR(R1) ; DO IT .IFZ DRESDI BR ERRBXX .ENDC .IFNZ DRESP # 1 .WORD LFRG.2 ;L/P # 2 .WORD LFRG.3 ;L/P # 3 .WORD LFRG.4 L/P # 4 .=LPFEED+NLP+NLP ; LPADDR: .WORD LPDT.1 ;ADDRESS OF L/P MEMORY ADDR REGISTER - L/P # 1 .WORD LPDT.2 ;L/P # 2 .WORD LPDT.3 ;L/P # 3 .WORD LPDT.4 ;L/P # 4 .=LPADDR+NLP+NLP ; LPVECT: .WORD LPVC.1 ;L/P # 1 INTERRUPT VECTOR ADDRESS .WORD LPVC.2 Q ; PAR VALUE MOV R0,$UPAR1 MOV SVHDRA,R0 MOV $UPAR1,TPAR1(R0) ; SET IN HEADER MOV #077406,$UPDR1 ; SET UP PDR'S MOV #077406,TPDR1(R0) MOV 4.(SP),R0 ASL R0 ASL R0 ; FROM DOUBLE-WORD TO BYTE BIC #177700,R0 ; ISOLATE BIS #020000,R0 ; SVA TO USE ASR 1 MOV R0,4.(SP) MOV (SP)+,R0 ; RESTORE RTS PC RNCH IF ALPHANUMERIC AND NO ASSEMBLER .ENDC .IFNZ $RASM ;.....OR..... BEQ CRCA01 ;BRANCH IF ALPHANUMERIC AND AN ASSEMBLER .ENDC ;IS IN THE SYSTEM .ENDC ASR NREAD(R1) ;CONVERT BYTES TO WORDS .IFNZ BCD .IFNZ $RASM BR CRCA05 ; CRCA01: CMP (R1),#82. ;IF USER WANTED 82 CHARACTERS, STORE BNE CRCA05 ;THE LAST TWO AS ,SDI MOV #ERRCX9,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN TO DISCIO ; ERRCX9 = . JSR PC,GRQUST ; GET REQUEST'S ADDRESS BR ERRBXX ; FINISH REQUEST ; .ENDC ; ; ; CDSRCH WILL PERFORM A CORE DIRECTORY SEARCH FOR ; THE FILE ID FOUND IN R0. IF R0=0, THEN IT WILL ; SEARCH FOR AN AVAILABLE ENTRY. ; R0 = FILE ID ; R1 = PARAMETER LIST ADDRESS-SVT ;L/P # 2 INTERRUPT VECTOR ADDRESS .WORD LPVC.3 ;L/P # 3 INTERRUPT VECTOR ADDRESS .WORD LPVC.4 ;L/P # 4 INTERRUPT VECTOR ADDRESS .=LPVECT+NLP+NLP .ENDC .PAGE .MACRO SAV.56 MOV @#$KPAR5,-(SP) ;MACRO TO SAVE KERNEL PAR 5 AND 6 MOV @#$KPAR6,-(SP) .ENDM .MACRO RST.56 MOV (SP)+,@#$KPAR6 ;MACRO TO RESTORE KERNEL PAR 5 AND 6 MOV (SP)+,@#$KPAR5 U ; RETURN ; PPAUV2 = . MOV R0,-(SP) ; SAVE REGISTER 0 MOV 4.(SP),R0 ; GET PACKED PHYSICAL ADDRESS TO CONVERT ASH #-4,R0 ; PAR VALUE MOV R0,$UPAR2 MOV SVHDRA,R0 MOV $UPAR2,TPAR2(R0) ; SET IN HEADER MOV 077406,$UPAR2 MOV #077406,TPDR2(R0) ; SET UP PDR'S MOV 4.(SP),R0 ASL R0 ASL R0 ; FROM DOUV MOV #LF*256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 MOV #340,@#PSR ;INHIBIT INTERRUPTS .ENDC ; . .IFNZ $1145 ; . SPL 7 ; . .ENDC ; . MOV (R0),R2 ;SAVE ADDRESS OF NEXT LIST ASL R3 MOV R2,CRFRST(R3) ;DEQUEUE THIS REQUEST ASR WA ; UPON RETURN: ; R3 = ADDRESS OF ENTRY IF FOUND ; = 0, ENTRY NOT FOUND ; R4 = IFD OF ENTRY IF FOUND ; CONDITION CODES SET ON R3 ; ; NOTE: USES REGISTER 5 (R5) AS A WORK REGISTER. ; CDSRCH = . CLR R4 ; INITIALIZE IFD COUNTER MOV #-NCRLOC,R3 ; USED AS INDEX THRU CORE ; ; RESIDENT DIRECTORY. CDSR10: CMP R0,DOD+NCRLOC(R3) [ .ENDM ;********************************************************************** ;* ** ;* S T A R T O F L P R N T R ** ;* ** ;* ** LPRNTR: MOV R0,-(SP) ;GUESS MOV R1,-(SP) ; WHAT MOV R2,-(SP) ; YBLE WORD TO BYTE BIC #177700,R0 ; ISOLATE BIS #040000,R0 ; SVA TO USE ASR 2 MOV R0,4.(SP) MOV (SP)+,R0 ; RESTORE RTS PC ; RETURN ; SVPPA = . MOV R0,-(SP) ; SAVE REGISTERS NEEDED MOV R1,-(SP) ; FOR WORK MOV 6.(SP),R0 ; GET SYSTEM VIRTUAL ADDRESS MOV R0,R1 ; DUPLICATE SWAB R1 ASH #-4,R1Z R3 BNE CRCA20 ;BRANCH IF SOMEONE'S LEFT IN QUEUE ; CRCA10: MOV R3,R4 ;SO, CLEAN IT UP ASL R4 ADD #CRFRST,R4 .IFNZ $KT11C CLC ;CONVERT TO ROR R4 ; PACKED PHYSICAL ROR R4 ; ADDRESS .ENDC MOV R4,CRLAST(R3) ; CRCA20: MOV (SP)+,@#PSR MOV CRTASK(R3),R4 ;SET R4 = CALLER'S TASK NO. ]; SEARCH CORE DIRECTORY FOR MATCH BEQ CDSR30 ; FOUND IT? CDSR20: INC R4 ; BUMP IFD ADD #10.,R3 ; BUMP INDEX BNE CDSR10 ; TRY AGAIN CLR R3 ; SET NOT FOUND RTS PC ; RETURN CDSR30: TST R0 ; SEARCHING FOR AVAILABLE ENTRY BEQ CDSR40 ; YES MOVB DOD+NCRLOC+PDVCE(R3),R5 ; NO-GET LOG. DEVICE OF FILE BIC #177600,\; UPDATE IOQTME.002 08.30.72 ; UPDATE IOQTME.001 02.08.72 .TITLE IOQTME ;********************************************************************** ;* ** ;* I O Q T M E / I O D Q T M ** ;* ** ;* PURPOSE. THESE SUBROUTINES QUEUE AND DEQUEUE TIMER MODULES ** ;* FOR THE ROS I/O SUBROUTI BIC #177761,R1 ; ISOLATE ASR WORD INDEX MOV $UPAR0(R1),R1 ; APPROPRIATE USER PAR ASH #4,R1 ; GET TO PROPER BIT POSITION ASR R0 ASR R0 ; DOUBLE-WORD BOUND BIC #174000,R0 ; ISOLATE ADD R0,R1 ; PACKED PHYSICAL ADDRESS MOV R1,6.(SP) ; SET ON STACK MOV (SP)+,R1 ; RESTORE MOV (SP)+,R0 ; REGISTERS RTS ^ .ENDC ; ; NOW CHECK FOR EXIT TYPE 2 (SUSPENDED TASK) OR 3 (I/O COMPLETE) ; MOV #1,(R0) CMPB #2,TYPE(R0) BEQ CRCA40 ;BRANCH IF EXIT 2 BGT CRCB00 ;BRANCH IF WE DON'T CARE (EXIT 1) CMPB #3,TYPE(R0) ;OTHERWISE, IT'S EXIT 3 - BUT BNE CRCB00 ;MAKE SURE ANYWAY MOV R0,R1 ;GET I/O COMPLETE SUBROUTINE ADDRESS MOV $EXIT(R1),R0 ;PUT IN R0 MO_ WE'RE MOV R3,-(SP) ; DOING MOV R4,-(SP) ; HERE MOV R5,-(SP) ; SAV.56 ;SAVE KERNEL PAR 5 AND 6 MOV LIST(SP),R0 ;GET ADDRESS OF I/O LIST .IFZ $KT11C MOV DATA(R0),R1 ;GET ADDRESS OF DATA .ENDC .IFNZ $KT11C MOV DTVIRT(R0),R1 ;GET SYSTEM VIRTUAL DATA BUFFER ADDRESS .ENDC JSR PC,LPCHEK `NES. ** ;* ** ;* USAGE. THE LINKAGE TO THESE SUBROUTINES IS THE SAME AS FOR ** ;* QTIME AND DQTIME: ** ;* ** ;* MOV #MODULE,-(SP) MOV #MODULE,-(SP) ** ;* MOV #DELAY(-(SP) JSR PC,IODQTM ** ;* JSR PC,IOQTMaR5 ; ISOLATE CMPB R5,SYSTMB(R1) ; SAME AS CALL'S DEVICE? BNE CDSR20 ; NO-KEEP LOOKING CDSR40: ADD #DOD+NCRLOC,R3 ; ADDRESS OF ENTRY FOUND RTS PC ; RETURN TO CALLER WITH GOOD NEWS. ; ; .IFNZ DRESDI ; ; DDREAD WILL CALCULATE THE SECTOR ON WHICH A FILE ; ENTRY RESIDES RELATIVE TO THE BEGINNING OF THE ; DISC RESIDENT DIRECTORY. IT WILL CALCULATE THE ; ADDRESS OF THE ENTRY IN "BUFFER"bV R2,-(SP) MOV R3,-(SP) ;ADDRESS LOOKS GOOD, SO SAVE THE MOV R4,-(SP) ;VOLATILE REGISTERS MOV R5,-(SP) .IFZ $KT11C JSR PC,(R0) ;AND LINK TO THE I/O COMPLETE ROUTINE .ENDC .IFNZ $KT11C MOV R1,-(SP) ;PUSH LIST ADDRESS MOV R4,-(SP) ; AND TASK NUMBER JSR PC,IOCOMX ; THEN LET IOCOMX LINK TO THE .ENDC ; I/Oc ;GO CHECK SOME OF THE INFO BNE LPRA10 ;OOPS, SOMETHING HAPPENED. GO TELL CALLER CLR R3 ;CHECK L/P DEVICE ADDRESS .IFZ NLP-1 CMPB DEVICE(R0),LPUNIT ;FOR ONE L/P BEQ LPRA20 .ENDC .IFG NLP-1 LPRA00: CMPB DEVICE(R0),LPUNIT(R3) ;FOR MORE THAN ONE L/P BEQ LPRA20 INC R3 CMP R3,#NLP BLT LPRA00 .ENDC MOV #3dE ** ;* ** ;* WHEN IOQTME IS ENTERED, THE INTERRUPT SYSTEM IS INHIBITED ** ;* (MAX OF 42 MICROSECONDS). IF THE MODULE IS ALREADY QUEUED, ** ;* THEN THE TIMER COUNTER IS RESET AND QTIME IS NOT CALLED. ** ;* OTHERWISE, INTERRUPTS ARE ENABLED AND QTIME IS CALLED. ** ;* ** ;* IODQTM De AND ALSO THE ; DOD ON WHICH THE ENTRY IS PART OF. ; R0= FILE ID ; R1 = PARAMETER LIST ADDRESS-SVA ; UPON RETURN: ; CRRSCT CONTAINS RELATIVE SECTOR OF THE DOD ; CRREAD CONTAINS ENTRY ADDRESS IN "BUFFER" ; DEVNO CONTAINS LOGICAL DEVICE (IN I/O LIST) ; DBUF CONTAINS APPROPRIATE DOD ID (IN I/O LIST) ; REGISTERS ARE VOLITILE. ; DDREAD = . .IFNZ $1145 MOV R2,-f COMPLETE ROUTINE MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 BR CRCB00 ;THEN BRANCH TO COMMON CODE ; CRCA40: TST R4 ;EXIT TYPE 2 - NEED TO UNSUSPEND TASK BLE CRCB00 ;BUT FIRST, IS IT A TASK? BRANCH IF NO MOV R4,-(SP) ;OK - LET'S UNSUSPEND THE TASK CLR -(SP) JSR PC,UNSPND TST (SP)+ g,R4 ;AT THIS POINT, THE L/P # IS NOT LEGAL ; LPRA10: ; LPRA15: RST.56 ;RESTORE CALLER'S KERNEL PAR 5/6 REGISTERS MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; THE MOV (SP)+,R3 ; YOU-KNOW-WHATS MOV (SP)+,R2 ; . MOV (SP)+,R1 ; . MOV (SP)+,R0 ; . MOV (SP)+,(SP) ;PUT PC ON TOP OhOES NOT DEQUEUE THE TIMER MODULE, IT ONLY SWITCHES ** ;* THE JSR ADDRESS TO POINT TO AN RTS PC INSTRUCTION. ** ;* THESE ROUTINES ASSUME THAT ONLY THE ARGUMENT AND JSR OPTIONS ** ;* OF THE TIMER MODULE ARE EXERCISED. ** ;* ** ;* IOQTME REQUIRES 4 WORDS OF STACK; IODQTM REQUIRES 2 WORDS ** ;* OF STACK STORAGE. BOTH INCLUDE THE ARGUMENTS PUSHED ONTO ** ;* i(SP) ; SAVE .ENDC DEC R0 ; CALCULATE (FILE ID #-1)/12 CLR CRRSCT ; USE AS RELATIVE SECTOR COUNTER .IFZ $1145 DDR010: SUB #12.,R0 ; DIVIDE BY 12 TO FIND BMI DDR020 ; RELATIVE SECTOR OF DIRECTORY INC CRRSCT ; ACCUMULATE RELATIVE SECTOR BR DDR010 ; DO MORE DDR020: ADD #12.,R0 ; BUMP BACK REMAINDER MOV R0,R3 ASj ;IGNORE ERRORS ; ; BEFORE WE EXIT, WE NEED TO SEE IF THERE ARE ANY OTHER REQUESTS ; QUEUED FOR THIS CARD READER. ; CRCB00: TST R4 BEQ CRCB05 ;BRANCH IF REQUESTOR WASN'T A TASK DECB IOSTAT(R4) ;OTHERWISE, DECREMENT HIS I/O IN PROGRESS .IFNZ OVRLAY ;COUNTER, AND..... BNE CRCB05 ;IF HE IS IN AN OVERLAY SYSTEM, AND..... MOV R4,-(SP) ;HIS COUNTER WENT TO ZERO (NO MORE I/OkF OLD LIST ADDRESS RTS PC ;AND GO, GO, GO - HOME, HOME, HOME ; ; LPRA20: .IFG NLP-1 ;R3 NOW CONTAINS THE L/P INDEX (0,1,...) ASL R3 ;CONVERT IT TO A WORD INDEX (0,2,...) .ENDC MOVB LEVEL(R0),R2 ;NOW, TEST THE PRIORITY LEVEL BLE LPRA30 ;BRANCH IF ILLEGAL CMP R2,#NLPRTY BLE LPRA40 ;BRANCH IF IT'S OK ; LPRA30: MOV #NLPRTY,R2 lTHE STACK BY THE CALLING PROGRAM. ** ;* ** ;* TIMING CONSIDERATIONS. IOQTME EXECUTES IN: ** ;* 62.2 USEC IF MODULE ONLY NEEDS TO BE RESET ** ;* 33.3 + QTIME USEC IF QTIME IS CALLED ** ;* ** ;* PROGRAMMER: 55 ** mL R0 ; PERFORM ASL R0 ; MULTIPLICATION ADD R0,R3 ; BY 5 ADD R3,R3 ; DOUBLE FOR WORD ADDRESSING .ENDC .IFNZ $1145 CLR R2 MOV R0,R3 DIV #12.,R2 ; RELATIVE SECTOR IN REMAINDER MOV R2,CRRSCT ; RELATIVE SECTOR MUL #10.,R3 ; INDEX INTO BUFFER-WORD ADDRESSING .ENDC ADD #BUFFER,R3 n GOING), JSR PC,RELTSK ;THEN LET THE OVERLAY MONITOR RELEASE HIS CORE .ENDC ;(IF IT IS READY TO BE RELEASED, THAT IS) ; CRCB05: TST R2 BNE CRCB10 ;BRANCH IF SOMEBODY IS WAITING .IFZ NCR-1 ;OTHERWISE, SHUT OFF C/R INTERRUPT BIC #ENABLE!START,@#CRS.1 .ENDC .IFG NCR-1 BIC #ENABLE!START,@CRS(R3) .ENDC CLR CRBUSY(R3) MOV o;USER'S VALUE IS ILLEGAL, USE LOWEST ; LPRA40: TST (R1) ;TEST NWORD FOR VALIDITY BGE LPRA50 ;BRANCH IF .GE. 0 AND ASCII .IFZ INEBC MOV #9.,R4 ;BUT, IF EBCDIC ISN'T SYSGENED BR LPRA10 ;NWORD CAN'T BE <= 0 .ENDC .IFNZ INEBC .=.-4 BR LPRA10 .ENDC ; LPRA45: MOV #11.,R4 BR LPRA10 ; LPRA50: JSR PC,LPLEVL p;* DATE: 01.27.72 ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;*****************************************************************q ; ACTUAL ADDRESS OF ENTRY IN BUFFER MOV R3,CRREAD ; SAVE IT MOVB SYSTMB(R1),R3 ; GET LOGICAL DEVICE OF REQUEST MOVB R3,DEVNO ; SET IN LIST ASL R3 ; WORD INDEX MOVB PHYDEV(R3),DBUF ; CALCULATE ID OF APPROPRIATE INC DBUF ; DOD TO USE FOR REQUEST .IFNZ $1145 MOV (SP)+,R2 .ENDC RTS PC ; RETURN .ENDC ; ; ; r CRMDAD(R3),-(SP) JSR PC,IODQTM ;DEQUEUE TIMER TST (SP)+ JMP (R5) ;AND EXIT TO RESTOR ; ; ; CRCB10: .IFZ $KT11C MOV R2,R1 ;BEFORE WE START ANYTHING, MAKE SURE .ENDC .IFNZ $KT11C MOV R2,-(SP) ;CONVERT LIST ADDRESS FROM PACKED JSR PC,PPASV5 ;PHYSICAL TO SYSTEM VIRTUAL MOV (SP)+,R1 ; ; CRCB15: MOV DTVIRT(R1),Rs ;NOW DETERMINE THE INDEX FOR THE ;L/P AND PRIORITY VALUES .IFLE NLP ;THIS LOGIC NEEDS TO BE CONSIDERED MOV LOGMAX,R4 ; LPRA51: TBIT #AVAIL,PHYDEV(R3) ;SEE IF THIS DEVICE IS AVAILABLE BNE LPRA53 ;BRANCH IF IT IS ; LPRA52: TBIT #ALT,PHYDEV(R3) ;OOPS. BETTER SEE IF WE HAVE BEQ LPRA45 ;AN ALTERNATE. BRANCH IF NO. DEC R4 t***** ; ; .DEF IOQTME,IODQTM .REF QTIME ; ; JSTARG = 14. ;POSITION OF JSR SUBROUTINE ADDRESS ;IN THE TIMER MODULES MULTPL = 10. ;TIMER COUNTER ; ; IOQTME: MOV @#PS,-(SP) ;INHIBIT INTERRUPTS .LOCK CMP #1,@6(SP) ;SEE IF MODULE IS ALREADY QUEUED BEQ IOQA00 ;BRANCH IF IT ISN'T MOV R5,-(SP) ;OTHERWISE, RESEu; CREATE WILL BUILD A FILE DIRECTORY ENTRY ; R1 = REQUEST LIST ADDRESS-SVA ; R2= FILE TYPE ; R3= DIRECTORY ENTRY ADDRESS ; NEWSS= START SECTOR OF FILE ; CREATE = . MOV FILEID(R1),(R3) ; SET FILE ID IN ENTRY MOV NEWSS,SCTR(R3) ; SET START SECTOR IN ENTRY MOVB SYSTMB(R1),PDVCE(R3) ; SET LOGICAL DEVICE NUMBER MOVB R2,FTYPE(R3) ; SET FILE TYPE .IFNZ DRESDI v0 ;THEN GET THE VIRTUAL DATA BUFFER MOV DTPAR(R1),@#$KPAR6 ;ADDRESS .ENDC .IFZ $KT11C CRCB15: MOV DATA(R1),R0 ;THE LIST IS STILL VALID, ETC. .ENDC JSR PC,CRCHEK BNE CRCB20 ;BRANCH IF NO GOOD MOV R0,CRDATA(R3) .IFNZ $KT11C MOV @#$KPAR5,VRKPR5(R3) ;SAVE SYSTEM VIRTUAL MOV R1,VRFRST(R3) ;ADDRESSES .ENDC JSR PC,CRSIO ;Ow ; BLE LPRA45 ; MOV ALTDEV(R3),R3 ;GET LOGICAL UNIT NO. OF ALTERNATE ASL R3 ;CONVERT TO WORD INDEX CMPB #LPDEV,PHYDEV(R3) ;SEE IF THE DEVICE IS COMPATIBLE BEQ LPRA51 ;BRANCH IF WE CAN USE IT. BR LPRA52 ;OTHERWISE, GO TRY NEXT ALTERNATE .ENDC ; LPRA53: MOV @#PSR,-(SP) ;PRIORITY QUEUE. INHIBIT INTERRUPTS. .LOCK xT TIME DELAY MOV 8.(SP),R5 ;GET MODULE ADDRESS MOVB 6(SP),MULTPL(R5) ;RESET TIMER MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,@#PS ;ENABLE INTERRUPT MOV (SP)+,(SP) ;MOVE PC UP ONE NOTCH IN STACK CLR 2(SP) ;SET NO ERROR CONDITION ; IOQB00: RTS PC ;THEN EXIT ; ; ; TIMER MODULE MUST BE QUEUED BY QTIME. WE ONLY GET TO SERVE ; AS AN INTERMEDIARY. ; y TSTB FLTYPE(R1) ; CORE DIRECTORY REQUESTED BPL CRE010 ; NO .ENDC BISB #200,FTYPE(R3) ; YES-SET C-STATUS BIT CRE010: MOV LENGTH(R1),LGTH(R3) ; SET FILE'S LENGTH IN ENTRY .IFNZ $TMSLC!CHKPTC BITB #100,FSTAT(R2) ; IS A CHECKPOINT AREA REQUIRED? BEQ CRE020 ; NO MOV NEWSS,CKSAVE(R3) ; YES- CALCULATE START SECTOR ADD LGTH(R3),CKSAVE(R3) .ENDC CRE020: RTzTHERWISE, START I/O JMP (R5) ; ; CRCB20: MOV R4,ERROR(R0) ;STORE ERROR CODE IN USER'S LIST BR CRCLOS ;AND GO TELL HIM ABOUT IT .PAGE ;********************************************************************** ;* ;* THIS SECTION OF CODE IS EXECUTED WHEN A COLUMN OF DATA IS READY. ;* THE INPUT MODE (BINARY OR ALPHANUMERIC) IS DETERMINED, AND THE ;* DATA ARE PROCESSED ACCORDINGLY ;* ;*******************************************{ DEC (R0) ;SEE IF LIST IS THREADABLE BNE LPRA80 ;BRANCH IF NO, CAUSE THAT'S A NO-NO .IFZ $KT11C MOV R0,@LPLAST(R2) ;QUEUE IT - MOV R0,LPLAST(R2) ;QUEUE IT ! .ENDC .IFNZ $KT11C MOV R0,-(SP) ;STORE SYSTEM VIRTUAL LIST ADDRESS ON STACK JSR PC,SVPPA ;AND CONVERT TO PACKED PHYSICAL MOV LPLAST(R2),-(SP);CONVERT THE ADDRESS OF THE LAST ENTRY IN | ; IOQA00: MOV (SP)+,@#PS ;ENABLE INTERRUPTS JMP QTIME ;THEN GO TO QTIME AND LET IT DO ITS THING ;(QTIME WILL EXIT TO CALLER 'CAUSE ; THE STACK NOW LOOKS LIKE: ; ; :MODULE ; :DELAY ; TOP ========> CALLER'S PC ; ; }S PC ; RETURN TO CALLER ; ; GFTYPE WILL GET AND ISOLATE THE FILE TYPE ; FROM A FLMGMT REQUEST ; R1 = REQUEST'S LIST ADDRESS-SVA ; UPON RETURN: ; R1 = UNCHANGED ; R2= FILE TYPE ; GFTYPE = . MOVB FLTYPE(R1),R2 ; GET FILE TYPE BIC #177600,R2 ; ISOLATE RTS PC ; RETURN ; ; GRQUST WILL PUT THE CURRENT LIST ADDRESS IN R1 ; GRQUST = . ~*************************** ; CRID00: .IFNZ BIN .IFNZ BCD TST CRMODE(R3) ;SEE IF WE'RE IN THE BINARY MODE BEQ CRIE00 ;BRANCH IF ALPHANUMERIC .ENDC .ENDC TST MXCNT(R3) ;SEE IF THERE'S ANYMORE INFORMATION BLE CRID30 ;THAT WE WANT ON CARD - BRANCH IF NO .IFZ BIN .IFNZ BCD BR CRIE00 .ENDC .ENDC ;* ;* USE BYTE TO TE JSR PC,PPASV6 ;THE QUEUE FROM PACKED PHYS. TO SYS VIRTUAL MOV 2(SP),@(SP)+ ;AND FINALLY, QUEUE THE CURRENT REQUEST MOV (SP)+,LPLAST(R2) ; THEN.... MOV DTPAR(R0),@#$KPAR6 ; KERNEL PAR 6 .ENDC .IFNZ $KT11C CLR R4 CMP #TSK.PC,RET.PC+2(SP) ;SEE IF CALLER IS A TASK .ENDC .IFZ $KT11C MOV ACTIVE,R4 ;SEE IF CALLER IS A TASK .ENDC IODQTM: ADD #JSTARG,2(SP) ;SET MODULE ADDRESS TO POINT TO ;THE JSR ADDRESS MOV #IOQB00,@2(SP) ;STORE ADDRESS OF AN RTS PC CLR 2(SP) ;CLEAR ERROR POINTER FOR CALLER RTS PC ;RETURN .END .IFZ $KT11C MOV FMFRST,R1 ; CAN TAKE IT OUT OF QUEUE DIRECTLY .ENDC .IFNZ $KT11C MOV CFMSVA,R1 ; GET SVA MOV FMPAR5,$KPAR5 ; AND KERNEL PAR5 .ENDC RTS PC ; ; .END LL US HOW AND WHERE TO USE THE 12 BITS IN CRB1 ;* AS FOLLOWS. ASSUME FORMAT OF CRB1 IS 00 X1 X2 X3, WHERE ;* XX = 4 BITS EACH. ;* ;* BYTE CRB1 IN CURRENT WORD CRB1 IN NEXT WORD ;* ;* 0 X1 X2 X3 00 ----------- ;* 1 00 00 00 X1 X2 X3 00 00 ;* 2 00 00 X1 X2 X3 00 00 00 ;* 3 00 X1 X2 X3 ----------- ;* ;* BNE LPRA55 ;BRANCH IF HE ISN'T MOV $CTASK,R4 ;OTHERWISE, GET HIS NUMBER INCB IOSTAT(R4) ;AND INCREMENT THE I/O IN PROGRESS STATUS BYTE ; LPRA55: MOV R4,SYSTEM(R0) ;SAVE TASK NO. (0 =====> NOT A TASK) TST LPBUSY(R3) ;SEE IF IT'S THE FIRST IN THE QUEUE BEQ LPRB00 ;BRANCH IF YES MOV (SP),@#PSR ;ELSTWISE, CLEAR THE INHIBIT CLR R4 ;NO ERRORS SO FAR PC ; RETURN TO CALLER ; SETUV2 = . MOV SVHDRA,R0 MOV 2.(SP),TPAR2(R0) MOV 2.(SP),$UPAR2 ; SET UP ASR 2 MOV #077406,$UPDR2 MOV #077406,TPDR2(R0) MOV (SP)+,(SP) RTS PC ; .ENDC ; ; .=.+200 ; FORCE THE LOADER FOR NOW ******** ; .END .IFNZ BIN MOV CRDATA(R3),R1 ;GET ADDRESS OF DATA BUFFER .IFNZ $KT11C MOV DTPAR(R1),@#$KPAR6 ;RESTORE PAR PORTION OF .ENDC ;VIRTUAL ADDRESS ADD #4,R1 ADD COUNT(R3),R1 ;ADD INDEX INTO BUFFER MOV BYTE(R3),R2 BEQ CRID10 DEC R2 BEQ CRID40 DEC R2 BEQ CRID50 BR CRID60 ; CRID10: MOV @CRB1(R3),; ; THIS SECTION RETURNS TO THE CALLER (IF EXIT TYPES 1 OR 3) OR TO ; THE ROS DISPATCHER (IF EXIT TYPE 2); THE LATTER REQUIRES THAT ; THE TASK BE SUSPENDED FIRST. ; LPRA60: CMPB #2,TYPE(R0) ;IS THE EXIT TYPE = 2? BNE LPRA70 ;BRANCH IF NO TST SYSTEM(R0) ;SEE IF THIS IS A TASK CALLING BEQ LPRA70 ;BRANCH IF THE CALLER IS NOT A TASK MOV (SP)+,LIST(SP) ;GOOD, HE IS A TASK; PUT HIS PSR ON STACK ; GET SVA MOV FMPAR5,$KPAR5 ; AND KERNEL PAR5 .ENDC RTS PC ; ; .END R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; DATA ASL R4 ; INTO ASL R4 ; POSITION ASL R4 ; .ENDC ; .IFNZ $1145 ; ASH 14,R4 ; .ENDC ; MOV R4,(R1) ;STORE BINARY DATA ; CRID20: INC BYTE(R3) .ENDC ;  .IIF NE $KT11C ADD #4,SP ;SINCE CALLER IS A TASK, HE ;DOESN'T NEED THE KERNEL PAR'S MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; ALL MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV (SP)+,R1 ; REGISTERS MOV (SP)+,R0 ; CLR -(SP) ;SET INVOLUNTARY SUSPEND FLAG JSR PC,QSAVEI ;AND LET QSAVE ND.E C ND.E CTSE.C PC S RT C ND.E C ND.E 0 A0PN,LR0  .ASCII 'H ' ; 210-211 .BYTE 140 ; CENT 212 .ASCII '.<(+' ; 213-216 .BYTE 174 ;OR 217 .ASCII 'I' ; 220 .BYTE 001,002,003 ;SOH STX ETX 221-223 .BYTE 004,011,006,007 ;EOT HT ACK BEL 224-227 .BYTE 010,005,025,013 ;EOM ENQ NAK VT 230-23CRID30: JMP (R5) ;EXIT TO RESTOR ; .IFNZ BIN ; CRID40: MOV @CRB1(R3),R4 ;GET CURRENT COLUMN OF DATA CLR R0 BISB R4,R0 ;SET R4 = BITS 0-7 OF CRB1 DATA SWAB R4 BISB R4,(R1) ;STORE BITS 8-11 OF CRB1 IN DATA BUFFER ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 ;BRANCH IF NI SUSPEND 'IM JMP DSPTCH ;THEN GO TO THE SYSTEM DISPATCHER ; LPRA70: MOV R4,ERROR(R0) ;STORE ERROR CODE MOV (SP)+,@#PSR ;RESTORE CALLER'S PS BR LPRA15 ;AND GO WHERE THE REGISTER CAN BE RESTORED ; LPRA80: INC (R0) ;LIST IS NOT THREADABLE MOV (SP)+,@#PSR MOV #1,R4 BR LPRA10 .PAGE ;*************************************************************** B SO 5 14$1 Z FN.I C ND.E 00NALP T BG R0 C DE 5 14$1 FZ.I + 3)(R T TS LRPC,LPC R JS T SEPR,LPC R JS 1 ,RR4 D AD )+R5,(R2 V MO )+R5,(R1 V MO 5 ,R3)(RCTVELP V MO : 00NALP ; R4.,#8 V MO 2 ,R40#3 V MO R10,NTPI#L V MO 0 ,RLP#N V MO R3 R CL 1 P-NL FG.I ; ; C ND.E /P LHE TARLE Cx ND.E C ND.E CTSE.C PC S RT C ND.E C ND.E 0 A0PN,LR0 B SO 5 14$1 Z FN.I C ND.E 00NALP T BG R0 C DE 5 14$1 FZ.I + 3)(R T TS LRPC,LPC R JS T SEPR,LPC R JS 1 ,RR4 D AD O MORE CARD DATA IS REQUIRED MOVB R0,3(R1) ;STORE 8 BITS OF BINARY DATA IN TOP BYTE BR CRID20 ;OF DATA BUFFER ; CRID50: MOV @CRB1(R3),R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; INTO ASL R4 ; BIT ASL R4 ; POSITIONS ASL R4 ; 4-15 SO WE .ENDC ; CAN ******* ;* ** ;* AT THIS POINT, THE REQUEST JUST QUEUED IS THE ONLY ** ;* REQUEST IN THE QUEUE, SO WE GONNA START THE OUTPUT. ** ;* INTERRUPTS ARE INHIBITED ON ENTRY, AND THE REGISTERS ** ;* ARE SET AS FOLLOWS: ** ;* ** ;* R0 = ADDR(LIST) ND;A LRPC,LPC R JS /P LHE TETES;R T SEPR,LPC R JS Y TRENN OTSUPRRTEINT BIHIINO TET;S 2 1+C.PV#L,@40#3 V MO NETIOU RPTRUERNT IOFR DD ARETO;S .1VCLP@#0,NTPI#L V MO R3 R CL 1 P-NL FZ.I : ITINLP NTPI.L CTSE.C ; ; * ********************************************************************;* * * ;* * * E.IM TONTIZALIIAITINM TEYS St)+R5,(R2 V MO )+R5,(R1 V MO 5 ,R3)(RCTVELP V MO : 00NALP ; R4.,#8 V MO 2 ,R40#3 V MO R10,NTPI#L V MO 0 ,RLP#N V MO R3 R CL 1 P-NL FG.I ; ; C ND.E /P LHE TARLE CND;A LRPC,LPC R JS /P LHE TETES;R T SEPR,LPC R JS Y TRENN OTSUPRRTEINT BIHIINO TET;S 2 1+C.PV#L,@40#3 V MO NETIOU RPTRUERNT IOFR DD ARETO;S .1VCLP@#0,NTPI#L V sGET THE .IFNZ $1145 ; MOST SIGNIFICANT ASH #4,R4 ; 8 BITS OF CRB1 .ENDC ; DATA CLR R0 BISB R4,R0 ;SET R4 = BITS 0-3 OF CRB1 DATA SWAB R4 MOVB R4,(R1) ;STORE BINARY DATA AS 00 00 X1 X2 ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER ** ;* R1 = ADDR(DATA) ** ;* R2 = PRIORITY INDEX ** ;* R3 = L/P INDEX ** ;* ** ;********************************************************************** ; ; LPRB00: INC LPBUSY(R3) ; SET L/P BUSY FLAG MOV (SP),@#PSR ;ENABLE INTERRUPTSATD LEAL CBED ULHO SITINLP ;* * * ;* * * . S)R(TEINPRE IN LHE TRSEACLD ANS ETES R2. ;* * * S UEAL VORCTVET UPRRTEINS RETO S1. ;* * * ;* * * : NETIOU RISTH E.INUTRON IOATIZALTINI IERNTRI PNELI ;* * * ;* * ****************************pMO R3 R CL 1 P-NL FZ.I : ITINLP NTPI.L CTSE.C ; ; * ********************************************************************;* * * ;* * * E.IM TONTIZALIIAITINM TEYS SATD LEAL CBED ULHO SITINLP ;* * * ;* * * . S)R(TEINPRE IN LHE TRSEACLD ANS ETES R2. ;* * * S UEAL VORCTo BLE CRID30 SWAB R0 MOV R0,2(R1) ;STORE BINARY DATA IN NEXT WORD OF BR CRID20 ;BUFFER AS X3 00 00 00 ; CRID60: BIS @CRB1(R3),(R1) ;PUT CURRENT BINARY DATA IN BUFFER ADD #2,COUNT(R3) ;AS 00 X1 X2 X3 CLR BYTE(R3) DEC MXCNT(R3) JMP (R5) ;EXIT TO RESTOR .ENDC .PAGE ;********************************************************************* MOV R1,LPDATA(R3) ;SAVE DATA BUFFER ADDRESS MOV SYSTEM(R0),LPTASK(R3) CLR LPCNT(R3) ;CLEAR THE BUFFER INDEX POINTER MOV R2,LPRIOR(R3) ;SAVE PRIORITY INDEX MOV NWORD(R1),LPMAX(R3) ;SAVE MAX NO CHARACTERS .IFNZ INEBC ;'IF EBCDIC CONVERSION' BGT LPRB10 ;BRANCH IF ASCII NEG LPMAX(R3) ;OTHERWISE, FORCE POSITIVE LPRB10: .END****************************************;* E AG.P C ND.E PC S RT Y TTLP R CL 1 P-NL FZ.I : ONLP ; C ND.E PC S RT : 10DFLP ; ; C ND.E Y TTLP C IN 1 P-NL FZ.I ; ; C ND.E ) R3Y(TTLP C IN R3 L AS R3 C DE 10DFLP T BG = R ;O P NL,#R3 P CM 10DFLP E BL 0<=E B'TAN CO. N/P;L R3 T TS lVET UPRRTEINS RETO S1. ;* * * ;* * * : NETIOU RISTH E.INUTRON IOATIZALTINI IERNTRI PNELI ;* * * ;* * ********************************************************************;* E AG.P C ND.E PC S RT Y TTLP R CL 1 P-NL FZ.I : ONLP ; C ND.E PC S RT : 10DFLP ; ; C ND.E k* ;* ;* ;* A L P H A N U M E R I C M O D E ;* ;* THIS SECTION CONVERTS THE CURRENT COLUMN CHARACTER TO THE ;* SPECIFIED FORMAT AND STORES IT IN THE DATA BUFFER. IT ALSO ;* CHECKS COLUMN 1 OF EACH CARD FOR CONTROL INFORMATION (FORMAT ;* OF CARDS, ETC.). ;* .IFNZ BCD ; CRIE00: INC COUNT(R3) ;INCREMENT CHARACTER (COLUMN) COUNT CMP COUNT(R3),#1 ;IS THIS THE FIRST COLUMN? BNE CRIE15 ;BRANCH IF NO C CLR LPRTRY(R3) ;SET NO. ATTEMPTS TO ZERO ; LPRB20: JSR PC,LPRSET ;RESET THE LINE PRINTER MOV #ASCLP,R2 ;GET ADDRESS OF ASCII TO EVEN-PARITY-ASCII .IFNZ INEBC TST NWORD(R1) BGE LPRB30 MOV #EBCLP,R2 ;LOAD EBCDIC TO EVEN-PARITY-ASCII TABLE ADDR ; LPRB30: .ENDC JSR PC,LPCNVT ;CALL LPCNVT TO CONVERT THE USER'S .LOCK ;NEED TO INHIB1 P-NL FG.I CKBALP Z FN.I F:OFLP ; ; * ********************************************************************;* * * ;* * * . 1)> P NLF (IN URET ROND YEROSTDES IR3 ;* * * ;* * )*LP N.,.., 32,, (1R BEUM NERNTRI PNELIE THS INTAON CR3E ERWH ;* * * ;* * hY TTLP C IN 1 P-NL FZ.I ; ; C ND.E ) R3Y(TTLP C IN R3 L AS R3 C DE 10DFLP T BG = R ;O P NL,#R3 P CM 10DFLP E BL 0<=E B'TAN CO. N/P;L R3 T TS 1 P-NL FG.I CKBALP Z FN.I F:OFLP ; ; * ********************************************************************;* * * ;* * * g MOV @CRB1(R3),R4 ;OTHERWISE, GET BINARY CARD IMAGE .IFNZ TTYSW CMP R4,#SWITCH ;SEE IF COMMAND IS TO SWITCH TO TTY BNE CRIE10 INC CRBKUP(R3) ;SET FLAG TO SWITCH TO TTY BACKUP BR CRIF10 ;THEN GO SET 'READ ANOTHER CARD' FLAG .ENDC ; CRIE10: CMP R4,#$026 ;026 CONTROL COMMAND? BEQ CRIF00 ;BRANCH IF YES .IFNZ EXEBC CMP R4,#$029IT BEFORE I/O CAN START ; LPRB35: ;FIRST LINE OF TEXT. JSR PC,LPSIO ;OTHERWISE, START I/O CLR R4 BR LPRA60 ;THEN GO SET UP FOR EXIT ; LPRB40: JMP LPIE00 .PAGE ;********************************************************************** ;* ** ;* L P I N T ** ;* * F)OFLPR (ON PO,LPC R JS ;* * * ;* * * : S IGEKAIN LHE T).ONLP (/P LHE TTOT PUUT OTETANSEI ROR ;* * * ) FFPO(LE YPETEL THE TTOT PUUT O/P LHE TCHITSWO TEDUS ;* * * RE AND AUTNP IORATEROPY BEDLLCAE ARS NETIOUBRSUE ESTH ;* * * ;* * * F F O P L / N O P L d . 1)> P NLF (IN URET ROND YEROSTDES IR3 ;* * * ;* * )*LP N.,.., 32,, (1R BEUM NERNTRI PNELIE THS INTAON CR3E ERWH ;* * * ;* * * F)OFLPR (ON PO,LPC R JS ;* * * ;* * * : S IGEKAIN LHE T).ONLP (/P LHE TTOT PUUT OTETANSEI ROR ;* * * c ;029 CONTROL COMMAND? BEQ CRIF30 ;BRANCH IF 029 .ENDC CMP R4,#EOD ;LOGICAL END-OF-DATA? BEQ CRIE20 ;BRANCH IF EOD ; CRIE15: ; TST MXCNT(R3) ;WELL THEN, IT MUST BE AN ORDINARY CHARACTER BLE CRID30 ;BRANCH IF WE DON'T NEED ANY MORE CHARACTERS MOV @CRB2(R3),R2 ;GET COMPRESSED VERSION OF CHARACTER ADD TABLE(R3),R2 ;ADD IN BASE ** ;* LINE PRINTER INTERRUPT ROUTINE, ENTERED WHEN THE PRINTER ** ;* IS READY TO ACCEPT ANOTHER LINE OR IF AN ERROR WAS ** ;* DETECTED. ** ;* ** ;********************************************************************** ; LPINT0: JSR R5,SAVE ; CALL SAVE TO TAKE CARE O ;* * * ;* * ********************************************************************;* E AG.P PC S RT E BLLAAIAVT IS L/O IET;S 1)(RTADA R CL : NEDOTY ; R LEAL CTOT XI;E PC S RT ONTIDION CORRR EET;S Z SE R DEORN ICKTA SUT;P P)(S+,P)(S V MO 5 RRETOES;R R5+,P)(S V MO TSUPRRTEINE BLNA;E R PS@#+,P)(S V MO ` ) FFPO(LE YPETEL THE TTOT PUUT O/P LHE TCHITSWO TEDUS ;* * * RE AND AUTNP IORATEROPY BEDLLCAE ARS NETIOUBRSUE ESTH ;* * * ;* * * F F O P L / N O P L ;* * * ;* * ********************************************************************;* E AG.P PC S RT E BLLAAIAVT IS L/O IET;S 1)(R_ TABLE ADDRESS .IFZ $KT11C MOV CRDATA(R3),R1 ;GET DATA BUFFER ADDRESS .ENDC .IFNZ $KT11C MOV VRFRST(R3),R1 ;GET VIRTUAL LIST ADDRESS SO'S WE MOV VRKPR5(R3),@#$KPAR5 ;CAN GET THE VIRTUAL DATA BUFFER ADDR MOV DTPAR(R1),@#$KPAR6 ;LOAD VIRTUAL ADDRESS MOV DTVIRT(R1),R1 ;GET DATA BUFFER ADD-ESS .ENDC ADD #4,R1 ADD COUNT(R3),R1 ;ADD CHARACTERF THINGS .IFZ NLP-1 CLR R3 .ENDC .IFGE NLP-2 MOV #0,R3 ;SET L/P INDEX TO ZERO (FIRST L/P) BR LPIA00 ; LPINT2: JSR R5,SAVE ; CALL SAVE TO TAKE CARE OF THINGS MOV #2,R3 ;SET L/P INDEX TO SECOND L/P .IFGE NLP-3 BR LPIA00 ; LPINT4: JSR R5,SAVE ; ET CETERA MOV #4,R3 .IFGE NLP-4 BR LPIA00 : 00SXLP ; ; PC S RT N IOITNDCOR ROERO- NET;S Z CL R DEORN ICKTA SUT;P P)(S+,P)(S V MO 5 RRETOES;R R5+,P)(S V MO E AGSSMET INPRO TUTYOTTL AL;C T OUTY,TPC R JS SSREDD ASTLIH US;P P)(S,-R5 V MO REWEY HE TREHE WTOK AC BTSUPRRTEINE BLNA;E R PS@#+,P)(S V MO T IABGRO SE,BLLAAIAVS T';I ) R5A(AT,DR4 V MO Y US BIFH NCRA;B 00SXLP E BN E \TADA R CL : NEDOTY ; R LEAL CTOT XI;E PC S RT ONTIDION CORRR EET;S Z SE R DEORN ICKTA SUT;P P)(S+,P)(S V MO 5 RRETOES;R R5+,P)(S V MO TSUPRRTEINE BLNA;E R PS@#+,P)(S V MO : 00SXLP ; ; PC S RT N IOITNDCOR ROERO- NET;S Z CL R DEORN ICKTA SUT;P P)(S+,P)(S V MO 5 RRETOES;R R5+,P)(S V MO E AGSSMET INPRO TUTYO[ INDEX MOVB (R2),-(R1) ;MOVE CONVERTED CHARACTER TO CALLER'S BUFFER DEC MXCNT(R3) BR CRID30 ; CRIE20: .IFZ $KT11C ASL R3 MOV CRFRST(R3),R1 ;EOD READ - GET ADDRESS OF LIST ASR R3 .ENDC .IFNZ $KT11C MOV VRFRST(R3),R1 ;LOAD VIRTUAL ADDRESS OF MOV VRKPR5(R3),@#$KPAR5 ;I/O LIST .ENDC MOV #7,ERROR(R1) ;SET EOD ENCOUNTERED E; LPINT6: JSR R5,SAVE ; ... AND ET CETERA MOV #6,R3 .ENDC .ENDC .ENDC ; ; LPIA00: MOV #RESTOR,R5 ; SET UP R5 FOR RETURN TO RESTOR TST LPBUSY(R3) ;WE'RE GOING TO IGNORE THIS BNE LPIA01 ;INTERRUPT IF LINE PRINTER JMP (R5) ;I/O ISN'T IN PROGRESS ; LPIA01: .IFZ $1145 ;CLEAR THE INTERRUPT INHIBIT MOV #LPINH*32.,@#PSRBLLAAIAVS ISTLIE THF IEE;S 5)(RTADA T TS C ND.E NGHI TMESAE THR FOE OD C451/;1 7 L SP 5 14$1 Z FN.I C ND.E S PTRUERNT IITIBNH ITOE OD C201/;1 SR#P,@40#3 V MO 5 14$1 FZ.I L VELEU CPT ENRRCUE AV;S ) SP-(R,PS@# V MO ;* C ND.E STLIO I/ ;* 5 ,R3)(RLSIOLP V MO ;* 1 P-NL FG.I R TEINPRE IN LOF ;* C ND.E XTTL AL;C T OUTY,TPC R JS SSREDD ASTLIH US;P P)(S,-R5 V MO REWEY HE TREHE WTOK AC BTSUPRRTEINE BLNA;E R PS@#+,P)(S V MO T IABGRO SE,BLLAAIAVS T';I ) R5A(AT,DR4 V MO Y US BIFH NCRA;B 00SXLP E BN E BLLAAIAVS ISTLIE THF IEE;S 5)(RTADA T TS C ND.E NGHI TMESAE THR FOE OD C451/;1 7 L SP 5 14$1 Z FN.I C ND.E S PTRUERNT IITIBNH ITOE OD C201/;1 SR#PWRROR CODE INC IGNORE(R3) ;SET 'IGNORE CARD' FLAG JMP (R5) ; ; 026 CONTROL CARD READ. SET CONVERSION TABLE ADDRESS UP. ; CRIF00: .IFNZ INEBC .IFZ $KT11C ASL R3 MOV CRFRST(R3),R0 ;GET I/O LIST ADDRESS ASR R3 .ENDC .IFNZ $KT11C MOV VRFRST(R3),R0 ;LOAD VIRTUAL ADDRES MOV VRKPR5(R3),@#$KPAR5 ;OF I/O LIST .ENDC TSTB LEVE ;INHIBIT INTERRUPTS AT AND BELOW L/P .ENDC .IFNZ $1145 SPL LPINH .ENDC MOV LPRIOR(R3),R2 ;GET CURRENT REQUEST PRIORITY LEVEL .IFZ $KT11C MOV LPFRST(R2),R0 ;GET I/O LIST ADDRESS .ENDC .IFNZ $KT11C MOV LPFRST(R2),-(SP);CONVERT PACKED PHYSICAL LIST ADDRESS JSR PC,PPASV5 ;TO SYSTEM VIRTUAL MOV (SP)+,R0 MOV DTPAR(R0),@#$KPAR6 ;INI ;* R5T,ISPL#L V MO SSREDD AET G;* 1 P-NL FZ.I R5E AV;S P)(S,-R5 V MO C ND.E 4 ,R4)(R V MO P L/S HI TOR FERFFBUF OSSREDD AET;G 4 ,RR3 D AD 1 P-NL FG.I K ACSTM RO FSSREDD AERFFBUA AT DET;G R4),SP2( V MO : GEMSLP ; ; * ********************************************************************;* * * ;* * * T,@40#3 V MO 5 14$1 FZ.I L VELEU CPT ENRRCUE AV;S ) SP-(R,PS@# V MO ;* C ND.E STLIO I/ ;* 5 ,R3)(RLSIOLP V MO ;* 1 P-NL FG.I R TEINPRE IN LOF ;* C ND.E ;* R5T,ISPL#L V MO SSREDD AET G;* 1 P-NL FZ.I R5E AV;S P)(S,-R5 V MO C ND.E 4 ,R4)(R V MO P L/S HI TOR FERFFBUF OSSREDD AET;G 4 ,RR3 SL(R0) ;TEST LEVEL TO DETERMINE MODE BNE CRIF20 ;1 = EBCDIC .ENDC MOV #O26ASC,TABLE(R3) ;0 = ASCII ; CRIF10: INC REPEAT(R3) ;SET 'READ ANOTHER CARD FLAG' BR CRID30 ; CRIF20: .IFNZ INEBC MOV #O26EBC,TABLE(R3) ;SET FOR 026 TO EBCDIC CONVERSION BR CRIF10 .ENDC ; ; 029 CONTROL CARD. SET FOR PROPER CONVERSION ; .IFNZ EXEBC CRIFTIALIZE KERNEL PAR 6 FOR DATA ;BUFFER ADDRESS MOV LPDATA(R3),R1 ;GET DATA BUFFER ADDRESS JSR PC,LPSTAT ;GET L/P STATUS BNE LPRB40 ;BRANCH IF AN ERROR WAS DETECTED JSR PC,LPRSET ;THEN RESET THE L/P .IFNZ INEBC TST (R1) ;HERE'S WHERE WE DECIDE WHETHER THE INTERNAL BGT LPIA04 ;CODE IS ASCII OR EBCDIC MOV #EBCLP,R2 . EDOYTRES DIS4 RERSTGIRE ;* * * ;* * * LEABILVA A'TSNWAT IS LIFH NCRA;B E BN ;* * * E SGPM,LPC R JS ;* * * S ESDRADR FEUF BTADAH US;P ) SP-(A,AT#D V MO ;* * * X DEINP L/= 3 RET;S ;* * * ;* * PD AD 1 P-NL FG.I K ACSTM RO FSSREDD AERFFBUA AT DET;G R4),SP2( V MO : GEMSLP ; ; * ********************************************************************;* * * ;* * * . EDOYTRES DIS4 RERSTGIRE ;* * * ;* * * LEABILVA A'TSNWAT IS LIFH NCRA;B E BN ;* * * O30: .IFZ $KT11C ASL R3 MOV CRFRST(R3),R0 ;GET I/O LIST ADDRESS ASR R3 .ENDC .IFNZ $KT11C MOV VRFRST(R3),R0 ;LOAD VIRTUAL ADDRESS MOV VRKPR5(R3),@#$KPAR5 ;OF I/O LIST .ENDC .IFNZ INEBC TSTB LEVEL(R0) ;TEST FOR INTERNAL FORMAT TYPE BNE CRIF40 ;BRANCH IF EBCDIC .ENDC MOV #O29ASC,TABLE(R3) ;OTHERWISE, SE ;MUST BE EBCDIC AT THIS POINT BR LPIA06 ; LPIA03: JMP LPIE00 ; LPIA04: .ENDC MOV #ASCLP,R2 ;INTERNAL FORMAT IS ASCII .IFNZ INEBC ; LPIA06: .ENDC JSR PC,LPCNVT ;AND GO SEE IF THERE'S MORE TEXT BNE LPIA10 ;(DON'T WANT TO LEAVE ANYTHING HANGING) JSR PC,LPSIO ;START 'ER UP AGAIN BOYS, WE GOT A NEW CUSTOMER JMP (R5) ;THEN GET OUT OF * S: IGEKAIN L. EDIRQURES IONTIACR TORAPE OOR ;* * *D TEECET DENBES HAR ROERN AENWHD LEAL CISE SGPM L. PETYLETE ;* * *M TEYS SHE TTOE AGSSMED TECADIINE THS UTTPOUE INUTROUB SISTH ;* * * ;* * * E G S M P L ;* * * ;* * ******************************************************************L E SGPM,LPC R JS ;* * * S ESDRADR FEUF BTADAH US;P ) SP-(A,AT#D V MO ;* * * X DEINP L/= 3 RET;S ;* * * ;* * * S: IGEKAIN L. EDIRQURES IONTIACR TORAPE OOR ;* * *D TEECET DENBES HAR ROERN AENWHD LEAL CISE SGPM L. PETYLETE ;* * *M TEYS SHE TTOE AGSSMED TECADIINE THS UTTPOUE INUTROUB SISTH ;* * * KT FOR 029-ASCII BR CRIF10 .IFNZ INEBC ; CRIF40: MOV #O29EBC,TABLE(R3) ;029-EBCDIC BR CRIF10 .ENDC .ENDC .ENDC .PAGE ;********************************************************************** ;* ** ;* C R C H E K ** ;*  HERE (GO TO RESTOR) ; LPIA10: MOV @#PSR,-(SP) ;SAVE CURRENT CPU STATUS LEVEL MOV LPRIOR(R3),R2 ;GET PRIORITY INDEX .LOCK ;NO DATA LEFT IN USER'S BUFFER, SO ;INHIBIT INTERRUPTS SO'S WE CA DEQUEUE ;THE REQUEST MOV (R0),LPFRST(R2) ;PUT NEXT GUY IN THREAD AT TOP OF QUEUE BNE LPIA20 ;BRANCH IF THERE'S MORE IN QUEUE MOV R2,R4 **;* E AG.P PC S RT EXND IRDWOLEUBDOO TRTVEON;C R3 L AS C ND.E O WHW-NO-KOU YRETOES;R R5+,P)(S V MO : 20LALP ; ) 1 -R2*( 2IND ADN HE;T 2 ,RR5 D AD C ND.E ? CKUI QATTHT N'AS;W 5 ,RR3 L MU ITS OE D451/ 1HE TOW HISS HI TND;A 5 14$1 Z FN.I C ND.E : 10LALP ; 00LALP BR 2 ,RR3 D AD 3 *RTYPRNL ; 20LALP T BL H ;* * * E G S M P L ;* * * ;* * ********************************************************************;* E AG.P PC S RT EXND IRDWOLEUBDOO TRTVEON;C R3 L AS C ND.E O WHW-NO-KOU YRETOES;R R5+,P)(S V MO : 20LALP ; ) 1 -R2*( 2IND ADN HE;T 2 G ** ;* THIS SUBROUTINE CHECKS THOSE PARTS OF THE LIST AND DATA ** ;* BUFFER WHICH ARE COMMON TO BOTH THE ORIGINAL CHECK (WHEN ** ;* QUEUEING) AND THE RECHECK (PRIOR TO INITIATING I/O). ** ;* ANYTHING THAT COULD CAUSE CREAD TO HONK UP THE REAL-TIME ;* SYSTEM. LINKAGE IS: ** ;* ** ;* R1 = ADDR(LIST)  ;OTHERWISE, PLACE THIS PRIORITY'S ADD #LPFRST,R4 ;QUEUE IN THE NOMINAL STATE (NO ENTRIES) .IFNZ $KT11C CLC ; ROR R4 ;CONVERT THE ADDRESS CLC ; TO PACKED PHYSICAL ROR R4 ; FORMAT .ENDC MOV R4,LPLAST(R2) ; LPIA20: MOV #1,(R0) ;SET LIST READY MOV (SP)+,@#PSR ;UN-INHIBIT THE INTERRUPTS S OE D201/ 1HE TAY WHE TISS HI;T R5 C DE : 00LALP ; 5 14$1 FZ.I ; TYRIIOPR= 2 R ; X DEINP L/= 3 R -REHE;W ; ) 1 -R2*( 2 +R3Y*RTLP N =EXND ITYRIIOPR ; ; : ISN IOATQU EICAS;B S ELEV LTYRIIOPRR BEUM NUMIMAX MET;S R5D,RR5 D AD C ND.E ? CKUI QATTHT N'AS;W 5 ,RR3 L MU ITS OE D451/ 1HE TOW HISS HI TND;A 5 14$1 Z FN.I C ND.E : 10LALP ; 00LALP BR 2 ,RR3 D AD 3 *RTYPRNL ; 20LALP T BL S OE D201/ 1HE TAY WHE TISS HI;T R5 C DE : 00LALP ; 5 14$1 FZ.I ; TYRIIOPR= 2 R ; X DEINP L/= 3 R -REHEC ** ;* R0 = ADDR(DATA) ** ;* R3 = C/R INDEX ** ;* JSR PC,CRCHEK ** ;* BNE ERROR ;R4 = ERROR CODE ** ;* ** ;* ALL REGISTERS USED BY CRCHEK ARE SAVED AND RESTORED. ** ;* MOV LPTASK(R3),R4 ;GET TASK NO. OF REQUESTOR BEQ LPIA25 ;BRANCH IF NOT A TASK DECB IOSTAT(R4) ;OTHERWISE, DECREMENT HIS I/O IN PROGRESS .IFNZ OVRLAY ;STATUS BYTE BNE LPIA25 ;AND, IF IT BECOMES ZERO, THEN..... MOV R4,-(SP) ;GO THO THE OVERLAY MONITOR SO THE TASK'S JSR PC,RELTSK ;CORE CAN BE RELEASED .ENDC ; LPIA25: CMPB TYPE(R0),#2 ;WAS IT AN EXIT Y,RTLP#N V MO R2 L AS R2 C DE T ISE UWEE USCA 'R5E AV;S P)(S,-R5 V MO -2TYPRNLP+NL Z FN.I C ND.E R2 R CL -2TYPRNLP+NL FZ.I : VLLELP ; ; * ********************************************************************;* * * ;* * * EXND ITYRIIOPR= 2 RTHWIN URET;R ;* * * L @;W ; ) 1 -R2*( 2 +R3Y*RTLP N =EXND ITYRIIOPR ; ; : ISN IOATQU EICAS;B S ELEV LTYRIIOPRR BEUM NUMIMAX MET;S R5Y,RTLP#N V MO R2 L AS R2 C DE T ISE UWEE USCA 'R5E AV;S P)(S,-R5 V MO -2TYPRNLP+NL Z FN.I C ND.E R2 R CL -2TYPRNLP+NL FZ.I : VL? ** ;********************************************************************** ; ; CRCHEK: CLR R4 MOVB TYPE(R1),R2 ;CHECK FOR VALID EXIT TYPE BLE CRDW02 ;BRANCH IF <= 0 * CMP R2,#3 ; * ONLY 1,2,3 ARE VALID BGT CRDW02 ;BRANCH IF > 3 * BNE CRDA20 ;BRANCH IF EXITS 1 OR 2 ; CRDA20: MOV (R0),R2 ;GET WORD COUNT BEQ 2 REQUEST? BGT LPIA40 ;BRANCH IF EXIT 3 BLT LPIB00 ;BRANCH IF EXIT 1 MOV LPTASK(R3),-(SP);OK - IT'S EXIT 2 BEQ LPIA30 CLR -(SP) JSR PC,UNSPND ;SO, UNSUSPEND IT ; LPIA30: TST (SP)+ ;POP OFF ERROR BR LPIB00 ; LPIA40: MOV R5,-(SP) ;THE TIME HAS COME TO JSR TO THE MOV R3,-(SP) ;I/O COMPLETE SUBROUTINE .IFZ $KEVPL,LPC R JS ;* * * X DEINP L/= 3 ;R ;* * * ) TYPRNL.,..2,1, (TYRIIOPR= 2 ;R ;* * * : ISE AGNKLI L.VELE ;* * Y*ITORRI PND AERNTRI PNELID IEIFECSPE THR FOT ASPL LND ASTFRLP ;* * * S ESCC ATOD REUIEQ REXND IHE TESATULLCCAE INUTROUB SISTH ;* * * ;* * * L V E L P 1 PRORITY LEVEL * MOV #NLPRTY,R4 ;R2 = INDEX FOR TOP PRIORITY * ; * LPIB10: ; * TST LPFRST(R2) ;IS THERE A REQUEST FOR THIS * BNE LPIB20 ;PRIORITY LEVEL? BRANCH IF YES **********************;* E AG.P C ND.E NEDOE BTOS ISEELT HA WEE SGON HE;T 10IALP P JM X DEINY ITORRI P =R2 ; 2 ,R3)(RORRILP V MO T OUTY TTON URET R =R5 ; R5+,P)(S V MO TADAR DD A =R1 ; 1 ,R3)(RTADALP V MO STLIR DD A =R0 ; 0 ,RR1 V MO S: ARSTEISEG RUPT SE, OW;N ; C ND.E 0 B2PO,LR5 B SO 5 14$1 Z FN.I C ND.E 0 ;* * * R)BEUM N/P L =(KK T.PD LR,TEISEG RSSREDD ARYMOMEE TH ;* * * G INARLE CBYR ROERR TEINPRE IN L ARSEACLE INUTROUB SISTH ;* * * R L C P L ;* * ********************************************************************;* E AG.P C ND.E NEDOE BTOS ISEELT HA WEE SGON HE;T 10IALP P JM X DEINY ITORRI P =R2 ; 2 ,R3)(RORRILP V MO T OUTY TTON URET R =R5 ; /;SET BIT 2 = 1 TO SIGNAL C/R ERROR CONDITION MOV R0,ERRCR(R3) ;STORE ERROR MOV #ERMSGE,-(SP) ;PRINT MESSAGE JSR PC,CRMSGE MOV #MXTIME,COUNT(R3) ;SET MAXIMUM DELAY THAT WE'LL MOV #CRDLAY,8.(R1) ;WAIT FOR CORRECTIVE ACTION CLR @CRS(R3) ;STORE NEW TIMEOUT ENTRY AND CRTA00: ;DISABLE INTERRUPTS MOV R1,-(SP) ;SET UP FOR 1 SECOND DELAY  * ADD #4,R2 ;INCREMENT INDEX .IFZ $1145 DEC R4 BGT LPIB10 ; AND GO BACK FOR ANOTHER .ENDC .IFNZ $1145 SOB R4,LPIB10 .ENDC BR LPID00 ; * LPIB20: ; * .ENDC ; AT THIS POINT, THERE IS AN ENTRY IN THE QUEUE, AND R2 POINTS ; TO20OBLP T BG R5 C DE 5 14$1 FZ.I R FEUF B/P LHE TOMFRT IS LHE TET;G ) R1-(),R0-( V MO : 20OBLP ; R5 R AS 1 ,RR5 D AD DSARKWAC BRETOES RAN CWES O' S14S LU;P 0 ,RR5 D AD S ESDRAD+ UFPB;L 0 ,R3)(RFRBULP V MO STLIL NAGIRI ORETOES;R 5 ,R4.#1 V MO : 00DALP ; ; ; E ONPD+L8.P*NL.= ; 6EXND I/P LOR FRYNT;E 3 ,R#6 V MO ; 00DALP P JM 4EXND I/P, R5+,P)(S V MO TADAR DD A =R1 ; 1 ,R3)(RTADALP V MO STLIR DD A =R0 ; 0 ,RR1 V MO S: ARSTEISEG RUPT SE, OW;N ; C ND.E 0 B2PO,LR5 B SO 5 14$1 Z FN.I C ND.E 20OBLP T BG R5 C DE 5 14$1 FZ.I R FEUF B/P LHE TOMFRT IS LHE TET;G ) R1-(),R0-( V MO : 20OBLP ; R5 R AS 1 ,RR5 D AD DSARKWAC BRETOES RAN CWES O' S14+ MOV #$1SEC,-(SP) ; JSR PC,IOQTME TST (SP)+ BNE CRLA00 ;LET'S GO ABORT THIS REQUEST ; CRTA10: RTS PC ;RETURN TO TIMER ROUTINES .PAGE ;********************************************************************** ;* ** ;* C R D L A Y ** ;*  IT. ; .IFZ $KT11C MOV LPFRST(R2),R0 ;DATA I/O LIST ADDRESS MOV DATA(R0),R1 ;AND DATA BUFFER ADDRESS .ENDC .IFNZ $KT11C MOV LPFRST(R2),-(SP);GET NEXT ENTRY IN QUEUE JSR PC,PPASV5 ;CONVERT TO SYSTEM VIRTUAL MOV (SP)+,R0 ;AND PUT IN R0 MOV DTVIRT(R0),R1 ;GET SYSTEM VIRTUAL EQUIVALENT OF MOV DTPAR(R0),@#$KPAR6 ;THE DATA BUFFER ADDRESS .ENDC LOR FRYNT;E 3 ,R#4 V MO ; 00DALP P JM 2EXND I/P LOR FRYNT;E 3 ,R#2 V MO ; 00DALP P JM 0EXND I/P LOR FRYNT;E 3 ,R#0 V MO : NEDOLP ; ; T IS LSSREDD A =R1 ; D.SEESOCPRY ELETPLOM C ; ENBES HAE AGSSMEE THN HE WUTYOTTY BEDERNT EISN IOCTSES HI T ; ; ; PC S RT 0 ,R3)(RFRBULP V MO 5 RRETOES;R R5+,P)(S V MO T IDOO GND;A T OUTY,TPC R JS (S LU;P 0 ,RR5 D AD S ESDRAD+ UFPB;L 0 ,R3)(RFRBULP V MO STLIL NAGIRI ORETOES;R 5 ,R4.#1 V MO : 00DALP ; ; ; E ONPD+L8.P*NL.= ; 6EXND I/P LOR FRYNT;E 3 ,R#6 V MO ; 00DALP P JM 4EXND I/P LOR FRYNT;E 3 ,R#4 V MO ; 00DALP P JM 2EXND I/P LOR FRYNT;E 3 ,R#2 V MO ; 00DALP P JM 0EXND I/P LOR FRYNT;E 3 ,R#0 V MO : NEDOLP ; ' ** ;* THIS ROUTINE IS ENTERED ONCE EVERY SECOND AND IS INITIALLY ** ;* ACTIVATED BY CRTIME. IT PURPOSE IS TO PATIENTLY SIT AND ** ;* WAIT FOR THE CARD READER TO GET READY. HOWEVER, NOT BEING ** ;* A VERY PATIENT INDIVIDUAL, HE JUST MIGHT ABORT THE C/R ** ;* REQUEST, BUT ONLY AFTER MXTIME SECONDS HAVE ELAPSED. ** ;* ** ;* CRDLAY IS ENTERED FROM THE TIMER JSR PC,LPCHEK ;DOUBLE CHECK VALUES BEQ LPIC00 ;BRANCH IF ALL'S WELL MOV #10.,ERROR(R0) ;TSK, TSK. SOMEBODY DID SOMETHING JMP LPIA10 ;WHILE IT WAS IN THE QUEUE ; ; ; REQUEST IS OK, BEGIN PREPARATIONS FOR MESSAGE OUTPUT ; ; LPIC00: MOV R1,LPDATA(R3) ;SAVE VOLATILE STUFF: DATA ADDRESS MOV R2,LPRIOR(R3) ; PRIORITY INDEX MOV SYSTEM(R0),LPTASK(R3) P)(S,-R0 V MO E BLDAEAHR TSTLIE AK;M ) R0,(#1 V MO 0 Y ITORRI;P ) R0L(VELE RBCL 3 = E YP T0,= E ICEV DET;S 0)(RCEVIDE.,56*2#3 V MO S ESDRADE ETPLOM C/O IRETO;S 0)(RITEX,$R4 V MO R4E,ONPD#L D AD R4 L AS R4 L AS R4 L AS E USY TTR FOT IS LUPT SEN HE;T 4 ,RR3 V MO 0 ,R4.#1 B SU C ND.E 0 B1PO,LR5 B SO 5 14$1 Z FN.I $ ; T IS LSSREDD A =R1 ; D.SEESOCPRY ELETPLOM C ; ENBES HAE AGSSMEE THN HE WUTYOTTY BEDERNT EISN IOCTSES HI T ; ; ; PC S RT 0 ,R3)(RFRBULP V MO 5 RRETOES;R R5+,P)(S V MO T IDOO GND;A T OUTY,TPC R JS P)(S,-R0 V MO E BLDAEAHR TSTLIE AK;M ) R0,(#1 V MO 0 Y ITORRI;P ) R0L(VELE RBCL 3 = E YP T0,= E ICEV DET;S 0)(RCEVIDE.,56*2#3 V MO S ESDRADE ETPLOM# ROUTINE AND R1 POINTS TO ** ;* THE TIMER MODULE. ** ;* ** ;********************************************************************** ; CRDLAY: MOV 6(R1),R3 ;GET C/R INDEX BIC #START!ENABLE,@CRS(R3) BIT #READY,@CRS(R3) ;CHECK C/R STATUS BEQ CRLA10 ;BRANCH IF C/R IS READY DEC COUNT(R3) ;TSK, TSK. ;STORE THE TASK NUMBER OF CLR LPCNT(R3) ;THE REQUESTING PROGRAM MOV #ASCLP,R2 ; MOV (R1),LPMAX(R3) ; NWORD .IFNZ INEBC BGE LPIC10 MOV #EBCLP,R2 NEG LPMAX(R3) ;SET LPMAX = ABS(NWORD) ; LPIC10: .ENDC CLR LPRTRY(R3) ;CLEAR # ATTEMPTS COUNTER JSR PC,LPCNVT ;SET UP BUFFER, C ND.E 10OBLP T BG R5 C DE 5 14$1 FZ.I + 4)(R+,0)(R V MO : 10OBLP ; 5 ,R#7 V MO UFPB LINT IS LVESA, STIR;F 4 ,R3)(RFRBULP V MO R5E AV;S P)(S,-R5 V MO : 00OBLP ; ; CKBALP Z FN.I ; ; E?ER H ; G INDON VE EOU YRE AATWH, SECAH ICWHN I. EMSTSYE THO NT I ; D TERANEGET N'AS WONTIOPS HI TE,RSOU COF, SSLEUN E.YPETEL T ; M TEYS SHE TTOT PUUT OERNTRI PNELIE THS RTVEDIN IOCTSES C/O IRETO;S 0)(RITEX,$R4 V MO R4E,ONPD#L D AD R4 L AS R4 L AS R4 L AS E USY TTR FOT IS LUPT SEN HE;T 4 ,RR3 V MO 0 ,R4.#1 B SU C ND.E 0 B1PO,LR5 B SO 5 14$1 Z FN.I C ND.E 10OBLP T BG R5 C DE 5 14$1 FZ.I + 4)(R+,0)(R V MO : 10OBLP ; 5 ,R#7 V MO UFPB LINT IS LVESA, STIR;F 4 ,R3)(RFRBULP V MO R5E AV DECREMENT COUNTER BNE CRTA00 ;GO WAIT SOME IF MXTIME SEC. HAVEN'T ELAPSED CRLA00: MOV (SP)+,R5 ;PUT TIMER RETURN ADDRESS IN R5 .IFZ $KT11C ASL R3 MOV CRFRST(R3),R1 ;GET USER'S LIST ADDRESS ASR R3 .ENDC .IFNZ $KT11C MOV VRFRST(R3),R1 ;SET UP SYSTEM VIRTUAL LIST ADDRESS MOV VRKPR5(R3),@#$KPAR5 .ENDC MOV #7,ERROR(R1) ;SET I/O REQUESTCONVERT TO L/P ASCII JSR PC,LPRSET ;RESET THE L/P JSR PC,LPSIO ;START THE L/P I/O JMP (R5) ;THEN RETURN TO RESTOR, WHO'LL CLEAR THE INT. ; ; ; NO REQUESTS ARE LEFT IN THE LINE PRINTER'S QUEUE. ; LPID00: JSR PC,LPRSET ;RESET THE LINE PRINTER CLR LPBUSY(R3) ;CLEAR THE BUSY INDICATOR .IFG NLP-1 MOV LPMDAD(R3),-(SP) ;GO STOP THE TIMER .ENDC .IHI T ; ; ; . RRHEN EI ME,OM HGO ND;U PC S RT + P)(S T TS R METIT ARSTO ;G E TMOQ,IPC R JS D ONEC SNE OAYEL;D P)(S,-EC1S#$ V MO P)(S,-R4 V MO 4)(RUBRSJSE,IMPT#L V MO ; C ND.E 4 ,R3)(RADMDLP V MO S RMFOER PDECOE THF ORTPAS HI;T 1 P-NL Z FN.I C ND.E 4 ,RODPM#L V MO E ULOD MERIM TOFS ESDRADT GE, OW;N 1 P-NL FZ.I ;S P)(S,-R5 V MO : 00OBLP ; ; CKBALP Z FN.I ; ; E?ER H ; G INDON VE EOU YRE AATWH, SECAH ICWHN I. EMSTSYE THO NT I ; D TERANEGET N'AS WONTIOPS HI TE,RSOU COF, SSLEUN E.YPETEL T ; M TEYS SHE TTOT PUUT OERNTRI PNELIE THS RTVEDIN IOCTSES HI T ; ; ; . RRHEN EI ME,OM HGO ND;U PC S RT + P)(S T TS R METIT ARSTO ;G E TMOQ,IPC R JS D ONEC SNE OAYEL;D P)(S,-EC1S#$ V MO P)(S,-R4 V MO  ABORTED ERROR CODE JMP CRCLOS ;THEN GO TO DEQUEUE THE REQUEST AND EXIT ; CRLA10: MOV (SP)+,R5 ;SET TIMER TO RETURN TO LOOK LIKE RESTOR JMP CRIC10 ;AND GO RESTART THE I/O .PAGE ;********************************************************************** ;* C R M S G E ** ;* ** ;* THIS SUBROUTINE OUTPUTFZ NLP-1 MOV #LPMOD,-(SP) .ENDC JSR PC,IODQTM TST (SP)+ JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ** ;* THIS SECTION GETS ENTERED FROM THE INTERRUPT ROUTINE IF ** ;* A DEVICE ERROR HAS BEEN DETECTED. ONLY TWO ERROR ** ;* CONDITIONS ARE CONSIDERED: C ND.E YSBO, NEGIENE OLE THP UEV;R 3)(RMDPC@LE,!IIDB!#S V MO SSREDD ARYMOMER FEUF BRETO;S 3)(RDRADLP,@3)(RFRBULP V MO : 10OALP ; E OD MOLTRON CGEIARRCAO TET;S ) R3D(EEPF@L R CL : 00OALP ; 10OALP BR EDFEE IN LTOAUE SUIS, SEWIERTH;O ) R3D(EEPF@LF,OLUT#A V MO L RONTCOE AGRIAR CIFH NCRA;B 00OALP Q BE INE 'RWEE OD MCHHI WEE;S 3)(RDEMOLP T TS T UNCOD OR WRETO;S  4)(RUBRSJSE,IMPT#L V MO ; C ND.E 4 ,R3)(RADMDLP V MO S RMFOER PDECOE THF ORTPAS HI;T 1 P-NL Z FN.I C ND.E 4 ,RODPM#L V MO E ULOD MERIM TOFS ESDRADT GE, OW;N 1 P-NL FZ.I C ND.E YSBO, NEGIENE OLE THP UEV;R 3)(RMDPC@LE,!IIDB!#S V MO SSREDD ARYMOMER FEUF BRETO;S 3)(RDRADLP,@3)(RFRBULP V MO : 10OALP ; E OD MOLTRON CGEIARRCAO TET;S ) R3D(EEPF@LS THE INDICATED MESSAGE TO THE SYSTEM ** ;* TELETYPE. CRMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS ** ;* ** ;* SET R3 = C/R INDEX ** ;* MOV #DATA-(SP) PUSH DATA BUFFER ADDRESS ** ;* JSR PC,CRMSGE ** ;* BNE FATAL AND WARNING. PARITY ** ;* ERRORS ARE CONSIDERED FATAL; PAPER LOW, L/P NOT READY, ** ;* ETC., ARE CONSIDERED WARNINGS. FATAL ERRORS ARE ** ;* RESTARTED: AFTER A PREDETERMINED NUMBER OF ATTEMPTS, ** ;* AN ERROR MESSAGE IS GENERATED AND THE REQUEST IS ABORTED. ** ;* WARNING CONDITIONS CAUSE LPRNTR TO WAIT A PRESCRIBED ** ;* PERIOD OF TIME, AFTER WHICH THE REQUEST IS ALSO ABORTED. ** ;* HOWEVER, IF IT BECOM 3)(RCTWDLP,@R4 V MO M TEYS SINP L/1 > R FOE OD CHE TOR FOW NND;A 1 P-NL FG.I ; ; C ND.E UPR 'ERTTA;S 1 D.CM@#D,!IIEB!#S V MO SSREDD AERFFBUY OREM MRETO;S1 T.PD#L,@UFPB#L V MO : 10OALP E OD MOLTRON CGEIARRCAO TET;S .1RGLF@# R CL : 00OALP ; 10OALP BR EDFEE IN LTOAUE SUIS, SEWIERTH;O .1RGLF@#F,OLUT#A V MO L RONTCOE AGRIAR CIFH NCRA;B 00OALP Q BE INE 'RWEE  R CL : 00OALP ; 10OALP BR EDFEE IN LTOAUE SUIS, SEWIERTH;O ) R3D(EEPF@LF,OLUT#A V MO L RONTCOE AGRIAR CIFH NCRA;B 00OALP Q BE INE 'RWEE OD MCHHI WEE;S 3)(RDEMOLP T TS T UNCOD OR WRETO;S 3)(RCTWDLP,@R4 V MO M TEYS SINP L/1 > R FOE OD CHE TOR FOW NND;A 1 P-NL FG.I ; ; C ND.E UPR 'ERTTA;S 1 D.CM@#D,!IIEB!#S V MO SSREDD AERFFBUY OREM MRETO;S1 T.PD#L BNE IF LIST WASN'T AVAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. ** ;* ** ;********************************************************************** ; CRMSGE: MOV 2(SP),R4 ;GET DATA BUFFER ADDRESS FROM STACK .IFG NCR-1 ADD R3,R4 ;GET ADDRESS OF BUFFERES READY DURING THIS PERIOD, THEN I/O ** ;* WILL CONTINUE. ** ;* ** ;********************************************************************** ; ; LPIE00: BGT LPIE20 ;BRANCH IF ERROR IS NOT FATAL INC LPRTRY(R3) ;INCREMENT ERROR COUTNER CMP #LPERR,LPRTRY(R3) ;WE CAN ONLY HACK LPERR ERRORS BLE LPIE10OD MCHHI WEE;S DEMOLP T TS NTOU CRDWOR TEINPRE IN LRETO;S .1NT#C,@R4 V MO EMSTSYN I/P LLYONR FOS IDECOS HI;T 1 P-NL FZ.I : 00O0LP ; NTOU CRDWOE IVATEG NDSEE N/P;L R4 G NE ) R3D(ORPW,LR4 V MO C ND.E ES YIFH NCRA;B 00OBLP E BN D SE UBEO TISY TTF IEE;S ) R3Y(TTLP T TS CKBALP Z FN.I O:SILP ; ; * ****************************************************,@UFPB#L V MO : 10OALP E OD MOLTRON CGEIARRCAO TET;S .1RGLF@# R CL : 00OALP ; 10OALP BR EDFEE IN LTOAUE SUIS, SEWIERTH;O .1RGLF@#F,OLUT#A V MO L RONTCOE AGRIAR CIFH NCRA;B 00OALP Q BE INE 'RWEE OD MCHHI WEE;S DEMOLP T TS NTOU CRDWOR TEINPRE IN LRETO;S .1NT#C,@R4 V MO EMSTSYN I/P LLYONR FOS IDECOS HI;T 1 P-NL FZ.I : 00O0LP ; NTOU CRDWOE IVATEG NDSEE N/P;L FOR THIS C/R MOV (R4),R4 .ENDC MOV R5,-(SP) ;SAVE R5 .IFZ NCR-1 MOV #CRLIST,R5 .ENDC .IFG NCR-1 MOV CRIOLS(R3),R5 ;GET THE I/O LIST ADDRESS .ENDC ; ; MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 ;THEN, INHIBIT INTERRUPTS MOV #340,@#PSR ;11/20 CODE .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE  ;BRANCH IF WE MUST GIVE UP LPIE05: JSR PC,LPCLR ;CLEAR THE ERROR JSR PC,LPRSET ;AND RESET THE L/P JSR PC,LPSIO ;START THE I/O AGAIN JMP (R5) ;EXIT TO RESTOR ; LPIE10: MOV #LPARTY,-(SP) JSR PC,LPMSGE ;PRINT 'L/P K PARITY ERROR' MOV #6,ERROR(R1) ;TELL CALLER WHAT HAPPENED JMP LPIA10 ;GO TRY NEXT QUEUED REQUEST ; ; ; LINE PRINTER ****************;* * * ;* * * D.TEARSTE BOT NLLWIR METI ;* * * E TH, SECAS HI TIN T.OUTY TIA VPETYLETEE THO TEDCTREDI ;* * * E BLLWIT PUUT O/P LHE TD,IEIFOT NSOS HAR TORAPE OHE TIF ;* * * S ESDRADT IS L =R0 ;* * * EXND I/P L =R3 ;* * * T UNCOD OR R4 G NE ) R3D(ORPW,LR4 V MO C ND.E ES YIFH NCRA;B 00OBLP E BN D SE UBEO TISY TTF IEE;S ) R3Y(TTLP T TS CKBALP Z FN.I O:SILP ; ; * ********************************************************************;* * * ;* * * D.TEARSTE BOT NLLWIR METI ;* * * E TH, SECAS HI TIN T.OUTY TIA VPETYLETEE THO TED  .ENDC TST DATA(R5) ;SEE IF LIST IS AVAILABLE BNE CMSX00 ;BRANCH IF NO MOV R4,DATA(R5) ;YES - GRAB IT MOV R4,DTVIRT(R5) MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R5,-(SP) ;STORE LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) CLZ RTS PC ;RETURN TO CALERROR IS NOT PERMANENT. PRINT AN OPERATOR NOTIFICATION ; MESSAGE, THEN SET UP ONE SECOND DELAY. ; ; LPIE20: MOV #LPRDY,-(SP) JSR PC,LPMSGE ;PRINT 'L/P K NOT READY' JSR PC,LPRSET ;SET UP MAXIMUM TIME WE'LL WAIT CLR LPRTRY(R3) .IFZ NLP-1 MOV #LPMOD,R4 ;GET TIMER MODULE ADDRESS .ENDC .IFG NLP-1 MOV LPMDAD(R3),R4 ;GET TIMER MODULE ADDRESS .ENDC W/P L =R4 ;* * * ;* * * Y:TRENN OTSENEMIRQURE ;* * * T. ITHWIE ON DTSGEO SILPN HE WBEL IL WIT, EDEUQUT N'IS ;* * * LEDUMOE THF I. UTEOIM TNDCOSEE ONA R FOD TEUSDJ AIS ;* * * E ULOD MERIM THE TS,RDWAERFT A. ERNTRI PNELIE THT ARST ;* * * TON IOCTUN FUTTPOUL UACT AHE TMSORRFPEE INUTROUB SISTH ;* * * CTREDI ;* * * E BLLWIT PUUT O/P LHE TD,IEIFOT NSOS HAR TORAPE OHE TIF ;* * * S ESDRADT IS L =R0 ;* * * EXND I/P L =R3 ;* * * T UNCOD OR W/P L =R4 ;* * * ;* * * Y:TRENN OTSENEMIRQURE ;* * * T. ITHWIE ON DTSGEO SILPN HE WBEL IL WITLER ; CMSX00: MOV (SP)+,@#PSR ;LIST BUSY MOV (SP)+,R5 MOV (SP)+,(SP) SEZ ;SET ERROR INDICATOR (BUSY LIST) RTS PC ;RETURN TO CALLER ; CRTTY: CLR DATA(R1) ;TTY I/O COMPLETE SUBROUTINE RTS PC ;SET LIST NOT BUSY AND EXIT .PAGE ;********************************************************************** ;*  MOV R4,-(SP) MOV #LPTIME,JSRSUB(R4) MOV #$1SEC,-(SP) ;STORE ONE SECOND DELAY JSR PC,IOQTME ;AND GO START THE TIMER TST (SP)+ ; JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ** ;* L P T I M E ;* * * O I S P L ;* * * ;* * ********************************************************************;* E AG.P T XI END;A PC S RT R TOCADIINR ROERY ITAR PET;S + P)(S C DE : 20SALP ; T XI;E PC S RT D REUIEQ RONTIACR TORAPE;O + P)(S C IN : 10SALP ; IT, EDEUQUT N'IS ;* * * LEDUMOE THF I. UTEOIM TNDCOSEE ONA R FOD TEUSDJ AIS ;* * * E ULOD MERIM THE TS,RDWAERFT A. ERNTRI PNELIE THT ARST ;* * * TON IOCTUN FUTTPOUL UACT AHE TMSORRFPEE INUTROUB SISTH ;* * * ;* * * O I S P L ;* * * ;* * **************************************** ** ;* C R S I O ** ;* ** ;* CARD READER START I/O SUBROUTINE. CRSIO SETS UP ALL ** ;* COUNTERS, INITIATES A C/R READ REQUEST, AND STARTS ** ;* UP A TIMER (100 MS DELAY) TO MAKE SURE WE DON'T HANG ** ;* IF AN INTERRUPT ISN'T RECEIVED. CRDQTM, A SECOND ** ;* ENTRY, WILL DEQUEUE (STOP) THIS  ** ;* ** ;* THIS ROUTINE IS ENTERED BY TIMER EVERY SECOND. LPTIME ** ;* CHECKS FOR AN L/P READY CONDITION SO THAT OUTPUT CAN ** ;* CONTINUE. AFTER LPMXTM SECONDS, LPTIME GIVES UP ON THE ** ;* OPERATOR AND ABORTS THE REQUEST. ** ;* ** ;* ON ENTRY, R1 CONTAINS THE TIMER MODULE AEXN HE;T PC S RT OK= E OD CONTIDION CET;S + P)(S T TS : 00SALP ; E INNL OIFH NCRA;B 10SALP Q BE R4E,INNL#O T BI OW LERAP PIFH NCRA;B 10SALP E BN ; R4W,LO#P T BI NTSERE PIFH NCRA;B 20SALP E BN ORRR ETYRIPAR FOT ES;T R4Y,ITAR#P T BI N IOITNDCO' OK 'ET;S ) SP-( R CL C ND.E S TUTA SET;G 4 ,R3)(RTSPS@L V MO 1 ****************************;* E AG.P T XI END;A PC S RT R TOCADIINR ROERY ITAR PET;S + P)(S C DE : 20SALP ; T XI;E PC S RT D REUIEQ RONTIACR TORAPE;O + P)(S C IN : 10SALP ; ITEXN HE;T PC S RT OK= E OD CONTIDION CET;S + P)(S T TS : 00SALP ; E INNL OIFH NCRA;B 10SALP Q BE R4E,INNL#O T BI OW LERAP PIFH NCRA;B 10 TIMER REQUEST BY USING ** ;* SUBROUTINE DQTIME. USAGE IS: ** ;* ** ;* R1 = ADDR(LIST) ** ;* MOV #CRINDX,R3 ;SET R3 = C/R INDEX ** ;* JSR PC,CRSIO ** ;* ** ;* REGISTERS R0, R1, R2 AN DDRESS. LPTIME IS ** ;* ENTERED BY A JSR PC,LPTIME ** ;* ** ;********************************************************************** ; ; LPTIME: MOV INDEX(R1),R3 ;GET L/P INDEX FROM MODULE ARGUMENT MOV R1,-(SP) ;REORGANIZE REGISTERS THE WAY WE LIKE'EM MOV LPDATA(R3),R1 ; R1 = ADDR(DATA) MOV LPRIOR(R3),R2 ; R2 = PRIOP-NL FG.I C ND.E 4 ,R.1ATST@# V MO 1 P-NL FZ.I : ATSTLP ; ; * ********************************************************************;* * * ;* * * D YEROSTDES IR4 X.DEINP L/N AINTCOT US MR3, RYNT EON ;* * * ;* * * D REUIEQ RONTIACR TORAPE O= ROZE> ;* * * SALP E BN ; R4W,LO#P T BI NTSERE PIFH NCRA;B 20SALP E BN ORRR ETYRIPAR FOT ES;T R4Y,ITAR#P T BI N IOITNDCO' OK 'ET;S ) SP-( R CL C ND.E S TUTA SET;G 4 ,R3)(RTSPS@L V MO 1 P-NL FG.I C ND.E 4 ,R.1ATST@# V MO 1 P-NL FZ.I : ATSTLP ; ; * ********************************************************************;* * * D R4 ARE DESTROYED. ** ;* ** ;********************************************************************** ; ; CRSIO: CLR COUNT(R3) ;SET COUNT = 0 CLR IGNORE(R3) MOV SYSTEM(R1),CRTASK(R3) ;STORE TASK NUMBER .IFNZ BIN CLR BYTE(R3) .ENDC .IFNZ TTYSW TST CRBKUP(R3) ;SEE IF THIS READ IS TO BE DIRECTED BNRITY INDEX .IFZ $KT11C MOV LPFRST(R2),R0 ; R0 = ADDR(LIST) .ENDC ; R3 = L/P INDEX ; R4 = TIMER MUDULE ADDRESS .IFNZ $KT11C MOV LPFRST(R3),-(SP);CONVERT PACKED PHYSICAL LIST JSR PC,PPASV5 ;ADDRESS TO SYSTEM VIRTUAL MOV (SP)+,R0 ; MOV DTPAR(R0),@#$KPAR6 ;INITIALIZE KPAR6 FOR DATA BUFFER ADDR .ENDC ORRR EALAT F= ROZE< ;* * * T GHRIALS G'INTHRYVE E= O ER Z ;* * * ;* * * : LYNGDIORCC AESOD CONTIDION CHE TTSSEN HE TR,TEINPR ;* * * NELID TECADIINE THF OUSATSTE THS ADREE INUTROUB SISTH ;* * * ;* * * T A T S P L ;* * * ;* * * D YEROSTDES IR4 X.DEINP L/N AINTCOT US MR3, RYNT EON ;* * * ;* * * D REUIEQ RONTIACR TORAPE O= ROZE> ;* * * ORRR EALAT F= ROZE< ;* * * T GHRIALS G'INTHRYVE E= O ER Z ;* * * ;* * * : LYNGDIORCC AESOD CONE CRSB00 ;TO THE TTY - BRANCH IF YES (OR SI) ; CRSA05: .ENDC .IFZ $KT11C ASL R3 MOV CRDATA(R3),R0 ;GET DATA ADDRESS ASR R3 .ENDC .IFNZ $KT11C MOV DTVIRT(R1),R0 ;SRT UP VIRTUAL DATA BUFFER ADDRESS MOV DTPAR(R1),@#$KPAR6 ; .ENDC .IFNZ BIN CLR R1 ;DETERMINE MODE OF INPUT .ENDC MOV (R0),R2 .IFN JSR PC,LPSTAT ;GET L/P STATUS BNE LPTA00 ;BRANCH IF STILL NOT READY TST (SP)+ MOV (SP)+,R5 ;OTHERWISE, SET UP TIMER RETURN MOV LPWORD(R3),R4 ;GET LENGTH OF CURRENT LINE BR LPIE05 ;TO LOOK LIKE RESTOR RETURN ; LPTA00: JSR PC,LPRSET ;AND RESET THE L/P INC LPRTRY(R3) ;INCREMENT #ATTEMPTS COUNTER CMP LPRTRY(R3),#LPMXTM BGE LPTA10 ;* * ********************************************************************;* E AG.P ! KSOL FL,ALS T'HA;T PC S RT C ND.E T IARLE;C ) R3D(CMLP,@ARLE#C V MO 1 P-NL FG.I C ND.E .1MD#C,@ARLE#C V MO 1 P-NL FZ.I : ETRSLP ; ; * ********************************************************************;* * * TIDION CHE TTSSEN HE TR,TEINPR ;* * * NELID TECADIINE THF OUSATSTE THS ADREE INUTROUB SISTH ;* * * ;* * * T A T S P L ;* * * ;* * ********************************************************************;* E AG.P ! KSOL FL,ALS T'HA;T PC S RT C ND.E T IARZ BIN BGE CRSA10 ;NWORD < 0 ======> BINARY INC R1 ;SET R1 = 1 (BINARY) NEG R2 .ENDC ; CRSA10: .IFNZ BIN MOV R1,CRMODE(R3) ;STORE MODE CODE .ENDC CLR ERRCR(R3) ;CLEAR ERROR STATUS INC CRBUSY(R3) ; SET C/R BUSY .IFZ NCR-1 ;NOW WE GOT'S TA GET THE ADDRESS OF MOV #CRMOD,R1 ;THE TIMER MODULE FOR THIS C/R .END ;BRANCH IF IT'S TIME TO QUIT MOV #$1SEC,-(SP) ;RESTART TIMER FOR ONE SECOND JSR PC,IOQTME TST (SP)+ ;POP OFF ERROR FLAG BNE LPTA10 ;WHAT'S THAT, AN ERROR? THEN BRANCH RTS PC ;RETURN TO TIMER ; ; LPTA10: MOV #7,ERROR(R0) ;SET USER'S ERROR FLAG TST (SP)+ MOV (SP)+,R5 JMP LPIA10 ;GO TRY NEXT REQUEST. .PAGE ;***** ;* * * R.BEUM NEXND I/P L =R3 S. IATTH, EDARLE CBE ;* * * TOS EDNET INTVE EHE TIN T; IARLE CLDOUSHE OSPPSUI H ICWH ;* * *, ERNTRI PNELIE THO TNDMAOM CETES R AESSUISE INUTROUB SISTH ;* * * ;* * * T E S R P L ;* * * ;* * ****************************************LE;C ) R3D(CMLP,@ARLE#C V MO 1 P-NL FG.I C ND.E .1MD#C,@ARLE#C V MO 1 P-NL FZ.I : ETRSLP ; ; * ********************************************************************;* * * ;* * * R.BEUM NEXND I/P L =R3 S. IATTH, EDARLE CBE ;* * * TOS EDNET INTVE EHE TIN T; IARLE CLDOUSHE OSPPSUI H ICWH ;* * *, ERNTRI PNELIE THO TNDMAOM CETES R AESSUISE INUTC .IFG NCR-1 MOV CRMDAD(R3),R1 ;GET ADDRESS OF TIMER MODULE .ENDC MOV R1,-(SP) ; MOV #$1SEC,-(SP) ;SET UP FOR 1 SECOND DELAY JSR PC,IOQTME ;REV UP THE OLE TIMER MOV #CRTIME,14.(R1) ;AND STORE TIMEOUT ADDRESS TST (SP)+ ; ; CRSA20: MOV R2,MXCNT(R3) ;STORE MAXIMUM NUMBER WORDS (CHARACTERS) ;NOW, WE CAN FINALLY START THE I/O ***************************************************************** ;* ** ;* L P C N V T ** ;* ** ;* THIS SUBROUTINE FORMS ONE PRINTABLE LINE OF TEXT, ** ;* CONVERTING EACH CHARACTER TO THE L/P EVEN PARITY ASCII ** ;* FORMAT. LINKAGE IS: ** ****************************;* E AG.P C ND.E PC S RT S ESDRADE ETPLOM C/O IALEGLL;I 4 ,R#5 V MO : 05KELP ; PC S RT S ESDRADA AT DORT IS LALEGLL;I 4 ,R#2 V MO : 02KELP ; 1CT1$K FZ.I PC S RT PETYN URET RALEGLL;I 4 ,R#4 V MO : 04KELP ; 10KBLP E BL ) R0E(YP,T#1 PBCM E YP TITEXD LIVAR FOT ES;T 04KELP T BL : 20KBLP ; R LEAL CTOROUB SISTH ;* * * ;* * * T E S R P L ;* * * ;* * ********************************************************************;* E AG.P C ND.E PC S RT S ESDRADE ETPLOM C/O IALEGLL;I 4 ,R#5 V MO : 05KELP ; PC S RT S ESDRADA AT DORT IS LALEGLL;I 4 ,R MOV #ENABLE!START,@CRS(R3) ; RTS PC ;RETURN TO HE WHO CALLS ;* ;* ;* THIS SECTION RE-DIRECTS THE C/R INPUT TO THE SYSTEM TELETYPE. ;* THE TELETYPE USER MAY REINSTATE THE C/R INPUT BY TYPING THE ;* CHARACTER 'BELL', FOLLOWED BY A ;* ;* NOTE: THE SYSTEM OPERATOR CAN ALSO SWITCH INPUT BY THE ;* COMMANDS: ;* CR,K SWITCH TO C/R : K ;* TY,K SWITCH C/R : K TO TTY  ;* ** ;* SET R0 = LIST ADDRESS ** ;* R1 = DATA ADDRESS ** ;* R2 = CONVERSION TABLE ADDRESS ** ;* R3 = L/P INDEX ** ;* JSR PC,LPCNVT ** ;* BNE ;BRANCH IF NO MORE TEXT T XI END;A PC S RT S'ORRR ENO 'ET;S R4 R CL : 10KBLP ; C ND.E 05KELP E BN 4 ,R#1 T BI 05KELP ISBH 0.-1RECOHI,#R4 P CM 05KELP OSBL OPSTRO,#R4 P CM SSREDD AHE TSTTE, SEWIERTH;O R4),R0T(XI$E V MO O NIFH NCRA;B 20KBLP E BN 1CT1$K FZ.I 3?T XI EITS ;I ) R0E(YP,T#3 PBCM ; S ESDRADE ETPLOM C/O IOR FCKHE CLLE' WOW N #2 V MO : 02KELP ; 1CT1$K FZ.I PC S RT PETYN URET RALEGLL;I 4 ,R#4 V MO : 04KELP ; 10KBLP E BL ) R0E(YP,T#1 PBCM E YP TITEXD LIVAR FOT ES;T 04KELP T BL : 20KBLP ; R LEAL CTOT XI END;A PC S RT S'ORRR ENO 'ET;S R4 R CL : 10KBLP ; C ND.E 05KELP E BN 4 ,R#1 T BI 05KELP ISBH 0.-1RECOHI,#R4 P CM " ;* ;* WHERE K = 1 FOR C/R : 1, ETC. ;* ;* ; .IFNZ TTYSW ; CRSB00: .IFNZ BIN TST @CRDATA(R3) ;CAN'T SWITCH IF IT'S BINARY BNE CRSA05 .ENDC .IFZ NCR-1 ;GET THE TTY I/O LIST ADDRESS MOV #CRLIST,R0 .ENDC .IFG NCR-1 MOV CRIOLS(R3),R0 .ENDC CMP (R0),#1 ;IS IT IN USE? BNE CRSA05 ;BRACH AND USE C/R IF IT'S BUS# ** ;* ** ;********************************************************************** ; ; LPCNVT: ; ; MOV PC,-(SP) ;SET NO DATA FOUND FLAG MOV R0,-(SP) ;SAVE SOME REGISTERS MOV R1,-(SP) ; MOV R5,-(SP) CLR -(SP) ;TAB POSITION COUNTER MOV LPBUFR(R3),R0 ; R0 = ADDR L/P BUFFER MOV LPCNT(R3),R5 ; ; ; C ND.E E OR COFP TOM RO FDSOR;W 02KELP I BH N VESEN HA TREMOS ISTLIT HA TND;A -7-7RECOHI,#R0 P CM E OR COFP TOM RO FDSOR W/2RDWO;N 02KELP I BH N HA TERATRE GBEO TERFFBUA AT DCKHE;C 4 ,RR1 P CM R4E,ORIC#H D AD S RDWO# O ;T R4 R AS S ERCTRAHA C #RTVEON;C R4 C IN : 00KALP ; . RECOE BLLAAIAVN HIIT;W R4 G NE LEABONASRES T' IRESU 05KELP OSBL OPSTRO,#R4 P CM SSREDD AHE TSTTE, SEWIERTH;O R4),R0T(XI$E V MO O NIFH NCRA;B 20KBLP E BN 1CT1$K FZ.I 3?T XI EITS ;I ) R0E(YP,T#3 PBCM ; S ESDRADE ETPLOM C/O IOR FCKHE CLLE' WOW N ; ; C ND.E E OR COFP TOM RO FDSOR;W 02KELP I BH N VESEN HA TREMOS ISTLIT HA TND;A -7-7RECOHI,#R0 P CM E OR COFP TOM RO FDSOR W/2RDWO;N 02KELP I BH N HA TERAT&Y MOV #CRSB50,$EXIT(R0) ;NOT BUSY. SET I/O COMPLETE ADDR MOV DATA(R1),DATA(R0) ;MOVE ADDR(DATA) INTO TTY LIST MOV R0,-(SP) MOV CRMDAD(R3),-(SP) JSR PC,IODQTM ;STOP THE TIMER TST (SP)+ JSR PC,TTYIN ;CALL TTYIN TO READ DATA RTS PC ;* ;* ;* ENTRY HERE WHEN INPUT REQUEST IS COMPLETE (TTY I/O COMPLETE ;* SUBROUTINE). ON ENTRY, R1 POINTS TO TTY LIST. ;* ;* ; CR' R1 = TEXT DATA BUFFER ADDRESS ADD R5,R1 ; ADD #4,R1 ; R5 = CURRENT INDEX INTO DATA CMP R5,LPMAX(R3) BGE LPCA70 CLR LPMODE(R3) ;SET L/P MODE TO CARRIAGE CONTROL ; ; ; LPCA00: CLR R4 BISB (R1)+,R4 ;GET NEXT CHARACTER FROM TEXT ======>R4 CMP R4,#CR ;IGNORE ALL CARRIAGE RETURNS BEQ LPCA15 CMP R4,#MAXCC ;IS IT A CE AK MND ARDWO NET;G 00KALP T BL ),T?HA TAY SDYEALR A IID(DY LLNAFI, ND;A 4 ,R1)(R V MO 02KELP E BN 1 ,R#1 T BI S)IEARNDOU BRDWO (ENEVE ;B 02KELP E BN T US MESSSREDD AHE TY,LLNAFI, ND;A 0 ,R#1 T BI 02KELP ISBH RECOHI,#R1 P CM Y OREM;M 02KELP ISBH NTTEISEXN-NON IBER HEIT EAN COR;N RECOHI,#R0 P CM R HEIT EOS RINE B'TAN;C 02KELP RE GBEO TERFFBUA AT DCKHE;C 4 ,RR1 P CM R4E,ORIC#H D AD S RDWO# O ;T R4 R AS S ERCTRAHA C #RTVEON;C R4 C IN : 00KALP ; . RECOE BLLAAIAVN HIIT;W R4 G NE LEABONASRES T' IRESUE AK MND ARDWO NET;G 00KALP T BL ),T?HA TAY SDYEALR A IID(DY LLNAFI, ND;A 4 ,R1)(R V MO 02KELP E BN 1 ,R#1 T BI S)IEARNDOU BRDWO (ENEVE ;B 02KELP E BN*SB50: .IFZ NCR-1 ;FIRST, WE NEED THE C/R INDEX CLR R3 ;FOR ONE C/R, IT'S SIMPLE! .ENDC .IFG NCR-1 ;FOR MORE THAN TWO, IT AIN'T SO EASY MOV R1,R3 ;(UNLESS, OF COURSE, WE'RE ON THE 11/45) SUB #CRLIST,R3 ;GET DISPLACEMENT OF THIS LIST FROM BEZ CRSB80 ;THE FIRST LIST .IFZ $1145 CLR R4 ;THE C/R INDEX IS = DISP/7 ; CRSB60: +ONTROL CHARACTER? BLE LPCA05 ;BRANCH IF YES CMP R0,LPBUFR(R3) ;IF WE'RE AT THE BEGINNING OF THE BUFFER BNE LPCA10 ;AND THE CHARACTER IS NOT CONTROL, THEN INC LPMODE(R3) ;ASSUME AUTO LINE FEED MODE BR LPCA10 ; LPCA05: CMP #HT,R4 ;SEE IF CHARACTER IS A TAB BEQ LPCA60 ;BRANCH IF 'TIS CMP R0,LPBUFR(R3) ;OTHERWISE, IF WE'RE AT THE BEGINNING BNE OSBL SSREDD ATADAT ES;T OPSTRO,#R1 P CM OS RINE B'TAN;C 02KELP OSBL SSREDD ASTLIT ES;T OPSTRO,#R0 P CM 1CT1$K FZ.I : EKCHLP ; ; * ********************************************************************;* * * ;* * * SSREDD ATELEMPCOO I/L GALEIL= 5 ;* * * E YP TRNTUREL GALEIL= 4 ;* * * T US MESSSREDD AHE TY,LLNAFI, ND;A 0 ,R#1 T BI 02KELP ISBH RECOHI,#R1 P CM Y OREM;M 02KELP ISBH NTTEISEXN-NON IBER HEIT EAN COR;N RECOHI,#R0 P CM R HEIT EOS RINE B'TAN;C 02KELP OSBL SSREDD ATADAT ES;T OPSTRO,#R1 P CM OS RINE B'TAN;C 02KELP OSBL SSREDD ASTLIT ES;T OPSTRO,#R0 P CM 1CT1$K FZ.I : EKCHLP ; ; * **************. SUB #7,R3 BLT CRSB70 TST (R4)+ BR CRSB60 ; CRSB70: MOV R4,R3 .ENDC .IFNZ $1145 DIV #7,R3 .ENDC .ENDC ; CRSB80: MOV #CRTTY,$EXIT(R1) ;SET TTY LIST BACK TO ORIGINAL FORM MOV CRDATA(R3),R4 ;GET DATA ADDRRESS AND CHECK FOR THE CMPB #BELL,4(R4) ;RETURN TO C/R CHARACTER BEQ CRSC00 ;AND BRANCH IF WE FOUND IT / LPCA20 ;OF THE L/P BUFFER, WE'LL CONTINUE JSR PC,LPSTOR ;FIRST WORD IS CONTROL, TOP BYTE (LEFT) MOVB #' ,R4 ;IS IGNORED BY PER DATA CONTROLLER SUB #2,(SP) ;CONTROL CHARS DON'T COUNT FOR TAB POSIT ; LPCA10: JSR PC,LPSTOR ;CONVERT CHARACTER TO L/P ASCII AND BNE LPCA40 ;BRANCH IF L/P BUFFER IF FULL ; LPCA15: INC R5 ;STORE IN L/P BUFFER ; LPCA16: SSREDD ATADAR OSTLIL GALEIL= 2 ;* * * T ESQURED LIVA= 0 ;* * * ;* * * : NSAINTCO4 RN,URET RON ;* * * ;* * * R FEUF BTADAF OSSREDD A =R1 ;* * * STLIO I/F OSSREDD A =R0 ******************************************************;* * * ;* * * SSREDD ATELEMPCOO I/L GALEIL= 5 ;* * * E YP TRNTUREL GALEIL= 4 ;* * * SSREDD ATADAR OSTLIL GALEIL= 2 ;* * * T ESQURED LIVA= 0 ;* * * ;* * * 2 TST ERROR(R1) ;THEN CHECK FOR AN ERROR BEQ CRSB90 ;BRANCH IF NONE MOV CRFRST(R3),R0 ;OOPS - SET ERROR FLAG MOV #7,ERROR(R0) ; CRSB90: MOV (SP)+,R5 ;SET FOR FOR TTYIN RETURN BY JMP (R5) MOV NREAD(R4),COUNT(R3) JMP CRCLOS ;GO CLOSE OUT THIS REQUEST ; ; ; THIS SECTION SETS UP THE LOGIC TO SWITCH BACK TO THE CARD ; READER. ENTERED WHEN THE OPERATOR ENTERS A 'BEL3CMP R5,LPMAX(R3) ;IF WE HAVEN'T EXCEEDED MAXIMUM SIZE, BLT LPCA00 ;WE'LL GO BACK FOR MORE ; LPCA20: BIT #1,R0 ;CHECK TO SEE IF THE RIGHTMOST BYTE BEQ LPCA30 ;NEEDS A BLANK MOVB #LPBLNK,(R0)+ ;YES - STORE IT ; LPCA30: ; LPCA40: MOV R5,LPCNT(R3) ;STORE CALLER'S BUFFER POINTER SUB LPBUFR(R3),R0 ;DETERMINE NO. WORDS IN L/P BUFFER MOV R0,R4 ASR R4 ;* * * ;* * * : INTAON CSTMUS ERSTGIREE TH ;* * * . EDRTTA SISO I/S ITN HE WND AEDEUQUS ISTUEEQ RHE TENWH ;* * * D MEORRFPEE ARS STTEE ESTH R.NTPR LMBBOD ULCOT HA TERFFBU ;* * * TADAD ANT IS L/O IHE TONS CKHE CMSORRFPEE INUTROUB SISTH ;* * * ;* * * K E H C P L : NSAINTCO4 RN,URET RON ;* * * ;* * * R FEUF BTADAF OSSREDD A =R1 ;* * * STLIO I/F OSSREDD A =R0 ;* * * ;* * * : INTAON CSTMUS ERSTGIREE TH ;* * * . EDRTTA SISO I/S ITN HE WND AEDEUQUS ISTUEEQ RHE TENWH ;* 6L' CHARACTER. ; ; CRSC00: CLR CRBKUP(R3) ;CLEAR C/R BACKUP FLAG INC REPEAT(R3) ;SET 'READ ANOTHER CARD' FLAG MOV (SP)+,R5 ;SET R5 FOR TTYIN RETURN BY JMP (R5) JMP CRIC00 ;AND GO START ANOTHER CARD .ENDC .PAGE ;********************************************************************** ;* ** ;* C R D O N / C R D O 7 ;AND LEAVE IT IN R4 ; LPCA50: TST (SP)+ ;POP OFF TAB COUNTER MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 TST (SP)+ ;POP OFF FLAG, WHICH SETS THE CONDITION RTS PC ;CODE: ZERO = DATA STORED ; NON-ZERO = NO DATA STORED ; ; LPCA60: ;CHARACTER IS A TAB, FILL IN BLANKS CMP R0,LPBUFR( ;* * * ;* * ********************************************************************;* E AG.P . ITEXN HE TE,OD CONTIDION;C PC S RT ET STOG LA FD'LEIL FERFFBU 'OP;P + P)(S T TS : 10STLP ; P)(S C IN 10STLP T BL ? REHEO TUPD LEIL FERFFBUS ;I) R32(R+UFPB,LR0 P CM : 00STLP ; UFPB LINE ORST' YT BRTVEON;C )+R0,(4)(R VBMO E OD C* * D MEORRFPEE ARS STTEE ESTH R.NTPR LMBBOD ULCOT HA TERFFBU ;* * * TADAD ANT IS L/O IHE TONS CKHE CMSORRFPEE INUTROUB SISTH ;* * * ;* * * K E H C P L ;* * * ;* * ********************************************************************;* E AG.P . ITEXN HE TE,OD CONTIDION;C PC S :F F ** ;* ** ;* THESE SUBROUTINES ARE CALLED BY OPERATOR INPUT AND ARE ** ;* USED TO SWITCH THE C/R INPUT TO THE TELETYPE (CRDOFF) ** ;* OR REINSTATE INPUT FROM THE C/R (CRDON). THE LINKAGE IS: ** ;* ** ;* JSR PC,CRDON (OR CRDOFF) ** ;* ;R3) ;IS THIS THE FIRST CHARACTER OF THE LINE BNE LPCA65 ;BRANCH IF NO INC LPMODE(R3) ;OTHERWISE, FORCE TO AUTO-INCREMENT MODE ; LPCA65: MOV #40,R4 ;KEEP STORING BLANKS JSR PC,LPSTOR ;UNTIL WE GET TO A TAB POSITION BNE LPCA40 ;OR UNTIL THE L/P BUFFER IS FULL BIT #7,(SP) BNE LPCA65 ;KEEP GOING 'TIL WE HIT A MULTIPLE BR LPCA15 ;OF 8 (PLUS ONIISC ATOS ESDRADE AS BLEAB TDD;A 4 ,RR2 D AD G LA FL'UL FOT NERFFBUP L/ 'ET;S ) SP-( R CL G LA FD'RETO STADA 'ET;S ) SP.(10 R CL ERNTOU CAB TNTMERENC;I ) SP2( C IN : ORSTLP ; ; * ********************************************************************;* * * ;* * * D.VESAE AR ;* * * S ERSTGIRER HEOT ND.E T ENEMATSTR NCZ FN.IG INNNGIBEE THR FOC ND;E C ND.E CTSE.C PC S RT ; T OUS UEUE QHE TARLE C'SET LW,NO ; ; C ND.E ; C ND.E 0 A1RN,CR2 B SO 5 14$1 Z FN.I ; C ND.E 10NACR E BN R2 C DE ; 5 14$1 FZ.I 1 ,R0.#1 D AD O ER ZTOL VELEY ITORRI PET;S > ** ;* WHERE R3 CONTAINS THE CARD READER NUMBER (1, 2, 3, ..., NCR) ;* ** ;* R3 IS DESTROYED ON RETURN. ** ;* ** ;********************************************************************** ; ; CRDOFF: .IFNZ TTYSW .IFG NCR-1 TST R3 ;C/R NO. C?E) = 1, 9, 17 ; ; LPCA70: TST R5 ;WE GET HERE IF: BNE LPCA50 ; 1. THERE IS NO MORE TO PRINT MOV #SKIP1,R4 ; 2. USER HAS NWORD = 0 BR LPCA10 ;IF (2) IS TRUE, THEN STORE A SINGLE ;LINE SKIP AND PRINT IT .PAGE ;********************************************************************** ;* L ALD AN, EDATPD UIS0 RD,YEROSTDES IR4 ;* * * ;* * * LEAB TONSIERNVCOF OSSREDD A =R2 ;* * * ERFFBUP L/F OSSREDD A =R0 ;* * * ;* * * : INTAON CTO ;* * * EDCTPEEXE ARS ERSTGIREE TH, RYNT EON E.ORSTD XEDEIN ;* * * LEMP )+R3,(R4 V MO ORCTVEN IT)INCRR(DD ARETO;S )+R3,(R1 V MO SSREDD AORCTVED OA;L 3 ,R0)(R V MO : 10NACR ; 2 ,RCR#N V MO 4 ,R40#3 V MO R11,NTRI#C V MO R0T,ECRV#C V MO 1 R-NC FG.I C ND.E 2 T+ECRV#C,@40#3 V MO SSREDD APTRUERNT I/R CRETO;S CTVECR@#1,NTRI#C V MO RSTOEC VPTRUERNT IHE TUPT SES T'LE, STIR;F 1 R-NC FZ.I AN'T BE <= 0 BLE CRDF10 CMP R3,#NCR ;OR > NCR BGT CRDF10 DEC R3 ASL R3 INC CRBKUP(R3) .ENDC ; ; .IFZ NCR-1 INC CRBKUP .ENDC ; ; CRDF10: RTS PC .ENDC ; CRDON: .IFZ NCR-1 CLR CRBKUP RTS PC .ENDC .PAGE ; ; ; I N I T I A L I Z A T I O N ; .CSECT .CRINT CRINIT: ** ;* L P S T O R ** ;* ** ;* CONVERT THE CHARACTER IN REGISTER R4 TO EVEN PARITY, ** ;* LINE PRINTER ASCII, THEN STORE IT IN THE LINE PRINTER ** ;* BUFFER. THE L/P READS CHARACTERS FROM INCREASING ** ;* MEMORY LOCATIONS, AND FROM LEFT (TOP BYTE) TO RIGHT ** ;* (BOTTOM BYTE). THUS, LPSTOR CANNOT PERFORM A SI