; 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 ;*********************************************************************** ;* * ;* COMPRS * ;* ; 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 FLMGMT.S03 ; UPDATE 3/20/72 FLMGMT.S02 ; UPDATE 3/20/72 FLMGMT.S01 .TITLE FLMGMT ;*********************************************************************** ;* ; 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 FLIST.S03 ; UPDATE 4/21/72 FLIST.S02 ; UPDATE 4/11/72 FLIST.S01 .TITLE FLIST ;*********************************************************************** ;* ; UPDATE CRTABL.003 01.27.72 ; UPDATE CRTABL.002 01.24.72 ; UPDATE CRTABL.001 01.22.72 .TITLE CRTABL ;********************************************************************** ;* ;* ;* C R E A D C O N V E R S I O N T A B L E S ;* ;* THESE TABLES CONVERT FROM THE DEC CARD READER COMPRESSED MODE ;* TO INTERNAL ASCII OR EBCDIC ;* ;* ;********************************************************************** ; ; .IFG * ;* PROGRAM IDENTIFICATION. COMPRS, CATALOG NUMBER ; * ;* COMPRESS A ROS FILE TYPE DISC SECTION. * ;* * ;* 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: * ;* PROGRAM IDENTIFICATION. FLMGMT; ROS FILE MANAGEMENT. * ;* DEFINE, CATALOG NUMBER ; * ;* DELETE , CATALOG NUMBER ; * ;* PRTCT,CATALOG NUMBER ; * ;* UNPRCT, CATALOG NUMBER . * ;* * ;* * ;* FLIST IS THE ROS FILE LIST PROGRAM. THIS WILL BE INITIALTED * ;* VIA INPUT BY: * ;* FL,XXX * ;* WHERE XXX IS THE FILE TYPE(FILE TYPE 0 NOT ALLOWED). * ;* OR: * ;* FL * ;* TO LIST ALL ROS FILE ENTRYS. NCR .IFNZ BCD .DEF O26ASC O26ASC: ;COMPRESSED 026 TO INTERNAL ASCII .ASCII ' 1234567' ;COMPRESSED CODES 0-7 .ASCII /8 &=':>@/ 10-17 .ASCII '9 ' 20-27 .ASCII ' ' 30-37 .ASCII '0/STUVWX' 40-47 .ASCII 'Y _,(%\"' ; 50-57 .ASCII 'Z ' ; * ;* CM,T * ;* WHERE T IS THE FILE TYPE AREA TO BE COMPRESSED. FILES THAT * ;* ARE COMPRESSED ARE IN ESSENCE ASSIGNED NEW START SECTOR * ;* ADDRESSES AND THE UNUSED DISC SPACES THAT MAY EXIST BETWEEN * ;* THE FILES ARE "SQUEEZED" OUT. * ;* * ;* PROGRAM USAGE. TO QUPURPOSE. 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- * ;* PATCHING OF FILE MANAGEMENT REQUESTS. THE OPERATOR * ;* DEMAND FILE UTILITY PACKAGE (ODFUP) IS NOT CONTAINED * ;* IN FILE MANAGEMENT, BUT USES THESE COMMON SUBROUTINES. *  * ;* * ;* THE LISTING WILL BE PRINTED ON THE LINE PRINTER UNLESS * ;* IT DOESN'T EXIST IN WHICH CASE IT WILL BE LISTED ON THE * ;* SYSTEM TELETYPE. * ;* * ;* PROGRAMMER 54 * ;* DATE  60-67 .ASCII ' ' ; 70-77 .ASCII '-JKLMNOP' ; 100-107 .ASCII 'Q $*];^' ; 110-117 .ASCII 'R ' ; 120-127 .ASCII ' ' ; 130-137 .ASCII '! ' ; 140-147 .ASCII ' ' ; 150-157 .ASCII ' ' ; 160-167 .ASCII ' ' EUE COMPRS BY OPERATOR DEMAND,TYPE * ;* THE COMMAND: * ;* CM,T * ;* WHERE T IS THE FILE TYPE TO COMPRESS. OTHERWISE, QUEUING * ;* COMPRS VIA QUEUE AND PASSING T AS AN ARGUMENT MAY * ;* BE USED * ;* * ;* WHEN COMPRES;* ODFUP IS PART OF THE OPERATOR DEMAND TASK 'INPUT'. * ;* * ;* THE FOUR SUBROUTINE ENTRY POINTS PROVIDED FOR * ;* IN FLMGMT ARE: * ;* * ;* DEFINE - SUBROUTINE TO ALLOCATE A FILE SPACE AND * ;* CREATE A FILE DIRECTORY ENTRY.  * ;* REVISION * ;* * ;*********************************************************************** ; .DEF FLSTHD,FLIST .REF DOD,FSTAT,PHYDEV .REF PUSHR,POPR,CDSRCH LPRNTR = 25 TTYOUT = 13 DISCIO = 23 EXIT = 4 NOCKPT = 30 BINASC = 16 ; .PAGE ; ; EQ; 170-177 .ASCII '+ABCDEFG' ; 200-207 .ASCII 'H .)[<#' ; 210-217 .ASCII 'I ' ; 220-224 .BYTE 011 ;HORIZONTAL TAB 225 .ASCII ' ' ; 226-232 .BYTE 013 ;VERTICAL TAB 233 .BYTE 014 ;FORM FEED 234 .BYTE 015 ;CARRIAGE RETURN 235 .ASCII ' ' ; SION IS COMPLETE, IT WILL TYPE: * ;* * ;* "FILE COMPRESSION COMPLETE" * ;* * ;* APPROPRIATE ERROR MESSAGES WILL ALSO BE TYPED WHEN * ;* ERRORS OCCUR. COMPRS WILL THEN BE TERMINATED. * ;* * ;* PROG * ;* DELETE - SUBROUTINE THAT WILL DELETE A FILE DIRECTORY * ;* ENTRY. * ;* PRTCT - SUBROUTINE THAT WILL SET THE PROTECT STATUS * ;* IN A DIRECTORY ENTRY. * ;* UNPRCT - SUBROUTINE THAT WILL RESET THE PROTECT STATUS * ;* IN A DIRECTORY ENTRY. * ;* UATES 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 .IFNZ $BATCH ; ; BATCH ELEMENT DIRECTORY EQUATES ; NAME1 = 0. NAME2 = 2. STATUS = 4. BTYPE = 5. BHOUR = 6. BMIN = 7. BSEC =  236-237 .ASCII '? ' ; 240-247 .ASCII ' ' ; 250-257 .ASCII ' ' ; 260-267 .ASCII ' ' ; 270-277 .ASCII ' ' ; 300-307 .ASCII ' ' ; 310-317 .ASCII ' ' ; 320-327 .ASCII ' ' ; 330-337 .ASCII ' RAMMER: 54 * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** ; .DEF CMPRHD,COMPRS .REF FSTAT,PHYDEV,NODREQ,CMPTMR,CPRSIP .REF FINIT,PFRITE,FILE,CDSRCH,CDILST .REF  * ;* PROGRAM USAGE. THE LINKAGE TO SUBROUTINE DEFINE IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT DEFINE * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;*  8. BYEAR = 9. BDAY = 10. BMNTH = 11. BSTRTS = 12. BLGTH = 14. ; .ENDC ; ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ; PRIORITY LOCKOUT MASK FLSSIZ = 50. ; FILE LIST TASK SIZE YES = 131 ; ASCII Y NO = 116 ; ASCII N .PAGE ; ; FLIST TASK HEADER ; FLSTHD =  ' ; 340-347 .ASCII ' ' ; 350-357 .ASCII ' ' ; 360-367 .ASCII ' ' ; 370-377 .PAGE ;* ;* CONVERSION TABLE FOR COMPRESSED CREAD DATA - ;* ;* E B C D I C T O A S C I I ;* ;* .IFNZ EXEBC ;DON'T ASSEMBLE IF EBCDIC ISN'T REQUIRED .DEF O29ASC ; O29ASC: ; COMP DQFRST,DQLAST,NDPRTY,HPRIRQ,CALLED,DIHA50,FMFRST .REF FMLAST,FNEXT,AULIST,DIOA65,IOSTAT,NOFMRQ,FMACTV .REF FLMB00,COMPID NOCKPT = 30 QTIME = 7 SUSPND = 2 UNSPND = 3 TTYOUT = 13 EXIT = 4 BINASC = 16 .PAGE ; ; EQUATES FOR RELATIVE FILE POSITIONS ; SCTR = 2. ; START SECTOR FTYPE = 4. ; FILE TYPE PDVCE = 5. ; PROTECT STATUS AND DEV * ;* CALL FORTRAN(LIST) * ;* * ;* THE LINKAGE TO SUBROUTINE DELETE IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT DELETE * ;* . .WORD 1 ; THREAD WORD .WORD FLIST ; ENTRY POINT .WORD 0 ; INIT. ENTRY POINT .WORD 0 ; MAX. EXECUTION TIME .BYTE FLSSIZ ; STACK SIZE .BYTE PRIBKG-1 ; PRIORITY ONE HIGHER THAN BACKGROUND .WORD 0 ; CURRENT TIMER VALUE .IFZ ARG XXXXXXXX FLIST MUST HAVE PASSED ARGUMENT .ENDC FLTYPE: .WORD 0 RESSED OCTAL .ASCII ' 1234567' ; 000-007 .ASCII /8 :#@'="/ ; 010-017 .ASCII '9 ' ; 020-027 .ASCII ' ' ; 030-037 .ASCII '0/STUVWX' ; 040-047 .ASCII 'Y ,% >?' ; 050-057 .ASCII 'Z ' ; 060-067 .ASCII ' ' ; !ICE LGTH = 6. ; FILE LENGTH CKSAVE = 8. ; CHECKPOINT SECTOR ADDRESS ; ; ; 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 " * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL DELETE(LIST) * ;* * ;* THE LINKAGE TO SUBROUTINE PRTCT IS: * ;* * ;* MOV #L# ; FILE TYPE FOR PASSED ARGUMENT .BYTE 5 ; CPU STATUS - FILE TYPE .BYTE $FLTNO ; TASK NO. .WORD 0 ; STACK POINTER .WORD 204 ; FILE ID . = .+FLSSIZ+FLSSIZ-2 ; TASK STACK ; .PAGE ; .IFNZ DRESDI!$BATCH ; ; DISC I/O PARAMETER LIST AND BUFFER ; DLIST = . .WORD 1 ; THREAD WORD DEVNO: .BYTE 0 ; DEVICE$ 070-077 .ASCII '-JKLMNOP' ; 100-107 .ASCII 'Q !$*); ' ; 110-117 .ASCII 'R' ; 120 .BYTE 021,022,023 ;DC1 DC2 DC3 121-123 .BYTE 024,012,026,027 ;DC4 LF SYN ETB 124-127 .BYTE 030,031,032,033 ;CAN EM SS ESC 130-133 .BYTE 034,035,036,037 ;FS GS RS US 134-137 .BYTE 040,%START SECTOR LEVEL = 7. ; RELATIVE POSITION OF PRIORITY ; ; LEVEL IN I/O LIST DATA = 12. ; RELATIVE ADDRESS OF I/O BUFFER ; ; IN I/O LIST DUSE3 = 8. ; THIRD RESERVED FOR DISCIO WORD ; ; IN DISC DATA BUFFER .PAGE ; ; THE FOLLOWING IS THE TASK HEADER FOR COMPRS ; CMPRHD = . .WORD 1 &IST,-(SP) * ;* EMT PRTCT * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL PRTCT(LIST) * ;* * ;* THE LINKAGE TO SUB' NO. .BYTE 2 ; EXIT TYPE 2 .WORD 0 ; NO I/O COMPLETE SUBROUTINE .BYTE 0 ; NO ERROR TASK .BYTE 3 ; DISC LEVEL 3 DERRWD: .WORD 0 ; DISC ERROR WORD .WORD 0 ; FOR SYSTEM .WORD .+2 ; ADDRESS OF DISC I/O BUFFER DODID: .WORD 0 ; DOD FILE ID-SET DYNAMICALLY .BYTE 0 ; USE RLSECT AND NWORD .BYTE (040,163,164 ; (S) (T) 140-143 .BYTE 165,166,167,170 ;(U) (V) (W) (X) 144-147 .BYTE 171,040,040,040 ;(Y) 150-153 .BYTE 040,040,040,040 ; 154-157 .BYTE 172,040,040,040 ;(Z) 160-163 .ASCII ' ' ; 164-167 .ASCII ' ' ; 170-177 .ASCII '&ABCDEFG' ; 200-207 ) ; THREAD WORD FMQEP: .WORD COMPRS ; ENTRY POINT-USED AS FILE MGMT. ; ; QUEUE ENTRY POINT DSCQEP: .WORD 0 ; INITIALIZATION ENTRY POINT-USED AS ; ; DISC QUEUE ENTRY POINT .WORD 0 ; MAXIMUM EXECUTION TIME .BYTE CSTKSZ ; TASK'S STACK SIZE .BYTE PRIBKG-1 ; PRIORITY ONE HIGHER THAN BACKGROUND .WORD 0 ; CURRENT *ROUTINE UNPRCT IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT UNPRCT * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* +0 ; READ DISC I/O FCN .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 0 ; RELATIVE SECTOR .WORD 64. ; ONE SECTORS LENGTH BUFFER = . . = .+128. ; RESERVE 64. WORDS FOR BUFFER ; .ENDC 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 '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-23-TIMER VALUE .IFZ ARG XXXXXXXX COMPRS MUST HAVE A PASSED ARGUMENT .ENDC FLTYPE: .WORD 0 ; PASSED ARGUMENT-CONTAINS FILE TYPE .BYTE 5 ; CPU STATUS - FILE TYPE .BYTE $CPTNO ; COMPRS TASK NUMBER .WORD 0 ; STACK POINTER .WORD 205 ; FILE ID . = .+CSTKSZ+CSTKSZ-2 ; TASK STACK ; .PAGE ; ; THE FOLLOWING IS THE LIST AN. CALL UNPRCT(LIST) * ;* * ;* WHERE IN ALL CASES, LIST IS THE FILE MANAGEMENT * ;* REQUEST LIST. THIS LIST IS CONSTRUCTED AS FOLLOWS: * ;* * ;* WORD 0: THREAD - THREAD WORD. NOMINALLY = 1 * ;* WORD 1, BYTE 0: ERROR - CONTAINS ERROR STATUS * ;* / . .ASCII /OBJECT / .ASCII /LOAD / .ASCII /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 03 .BYTE 014,015,016,017 ;FF CR SO SI 234-237 .BYTE 040,141,142,143 ; (A) (B) (C) 240-243 .BYTE 144,145,146,147 ;(D) (E) (F) (G) 244-247 .BYTE 150,040,040,040 ;(H) 250-253 .BYTE 040,040,040,040 ; 254-257 .BYTE 151,040,040,040 ;(I) 260-263 .BYTE 040,040,040,040 ; 264-267 .BYTE 040,000,040,040 ; NUL 1D BUFFER USED FOR DISCIO ; READS, WRITES, AND UPDATES ; 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 2 ON RETURN FROM FLMGMT. * ;* , BYTE 1: ERRTSK - TASK NO. TO QUEUE IF * ;* AN ERROR OCCURS. 0= NONE. * ;* WORD 2: RESERVED FOR SYSTEM USE * ;* WORD 3: FILEID - FILE'S ID ON WHICH TO PERFORM * ;* FILE MANAGEMENT. * ;* WORD 4, BITS 0-6: FILE TYPE - OF WHICH FILE TYPE * ;*3/DEC/ ; STTBL = . .ASCII /FREE / .ASCII /READ / .ASCII /WRITE / .ASCII /DELETED / ; .ENDC ; ; THE FOLLOWING IS THE FILE LIST PRINT LIST ; PRTLST = . .WORD 1 ; THREAD WORD .IFNZ NLP .BYTE 3 ; USE LINE PRINTER .ENDC .IFZ NLP .BYTE SYSTTY ; USE SYSTEM TELETYPE .ENDC .BYTE 2 ; 4 270-273 .BYTE 040,040,040,040 ; 274-277 .BYTE 040,152,153,154 ; (J) (K) (L) 300-303 .BYTE 155,156,157,160 ;(M) (N) (O) (P) 304-307 .BYTE 161,040,040,040 ;(Q) 310-313 .BYTE 040,040,040,040 ; 314-317 .BYTE 162,040,040,040 ;(R) 320-323 .BYTE 040,040,040,040 ; 324-327 .BYTE 040,020,045 ; RESERVED FOR SYSTEM .WORD CPRBUF ; BUFFER ADDRESS ; 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. 6 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. * ;* WORD 5: LENGTH - REQUIRED BY 'DEFINE' ONLY. * ;* LENGTH,IN SECTORS, OF FILE TO BE 7EXIT TYPE .WORD 0 .BYTE 0 .BYTE 1 ; PRIORITY LEVEL 1 .WORD 0,0 PRTBUF: .WORD 0 ; PRINT BUFFER ADDRESS ; ; 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 .ASCH0,040 ; DLE 330-333 .BYTE 040,040,040,040 ; 334-337 .BYTE 040,134 ; \ 340-341 .ASCII '()[] ' ; 342-347 .ASCII ' ' ; 350-357 .ASCII ' ' 360-367 .ASCII ' ' 370-376 .BYTE 376 ;DEL 377 .ENDE ; RESERVE 64 WORD BUFFER. ; ; ; ; TELETYPE I/O PARAMETER LIST ; 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 ; ; ; ; COMPRESSION COMPLETE MESSAGE ; CCMSG = . F * ;* 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. * ;* IF THE CALL IS TO DEFINE, WORD 2 WILL CONTAIN THE IFD * ;* OF THE FILE (CORE ENTRY ONLY) ENTRY JUST DEFINED UPOGII / SECTOR TYPE DEVICE 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 ; OU""""""" """""""""""""""""""""""""@DDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD """""""UU53333333333333333""""""""""""ADDB C%f{}Bm'-{di'y{}*Q7+V}wwMZW}: O7 5MO79q$DdBcc8a ͋,L w:B ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * BI .WORD 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 JN * ;* RETURN. * ;* UPON RETURN, THE VALUE OF ERROR WILL CONTAIN ONE OF THE * ;* FOLLOWING: * ;* 0 = REQUEST PROCESSED SUCCESSFULLY * ;* 1 = LIST NOT THREADABLE * ;* 2 = FILE ID NOT VALID * ;* 3 = FILE TYPE NOT VALID KTBUF = . .WORD 70. .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 LC .PAGE ;* ;* CONVERSION TABLE FOR COMPRESSED CREAD DATA - ;* ;* E B C D I C T O E B C D I C ;* ;* .IFNZ INEBC!EXEBC ;DON'T ASSEMBLE IF EBCDIC ISN'T NEEDED .DEF O29EBC ; O29EBC: ; COMPRESSED OCTAL .BYTE 100,361,362,363 ;SP 1 2 3 000-003 .BYTE 364,365,366,367 ; 4 5 6 7 004-007 .BYTE 370,171,172,173 ; 8 : # M 33. .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 N * ;* 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 * ;* 7 = FILE ALREADY DEFINED (DEFINE) * ;* 8 = CANNOT FIND ENOUGH DISC O ; FORM FEED .BYTE 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 P 010-013 .BYTE 174,175,176,177 ; @ ' = " 014-017 .BYTE 371,061,062,063 ; 9 020-023 .BYTE 064,065,066,067 ; 024-027 .BYTE 070,071,072,073 ; 030-033 .BYTE 074,075,076,077 ; 034-037 .BYTE 360,141,342,343 ; 0 / S T 040-043 .BYTE 344,345,346,347 ; U V W X 044-047 Q 0 .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 ; HITFLG: .WORD 0 ; USED TO FLAG DIRECTORY SEARCH SUCCESS SBUFLN: .WORD 0 RSPACE TO DEFINE FILE * ;* WITH LENGTH REQUESTED. * ;* 9 = FILE NOT DEFINED(DELETE,PRTCT,UNPRCT) * ;* . * ;* . * ;* . * ;* 15 = DISC READ OR WRITE ERROR OCCURRED * ;* S SECTOR LENGTH/ .BYTE 15 ; 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: .AT .BYTE 350,151,340,153 ; Y , 050-053 .BYTE 154,155,156,157 ; % UNDL > ? 054-057 .BYTE 351,041,042,043 ; Z 060-063 .BYTE 044,045,046,047 ; 064-067 .BYTE 050,051,052,053 ; 070-073 .BYTE 054,055,056,057 ; 074-077 .BYTE 140,321,322,323 ; - J K L 100-103 .BYTE 324,U ; SEARCH BUFFER LENGTH-CONTAINS END ; ; ADDRESS OF DIRECTORY SEARCH BUFFER SORTSC: .WORD 0 ; 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 LENGTV * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** ; .DEF FMFRST,FMLAST,FSTAT,DEFINE,DELETE,PRTCT,UNPRCT .DEF FNEXT,FLAST,AULISTWSCII /6 00010/ LG: .ASCII /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 = . EMT NOCKPT ; SET TASK NOT CHECKPOINTAX325,326,327 ; M N O P 104-107 .BYTE 330,131,132,133 ; Q ! $ 110-113 .BYTE 134,135,136,137 ; * ) ; NOT 114-117 .BYTE 331,021,022,023 ; R DC1 DC2 DC3 120-123 .BYTE 024,025,026,027 ;DC4 LF SYN ETB 124-127 .BYTE 030,031,032,033 ;CAN EM SS ESC 130-133 .BYTE 034,035,036,037 ;FS GS RS US 134-137 .BYTE 320,241,242,243 ; YH ; ; RELATED TO SORTSC ENTRY SORTAD: .WORD 0 ; SORT ADDRESS-USED TO SAVE ADDRESS ; ; IN BUFFER RELATED TO SORTSC ; ; ENTRY ; ; CPDFST: .WORD 0 ; COMPRESS WAIT QUEUE FOR CPDLST: .WORD CPDFST ; DISCIO REQUESTS ; ; CPFFST: .WORD 0 ; COMPRESS WAIT QUEUE FOR CPFLST: .WORD CPFFST ; FLMGMT REQUESTS Z,AUFCN,INIDSC,FLMB00 .DEF CDILST,CMPTMR,FINIT,CDSRCH,NOFMRQ,FMACTV .REF PUSHR,POPR,PHYDEV,ACTIVE,$CTASK,IOSTAT,QSAVEI .REF DSPTCH,CPRSIP,DISCIO,PFRITE,UNSPND,RELTSK,DOD .REF QUEUE,MASK,LOGMAX,TTYOUT,EXIT,CDIHDR,CDEND,FILE,HEADER .PAGE ; .CSECT FMTBLS ; ; THE FOLLOWING IS USED TO THREAD FILE MANAGEMENT REQUESTS FMFRST = . .WORD 0 ; THREAD FIRST POINTER FMLAST = . .WORD FMFR[BLE .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 #DOD,R1 ; ADDRESS OF FIRST DOD TO SCAN FLIA20: MOVB PDVCE(R1),R2 BIC #177600,R2 ; ISOLATE LOGICAL DEVICE MOVB R2,DEVNO\ (S) (T) 140-143 .BYTE 244,245,246,247 ;(U) (V) (W) (X) 144-147 .BYTE 250,240,252,253 ;(Y) 150-153 .BYTE 254,255,256,257 ; 154-157 .BYTE 251,341,142,143 ;(Z) 160-163 .BYTE 144,145,146,147 ; 164-167 .BYTE 150,040,352,353 ;DS 170-173 .BYTE 354,355,356,357 ; ]; 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 ; ; RELATIVE SECTOR OF ENTRY ; ; RELATED TO SORTSC ENTRY UP^ST ; THREAD LAST POINTER NOFMRQ = . .WORD 0 ; NO. FILE MGMT. REQUESTS IN QUEUE ; ; THE FOLLOWING LIST IS USED TO UPDATE THE FILE TYPE ; ALLOCATION DIRECTORY. ; AULIST = . .WORD 1 ; THREAD WORD .BYTE 1 ; LOG. DEVICE 1 .BYTE 1 ; EXIT TYPE 1 .WORD 0 ; NO I/O COMPLETE .BYTE 0 ; NO ERROR TASK .BYTE UD_ ; 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 ; YES REPORT MOV #BUFFER,R2 ; START BUFFER ADDRESS MOV #120.,R3 ; LENGTH OF `174-177 .BYTE 120,301,302,303 ; & A B C 200-203 .BYTE 304,305,306,307 ; D E F G 204-207 .BYTE 310,111,112,113 ; H CNT . 210-213 .BYTE 114,115,116,117 ; < ( + OR 214-217 .BYTE 311,001,002,003 ; I SOH STX ETX 220-223 .BYTE 004,005,006,007 ;EOT HT ACK BEL 224-227 .BYTE 010,011,012,013 ;EOM ENQ NAK VT 230-233 .BaDFLG: .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 ; ; ASCII CONVERSION .PAGE ; COMPRS = . MOV FLTYPE,R0 bLEV ; HIGH PRIORITY UPDATE .WORD 0 ; DISC ERROR WORD .WORD 0 ; SYSTEM USE .WORD .+2 ; BUFFER STARTS AT NEXT LOCATION ; .WORD NDISCS+2 ; ID FOR FTDIR .BYTE 1 ; 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 INITIAcSCAN OR SEARCH .ENDC .IFZ DRESDI FLIA40: MOV #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 BEQ FLID00 ; PRINT ALL MOVB FTYPE(R2),R4 ; ISOLATE FILE BIC #177600,R4 dYTE 014,015,016,017 ;FF CR SO SI 234-237 .BYTE 300,201,202,203 ; (A) (B) (C) 240-243 .BYTE 204,205,206,207 ;(D) (E) (F) (G) 244-247 .BYTE 210,200,212,213 ;(H) 250-253 .BYTE 214,215,216,217 ; 254-257 .BYTE 211,101,102,103 ;(I) 260-263 .BYTE 104,105,106,107 ; 264-267 .BYTE 110,000,312,31e; FILE TYPE TO COMPRESS FROM TASK ARG. CMP R0,#$FTMAX ; FILE TYPE VALID? BHIS CMPA70 ; NO, ERROR-CAN'T COMPRESS MOVB 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 PHYDEV(R5),R1 ; PHYSICAL DISC UNfLIZED DURING ; ROS IPL. ; FNEXT = . . = .+$FTMAX+$FTMAX FLAST = . . = .+$FTMAX+$FTMAX ; RESERVE $FTMAX WORDS FINIT = . . = .+$FTMAX+$FTMAX ; RESERVE $FTMAX WORDS . = $FTDRL*64.*2+FNEXT ; 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. ; CMPTMR = . g ; 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 BR FLIB10 ; DONE .ENDC .IFNZ $BATCH FLIA70: JMP FLBA00 ; FIh3 ; NUL 270-273 .BYTE 314,315,316,317 ; 274-277 .BYTE 152,221,222,223 ;CFX (J) (K) (L) 300-303 .BYTE 224,225,226,227 ;(M) (N) (O) (P) 304-307 .BYTE 230,220,232,233 ;(Q) 310-313 .BYTE 234,235,236,237 ; 314-317 .BYTE 231,121,122,123 ;(R) 320-323 .BYTE 124,125,126,127 ; iIT ON WHICH TYPE RESIDES ASL R1 ; COMPUTE WORD INDEX CMPA10: MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT TST NODREQ(R1) ; DEVICE HAVE ANY REQUESTS PENDING? BMI CMPB00 ; NO CMPA20: CLR 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 ; j .WORD 1 ; THREAD WORD .BYTE $CPTNO ; TASK NO. OF COMPRS .BYTE 200+MSECR ; SUSPEND/MILLISECOND RESOLUTION .WORD 100. ; 100 MILLISECOND TIMER ; ; .PAGE ; ; LIST TO UPDATE THE CORE DIRECTORY IMAGE ON DISC ; CDILST = . .WORD 1 ; THREAD WORD .BYTE 1 ; LOG DEVICE 1 .BYTE 1 ; EXIT TYPE 1 .WORD 0 ; kLE 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 = . EMT EXIT ; EXIT FROM TASK ; ; REPORT DISC ERROR ; FLIB20 = . MOV l 324-327 .BYTE 130,021,332,333 ; DLE 330-333 .BYTE 334,335,336,337 ; 334-337 .BYTE 160,261,262,263 ; \ ( ) 340-343 .BYTE 264,265,266,267 ; [ ] 344-347 .BYTE 270,260,272,273 ; 350-353 .BYTE 274,275,276,277 ; 354-357 .BYTE 271,161,162,163 ; 360-363 mSUSPEND 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 FSTAT(R0) ; FILE MANAGEMENT IN PROGRESS? BMI CMPA20 ; YES-WAIT MOV R0nNO I/O COMPLETE .BYTE 0 ; NO ERROR TASK .BYTE UDLEV ; I/O PRIORITY LEVEL 1 .WORD 0 ; DISC ERROR WORD .WORD 0 ; SYSTEM USE .WORD CDIHDR ; ADDRESS OF CORE DIRECTORY IMAGE ; ; BUFFER HEADER ; .PAGE ; ; FILE STATUS INFORMATION IS CONTAINED IN THE FOLLOWING ; TABLE ; FSTAT = . .BYTE $FD000 .BYTo #DISCER,PRTBUF JSR PC,PRINT BR FLIB10 ; EXIT ; ; LIST SPECIFIED FILE TYPES ; FLIC00 = . .IFZ DRESDI BR FLIA40 .ENDC .IFNZ DRESDI MOVB FSTAT(R0),R5 ; GET FILE TYPE STATUS BIC #177740,R5 ; ISOLATE LOGICAL DEVICE MOVB R5,DEVNO ASL R5 ; WORD INDEX CLR R4 BISB PHYDEV(R5),R4 ; GET PHYSICAL UNIT INC p .BYTE 164,165,166,167 ; 364-367 .BYTE 170,060,372,373 ; 370-373 .BYTE 374,375,376,377 ; DEL 374-377 .ENDC .PAGE .IFNZ INEBC ;COMPRESSED 026 TO INTERNAL EBCDIC .DEF O26EBC O26EBC: .BYTE 100 ;SPACE .BYTE 361 ;1 .BYTE 362 ;2 .BYTE 363 ;3 .BYTE 36q,CPRSIP ; NO-SET COMPRESSION IN PROGRESS ; ; FOR THIS TYPE MOV #FMGMTQ,FMQEP ; SET UP RE-QUEUE ENTRY POINTS IN MOV #DISCQ,DSCQEP ; HEADER FOR FLMGMT AND DISCIO EMT NOCKPT ; SET TASK CHECKPOINTABLE FOR ; ; REST OF IT'S EXECUTION CLR PSR ; RESET LOCKOUT ASR R5 MOVB R5,DEVNO ; SAVE LOGICAL DEVICE NO. ASrE $FD001 .BYTE $FD002 .BYTE $FD003 .BYTE $FD004 .BYTE $FD005 .BYTE $FD006 .BYTE $FD007 .BYTE $FD008 .BYTE $FD009 .IFL 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 SWIs 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 #' ,IFDCLR+1 ; IFD MOVB #' ,IFDCLR+2 ; IN PRINT MOVB #' ,IFDCLR+3 ; BUFFER MOV t4 ;4 .BYTE 365 ;5 .BYTE 366 ;6 .BYTE 367 ;7 .BYTE 370 ;8 .BYTE 100 ;NOT USED .BYTE 120 ;& (AMPERSAN) .BYTE 176 ;= (EQUALS) .BYTE 175 ;' (APOSTROPHE) .BYTE 172 ;: (COLON) .BYTE 156 ;> (GREATER THAN) .BYTE 174 ;@ (AT SIGN) .BYTE 37uR R1 MOV R1,PHYUNT ; SAVE PHYSICAL DISC NO. .IFNZ DRESDI INC R1 ; DOD ID FOR PHYSICAL DEVICE MOV R1,DODID ; SAVE .ENDC MOV #COMPID,R1 ; ADDRESS OF COMPRESSION DIR. 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 FINIT(R0),CSS(R1); SET INITIvTCH ; TPCALL = . .WORD DEFA00 ; DEFINE PROCESSOR .WORD DELA00 ; DELETE PROCESSOR .WORD PRTA00 ; PROTECT PROCESSOR .WORD UNPA00 ; UNPROTECT PROCESSOR ; 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 Su (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 ; FILE TYPE BPL FLID10 ; NO CORE DIRECTORY ENTRY JSR R5,PUSHR ; SAVE REGISTERS MOx1 ;9 .BYTE 100 ;NOT USED (21) .BYTE 100 ;NOT USED (22) .BYTE 100 ;NOT USED (23) .BYTE 100 ;NOT USED (24) .BYTE 100 ;NOT USED (25) .BYTE 100 ;NOT USED (26) .BYTE 100 ;NOT USED (27) .BYTE 100 ;NOT USED (30) .BYTE 100 ;NOT USED (31) .BYTE 100 ;NOT USED (32) .BYTyAL SECTOR THIS TYPE AS ASR R0 ; ; COMPRESSION 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 CLzTART SECTOR OF FILE SCHIDX: .WORD 0 ; USED TO SAVE INDEX INTO SEARCH BUFFER OF ; ; 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 ; {; UPDATE CREAD.008 06.21.72 ; UPDATE CREAD.007 04.12.72 .TITLE CREAD ;********************************************************************** ;* ** ;* C R E A D ** ;* ** ;* PROGRAM IDENTIFICATION. CARD READER INPUT SUBROUTINE, ** ;* CATALOG NUMBER |E 100 ;NOT USED (33) .BYTE 100 ;NOT USED (34) .BYTE 100 ;NOT USED (35) .BYTE 100 ;NOT USED (36) .BYTE 100 ;NOT USED (37) .BYTE 360 ;0 .BYTE 141 ;/ (SLASH) .BYTE 342 ;S .BYTE 343 ;T .BYTE 344 ;U .BYTE 345 ;V .BYTE 346 ;W .BYTE 347 }RB IOFCN ; READ FUNCTION CMPB20: MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,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 ~ ; FILE DURING DIRECTORY SEARCH SORTLN: .WORD 0 ; USED TO SORT LARGEST LENGTH OF A DELETED ; ; 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 ;  ** ;* ** ;* 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 ** ;* INPUT DEVICE, ALL REQUESTS ARE QUEUED ON A FIRST-COME ** ;* FIRST-SERVE BASIS. ** ;* ;X .BYTE 350 ;Y .BYTE 100 ;NOT USED (051) .BYTE 100 ;NOT EQUAL (0-2-8 PUNCH) .BYTE 153 ;, (COMMA) .BYTE 115 ;( (LEFT PARENTHESIS) .BYTE 154 ;% (PERCENT) .BYTE 261 ;\ (BACKSLASH) .BYTE 100 ; (SQUARE) .BYTE 351 ;Z .BYTE 100 ;NOT USED (061) .BYTE 100 .ENDC .IFZ DRESDI MOV #FILE,R2 ; START ADDRESS OF SEARCH BUFFER 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 ; IT'S SEARCH .ENDC .PAGE .IFNZ DRESDI ; ; DISC I/O PARAMETER LIST FOR DIRECTORY READS AND ; UPDATES. ; 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 DYNAMICALLY .BYTE 0 ; NO ERROR TASK DLVL: .BYTE ** ;* 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. ** ;* ** ;* THE THREE GENERAL I/O EXITS ARE AVAILABLE TO THE CALLING ** ;* PROGRAM. ;NOT USED (062) .BYTE 100 ;NOT USED (063) .BYTE 100 ;NOT USED (064) .BYTE 100 ;NOT USED (065) .BYTE 100 ;NOT USED (066) .BYTE 100 ;NOT USED (067) .BYTE 100 ;NOT USED (070) .BYTE 100 ;NOT USED (071) .BYTE 100 ;NOT USED (072) .BYTE 100 ;NOT USED (073) .BYTE 100 ;NOTCMPC00 ; YES CMPB40: ADD #10.,R2 ; BUMP TO NEXT ENTRY IN SEARCH BUFFER 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 0 ; DISC PRIORITY LEVEL - SET DYNAMICALLY DERRWD: .WORD 0 ; DISC ERROR WORD .WORD 0 ; RESERVED FOR SYSTEM .WORD DBUF ; ADDRESS OF DISC BUFFER ; DBUF = . .WORD 0 ; USED FOR FILE ID - SET DYNAMICALLY .BYTE 0 ; USE RLSECT AND NWORD IOFCN: .BYTE 0 ; I/O FCN - SET DYNAMICALLY .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 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. ** ;* ** ;* USAGE. THE ASSEMBLER CODE IS: ** ;* MOV #LIST,-(SP) ** ;* USED (074) .BYTE 100 ;NOT USED (075) .BYTE 100 ;NOT USED (076) .BYTE 100 ;NOT USED (077) .BYTE 240 ;- (MINUS) .BYTE 321 ;J .BYTE 322 ;K .BYTE 323 ;L .BYTE 324 ;M .BYTE 325 ;N .BYTE 326 ;O .BYTE 327 ;P .BYTE 330 ;Q .BYTE POSITION IN FILE TYPE AREA. ; R0 = FILE TYPE ; R1 = ADDRESS OF 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 ; 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. ; PROTECT STATUS AND DEVICE LGTH = 6. ; FILE LENGTH CKSAVE = 8. EMT CREAD ** ;* BNE LIST ERROR ONLY ** ;* THE FORMAT OF THE DATA BUFFER IS: ** ;* WORD 1 NWORD ** ;* 2 NREAD ** ;* 3+ DATA ** ;* WHERE: NWORD > 0 = NUMBER CHARACTERS TO READ (80 CHAR MAX) ** 100 ;NOT USED (111) .BYTE 100 ;NOT USED (112) .BYTE 133 ;$ (DOLLAR SIGN) .BYTE 134 ;* (ASTERISK) .BYTE 265 ;] (RIGHT BRACKET) .BYTE 136 ;; (SEMI-COLON) .BYTE 152 ;^ (DELTA = 11-7-8) .BYTE 331 ;R .BYTE 100 ;NOT USED (121) .BYTE 100 ;NOT USED (122) .BYTE 100 ;NKEEP LOOKING .ENDC CMPC05: MOV SCTR(R2),R3 ; GET FILE'S START SECTOR 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 ; CHECK POINT SECTOR ADDRESS ; ; EQUATES FOR FLMGMT PARAMETER LIST ; THREAD = 0. ; THREAD WORD ERROR = 2. ; ERROR INDICATOR ERRTSK = 3. ; TASK TO QUEUE IF ERROR SYSTEM = 4. ; RESERVED FOR FLMGMT FILEID = 6. ; FILE ID FLTYPE = 8. ; FILE TYPE SYSTMB = 9. ; RESERVED FOR FLMGMT LENGTH = 10. ; LENGTH OF FILE TO DEFINE ;* < 0 = NUMBER BINARY WORDS TO READ (60 WDS MAX)** ;* NREAD = NUMBER CHARACTERS/WORDS ACTUALLY READ ** ;* (STORED BY CREAD) ** ;* ** ;* PROGRAMMER: 55 ** ;* DATE: 01.10.72 ** ;* REVISION: OT USED (123) .BYTE 100 ;NOT USED (124) .BYTE 100 ;NOT USED (125) .BYTE 100 ;NOT USED (126) .BYTE 100 ;NOT USED (127) .BYTE 100 ;NOT USED (130) .BYTE 100 ;NOT USED (131) .BYTE 100 ;NOT USED (132) .BYTE 100 ;NOT USED (133) .BYTE 100 ;NOT USED (134) .BYTE 100 ;NOT USED (1MOV (R2),SORTID ; SAVE FILE'S ID MOV LGTH(R2),SORTLN ; SAVE FILE'S LENGTH 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,FSTAT(R0) ; CKSAVE AREA REQUIRED? BEQ ; ; 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 STKSZ = 50. ; STACK SIZE FOR DISC INITIALIZATION TASK ENTRY = 2. ; ENTRY POINT IN TASK HEADER ; .PAGE .CSECT FMCODE ; ; DEFINE = . JS ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;* ** ;* G U L F E L E C T R O N I C S S Y S T E M35) .BYTE 100 ;NOT USED (136) .BYTE 100 ;NOT USED (137) .BYTE 132 ;! (EXCLAMATION POINT) .BYTE 100 ;NOT USED (141) .BYTE 100 ;NOT USED (142) .BYTE 100 ;NOT USED (143) .BYTE 100 ;NOT USED (144) .BYTE 100 ;NOT USED (145) .BYTE 100 ;NOT USED (146) .BYTE 100 ;NOT USED (147) CMPC20 ; NO ADD LGTH(R2),CSS(R1); YES-BUMP CSS BY LENGTH AGAIN .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 ADDRER R5,PUSHR ; SAVE REGISTERS 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,PUS S ** ;* ** ;********************************************************************** ; ; .PAGE ;********************************************************************** ;* ;* C R E A D P A R A M E T E R S ;* .IFG NCR ;DON'T ASSEMBLE THIS ROUTINE IF THERE ;ISN'T AT LEAST ONE C/R IN SYSTEM .DEF CREAD,CRINIT .IFNZ .BYTE 100 ;NOT USED (150) .BYTE 100 ;NOT USED (151) .BYTE 100 ;NOT USED (152) .BYTE 100 ;NOT USED (153) .BYTE 100 ;NOT USED (154) .BYTE 100 ;NOT USED (155) .BYTE 100 ;NOT USED (156) .BYTE 100 ;NOT USED (157) .BYTE 100 ;NOT USED (160) .BYTE 100 ;NOT USED (161) SS MOVB #UDLEV,DLVL ; HIGHEST PRI. DISC LEVEL MOVB #4.,IOFCN ; UPDATE DISC I/O MOV #DLIST,-(SP) ; START UPDATE JSR PC,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 HR ; SAVE REGISTERS MOV #3,R0 ; UNPRCT ENTRY ; FLMA10 = . MOV 14.(SP),R1 ; GET FLMGMT PARAMETER LIST MOVB R0,SYSTEM(R1) ; SAVE ENTRY POINT MOV PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK MOV #1.,R0 ; PRESET ERROR TYPE REGISTER MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT DEC (R1) ; IS LIST THREADABLE? BNE FLMA30 ; NO - ERROR TYPE 1 TTYSW .DEF CRDON,CRDOFF .REF TTYIN .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 .REF O26EBC .ENDC .IFNZ EXEBC .REF O29ASC .IFNZ INEBC .REF O29EBC .ENDC .ENDC .ENDC .BYTE 100 ;NOT USED (162) .BYTE 100 ;NOT USED (163) .BYTE 100 ;NOT USED (164) .BYTE 100 ;NOT USED (165) .BYTE 100 ;NOT USED (166) .BYTE 100 ;NOT USED (167) .BYTE 100 ;NOT USED (170) .BYTE 100 ;NOT USED (171) .BYTE 100 ;NOT USED (172) .BYTE 100 ;NOT USED (173) .BYTE 10 ; YES- REPORT DIR. UPDATE ERROR JMP CMPB15 ; RE-START SEARCH OF PREVIOUS 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 MOV (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 FROM LIST CMP R2,#$FTMAX ; IS IT VA .IFNZ OVRLAY .REF RELTSK .ENDC PSR = PS ;ADDRESS OF PSR BELL = 07 ;'BELL' ASCII CODE LF = 12 ;LINE FEED ASCII 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 = 0 ;NOT USED (174) .BYTE 100 ;NOT USED (175) .BYTE 100 ;NOT USED (176) .BYTE 100 ;NOT USED (177) .BYTE 116 ;+ (PLUS) .BYTE 301 ;A .BYTE 302 ;B .BYTE 303 ;C .BYTE 304 ;D .BYTE 305 ;E .BYTE 306 ;F .BYTE 307 ;G .BYTE 310 ; ; SECOND I/O COMPLETE FOR DELETED FILE CLEAN-UP ; CMPC50 = . 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=FILLID 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,SYSTEM+1(R1) ; SAVE ASL R3 ; USE AS WORD INDEX TST PHYDEV(R3) ; IS DEVICE AVAILABLE? BMI FLMA35 ; NO - ERROR TYPE 4 INC R0 ; BUMP ERROR TYPE TST AC2 ;PHYSICAL DEVICE TABLE CODE FOR C/R DEVICES .PAGE ;********************************************************************** ;* ;* C R E A D D A T A T A B L E S ;* ;********************************************************************** ; ; COUNT: ;CONTAINS CURRENT BYTE INDEX TO .=.+NCR+NCR ;CALLER'S DATA BUFFER ; ERRCR: ;CONTAINS COUNTER OF NUMBER OF RETRIES .=.+NCR+NCR ;H .BYTE 100 ;NOT USED (211) .BYTE 100 ;NOT USED (212) .BYTE 113 ;. (PERIOD) .BYTE 235 ;) (RIGHT PARENTHESIS) .BYTE 264 ;[ (LEFT BRACKET) .BYTE 114 ;< (LESS THAN) .BYTE 073 ;# (POUND/NUMBER SIGN) .BYTE 311 ;I .BYTE 100 ;NOT USED (221) .BYTE 100 ;NOT USED (222) .BYTE TYPE ; R1=COMPID ADDRESS ; CMPD00 = . TST HITFLG ; 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 JSR PC,PFRITE ; RETIVE ; CALLED BY A TASK? BEQ FLMA35 ; NO - CAN'T SUSPEND THEN - ERROR TYPE 5 MOV $CTASK,R3 ; GET CALLING TASK NUMBER INCB IOSTAT(R3) ; SET TASK'S I/O STATUS MOVB R3,SYSTMB(R1) ; SAVE TASK NUMBER FOR UNSPND MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV R1,@FMLAST ; THREAD REQUEST IN MOV R1,FMLAST ; FILE MANAGEMENT QUEUE INC NOFMRQ ; INCREMENT ;BEFORE ABORTING REQUEST ; MXCNT: ;MAXIMUM NUMBER OF BYTES TO STORE: .=.+NCR+NCR ;2*NWORD FOR BINARY, NWORD FOR ALPHANUM. ; CRFRST: ;CARD READER QUEUE POINTER TO .=.+NCR+NCR ;BEGINNING OF QUEUE ; CRLAST: ;POINTER TO END OF QUEUE .=.+NCR+NCR ; ; CRBUSY: .=.+NCR+NCR ;0 = C/R NOT IN USE, 1 = C/R IN USE ; CRDATA: .=.+E 100 ;NOT USED (223) .BYTE 100 ;NOT USED (224) .BYTE 005 ; HORIZONTAL TAB .BYTE 100 ;NOT USED (226) .BYTE 100 ;NOT USED (227) .BYTE 100 ;NOT USED (230) .BYTE 100 ;NOT USED (231) .BYTE 100 ;NOT USED (232) .BYTE 013 ;VERTICAL TAB .BYTE 014 ;FORM FEED .BYTE 015 AD 1 SECTOR OF FILE TST DERRWD ; DISC ERROR OCCUR? BNE 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 JSR PC,PFRITE ; WRITE 1 SECTOR OF FILE TST DERRWD ; DISC ERROR OCCUR? BNE CMPD70 ; YES-REPORT INC RLSENO. REQUESTS IN QUEUE MOV (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 VOLUNTARY SUSPENSION OF TASK JSR PC,QSAVEI ; DO IT MOV #DSPTCH,-(SP) ; RETURN TO DISPATCHER WHEN THROUGH MOV PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT 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 ALPHANUMERIC ;CONVERSION TABLE CURRENTLY IN USE ;CARRIAGE RETURN .BYTE 100 ;NOT USED (236) .BYTE 100 ;NOT USED (237) .BYTE 157 ;? (QUESTION MARK) .BYTE 100 ;NOT USED (241) .WORD 040100 ; (242-243) .WORD 040100 ; (244-245) .WORD 040100 ; (246-247) .WORD 040100 ; (250-251) .WORD 040100 ; (252-253) .WORD 040100 ; CT ; BUMP RELATIVE SECTOR OF FILE CMP RLSECT,SORTLN ; MOVED COMPLETE 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 ; RE TST FMACTV ; FILE MGMT. CURRENTLY PROCESSING REQUESTS? BEQ FLMB00 ; NO FLMA20: MOV (SP)+,PSR ; YES- RESET PRIORITY LOCKOUT RTS PC ; FLMA30: JMP ERRA00 FLMA35: JMP ERRA10 ; FLMB00 = . INC FMACTV ; SET FILE MANAGEMENT ACTIVE FLMB10 = . MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOV FMFRST,R1 ; ADDRESS OF FIRST REQUEST IN QUEUE JSR PC,GFTYP .ENDC ; .IFNZ TTYSW CRBKUP: .=.+NCR+NCR ;1 = BACK UP C/R WITH TTY .ENDC ; CRMOD: ;CARD READER TIMER MODULES .WORD 1 ;FOR FIRST CARD READER .BYTE 0,120+$RES ;ARGUMENT AND JSR TO SUBROUTINE OPTIONS .WORD 0,0,0 .IFG NCR-1 .WORD 1 ;FOR SECOND CARD READER .BYTE 0,120+$RES .WORD 0,2,0 .IFG NCR-2 (254-255) .WORD 040100 ; (256-257) .WORD 040100 ; (260-261) .WORD 040100 ; (262-263) .WORD 040100 ; (264-265) .WORD 040100 ; (266-267) .WORD 040100 ; (270-271) .WORD 040100 ; (272-273) .WORD 040100 ; (274-275) .WORD 040100 ; (276-277) .WORD 040100 ; (300-301) LATIVE SECTOR TO UPDATE CLR UPDFLG ; RESET UPDATE FLAG MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,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 ; E ; GET FILE TYPE MOV #PLOCK,PSR ; SET LOCKOUT AGAIN 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 MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOVB SYSTEM(R1),R0 ; GET ENTRY POINT TO FLMGMT ASL R0 ; WORD INDEX JMP @TPCALL(R0) ; GO TO APPROPRIATE PROCES.WORD 1 ;FOR THIRD CARD READER .BYTE 0,120+$RES .WORD 0,4,0 .IFG NCR-3 .WORD 1 ;FOR FOURTH CARD READER .BYTE 0,120+$RES .WORD 0,6,0 .ENDC .ENDC .ENDC ; CRLIST: .WORD 1 ;C/R ERROR MESSAGE I/O LISTS .BYTE 0,3 ;C/R # 1 .WORD CRTTY,0,0,0,0 .IFG NCR-1 .WORD 1 ;C/R # 2 .BYT .WORD 040100 ; (302-303) .WORD 040100 ; (304-305) .WORD 040100 ; (306-307) .WORD 040100 ; (310-311) .WORD 040100 ; (312-313) .WORD 040100 ; (314-315) .WORD 040100 ; (316-317) .WORD 040100 ; (320-321) .WORD 040100 ; (322-323) .WORD 040100 ; (324-325) YES CMP #2.,UPDFLG ; CORE RESIDENT DIRECTORY EXIST? BNE CMPD30 ; NO ; ; NOTE:R1 CONTAINS ADDRESS OF COMPID AND 5.(R1) ; CONTAINS LOGICAL DEVICE NUMBER. THUS WE CAN ; USE FLMGMT SUBROUTINE 'CDSRCH' TO FIND CORE ; DIRECTORY ENTRY ADDRESS AND SYSTEM+1(R1) TEST ; WILL WORK ; MOV SORTID,R0 ; FILE ID TO SEARCH FOR JSR PC,CDSRCH ; SEARCH CORE DIRECTORSOR ; ; COMPRESSION 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. ; R1 = FLMGMT LIST ADDRESS ; FLMC00 = . MOV #$CPTNO,R0 ; COMPRESS TASK NUMBER ASL R0 ; WORD INDEX MOE 0,3 .WORD CRTTY,0,0,0,0 .IFG NCR-2 .WORD 1 ;C/R # 3 .BYTE 0,3 .WORD CRTTY,0,0,0,0 .IFG NCR-3 .WORD 1 ;C/R # 4 .BYTE 0,3 .WORD CRTTY,0,0,0,0 .ENDC .ENDC .ENDC ; CRMDAD: .WORD CRMOD,CRMOD+10.,CRMOD+20.,CRMOD+30. .=CRMDAD+NCR+NCR ;TABLE USED TO GET ADDRESS OF TIMER ;MODULE US.WORD 040100 ; (326-327) .WORD 040100 ; (330-331) .WORD 040100 ; (332-333) .WORD 040100 ; (334-335) .WORD 040100 ; (336-337) .WORD 040100 ; (340-341) .WORD 040100 ; (342-343) .WORD 040100 ; (344-345) .WORD 040100 ; (346-347) .WORD 040100 ; (350-351) .WORD 04Y 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 JSR PC,PFRITE ; EXIT TYPE 1-IGNORE ERROR CMPD30: MOV R1,R2 ; BOTH EQUAL TO COMPID ADDRESS V HEADER(R0),R0 ; COMPRS TASK HEADER ADDRESS JSR PC,@ENTRY(R0) ; 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 ; R2 = FILE TYPE ; DEFA00 = . ING C/R INDEX .PAGE ; ; CRIOLS: .WORD CRLIST,CRLIST+14.,CRLIST+28.,CRLIST+42. .=CRIOLS+NCR+NCR ;TABLE USED TO GET ADDRESS OF TTY I/O LIST ;USING C/R INDEX .IFNZ BIN ; BYTE: ;USED IN BINARY MODE TO INDICATE WHICH .=.+NCR+NCR ;SET OF BITS TO USE FROM NEXT COLUMN ; BINARY: ;USED IN BINARY MODE; CONTAINS 4 BITS .=.+NCR+NCR 0100 ; (352-353) .WORD 040100 ; (354-355) .WORD 040100 ; (356-357) .WORD 040100 ; (360-361) .WORD 040100 ; (362-363) .WORD 040100 ; (364-365) .WORD 040100 ; (366-367) .WORD 040100 ; (370-371) .WORD 040100 ; (372-373) .WORD 040100 ; (374-375) .WORD 040100 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 R0 ; FILE TYPE WORD INDEX MOV CSS(R1),FNEXT(R0);SET NEW NEXT SECTOR AVAILABLE MOV #AULIST,-(SP) .IFNZ DRESDI TSTB 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 FI;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 = 020000 ;INPUT HOPPER EMPTY / OUTPUT HOPPER FULL CHECK = 010000 ;C/R CHECK ERROR TIMING = 004000 ;C/R TIMING ERROR ONLINE = 002000 ;T ; (376-377) .ENDC .ENDC .ENDC .END ; THIS TYPE AND UPDATE FILE JSR PC,PFRITE ; TYPE ALLOCATION DIRECTORY MOV #-1.,CPRSIP ; RESET COMPRESSION IN PROGRESS MOVB #$CPTNO,R5 ; COMPRS TASK NO. INCB IOSTAT(R5) ; SET IOSTAT SO CANNOT ABORT MOV PHYUNT,R5 ; GET PHYSICAL DISC UNIT MOV R5,R0 ASL R0 ; COMPUTE DCUWX-DISC CONTROLLER ; ; WORD INDEX MOV #-1.,HITLE ID # TO DEFINE .IFZ 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 RANSITION 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 ;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 ; UPDATE LPRNTR.009 06.21.72 ; UPDATE LPRNTR.008 05.12.72 ; UPDATE LPRNTR.007 05.03.72 ROS SYSTEM VERSION .TITLE LPRNTR ;********************************************************************** ;* ** ;* L P R N T R ** ;* ** ;* PROGRAM IDENTIFICATION. LPRNTFLG ; USED TO COUNT NO. OF REQUESTS CMPE10: MOV DQLAST(R0),R3 ; ADDRESS OF DEVICE'S LAST LIST MOV CPDFST,R1 ; GET A REQUEST THAT IS WAITING BEQ CMPE40 ; NONE LEFT-EMPTY MOV DATA(R1),R4 ; ADDRESS OF DATA BUFFER CLR DUSE3(R4) ; INITIALIZE SO DIRECTORY SEARCH ; ; IS DONE AGAIN MOVB LEVEL(R1),R2 ; DISC LEVEL OF REQUEST MOV (R1),CPDFST ; PULL REQUESTJSR PC,DISCIO ; READ APPROPRIATE SECTOR OF DIRECTORY BR FLMA20 ; EXIT-WAIT FOR I/O COMPLETE ; ; DIRECTORY READ I/O COMPLETE ; DEFA20 = . MOV FMFRST,R1 ; ADDRESS OF CURRENT REQUEST 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 ;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. ;* I / O L I S T ERRTSK = 7. ;* ERROR = 8. ;* SYSTEM = 10. ;* E Q U A T E S DATA = 12. ;* R - LINE PRINTER OUTPUT ** ;* SUBROUTINE. ** ;* ** ;* PURPOSE. THIS SUBROUTINE PERFORMS THE OUTPUT PROCESSING ** ;* AND CONTROL FUNCTIONS FOR EVERY LINE PRINTER IN THE ** ;* SYSTEM. ALL OUTPUT REQUESTS ARE QUEUED ON A PRIORITY ** ;* BASIS, THEREBY PERMITTING THE LINE PRINTER TO BE USED ** ;* IN REAL-TIME APPLICATI FROM COMPRS QUEUE BNE CMPE20 ; NOT LAST ONE MOV #CPDFST,CPDLST ; LAST ONE-RESET ; NOTE: NOT NECESSARY TO DO ABOVE UNDER LOCKOUT SINCE ; NO QUEUEING IN CPDFST IS BEING DONE. CMPE20: CLR (R1) ; SET THREAD WORD TO 0 MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT CMPB R2,HPRIRQ(R5) ; WILL THIS BE HIGHEST PRIORITY REQUEST? BHIS CMPE30 ; NO MOVB R2,HPRIRQ(R5) ; YES-SET APPROPRIATFILE TYPE .ENDC 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 ; ; C/R 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 ; CRB1ONS 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 CHARACTER. ALL THREE GENERAL I/O ** ;* EXITS ARE SUPPORTED BY LPRNTR. ** ;* ** ;* USAGE. THE ASELY CMPE30: ASL R2 ; LEVEL WORD INDEX ADD R2,R3 ; GET TO PROPER 'LAST' ADDRESS+1 MOV R1,@-(R3) ; THREAD LIST BACK INTO MOV R1,(R3) ; DISC PRIORITY QUEUE INC NODREQ(R0) ; BUMP NO DISC REQUESTS INC HITFLG ; BUMP REQUEST COUNT CLR PSR ; RESET LOCKOUT BR CMPE10 ; RETHREAD THEM ALL CMPE40: MOV HITFLG,R3 ; GET NO. REQUESTSFNEXT(R2),R4 ; NEXT SECTOR AVAIL. 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 ; R2 = FILE TYPE WORD INDEX ; R4 = NEW START SECTOR ; DEFA27: MOV R4,NEWSS ; SAVE NEW START SECTOR ADD R0,FNEXT(R2) ; UPDATE NEXT APPROPRIATELY : .WORD 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 SEMBLER LINKAGE TO LPRNTR IS: ** ;* ** ;* MOV #LIST,-(SP) ;PUSH LIST ADDRESS ON STACK ** ;* EMT LPRNTR ** ;* ** ;* THE FORTRAN EQUIVALENT CALL IS: ** ;* ** ;* THAT WAITED BMI CMPF00 ; NONE-CHECK FLMGMT REQUESTS MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT CMP R3,NODREQ(R0) ; ALL REQUESTS MADE BY COMPRS BNE CMPF00 ; NO-WILL RECOVER BY ITSELF MOVB #-1.,CALLED(R5) ; SET CALLED BY TIME-OUT CLR PSR ; RESET LOCKOUT JSR PC,DIOA65 ; GIVE DISCIO A "PUSH" ; ; DETERMINE IF FLMGMT REQUESTS ARE WAITING ; CMPF00 = . CL ASR R2 ; FILE TYPE MOV #AULIST,-(SP) ; UPDATE ALLOCATION FILE ON DISC 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 MOV #DLIST,-(SP) ; LI;C/R # 3 .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 'C CALL LPRNTR (IADDR(LIST)) ** ;* ** ;* THE FORMAT OF THE DATA BUFFER, DATA, IS: ** ;* ** ;* ----------------------------------- ** ;* WORD 1 ! NWORD ! ** ;* ----------------------------------- ** ;* R PSR ; MAKE SURE LOCKOUT NOT SET MOV CPFFST,R1 ; GET A REQUEST THAT IS WAITING BEQ CMPF30 ; NONE LEFT-EMPTY MOV (R1),CPFFST ; PULL REQUEST FROM COMPRS QUEUE BNE CMPF20 ; NOT LAST ONE MOV #CPFFST,CPFLST ; LAST ONE RESET CMPF20: CLR (R1) ; SET THREAD WORD TO 0 ; NOTE: NOT NECESSARY TO DO ABOVE UNDER LOCKOUT SINCE ; NO QUEUEING IN CPFFST IS BST ADDRESS TO STACK JSR PC,PFRITE ; START DIRECTORY UPDATE RTS PC ; RETURN TO DISCIO ; ; FIRST I/O COMPLETE FOR DISC DIRECTORY UPDATE ; DEFA30 = . MOV FMFRST,R1 ; 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,CREATE ; CREATE FILE'S ENTRY INR 2 ERROR' .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 2 ! RESRVD ! ** ;* ----------------------------------- ** ;* WORD 3 ! CHAR 1 ! CNTRL ! ** ;* ----------------------------------- ** ;* . . ** ;* . . ** ;* . . ** EING DONE. MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV R1,@FMLAST ; PUT REQUEST INTO MOV R1,FMLAST ; FLMGMT THREAD INC NOFMRQ ; BUMP APPROPRIATELY BR CMPF00 ; RE-THREAD THEM ALL CMPF30: MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT TST FMACTV ; FILE MANAGEMENT CURRENTLY ACTIVE? BNE CMPG00 ; YES-WILL TAKE CARE OF ITSELF TST NOFMRQ ; DITO DIRECTORY MOV #DEFA40,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN TO DISCIO ; ; SECOND I/O COMPLETE FOR DISC DIRECTORY UPDATE ; DEFA40 = . MOV FMFRST,R1 ; 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 DEFB00 ; NO .E .WORD 16.,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 .PAGE ;********************************************************************** ;* ** ;* ;* ----------------------------------- ** ;* WORD X ! CHAR N ! CHAR N-1 ! ** ;* ----------------------------------- ** ;* ** ;* WHERE: ** ;* ** ;* NWORD = NUMBER OF CHARACTERS TO PRINT (INCLUDING THE D WE PUT ANYTHING IN FLMGMT QUEUE BEQ CMPG00 ; NO MOV #CMPG00,-(SP) ; SET RETURN ON STACK CLR -(SP) ; SET PSR TO RESET LOCKOUT JMP FLMB00 ; GIVE FLMGMT A "PUSH" ; ; FINISHED-SET UP TO EXIT FROM COMPRS ; CMPG00 = . CLR PSR ; RESET LOCKOUT IF SET MOV #$CPTNO,R0 ; TASK NO. DECB IOSTAT(R0) ; RESET I/O STATUS MOV #CCEDIT,R0 ; PUT NDC ; ; R1 = REQUEST LIST ADDRESS ; 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 REQUEST ; R1 = LIST ADDRESS C R E A D ** ;* ** ;********************************************************************** ; ; CREAD: MOV R1,-(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 L ** ;* CONTROL CHARACTER, CNTRL), AND ** ;* NWORD > 0 FOR ASCII STRINGS ** ;* NWORD < 0 FOR EBCDIC STRINGS ** ;* RESRVD = RESERVED FOR SYSTEM USE ** ;* CNTRL = CARRIAGE CONTROL: 0 - NO LINE FEED ** ;* N - SKIP N LINES (N=1,2,3) ** ;* FF- EJECT PAGE FILE TYPE IN JSR PC,MSGEDT ; 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 #NVM; R2 = FILE TYPE ; DEFB00 = . CLRB ERROR(R1) ; SET NO ERROR DEFB05: BICB #200,FSTAT(R2) ; SET F.M.NOT IN PROGRESS THIS FILE TYPE CLR R0 BISB SYSTMB(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 ERROR .ENDC IST 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: ; ; PC (BOTTOM) ; R0 ; R1 ; R2 ; R3 ; R4 ** ;* 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 MULTIPLE LINES.** ;* TAB (HT) POSITIONS ARE: 1, 9, 17, ..., 8N + 1, ... ** ;* ** ;* PROGRAMMER: 55 SG,TTYBUF BR CMPG10 ; 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 ; ; COMP .IFNZ DRESDI MOV PSR,(SP) ; IGNORE ERROR AND SAVE PROCESSOR STATUS .ENDC MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV (R1),FMFRST ; PULL REQUEST FROM THREAD BNE DEFB10 MOV #FMFRST,FMLAST ; EMPTIED QUEUE-LAST POINTS TO FIRST DEFB10: MOV #1.,(R1) ; SET REQUEST THREADABLE DECB IOSTAT(R0) ; RESET TASK'S I/O STATUS .IFNZ OVRLAY BNE DEFB20 ; NOT LAST ONE ; R5 (TOP) ; MOV DATA(R1),R0 ;GET DATA BUFFER ADDRESS ; ; 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 ** ;* DATE: 01.17.71 ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;***************************************RESS ERROR 4- FILE TRANSFER ERROR ; CMPER4 = . 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 ; MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOV R0,-(SP) ; TASK NO TO STACK JSR PC,RELTSK ; RELEASE TASK IF OVERLAY DEFB20 = . MOV #PLOCK,PSR ; SET LOCKOUT AGAIN .ENDC DEFB25: DEC NOFMRQ ; DECR. NO. FILE MGMT. REQUESTS BNE DEFB30 ; PROCESS OTHER REQUESTS CLR FMACTV ; SET FILE MGMT. NOT ACTIVE JMP FLMA20 ; EXIT DEFB30: JMP FLMB10 * C .IFG NCR-1 TST (R3)+ CMP R3,#NCR+NCR BNE CRDA00 * R .ENDC NO. * ; 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 I******************************* ; .IFG NLP .DEF LPRNTR .DEF LPINIT .REF QSAVEI,SAVE,TTYOUT,DSPTCH .REF QUEUE,IOQTME,IODQTM,IOSTAT .REF ASCLP,ACTIVE,UNSPND,$CTASK .REF PHYDEV,ALTDEV,LOGMAX .DEF LPON,LPOFF .IFNZ INEBC .REF EBCLP .ENDC .IFNZ LPBACK .DEF LPTTY .ENDC .IFNZ OVRLAY .REF RELTSK .ENDC ;* ;* R0 = START ADDRESS OF THREE BYTE FIELD ; 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 ; ; ; ; SEARCH FILE DIRECTORY FOR AVAILABLE DISC SPACE ; R0= LENGTH REQUIRED FOR FILE ; = 0, LOOK FOR LARGEST AVAILABLE AREA ; R1 = PARAMETER LIST ADDRESS ; R2 = FILE TYPE - DEFC01 ; FILE TYPE WORD INDEX - DEFC00 ; DEFC00 = . ASR R2 ; CALCULATE FILE TYPE DEFC01 = . CLR SORTLN ; INITIALIZE SORT LENGTH MOV R0,LNREQ ; SAN ROS BR CRDAXX ; CRDW10: MOV #10.,R4 ;DEVICE NOT AVAILABLE ; CRDAXX: 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 SEZ ;SET ERROR CODE RTS PC ;THEN EXIT BACK TO CALLER ; CRDA10: .IFLE NLP 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. ;LIGICAL DEVICE NO TYPE = 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 PSR = PS I/O COMPLETE SUBROUTINE FOR DISC DIRECTORY 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 VE 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 MOV #DEFC10,IOCOMP ; I/O COMPLETE ADDRESS MOVB #RDLEV,DLVL ; SET UP DISC READ LEVEL CL ;DON'T ASSEMBLE; NEEDS TO BE CONSIDERED MOV LOGMAX,R4 ; CRDA11: TBIT #AVAIL,PHYDEV(R3) ;SEE IF THIS DEVICE IS AVAILABLE BNE CRDA13 ;BRANCH IF C/R IS AVAILABLE ; CRDA12: TBIT #ALT,PHYDEV(R3) ;OOPS. BETTER SEE IF WE HAVE BEQ CRDW10 ;AN ALTERNATE. BRANCH IF NO DEC R4 BLE CRDW10 ;BRANCH IF NO MORE DEVICES MOV ALTDEV(R3),R3 ;CPU STATUS 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 ; CHANGE DIRECTORY APPROPRIATELY 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) ; IMMEDIATRB 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 = . MOV FMFRST,R1 ; ADDRESS OF REQUEST LIST JSR PC,TSTDER ; TEST FOR DISC ERROR MOV #BUFFER,R3 ; START OF DISC BUFFER SEARCH ;GET LOGICAL UNIT NO. OF ALTERNATE ASL R3 ;CONVERT TO WORD INDEX CMPB #CRDEV,PHYDEV(R3) ;SEE IF THE DEVICE IS COMPATIBLE BEQ CRDA11 ;BRANCH IF WE CAN USE IT BR CRDA12 ;OTHERWISE, GO TRY NEXT NEXT ALTERNATE .ENDC ; CRDA13: MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 MOV #340,@#PSR ;SET CPU LEVEL = 7 (11/20) .ENDC .IFNZ $1145 SPL (START I/O) DONE = 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 = E RETURN REQUESTED EMT UNSPND 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 CHAN 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 ; SAME AS TYPE IN REQUEST? BNE DEFC30 ; NO MOV LNREQ,R0 ; GET LENG 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) MOV R1,@CRLAST(R3) ;QUEUE THE REQUEST MOV R1,CRLAST(R3) TST ACTIVE ;SEE IF A TASK IS CURRENTLY ACTIVE BEQ CRDA15 ;BRANCH IF NO MOV $CTASK,R4 ;OTHERWISE, GET THE TASK NUMBER INCB IOSTAT(R4) ;INCREMENT T 4 ;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 GE ; ; R5 USED AS WORK REGISTER ; CHGDIR = . MOV CSS(R1),R5 ; CURRENT START SECTOR MOV R5,SCTR(R2) ; SET NEW START SECTOR .IFNZ $TMSLC!CHKPTC BITB #100,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 CTH 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 WHICH FOUND .ENDC DEFC30: ADD #10.,R3 ; BUMP TO NEXT ENTRY CMP R3,SBUFLN ; HE 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(R0) ;ZERO MEANS REQUESTOR IS NOT A TASK ; CRDA16: TST CRBUSY(R3) ;SEE IF THE I/O SHOULD BE STARTED BEQ CRDC00 ;BRANCH IF IT IS .PAGE ;********************************************************************** ;* ;* ;* THIS SECTION OF TH * SKIP3 = 3 ;SKIP TWREE LINES * AUTOLF = 1 ;CONTROL FOR AUTO LINE FEED MODE DELAY = 4. INDEX = 6. JSRSUB = 8. MAXCC = 14 ;MAX(HT,LF,FF,STAY,SKIP1,SKIP2,SKIP3) LPBLNK = 240 ;ASCII BLANK CLEAR = 100 .PAGE ;********************************************************************** ;* ** ;* ALLED BY DISCIO WHEN A DISC REQUEST IS FOUND ; FOR AN AREA THAT HAS COMPRESSION IN PROGRESS. ; R1 = I/O LIST ADDRESS ; R5 = DISC CONTROLLER UNIT NUMBER ; STACK CONTENTS: ADDRESS TO RETURN TO AFTER CFILID-IGNORE ; PSR ; NOTE: CALLED UNDER LOCKOUT ; DISCQ = . ASL R5 ; CALCULATE DCUWX MOV #1.,R2 ; SET R2 FOR PRIORITY LEVEL 1 MOV DQFRST(R5),R0 ; ADDRSEARCHED 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 ; NOPE ASL R2 ; FILE TYPE WORD INDEX MOV FLAST(R2),R3 ; DOES DISC ALE 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 SEE IF WE'RE IN A TYPE 2 RETURN BNE CRDB10 ;BRANCH IF NO TST ACTIVE ;ELSTWISE, MAKE SURE A TASK IS L P R N T R D A T A T A B L E S ** ;* ** ;* THE FOLLOWING TABLE 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. ** ;* ** ;********************************************************************** ; LPESS OF THIS DEVICE'S FIRST LIST MOV DQLAST(R5),R4 ; ADDRESS OF THIS DEVICE'S LAST LIST MOVB LEVEL(R1),R3 ; CURRENT PRIORITY OF REQUEST ASL R3 ; DOUBLE FOR WORD ADDRESSING ADD R3,R4 ; ADDRESS OF CURRENT LEVEL'S LAST LIST ADD R0,R3 ; ADDRESS OF CURRENT LEVEL'S FIRST LIST ASR R5 MOV (R1),-(R3) ; PULL REQUEST OUT OF QUEUE THREAD BNE DSCQ10 ; DIDN'T EMPTYLOCATOR 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 = . ASR R2 ; FILE TYPE TST SORTLN ; DID WE FIND ANYTHING?  CALLING BEQ CRDB10 ;BRANCH IF NO - SOMEBODY GOOFED CLZ ;SET CONDITION CODE ZERO BR CRSAVE ;AND SUSPEND CALLER ; CRDB10: ;WE MUST RETURN TO THE CALLER MOV (SP)+,R5 ;FIRST, MOV (SP)+,R4 ; RESTORE MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV (SP)+,R1 ; BUSY: .=.+NLP+NLP ;1 = L/P CURRENTLY IN USE ; LPDATA: .=.+NLP+NLP ;ADDRESS OF ACTIVE DATA BUFFER ; LPFRST: ; * .=NLP+NLP*NLPRTY+. ;ADDRESS OF FIRST LIST IN THREAD " ; " LPLAST: ; * .=NLP+NLP*NLPRTY+. ;ADDRESS OF LAST LIST IN QUEUE "  PRIORITY LIST MOV R3,-(R4) ; EMPTY-LAST POINTS TO FIRST DSCQ10: TST (R0)+ ; SEARCH DEVICE Q FOR BNE DSCQ20 ; HIGHEST PRIORITY LEFT-GOT IT! INC R2 ; CHECK NEXT REQUEST LEVEL CMPB R2,NDPRTY(R5) ; QUEUE EMPTY? BLE DSCQ10 ; NO-SCAN SOME MORE MOV #-1.,R2 ; YES-RESET HPRIRQ DSCQ20: MOVB R2,HPRIRQ(R5) ; UPDATE HPRIRQ APPROPRIATELY CLR (R1) 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 DURING SEARCH MOV #DLIST,-(SP) ; DISC I/O LIST TO STACK JSR PC,PFRITE ; START DIRECTOR  REGISTERS MOV (SP)+,R0 ; CLZ ;THEN, SET NO-ERROR CONDITION CODE RTS PC ;AND EXIT ; ; THIS LITTLE SUBROUTINE SUSPENDS THE CALLING TASK. LINKAGE IS ; ; SEZ SET Z BIT IN CONDITION CODE ; -OR- CLZ IF Z IS TO BE ZERO ; JMP CRSAVE (OR BR, IF CLOSE ENOUGH) ; ; CRSAVE: MOV @#PSR,-(SP) ;SAVE CONDITION CODE MOV 12.(SP),R0  ; ================================ ; " ; " ; ====> STORED AS: PRIORITY 1 * ; PRIORITY 2 * ; . * ; . * L/P # 1 ; . *  ; SET THREAD WORD EQUAL ZERO MOV R1,@CPDLST ; SET REQUEST IN MOV R1,CPDLST ; COMPRESS DISC QUEUE MOV (SP),PSR ; RESET LOCKOUT MOV (SP)+,(SP) ; SET STACK FOR DISCIO RETURN ; NOTE: R4 DOES NOT EQUAL ZERO,THEREFORE CALLED BY ; COMPRS IS ESTABLISHED JMP DIHA50 ; SEE IF ANY OTHER REQUESTS PENDING ; ; ; FMGMTQ IS CALLED BY FLMGMT WHEN A FILE MANAGEMENT REQUEST ; Y UPDATE RTS PC ;WAIT FOR I/O COMPLETE ; ; FIRST I/O COMPLETE FOR UPDATE OF DELETED ENTRY ; DEFC50 = . MOV FMFRST,R1 ; 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 NEW START SECTOR FOR DEF. ADD SORTLN,SCTR(R3) ; UPDATE DELETED ENTRY'S START SECTOR SUB SO ;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 ; PC (TASK) MOV (SP)+,R1 ; TOP OF STACK =====> PC (RETURN) CLR -(SP) MOV #DSPTCH,-(SP) ; JMP QSAVEI ; PRIORITY NLPRTY * ; . ; . ; . ; REPEAT FOR L/P # 2, ETC. ; ; LPTASK: .=.+NLP+NLP ;THE TASK NO. WHO INITIATED THE CURRENT RQST ; LPIOCM: .=.+NLP+NLP ;I/O COMPLETE ADDRES IS FOUND FOR AN AREA THAT HAS COMPRESSION IN PROGRESS. ; R1 = FLMGMT LIST ADDRESS ; NOTE: CALLED UNDER LOCKOUT ; FMGMTQ = . MOV (R1),FMFRST ; PULL REQUEST FROM THREAD BNE FMGQ10 MOV #FMFRST,FMLAST ; EMPTIED QUEUE-SET LAST=FIRST FMGQ10: CLR (R1) ; SET THREAD WORD = 0 MOV R1,@CPFLST ; THREAD REQUEST IN MOV R1,CPFLST ; COMPRESS WAIT QUEUE RTS PC RTLN,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 = . MOV FMFRST,R1 ; CURRENT REQUEST LIST JSR PC,TSTDER ; TEST FOR DISC ERROR .ENDC MOV SORTLN,LENGTH(R1) ; SET LENGTH FOUND IN LIST JMP DEFA28 ; CREATE NEW FILE' ;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. ;* OTHERWISE, OPERATOR ACTION WILL BE REQUIRED. CRDC00 IS ;* ENTERED WITH INTERRUPTS MASKED. ;* ;* ;********************************************************************** ; ; CRDC00: INC S OF CURRENT REQUEST ; LPCNT: .=.+NLP+NLP ;INDEX INTO TEXT OF CURRENT REQUEST ; LPMAX: .=.+NLP+NLP ;MAXIMUM VALUE 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 ; 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 SUBROUTINES. ** 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 .IFNZ DRESDI MOV RLSECT,NEWSS ; SAVE RELATIVE SECTOR IN WHICH FOUND .ENDC CRBUSY(R3) MOV (SP)+,@#PSR ;RESTORE PREVIOUS PSR (ENABLE INTERRUPTS) MOV R0,CRDATA(R3) ;STORE ADDRESS OF DATA BUFFER .IFNZ BCD 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 THE LENGTH OF THE ;CURRENT L/P BUFFER BEING OUTPUT (WHICH ;IS NOT NECESSARILY THE SAME AS THE CALLER'S ;BUFFER LENGTH) ; LPBUF: .=LPSIZE+2*NLP+. ;BUFFERS FOR LINE PRINTER OUTPUT ; LPLIST: .WORD 1,1400,TYDONE,0,0,0,0 ;TTYOUT .WORD 1,1400,TYDONE,0,0,0,0 ; LISTS .WORD 1,1400,TYDONE,0,0,0,0 ; FOR .WORD 1,1400,TYDONE,0,0,0,0 ; ;* ** ;* 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,IOQTME BR DEFC40 ; CONTINUE WITH GOOD NEWS. ; ERRB08 = . MOV #8.,R0 ; REPORT ERROR TYPE 8 JMP ERRB99 ; ; .PAGE ; ; DELETE A FILE ; R1= PARAMETER LIST ADDRESS ; R2= FILE TYPE ; DELA00 = . MOV #IDCLR,NEWSS ; PROCESSES SUBROUTINE FOR DELETE BR DPUA00 ; DO IT ; ; PROTECT A FILE ; R1= PARAMETER LIST ADDRESS ; R2=  .IFNZ INEBC BR CRDC05 ; CRDC04: MOV #O26EBC,TABLE(R3) .ENDC ; CRDC05: .ENDC JSR PC,CRSIO ;OTHERWISE, START UP C/R MOV CRFRST(R3),R1 ;RESTORE LIST ADDRESS BR CRDB06 ; CRDC10: MOV #ERMSGE,-(SP) ;PUT ADDRESS OF ERROR MESSAGE ON STACK JSR PC,CRMSGE ;PRINT MESSAGE MOV #MXTIME,COUNT(R3) ;SET UP FOR MAXIMUM TIME DELAY .IFZ NCR-1  MESSAGES .=NLP*14.+LPLIST ; LPMOD: .WORD 1,$RES*256.+050000,0,0,LPTIME ;TIMER .WORD 1,$RES*256.+050000,0,2,LPTIME ; MODULE .WORD 1,$RES*256.+050000,0,4,LPTIME ; FOR .WORD 1,$RES*256.+050000,0,6,LPTIME ; DELAYS .=NLP*10.+LPMOD ; LPUNIT: .BYTE 3,0,0,0 ;VALID LOGICAL DEVICE ADDRESSES .=LPUNIT+NLP .EVEN .IFG NLP-1 ; LPIOLS: .WORD LPLIST ;ADDRESS OF  ** ;* ** ;* 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 DOES NOT DEQUEUE THE TIMER MODULE, IT ONLY 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 ; ; DO IT ; DPUA00 = . MOV FILEID(R1),R0 ; GET SUBJECT FILE ID NO. .IFZ DRESDI JSR PC,C ; . 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,8.(R5) ;STORE ADDRESS OF CRDLAY IN TIMER MODULE MOV R5,-(SP) ;ADDRESS OF TIMER MODULE ONTO STACK MOV #$1SEC,-(SP) ;REQUEST 1 SECOND DELAY JSR PC,IOQTME TST LINE PRINTER .WORD LPLIST+14. ;TTY MESSAGE I/O LISTS .WORD LPLIST+28. ;FOR QUICK ACCESS .WORD LPLIST+42. ; .=LPIOLS+NLP+NLP ; LPMDAD: .WORD LPMOD ;TIMER MODULE ADDRESSES .WORD LPMOD+10. ;FOR QUICK ACCESS .WORD LPMOD+20. ; .WORD LPMOD+30. ; .=LPMDAD+NLP+NLP .ENDC ; ; .IFNZ LPBACK ; LPTTY: .WORD 0 ;SWITCH FOR !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 ** ;* THE STACK BY THE CALLING PROGRAM. "DSRCH ; 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 MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; START UPDATE OF DIRECTORY MOV (SP)# (SP)+ BR CRDB05 .PAGE ;********************************************************************** ;* ** ;* C R I N T ** ;* ** ;* CARD READER INTERRUPT ROUTINE. THIS ROUTINE GETS ENTERED ** ;* FOR THE FOLLOWING REASONS: ** ;* $LINE PRINTER BACKUP BY TTY .WORD 0 ; .WORD 0 ; 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.,% ** ;* ** ;* 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 ** ;* DATE: 01.27.72 &+,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 = . MOV FMFRST,R1 ; ADDRESS OF CURRENT REQUEST JSR PC,TSTDER ; TEST FOR DISC ERROR MOV CRREAD,R3 ; ADDRESS OF ENTRY TST (R3) ; ENTRY DEFINED? .ENDC BE' ** ;* 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. ** ;* (0 .BYTE CR,LF .ASCII 'L/P 1 PARITY ERROR' .IFG NLP-1 .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 ) ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;********************************************************************** ; ; .DEF IOQTME,IOD*Q 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 ; PERFORM ON IT .ENDC MOV #CDILST,-(SP) ; UPDATE CORE DIR. IMAGE JSR PC,PFRITE ; EXIT 1-IGNORE ER+ ** ;* OUR MISSION, SHOULD WE DECIDE TO ACCEPT IT, IS TO DETERMINE ** ;* WHAT CAUSED THE INTERRUPT, AND TAKE CARE OF IT. ** ;* ** ;********************************************************************** ; CRINT1: $SAVE ;LET ROS SAVE THE WORLD .IFZ NCR-1 CLR R3 .ENDC .IFG , ;ADDRESSES OF EACH LINE PRINTER DATA BUFFER .WORD LPRD+22. .WORD 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' -QTM .REF QTIME ; ; IOQTME: MOV @#PS,-(SP) ;INHIBIT INTERRUPTS .IFZ $1145 MOV #340,@#PS .ENDC .IFNZ $1145 SPL 7 .ENDC CMP #1,@6(SP) ;SEE IF MODULE IS ALREADY QUEUED BEQ IOQA00 ;BRANCH IF IT ISN'T MOV R5,-(SP) ;OTHERWISE, RESET TIME DELAY MOV 8.(SP),R5 ;GET MODULE ADDRESS MOV 6(SP),4(R5) ;RESET TIMER.RORS .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 = . MOV FMFRST,R1 ; ADDRESS OF CURRENT REQUEST JSR PC,TSTDER ; TEST FOR DISC ERROR JSR PC,GFTYPE ; GET FILE TYPE .ENDC JMP DEFB00 ; FINISHED PROCESSING REQUEST ; ; /NCR-1 ;...FOR C/R # 1 MOV #0,R3 ; BR CRIA00 ; CRINT2: $SAVE ;......FOR C/R # 2 MOV #2,R3 ; .ENDC .IFG NCR-2 BR CRIA00 ; CRINT3: $SAVE ;.........FOR C/R # 3 MOV #4,R3 .ENDC .IFG NCR-3 BR CRIA00 ; CRINT4: $SAVE CRIA00 ;............FOR C/R # 4 MOV #6,R0 .EVEN .IFG NLP-3 .WORD 17.,0 .BYTE CR,LF .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.,1 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. ; ; IOQA00: MOV (SP)+,@#PS ;ENABLE INTERRUPTS JMP QTIME ;THEN GO TO QTIME AN2 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) ; CHECKPOINT FILE TYPE BEQ IDC010 ; NO ADD LGTH(R3),LGTH(R3) ; YES-DOUBLE LENGTH CL33 .ENDC ; CRIA00: 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 BEQ CRIB10 ;BRANCH IF NO .IFZ NCR-1 40 .BYTE CR,LF .ASCII 'L/P 1 ABORTED' .EVEN .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: 5D LET IT DO ITS THING ;(QTIME WILL EXIT TO CALLER 'CAUSE ; THE STACK NOW LOOKS LIKE: ; ; :MODULE ; :DELAY ; TOP ========> CALLER'S PC ; ; IODQTM: ADD #8.,2(SP) ;SET MODULE ADDRESS TO POINT TO JSR ADDR MOV #IOQB00,@2(SP) ;S6R 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 ; RETURN ; ; CLEARP IS THE PROCESS SUBROUTINE THAT WILL RESET THE ; PROTECT BIT IN AN ENTRY IN A DIRECTORY ; 7 ;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 .ENDC ; STATUS .IFG NC8 .WORD LPBUF ;ADDRESSES OF L/P PRINT BUFFERS .WORD LPBUF+LPSIZE .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 TORE ADDRESS OF AN RTS PC CLR 2(SP) ;CLEAR ERROR POINTER FOR CALLER RTS PC ;RETURN .END : 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: MOV (SP)+,PSR ; RESET PRIORITY LOCKOUT JSR PC,REPERR ; REPORT ERROR JSR PC,POPR ; RESTORE REGISTERS MOV (SP)+,(SP) ; PUT RETURN IN PR;R-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 HERE 'CAUSE A BRANCH WON'T REACH ; CRIB20: BIT #CRE< .=LPSTS+NLP+NLP ; LPCMD: .WORD CMD.1 ;ADDRESS OF L/P COMMAND 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 =; UPDATE LPTABL.001 02.08.72 .TITLE LPTABL ;********************************************************************** ;* ** ;* L I N E P R I N T E R C O N V E R S I O N T A B L E S ** ;* ** ;* ** ;* ASCLP = TO CONVERT INTERNAL ASCII TO LINE PRINTER EVEN ** >OPER 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 (SP)+ ; POP RETURN PC OFF STACK MOV #15.,R0 ; REPORT ERROR TYPE 15- DISCIO ERROR ; ERRB99 = ?RR,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: MOV R0,ERRCR(R3) ;ASSUME C/R ERROR AND SAVE STATUS @; LPFEED: .WORD LFRG.1 ;ADDRESS OF L/P LINE FEED REGISTER / L/P # 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: A;* PARITY ASCII. ** ;* EBCLP = TO CONVERT INTERNAL EBCDIC TO LINE PRINTER EVEN ** ;* PARITY ASCII. ** ;* ** ;* IN THE CASE OF EITHER TABLE, THE INPUT BYTE SERVES AS AN ** ;* INDEX INTO THE TABLE. ** ;* B . JSR PC,REPERR ; REPORT ERROR ERRBXX: JSR PC,GFTYPE ; GET REQUEST'S FILE TYPE JMP DEFB05 ; FINISH REQUEST ; ; ERRC09 = . MOV #9.,R0 ; REPORT ERROR TYPE 9 JSR PC,REPERR ; DO IT .IFZ DRESDI BR ERRBXX .ENDC .IFNZ DRESDI MOV #ERRCX9,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN TO DISCIO ; ERRCX9 = C .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,8.(R0) ;SET TIMEOUT ADDRESS TO CRDERR MOV R0,-(SP) MOV #$500MS,-(SP) ;SET UP 500 MS DELAY JSR PC,IOQTME ;START TIMER TST (SP)+ .IFZ NCR-1 ;SUPPRESS FURTHER INTERRD .WORD LPVC.1 ;L/P # 1 INTERRUPT VECTOR ADDRESS .WORD LPVC.2 ;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 ;********************************************************************** ;* ** ;* S T A R T O F E ** ;********************************************************************** .IFG NLP .DEF ASCLP .IFNZ INEBC .DEF EBCLP .ENDC NON = 240 ;NON = NON-PRINTABLE CHARACTERS ; ; ASCLP: .BYTE 000,201,202,003 ;CARRIAGE 000-003 .BYTE 204,005,006,207 ; CONTROL 004-007 .BYTE 210,011,201,213 ; CODES 010-013 .BYTE 300,215,216,017 ; CODES F . MOV FMFRST,R1 ; GET REQUESTS 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 ; UPON RETURN: ; R3 = ADDRESS OF ENTRY IF FOUND ; = 0, ENTRY NOT FOUND ; R4 = IFDGUPTS FROM C/R BIC #ENABLE,@#CRS.1 ; . .ENDC ; . .IFG NCR-1 ; . BIC #ENABLE,@CRS(R3); . .ENDC ; . JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ;* ;* AT THIS POINT, ONE FULL CARD HAS BEEN READ. IF THE 'READ ANOTHER ;* CARD' FLAH L P R N T R ** ;* ** ;* ** LPRNTR: MOV R0,-(SP) ;GUESS MOV R1,-(SP) ; WHAT MOV R2,-(SP) ; WE'RE MOV R3,-(SP) ; DOING MOV R4,-(SP) ; HERE MOV R5,-(SP) ; MOV 14.(SP),R0 ;GET ADDI 014-017 .BYTE NON,NON,NON,NON ; 020-023 .BYTE NON,NON,NON,NON ; 024-027 .BYTE NON,NON,NON,NON ; 030-033 .BYTE NON,NON,NON,NON ; 034-037 .BYTE 240,041,042,243 ; SP ! " # 040-043 .BYTE 044,245,246,047 ; $ % & ' 044-047 .BYTE 050,251,252,053 ; ' ) * + 050-053 .BYTE 254,055,056,257 ; , - . / 054-057 J OF ENTRY IF FOUND ; CONDITION CODES SET ON R3 ; ; NOTE: USES REGISTER 5 (R5) AS A WORK REGISTER. ; THIS SUBROUTINE IS ALSO CALLED BY ; COMPRS AND FLIST ; CDSRCH = . CLR R4 ; INITIALIZE IFD COUNTER MOV #-NCRLOC,R3 ; USED AS INDEX THRU CORE ; ; RESIDENT DIRECTORY. CDSR10: CMP R0,DOD+NCRLOC(R3) ; SEARCH CORE DIRECTORY FOR MATCH BEQ CDKG (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: MOV CRFRST(R3),R1 ;GET I/O LIST ADDRESS JSR PC,CRSIO ;OTHERWISE, START THE I/O CLR REPEAT(R3) ; CARD' FLAG LRESS OF LIST MOV DATA(R0),R1 ;GET ADDRESS OF DATA JSR PC,LPCHEK ;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 M .BYTE 060,261,262,063 ; 0 1 2 3 060-063 .BYTE 264,065,066,267 ; 4 5 6 7 064-067 .BYTE 270,071,072,273 ; 8 9 : ; 070-073 .BYTE 074,275,276,077 ; < = > ? 074-077 .BYTE 300,101,102,303 ; @ A B C 100-103 .BYTE 104,305,306,107 ; D E F G 104-107 .BYTE 110,311,312,113 ; H I J K 110-113 .BYTE 314,115,116,317 ; L M N O 114-117 .BYTE NSR30 ; 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,R5 ; ISOLATE CMPB R5,SYSTEM+1(R1) O JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ;* ;* THIS SECTION CLOSES OUT A 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 MOV CRFRP INC R3 CMP R3,#NLP BLT LPRA00 .ENDC MOV #3,R4 ;AT THIS POINT, THE L/P # IS NOT LEGAL ; LPRA10: MOV R4,ERROR(R0) ;THIS IS AN ERROR EXIT - THE REQUEST JSR PC,LPQERR ;GO QUEUE THE ERROR (IF THERE IS ONE) ; LPRA15: MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; THE MOV (SP)+,R3 ; YOU-KNOW-WHATS MOV (SP)+,R2 ; Q120,321,322,123 ; P Q R S 120-123 .BYTE 324,125,126,327 ; T U V W 124-127 .BYTE 330,131,132,333 ; X Y Z [ 130-133 .BYTE 134,335,336,137 ; \ ] ^ 134-137 .BYTE 047,101,102,303 ; ' A B C 140-143 L C .BYTE 104,305,306,107 ; D E F G 144-147 O A .BYTE 110,311,312,113 ; H I J K 150-153 W S .BYTE 314,115,116,317 ; L M N O 154R ; 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" AND ALSO THE ; DOD ON WHICH THE ENTRYSST,R0 ;GET LIST ADDRESS =====>R0 MOV CRDATA,R1 ;GET DATA ADDRESS =====>R1 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 CRCA01 .ENDC .ENDC ASR NREAD(R1) ;THEN CONVERT NO. BYTES TO NO. WORDS .IFNZ BCD .IFNZ $RASM BRT . MOV (SP)+,R1 ; . MOV (SP)+,R0 ; . MOV (SP)+,(SP) ;PUT PC ON TOP OF 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 U-157 E E .BYTE 120,321,322,123 ; P Q R S 160-163 R .BYTE 324,125,126,327 ; T U V W 164-167 .BYTE 330,131,132,NON ; X Y Z 170-173 .BYTE NON,NON,NON,NON ; 174-177 ; ; ; .IFNZ INEBC ; ; EBCLP: .BYTE 000,201,202,003 ; 000-003 .BYTE 204,005,006,207 ; 004-007 .BYTE 210,011,012,213 ; 010-013 V IS PART OF. ; R0= FILE ID ; R1= PARAMETER LIST ADDRESS ; 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 = . DEC R0 ; CALCULATE (FILE ID #-1)/12 CLR CRRSCT ; W 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 .ENDC ; . .IFNZ $1145 ; . SPL 7 ; . .ENDC ; . X LPRA30 ;BRANCH IF ILLEGAL CMP R2,#NLPRTY BLE LPRA40 ;BRANCH IF IT'S OK ; LPRA30: MOV #NLPRTY,R2 ;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 Y .BYTE 300,NON,NON,NON ; 014-017 .BYTE NON,NON,NON,NON ; 020-023 .BYTE NON,NON,NON,NON ; 024-027 .BYTE NON,NON,NON,NON ; 030-033 .BYTE NON,NON,NON,NON ; 034-037 .BYTE NON,NON,NON,NON ; 040-043 .BYTE NON,NON,NON,NON ; 044-047 .BYTE NON,NON,NON,NON ; 050-053 .BYTE ZUSE AS RELATIVE SECTOR COUNTER 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 ASL R0 ; PERFORM ASL R0 ; MULTIPLICATION ADD R0,R3 ; BY 5 ADD R3,R3 [ MOV (R0),R2 ;DEQUEUE THE REQUEST MOV R2,CRFRST ;SAVE ADDRESS OF NEXT LIST BNE CRCA20 ;BRANCH IF QUEUE ISN'T EMPTY ; CRCA10: MOV #CRFRST,CRLAST ;CLEAN UP QUEUE ; 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 MOV CRFRST(R\INEBC .=.-4 BR LPRA10 .ENDC ; LPRA45: MOV #11.,R4 BR LPRA10 ; LPRA50: JSR PC,LPLEVL ;NOW, DETERMINE THE INDEX OF THE .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 ] NON,NON,NON,NON ; 054-057 .BYTE NON,NON,NON,NON ; 060-063 .BYTE NON,NON,NON,NON ; 064-067 .BYTE NON,NON,NON,NON ; 070-073 .BYTE NON,NON,NON,NON ; 074-077 .BYTE 240,NON,NON,NON ; SP 100-103 .BYTE NON,NON,NON,NON ; 104-107 .BYTE NON,NON,NON,056 ; . 110-113 .BYTE 074,050,053,^ ; DOUBLE FOR WORD ADDRESSING ADD #BUFFER,R3 ; ACTUAL ADDRESS OF ENTRY IN BUFFER MOV R3,CRREAD ; SAVE IT MOVB SYSTEM+1(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 RTS PC ; RETURN .ENDC ; ; ; _3),R0 ;GET LIST ADDRESS =====>R0 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 ;BRANCH IF ALPHANUMERIC AND NO ASSEMBLER .ENDC .IFNZ $RASM ;.....OR..... BEQ CRCA01 ;BRANCH IF ALPHANUMERIC AND AN ASSEMBLER `WE HAVE BEQ LPRA45 ;AN ALTERNATE. BRANCH IF NO. DEC R4 ; 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 aNON ; < ( + 114-117 .BYTE 246,NON,NON,NON ; & 120-123 .BYTE NON,NON,NON,NON ; 124-127 .BYTE NON,NON,041,044 ; ! $ 130-133 .BYTE 252,251,273,NON ; * ) ; 134-137 .BYTE 055,257,NON,NON ; - / 140-143 .BYTE NON,NON,NON,NON ; 144-147 .BYTE NON,NON,336,254 ; ^ , 150-153 .BYTE 245,NON,276,077 ; % b ; CREATE WILL BUILD A FILE DIRECTORY ENTRY ; R1= REQUEST LIST ADDRESS ; 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 SYSTEM+1(R1),PDVCE(R3) ; SET LOGICAL DEVICE NO. MOVB R2,FTYPE(R3) ; SET FILE TYPE .IFNZ DRESDI TSc.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 , MOV #LF*256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 MOV #340,@#PSR ;INHIBIT INTERRUPTS d ; LPRA53: MOV @#PSR,-(SP) ;PRIORITY QUEUE. INHIBIT INTERRUPTS. .IFZ $1145 MOV #340,@#PSR .ENDC .IFNZ $1145 SPL 7 .ENDC DEC (R0) ;SEE IF LIST IS THREADABLE BNE LPRA80 ;BRANCH IF NO, CAUSE THAT'S A NO-NO MOV R0,@LPLAST(R2) ;QUEUE IT - MOV R0,LPLAST(R2) ;QUEUE IT ! MOV ACTIVE,R4 ;SEE IF CALLER IS A TASK e> ? 154-157 .BYTE NON,NON,NON,NON ; 160-163 .BYTE NON,NON,NON,NON ; 164-167 .BYTE NON,NON,072,243 ; : # 170-173 .BYTE 300,047,275,042 ; @ ' = " 174-177 .BYTE NON,101,102,303 ; A B C 200-203 * .BYTE 104,305,306,107 ; D E F G 204-207 * .BYTE 110,311,NON,NON ; H I 210-213 * .BYTE NON,NON,NON,NON ; fTB 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: RTS PCg .ENDC ; . .IFNZ $1145 ; . SPL 7 ; . .ENDC ; . MOV (R0),R2 ;SAVE ADDRESS OF NEXT LIST MOV R2,CRFRST(R3) ;DEQUEUE THIS REQUEST BNE CRCA20 ;BRANCH IF SOMEONE'S LEFT IN QUEUE ; CRCA10: MOV RO,R4 ;SO, CLEAN IT UP. ADD #CRFRST,R4 MOV R4,CRLAST(R3) ; CRCA20: h BEQ 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 ; ; THIS SECTION RETURNS TO THE CALLER (IF EXi 214-217 * L .BYTE NON,312,113,314 ; J K L 220-223 * O C .BYTE 115,116,317,120 ; M N O P 224-227 * W A .BYTE 321,322,NON,NON ; Q R 230-233 * E S .BYTE NON,NON,NON,NON ; 234-237 * R E .BYTE NON,NON,123,324 ; S T 240-243 * .BYTE 125,126,327,330 ; U V W X 244-247 * .BYTE 131,132,NON,NON ; Y Z j ; RETURN TO CALLER ; ; GFTYPE WILL GET AND ISOLATE THE FILE TYPE ; FROM A FLMGMT REQUEST ; R1= REQUEST'S LIST ADDRESS ; UPON RETURN: ; R1 = UNCHANGED ; R2= FILE TYPE ; GFTYPE = . MOVB FLTYPE(R1),R2 ; GET FILE TYPE BIC #177600,R2 ; ISOLATE RTS PC ; RETURN ; ; ; ; REPERR IS A FLMGMT INTERNAL SUBROUTINE USED TO REPORT ; ERROR INFORMATkMOV (SP)+,@#PSR MOV CRTASK(R3),R4 ;SET R4 = CALLER'S TASK NO. .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/OlIT 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)+,14.(SP) ;GOOD, HE IS A TASK, PUT HIS PSR ON STACK MOV (SP)+,R5 ;RESTORE MOm 250-253 * .BYTE NON,NON,NON,NON ; 254-257 .BYTE NON,134,NON,NON ; \ 260-263 .BYTE 333,335,NON,NON ; [ ] 264-267 .BYTE NON,NON,NON,NON ; 270-273 .BYTE NON,NON,NON,NON ; 274-277 .BYTE NON,101,102,303 ; A B C 300-303 * .BYTE 104,305,306,107 ; D E F G 304-307 * .BYTE 110,311,NON,NON ; H I nION. ; R0 = ERROR TYPE ; R1 = PARAMETER LIST ADDRESS ; REPERR = . MOVB R0,ERROR(R1) ; SET ERROR TYPE IN LIST MOVB ERRTSK(R1),-(SP) ; TASK NO. TO STACK BEQ REPE10 ; NONE .IFNZ DPRTY CLR -(SP) ; USE PRIORITY IN TASK TABLE .ENDC .IFNZ ARG MOV R1,-(SP) ; SEND FLMGMT LIST ADDRESS AS AN ARGUMENT .ENDC CLR -(SP) o COMPLETE SUBROUTINE ADDRESS MOV $EXIT(R1),R0 ;PUT IN R0 CMP R0,#ROSTOP ;CHECK FOR VALIDITY BLOS CRCB00 CMP R0,#HICORE BHIS CRCB00 MOV R2,-(SP) MOV R3,-(SP) ;ADDRESS LOOKS GOOD, SO SAVE THE MOV R4,-(SP) ;VOLATILE REGISTERS MOV R5,-(SP) JSR PC,(R0) ;AND LINK TO THE I/O COMPLETE ROUTINE MOV (SP)+,R5 ;RESTORE REGISTERS MOpV (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 QSAVEI SUSPEND 'IM JMP DSPTCH ;THEN GO TO THE SYSTEM DISPATCHER ; LPRA70: MOV R4,ERROR(R0) ;STORE ERROR CODE MOV (SP)+,@#PSR ;RESTORE Cq 310-313 * .BYTE NON,NON,NON,NON ; 314-317 * U .BYTE NON,312,113,314 ; J K L 320-323 * P C .BYTE 115,116,317,120 ; M N O P 324-327 * P A .BYTE 321,322,NON,NON ; Q R 330-333 * E S .BYTE NON,NON,NON,NON ; 334-337 * R E .BYTE NON,NON,123,324 ; S T 340-343 * .BYTE 125,126,327,330 ; U V W X r ; IMMEDIATE RETURN REQUESTED JSR PC,QUEUE ; QUEUE ERROR TASK REPE10: TST (SP)+ ; IGNORE ERROR RTS PC ; RETURN ; ; .PAGE ; INIDSC = . .WORD 1 ; THREAD WORD .WORD INITD ; ENTRY POINT .WORD 0,0 .BYTE STKSZ ; STACK SIZE .BYTE 1 ; RUN AT PRIORITY 1 .WORD 0 .IFNZ ARG .WORD 0 sV (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)+ ;IGNORE ERRORS ; ; BEFORE WE EXIT, WE NEED TO SEE IF THERE ARE ANYtALLER'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 ;********************************************************************** ;* ** ;* AT THIS POINT, THE REQUEST JUST QUEUED IS THE ONLY ** ;* REQUEST IN THE QUEUE, SO W 344-347 * .BYTE 131,132,NON,NON ; Y Z 350-353 * .BYTE NON,NON,NON,NON ; 354-357 * .BYTE 060,261,262,063 ; 0 1 2 3 360-363 .BYTE 264,065,066,267 ; 4 5 6 7 364-367 .BYTE 270,071,NON,NON ; 8 9 370-373 .BYTE NON,NON,NON,NON ; 374-377 .ENDC .ENDC .END v .ENDC .BYTE 0 .BYTE $INITD ; TASK NUMBER .WORD 0 ; STACK POINTER .=.+STKSZ+STKSZ ; RESERVE SPACE FOR STACK ; ; ; ; 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 w 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/O GOING), JSR PC,RELTSK ;THEN LET THE OVERLAY MONITOR RELEASE HIxE GONNA START THE OUTPUT. ** ;* INTERRUPTS ARE INHIBITED ON ENTRY, AND THE REGISTERS ** ;* ARE SET AS FOLLOWS: ** ;* ** ;* R0 = ADDR(LIST) ** ;* R1 = ADDR(DATA) ** ;* R2 = PRIORITY INDEX ** ;* R3 = L/P INDEX yV (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 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 JSR R5,POPR ; RESTORE REGISTERS z0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; RESERVE ROOM FOR BLANK ; ; FILE TYPES .=FLSIZE+$FTMAX+$FTMAX ; USE ONLY SPACE NEEDED ; ; ; 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 ; BUFFER ADDRESS{S 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 CRMDAD(R3),-(SP) JSR PC,IODQTM ;DEQUEUE TIMER TST | ** ;* ** ;********************************************************************** ; ; LPRB00: MOV PC,LPBUSY(R3) ;SET L/P BUSY FLAG MOV (SP),@#PSR ;ENABLE INTERRUPTS MOV R1,LPDATA(R3) ;SAVE DATA BUFFER ADDRESS MOV $EXIT(R0),LPIOCM(R3) ;SAVE EXIT ADDRESS MOV SYSTEM(R0),LPTASK(R3) CLR LPCNT(R3) } FLID10: BIC #177600,R5 ; ISOLATE FILE TYPE MOV #OB3,R4 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)~ ; TTYBUF = . .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 = . JSR PC,MASK ; LOCK-OUT ALL OTHER TASKS MOV #-$FTMAX-$FTMAX,R0 ; INDEX FOR LOOP CLR R1 ; USED TO ACCUMULATE FNEXT'S MOV FLSIZE,R2  (SP)+ JMP (R5) ;AND EXIT TO RESTOR ; ; ; CRCB10: MOV R2,R1 ;BEFORE WE START ANYTHING, MAKE SURE CRCB15: MOV DATA(R1),R0 ;THE LIST IS STILL VALID, ETC. JSR PC,CRCHEK BNE CRCB20 ;BRANCH IF NO GOOD MOV R0,CRDATA(R3) JSR PC,CRSIO ;OTHERWISE, START I/O JMP (R5) ; ; CRCB20: MOV R4,ERROR(R0) ;STORE ERROR CODE IN USER'S LIST BR  ;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: .ENDC CLR LPRTRY(R3) ;SET NO. ATTEMPTS TO ZERO ; LPRB20: JSR PC,LPRSET ;RESET THE LINE PRINTER ,R5 ; CKSAVE IF REQUIRED MOV #OB6,R4 JSR PC,BIN2OC 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  ; USE TO ACCUMULATE DEC R2 ; FLAST'S INIA10: MOV R1,FNEXT+$FTMAX+$FTMAX(R0) ; SET FNEXT THIS TYPE MOV R1,FINIT+$FTMAX+$FTMAX(R0) ; SET INITIAL VALUE THIS TYPE MOV R2,FLAST+$FTMAX+$FTMAX(R0) ; SET FLAST THIS TYPE ADD FLSIZE+$FTMAX+$FTMAX(R0),R1 ; CALCULATE NEXT FNEXT ADD #2,R0 ; BUMP REGISTER BGE INIA20 ; FINISHED ADD FLSIZE+$FTMAX+$FTMAX(R0),R2 ; CALCULATE NEXCRCLOS ;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 ;* ;********************************************************************** ; CRID00: .IFNZ BIN .IFNZ BCD TST CRMODE(R3) ;SEE IF WE'RE IN THE BIN 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 MOV #340,@#PSR ;NEED TO INHIBIT BEFORE I/O CAN START ; LPRB35: ;FIRST LINE OF TEXT. JSR PC,LPSIO ;OTHERWI .IFNZ $BATCH TST FLTYPE ; ROS OR BATCH BMI PRNT10 ; 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 FLAST BR INIA10 ; DO FOR REST OF TABLE INIA20: MOV FLAST,FNEXT ; SET TYPE 0 FULL AS IT SHOULD ; ; ALWAYS BE. MOV FLAST,FINIT MOV #AULIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; DO IT-IGNORE PROCESSING ERROR ; ; OTHER THAN DISCIO PRINTOUT INIA25: CMP #1,AULIST ; I/O COMPLETE BNE INIA25 ; SPIN UNTIL COMPLETE ; ARY 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 TELL 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. SE, START I/O CLR R4 BR LPRA60 ;THEN GO SET UP FOR EXIT ; LPRB40: JMP LPIE00 .PAGE ;********************************************************************** ;* ** ;* L P I N T ** ;* ** ;* LINE PRINTER INTERRUPT ROUTINE, ENTERED WHEN THE PRINTER T R5 = BINARY NUMBER ; R4 = DESTINATION END ADDRESS ; 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  ; NOTE: CAN DO SINCE MASKED MOV #FILE,R0 ; ADDRESS OF CORE DIRECTORY USER AREA INIA26: CLR (R0)+ ; CLEAR USER'S AREA OF CORE DIR. CMP R0,#CDEND ; FINISHED? BLT INIA26 ; NO MOV #CDILST,-(SP) ; PUT INITIALIZED CORE DIR. IMAGE JSR PC,PFRITE ; ON DISC INIA27: CMP #1.,CDILST ; I/O COMPLETE? BNE INIA27 ; SPIN UNTIL COMPLETE ; ;* ;* 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 ----------- ;* ;* .IFNZ BIN MOV CRDATA(R3),R1 ;GET ADDRESS OF DATA BUFFER ADD #4,R1 ADD COUNT(R3),R1 ;ADD INDEX I ** ;* IS READY TO ACCEPT ANOTHER LINE OR IF AN ERROR WAS ** ;* DETECTED. ** ;* ** ;********************************************************************** ; LPINT0: $SAVE ;CALL SAVE TO TAKE CARE OF THINGS .IFZ NLP-1 CLR R3 .ENDC .IFGE NLP-2 MOV #0,R3 ;SET L/P ASR R5 DEC R0 ; MORE TO GO? BGT B2LOOP ; 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,PR ; NOTE: CAN DO SINCE MASKED .IFNZ DRESDI MOV #-128.,R0 ; INDEX TO CLEAR BUFFER INIA30: CLR BUFFER+128.(R0) ; SET BUFFER ADD #2,R0 ; EQUAL BLT INIA30 ; ALL ZEROS MOVB #1.,DEXIT ; USE EXIT TYPE 1 MOVB #UDLEV,DLVL ; USE DISC PRIORITY 1 MOVB #1.,IOFCN ; SET FUNCTION TO WRITE CLR R1 ; INDEX THRU PHYDEV NTO BUFFER MOV BYTE(R3),R2 BEQ CRID10 DEC R2 BEQ CRID40 DEC R2 BEQ CRID50 BR CRID60 ; CRID10: MOV @CRB1(R3),R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; DATA ASL R4 ; INTO ASL R4 ; POSITION ASL R4 ; .ENDC ;  INDEX TO ZERO (FIRST L/P) BR LPIA00 ; LPINT2: $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: $SAVE ;ET CETERA MOV #4,R3 .IFGE NLP-4 BR LPIA00 ; LPINT6: $SAVE ;...AND ET CETERA MOV #6,R3 .ENDC .ENDC .ENDC TBUF JSR PC,PRINT ; FILE LIST MOV #HDR3,PRTBUF 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,PRIINIA40: MOV PHYDEV(R1),R2 ; GET A PHYSICAL DEVICE DESCRIPTOR BMI INIA70 ; DEVICE NOT AVAILABLE BIC #170377,R2 ; ISOLATE TYPE CMP R2,#400 ; TYPE 1?-DISC DEVICE BNE INIA70 MOVB PHYDEV(R1),DBUF ; DOD FILE ID TO INC DBUF ; INITIALIZE ASR R1 ; LOGICAL DEVICE MOVB R1,DEVNO ; TO LIST CLR RLSECT ; ZERO RELATIVE SECTOR 0 .IFNZ $1145 ; ASH R4,4 ; .ENDC ; MOV R4,(R1) ;STORE BINARY DATA ; CRID20: INC BYTE(R3) .ENDC ; CRID30: 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)  ; ; LPIA00: .IFZ $1145 ;CLEAR THE INTERRUPT INHIBIT MOV #LPINH*32.,@#PSR ;INHIBIT INTERRUPTS AT AND BELOW L/P .ENDC .IFNZ $1145 SPL LPINH .ENDC MOV LPRIOR(R3),R2 ;GET CURRENT REQUEST PRIORITY LEVEL MOV LPFRST(R2),R0 ;GET I/O LIST ADDRESS MOV LPDATA(R3),R1 ;GET DATA BUFFER ADDRESS JSR PC,LPSTAT ;GET L/P STATUS BNE LPRB40 ;BRANT ; FORM FEED FRINT DEVICE MOV #BTCH1,PRTBUF JSR PC,PRINT ; 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 ;  FIRST INIA50: MOV #DLIST,-(SP) ; DISC LIST TO STACK JSR PC,PFRITE ; ZERO 1 SECTOR DISC DIRECTORY INIA55: CMP #1,DLIST ; I/O COMPLETE? BNE INIA55 ; SPIN ; ; NOTE: CAN DO SINCE MASKED INC RLSECT ; GET READY FOR NEXT SECTOR OF ; ; DISC DIRECTORY INITIALIZATION CMP #9.,DERRWD ; DO COMPLETE DIRECTORY YET? BNE INIA50 ;  ;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 NO 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 NCH 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 ;MUST BE EBCDIC AT THIS POINT BR LPIA06 ; LPIA03: JMP LPIE00 ; LPIA04: .ENDC MOV #ASCLP,R2 ;INTERNAL FORMAT IS ASCII .IFNZ INEBC ; LPIA06: .ENDTOBUFR = . MOV R1,-(SP) MOV #ASCII,-(SP) EMT 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 NO-KEEP GOING INIA60: INC R1 ; BUMP LOGICAL DEVICE CMP R1,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 = . MOVB #3,DEXIT ; SET BACK EXIT TYPE 3 .ENDC MOV #TTY; INTO ASL R4 ; BIT ASL R4 ; POSITIONS ASL R4 ; 4-15 SO WE .ENDC ; CAN GET THE .IFNZ $1145 ; MOST SIGNIFICANT ASH R4,4 ; 8 BITS OF CRB1 .ENDC ; DATA CLR R0 BISB R4,R0 ;SET R4 = BITS 0-3 OF CRB1C 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 HERE (GO TO RESTOR) ; LPIA10: MOV @#PSR,-(SP) ;SAVE CURRENT CPU STATUS LEVEL MOV LPRIOR(R3),R2 ;GET PRIORITY INDEX .IFZ $1145 ;NO DATA LEFT IN USER'S BUFFER MOV #3 #DLIST,-(SP) EMT DISCIO ; READ ONE SECTOR TST DERRWD ; 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 LST,-(SP) ; TELL OPERATOR FINISHED JSR PC,TTYOUT JMP EXIT ; EXIT FROM TASK ; ; EXIT WILL UNMASK TASK LOCKOUT ; .END  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 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 040,@#PSR ;SO, INHIBIT INTERRUPTS SO'S WE CAN .ENDC ;DEQUEUE THE REQUEST .IFNZ $1145 SPL 7 .ENDC 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 ;OTHERWISE, PLACE THIS PRIORITY'S ADD #LPFRST,R4 ;QUEUE IN THE NOMINAL STATE (NO ENTRIES) MOV R4,LPLAST(R2) ; LPIA20: MOV  RLSECT ; YES/BUMP RELATIVE SECTOR CMP #31.,RLSECT ; SEARCHED 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 ; ; RETURN TO FLMGMT ; ; .END 0 X1 X2 X3 CLR BYTE(R3) DEC MXCNT(R3) JMP (R5) ;EXIT TO RESTOR .ENDC .PAGE ;********************************************************************** ;* ;* ;* 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.).#1,(R0) ;SET LIST REASY MOV (SP)+,@#PSR ;UN-INHIBIT THE INTERRUPTS 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  MOV #BENAME,-(SP) ; ASCII STRING ADDRESS MOV R2,-(SP) ; ADDRESS 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 ELEMENTV MO R1T,ASPL#L V MO R0T,RSPF#L V MO 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 )+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  ;* .IFNZ BCD ; CRIE00: INC COUNT(R3) ;INCREMENT CHARACTER (COLUMN) COUNT CMP COUNT(R3),#1 ;IS THIS THE FIRST COLUMN? BNE CRIE15 ;BRANCH IF NO 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 ;THE;CORE CAN BE RELEASED .ENDC ; LPIA25: CMPB TYPE(R0),#2 ;WAS IT AN EXIT 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 TIM TYHPE TST (R1)+ MOV BETPTB(R1),BETYPE+4 TST (R1)+ 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) 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 MO R3 R CL 1 P-NL FZ.I : ITINLP NTPI.L CTSE.C ; ; * ********************************************************************;*^N GO SET 'READ ANOTHER CARD' FLAG .ENDC ; CRIE10: CMP R4,#$026 ;026 CONTROL COMMAND? BEQ CRIF00 ;BRANCH IF YES .IFNZ EXEBC CMP R4,#$029 ;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 E HAS COME TO JSR TO THE MOV R3,-(SP) ;I/O COMPLETE SUBROUTINE JSR PC,@LPIOCM(R3) MOV (SP)+,R3 ;RESTORE L/P INDEX AND R5 MOV (SP)+,R5 MOV LPRIOR(R3),R2 ;RESTORE PRIORITY INDEX ; ; ; THIS SECTION CHECKS TO SEE IF ANYBODY ELSE IS WAITING FOR ; THIS LINE PRINTER. IF SOMEONE IS, THEN THE NEW I/O IS ; INITIATED. ; ; LPIB00: MOV #1,R2 ;START WITH TOP PRIORITY .IFZ NLPRTY+ ; PUT IN ELEMENT STATUS MOV STTBL(R1),BESTAT+4 TST (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 * * ;* * * E.IM TONTIZALIIAITINM TEYS SATD 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 PNELIZBE 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 TABLE ADDRESS MOV CRDATA(R3),R1 ;GET DATA BUFFER ADDRESS ADD #4,R1 ADD COUNT(R3),R1 ;ADD CHARACTER INDEX MOVB (R2),-(R1) ;MOVE CONVERTED CHARACTER TO CALLER'S BUFFER DEC MXCNT(R3) BR CRID30 ; CRIE20-1 ;CODE FOR ONLY ONE PRIORITY LEVEL * TST LPFRST(R3) * BEQ LPID00 ;BRANCH IF NOBODY IS IN QUEUE * MOV R3,R2 * .ENDC ******* .IFNZ NLPRTY-1 ;NOW, DO THE SAME THING AGAIN, **** JSR PC,LPLEVL ;BUT FOR > 1 PRORITY LEVEL * MOV #NLPRTY,R4 ;R (R1)+ MOVB MNTHTB(R1),DATE2+2 MOVB BYEAR(R2),R1 ; GET BINARY 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 ;* * * ;* * ********************************************************************;* E AG.P PC S RT T XI END AERETAMAR PORRR EFF OOP;P + P)(S T TS : 00QALP ; K AS TORRR EHE TUEUE;Q UEUE,QPC R JS ) SP-( R CL ) SP-( R CL ) SP-( R CL D IEIFECSPT NOS ISKTAR ROERN AIFH NCRA;B 00QALP Q BE P)(S T TS ERMBNUK V: MOV CRFRST(R3),R1 ;EOD READ - GET ADDRESS OF LIST MOV #7,ERROR(R1) ;SET EOD ENCOUNTERED ERROR CODE INC IGNORE(R3) ;SET 'IGNORE CARD' FLAG JMP (R5) ; ; 026 CONTROL CARD READ. SET CONVERSION TABLE ADDRESS UP. ; CRIF00: .IFNZ INEBC MOV CRFRST(R3),R0 ;GET I/O LIST ADDRESS TSTB LEVEL(R0) ;TEST LEVEL TO DETERMINE MODE BNE CRIF20 ;1 = EBCDIC .ENDC 2 = INDEX FOR TOP PRIORITY * ; * LPIB10: ; * TST LPFRST(R2) ;IS THERE A REQUEST FOR THIS * BNE LPIB20 ;PRIORITY LEVEL? BRANCH IF YES * TST (R2)+ ;INCREMENT INDEX * .IFZ $1145 * DEC R4 ; START SECTOR MOV #SS,R4 JSR PC,BIN2OC MOV BLGTH(R2),R5 ; LENGTH MOV #LG,R4 JSR PC,BIN2OC MOV #BTCHBF,PRTBUF JSR PC,PRINT ; PRINT ELEMENT INFO. JMP FLBA15 ; NEXT---- ; .ENDC ; .END R1,R2 ; LPNA10: MOV R0,(R1)+ CLR (R0)+ ;IN THE PRIORITY QUEUES CMP R0,R2 BLO LPNA10 RTS PC .CSECT .ENDC .END  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 CRIF30: MOV CRFRST(R3),R0 ;GET I/O LIST ADDRESS .IFNZ INEBC TSTB LEVEL(R0)  * BGT LPIB10 ;AND GO BACK FOR ANOTHER * .ENDC * .IFNZ $1145 * SOB R4,LPIB10 .ENDC BR LPID00 ; * LPIB20: ; * .ENDC ; ATAS TORRR EET;G) SP,(0)(RSKRTER VBMO ) SP-( R CL : RRQELP ; ; * ********************************************************************;* * * ;* * * T.IS L/O IHE TOFS ESDRADE THN AINTCOT US MR0, RYNT EON ;* * *. ONTICUXE EOR FSKTAR ROERE THS UEUE QNETIOUBRSUE TLIT LISTH ;* * * R R E Q P L ;* * * R ;TEST FOR INTERNAL FORMAT TYPE BNE CRIF40 ;BRANCH IF EBCDIC .ENDC MOV #O29ASC,TABLE(R3) ;OTHERWISE, SET FOR 029-ASCII BR CRIF10 .IFNZ INEBC ; CRIF40: MOV #O29EBC,TABLE(R3) ;029-EBCDIC BR CRIF10 .ENDC .ENDC .ENDC .PAGE ;********************************************************************** ;*  THIS POINT, THERE IS AN ENTRY IN THE QUEUE, AND R2 POINTS ; TO IT. ; MOV LPFRST(R2),R0 ;DATA I/O LIST ADDRESS MOV DATA(R0),R1 ;AND DATA BUFFER ADDRESS JSR PC,LPCHEK ;DOUBLE CHECK VALUES BEQ LPIC00 ;BRANCH IF ALL'S WELL MOV #10.,ERROR(R0) ;TSK, TSK. SOMEBODY DID SOMETHING BR LPIA10 ;WHILE IT WAS IN QUEUE ; ; ; REQUEST IS OK, BEGIN PREPARATIONS FOR MESSAGE OUTPUT ; ; LPIC00: ;* * ********************************************************************;* 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 0K ** ;* C R C H E K ** ;* ** ;* 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:  MOV R1,LPDATA(R3) ;SAVE VOLATILE STUFF: DATA ADDRESS MOV $EXIT(R0),LPIOCM(R3) ; I/O COMPLETE MOV R2,LPRIOR(R3) ; PRIORITY INDEX MOV SYSTEM(R0),LPTASK(R3) ;STORE THE TASK NUMBER OF CLR LPCNT(R3) ;THE REQUESTING PROGRAM MOV #ASCLP,R2 ; MOV (R1),LPMAX(R3) ; NWORD .I<=E B'TAN CO. N/P;L R3 T TS 1 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 ;* * * G ** ;* ** ;* R1 = ADDR(LIST) ** ;* R0 = ADDR(DATA) ** ;* R3 = C/R INDEX ** ;* JSR PC,CRCHEK ** ;* BNE ERROR ;R4 = ERROR CODE ** ;* FNZ 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, CONVERT 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 ;* * * 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 ;* * * ;* * * C ** ;* ALL REGISTERS USED BY CRCHEK ARE SAVED AND RESTORED. ** ;* ** ;********************************************************************** ; ; CRCHEK: CLR R4 CMP #ROSTOP,R1 ;TEST FOR LEGAL I/O LIST ADDRESS BHIS CRDW19 ;BRANCH IF ILLEGAL CMP R1,#HICORE BHIS CRDW19 ;BRANCH IF ADDRESS IS BEYOND CORE  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 .IFZ NLP-1 MOV #LPMOD,-(SP) .ENDC JSR PC,IODQTM TST (SP)+ JMP (R5) ;EXIT TO RESTOR .PAGE ;************************************************************* F F O P L / N O P L ;* * * ;* * ********************************************************************;* 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?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 CMP #ROSTOP,$EXIT(R1) ;CHECK I/O COMPLETE ADDRESS BHIS CRDW03 ;BRANCH IF ADDRESS IS IN ROS CMP #HICORE,$EXIT(R1) ;OR OUTSIDE AVAILABLE CORE ; CRDA********* ;* ** ;* THIS SECTION GETS ENTERED FROM THE INTERRUPT ROUTINE IF ** ;* A DEVICE ERROR HAS BEEN DETECTED. ONLY TWO ERROR ** ;* CONDITIONS ARE CONSIDERED: 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 AT 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 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 ;20: CMP #ROSTOP,R0 ;NOW, MAKE SURE DATA ADDRESS IS VALID BHIS CRDW04 ;BRANCH IF IT'S IN ROS CMP R0,#HICORE BHIS CRDW04 ;OR OUTSIDE AVAILABLE CORE MOV (R0),R2 ;GET WORD COUNT BEQ CRDW05 ;BRANCH IF ZERO 'CAUSE IT'S NO GOOD BGT CRDA30 NEG R2 ;SET IT +++++ (PLUS, THAT IT) ASL R2 ;BINARY MODE NWORD = WORDS, NEED BYTES ; CRDATEMPTS, ** ;* 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 BECOMES READY DURING THIS PERIOD, THEN I/O ** ;* WILL CONTINUE. ** ;* ** ;********************************************* 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#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 730: ADD R0,R2 ;TEST VALIDITY OF DATA BUFFER ADDRESS CMP R2,#HICORE ;WHEN ADDED TO NWORD BHIS CRDW05 ;BRANCH IF WE WENT OUT OF CORE ; CRKX00: TST R4 RTS PC ; CRDW05: INC R4 CRDW04: INC R4 CRDW03: INC R4 CRDW02: INC R4 INC R4 BR CRKX00 CRDW19: MOV #9.,R4 BR CRKX00 .PAGE ;****************************************** ; ; 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 LPIE10 ;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) ;EXIR 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 D AD 1 P-NL FG.I K ACSTM RO FSSREDD AERFFBUA AT DET;G R4),SP2( V MO : GEMSLP ; ; * ********************************************************************;* * * 3***************************************************** ;* ** ;* C R T I M E ** ;* ** ;* THIS ROUTINE IS ENTERED WHENEVER AN EXPECTED CARD ** ;* READER INTERRUPT IS NOT RECEIVED. AN APPROPRIATE ** ;* OPERATOR ACTION MESSAGE IS PRINTED, AND THE C/R ** ;* STT 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 ERROR 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 ;* * * . 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 ;* * * /ATUS IS TESTED EVERY SECOND THEREAFTER ** ;* ** ;********************************************************************** ; ; ;CRTIME IS ENTERED FROM TIMER ROUTINES CRTIME: ;R1 POINTS TO THE TIMER MODULE LIST MOV 6(R1),R3 ;SET R3 = C/R INDEX MOV @CRS(R3),R0 BIS #4,R0 ;SET BIT 2 = 1 TO SIGNAL C/R ERR ;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 MOV R4,-(SP) MOV #LPTIME,JSRSUB(R4) MOV #$1SEC,-(SP) ;STORE ONE SECOND DELAY JSR PC,IOQTME ;AND GO START THE TIMER TST (SP)+ ; ;* * * 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 ;* * * ;* * ************+OR 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 MOV #$1SEC,-(SP) JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ** ;* L P T I M E ** ;* ** ;* THIS ROUTINE IS ENTERED BY TIMER EVERY SECOND. LPTIME ** ;* CHECKS FOR AN L/P READY CONDITION SO THAT OUTPUT CAN ** ********************************************************;* E AG.P PC S RT 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 '; 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 ** ;* ** ;* ;* CONTINUE. AFTER LPMXTM SECONDS, LPTIME GIVES UP ON THE ** ;* OPERATOR AND ABORTS THE REQUEST. ** ;* ** ;* ON ENTRY, R1 CONTAINS THE TIMER MODULE ADDRESS. LPTIME IS ** ;* ENTERED BY A JSR PC,LPTIME ** ;* ** ;*****************************************************************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 R5Y,RTLP#N# 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 ROUTINE AND R1 POINTS TO ** ***** ; ; 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 = PRIORITY INDEX MOV LPFRST(R2),R0 ; R0 = ADDR(LIST) ; R3 = L/P INDEX ; R4 = TIMER MUDULE ADDRESS JSR PC,LPSTAT ;GET L/P STATUS 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 EVPL,LPC ;* 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. DECREMENT COUNTER BN 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 ;BRANCH IF IT'S TIME TO QUIT 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 L E CRTA00 ;GO WAIT SOME IF MXTIME SEC. HAVEN'T ELAPSED CRLA00: MOV (SP)+,R5 ;PUT TIMER RETURN ADDRESS IN R5 MOV CRFRST(R3),R1 ;GET USER'S LIST ADDRESS MOV #7,ERROR(R1) ;SET I/O REQUEST 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 ;*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 JSR PC,LPQERR ;GO QUEUE THE ERROR TASK, IF THERE IS ONE JMP LPIA10 ;GO TRY NEXT REQUEST ;* * ********************************************************************;* E AG.P PC S RT C ND.E /P LNE OTNHA TREMOR FOT BU, TOIT;D ) R3R(DDPA@L R CL 1 P-NL FG.I C ND.E /P LNE OLYONR FOS ESDRADY OREM MARLE;C .1DTLP@# R CL 1 P-NL FZ.I R:CLLP ; ; * ********************************************************************;* * * ********************************************************************* ;* C R M S G E ** ;* ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO THE SYSTEM ** ;* TELETYPE. CRMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS ** ;* . .PAGE ;********************************************************************** ;* ** ;* L P C N V T ** ;* ** ;* THIS SUBROUTINE FORSM ONE PRINTABLE LINE OF TEXT, ** ;* CONVERTING EACH CHARACTER TO THE L/P EVEN PARITY ASCII ** ;* FORMAT. LINKAGE IS: ;* * * LRPC,LPC R JS ;* * * EVND I/P L =R3 ;* * * ;* * * 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 ;* * ****************************************************** ND.E C ND.E CTSE.C PC S RT 10NALP O BL 2 ,RR0 P CM S UEUE QTYRIIOPRE THN ;I + 0)(R R CL )+R1,(R0 V MO : 10NALP ; 2 ,RR1 V MO R1T,ASPL#L V MO R0T,RSPF#L V MO C ND.E C ND.E 0 A0PN,LR0 B SO 5 14$1 Z FN.I  ** ;* SET R3 = C/R INDEX ** ;* MOV #DATA-(SP) PUSH DATA BUFFER ADDRESS ** ;* JSR PC,CRMSGE ** ;* BNE BNE IF LIST WASN'T AVAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. ** ;*  ** ;* ** ;* SET R0 = LIST ADDRESS ** ;* R1 = DATA ADDRESS ** ;* R2 = CONVERSION TABLE ADDRESS ** ;* R3 = L/P INDEX ** ;* JSR PC,LPCNVT ** ;* BNE **************;* 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 20OBLP  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 CND;A LRPC,LPC R JS  ** ;********************************************************************** ; CRMSGE: MOV 2(SP),R4 ;GET DATA BUFFER ADDRESS FROM STACK .IFG NCR-1 ADD R3,R4 ;GET ADDRESS OF BUFFER 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  ;BRANCH IF NO MORE TEXT ** ;* ** ;********************************************************************** ; ; 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 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 LOR FRY /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 SATD LEAL CBED ULHO SITINLP ;* .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 .ENDC TST DATA(R5) ;SEE IF LIST IS AVAILABLE BNE CMSX00 ;BRANCH IF NO MOV R4,DATA(R5) ;YES - GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R5,-(SP) ;SMOV LPCNT(R3),R5 ; 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 NT;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 P)* * ;* * * . S)R(TEINPRE IN LHE TRSEACLD ANS ETES R2. ;* * * S UEAL VORCTVET UPRRTEINS RETO S1. ;* * * ;* * * : NETIOU RISTH E.INUTRON IOATIZALTINI IERNTRI PNELI ;* * * ;* * ****************************************************************TORE LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) CLZ RTS PC ;RETURN TO CALLER ; 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 COMR4,#MAXCC ;IS IT A CONTROL CHARACTER? BLE LPCA05 ;BRANCH IF NO 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 TH(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 C ND.E ,3R4 H AS 5 14$1 Z FN.I C ND.E R4 L AS R4 L AS R4 L AS 5 14$1 FZ.I E USY TTR FOT IS LUPT SEN HE;T 4 ,RR3 V MO ****;* E AG.P PC S RT T XI END AERETAMAR PORRR EFF OOP;P + P)(S T TS : 00QALP ; K AS TORRR EHE TUEUE;Q UEUE,QPC R JS ) SP-( R CL ) SP-( R CL ) SP-( R CL D IEIFECSPT NOS ISKTAR ROERN AIFH NCRA;B 00QALP Q BE P)(S T TS ERMBNUK AS TORRR EET;G) SP,(0)(RSKRTER VBMO ) SP-( R CL : RRQELP ; ; * **********************************************************PLETE SUBROUTINE RTS PC ;SET LIST NOT BUSY AND EXIT .PAGE ;********************************************************************** ;* ** ;* C R S I O ** ;* ** ;* CARD READER START I/O SUBROUTINE. CRSIO SETS UP ALL ** ;* COUNTERS, INITIATES A C/R READ REQUEE BEGINNING BNE 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 BUFF 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;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**********;* * * ;* * * T.IS L/O IHE TOFS ESDRADE THN AINTCOT US MR0, RYNT EON ;* * *. ONTICUXE EOR FSKTAR ROERE THS UEUE QNETIOUBRSUE TLIT LISTH ;* * * R R E Q P L ;* * * ;* * ********************************************************************;* E AG.P C ND.E PC S RT ST, 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 TIMER REQUEST BY USING ** ;* SUBROUTINE DQTIME. USAGE IS: ** ;* ** ;* R1 = ADDR(LIST) ** ;* MOV #CRINDX,R3 ;SET ER ; LPCA16: CMP 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,R 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 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 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 1 P-NL FG.I CKBALP Z FN.I F:OFLP ; ; * ****************************** R3 = C/R INDEX ** ;* JSR PC,CRSIO ** ;* ** ;* REGISTERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* ** ;********************************************************************** ; ; CRSIO: CLR COUNT(R3) ;SET COUNT = 0 CLR IGNORE(R3) MO4 ASR R4 ;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 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@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**************************************;* * * ;* * * . 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 ;* * * V 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 BNE CRSB00 ;TO THE TTY - BRANCH IF YES (OR SI) ; CRSA05: .ENDC MOV CRDATA(R3),R0 ;GET DATA ADDRESS .IFNZ BIN CLR R1 ;DETERMINE MODE OF INPUT .ENDC MOV (R0),R2 .IFNZ BIN  CMP R0,LPBUFR(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 LPCA 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,@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,OL ;* * * : 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 ;* * * ;* * ************** 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 MOV PC,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 .ENDC .IFG15 ;OF 8 (PLUS ONE) = 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 ;********************************************************************** ;* UT#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 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 ******************************************************;* 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 : 00SXLP ; ; PC S RT N IOITNDCOR ROERO- NET;S Z CL  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,8.(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 MOV  ** ;* 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, CKBALP Z FN.I O:SILP ; ; * ********************************************************************;* * * ;* * * 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 ;* * * 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 BLLAAIAVS ISTLIE THF IEE;S 5)(RTADA T TS C ND.E NGHI TMESAE THR FO#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 ;* ;* WH LPSTOR CANNOT PERFORM A SIMPLE ** ;* INDEXED STORE. ON ENTRY, THE REGISTERS ARE EXPECTED ** ;* TO CONTAIN: ** ;* ** ;* R0 = ADDRESS OF L/P BUFFER ** ;* R2 = ADDRESS OF CONVERSION TABLE ** ;* ** ;* R4 IS DESTROYE EXND I/P L =R3 ;* * * T UNCOD OR 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 IOCTE 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 ;* R5T,ISPL#L V MO SSREDD AET G;* 1 P-NL FZ.I R5E AV;S #ERE 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 BUSY MOV $D, R0 IS UPDATED, AND ALL OTHER REGISTERS ** ;* ARE SAVED. ** ;* ** ;********************************************************************** ; ; LPSTOR: INC 2(SP) ;INCREMENT TAB COUNTER CLR 10.(SP) ;SET 'DATA STORED' FLAG CLR -(SP) ;SET 'L/P BUFFER NOT FULL' FLAG ADD R2,R4 ;ADD TUN FUTTPOUL UACT AHE TMSORRFPEE INUTROUB SISTH ;* * * ;* * * 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 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 ; ; * ********************************************************************;* * * ;* * * . EDOYTRES DIS4 RERSTGIRE ;* * * ' #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. ;* ;* ; CRSB50: (ABLE BASE ADDRESS TO ASCII CODE MOVB (R4),(R0)+ ;CONVERT BYT' STORE IN LPBUF ; LPST00: CMP R0,LPBUFR+2(R3) ;IS BUFFER FILLED UP TO HERE? BLT LPST10 INC (SP) ; LPST10: TST (SP)+ ;POP 'BUFFER FILLED' FLAG TO SET RTS PC ;CONDITION CODE, THEN EXIT. .PAGE ;********************************************************************** ;* 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 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 ;* * * 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 ;* * * ;* * * S: IGEKAIN L. EDIRQURES IONTIACR TORAPE OOR ;* * *D TEECET DENBES HAR +.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: SUB , ** ;* L P C H E K ** ;* ** ;* THIS SUBROUTINE PERFORMS CHECKS ON THE I/O LIST AND DATA ** ;* BUFFER THAT COULD BOMB LPRNTR. THESE TESTS ARE PERFORMED ** ;* WHEN THE REQUEST IS QUEUED AND WHEN ITS I/O IS STARTED. ** ;* THE REGISTERS MUST CONTAIN: ** ;* ) 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 YEROSTDES IR4 X.DEINP L/N AINTCOT US MR3, RYNT EON ;* * * ;* * * ROERN AENWHD LEAL CISE SGPM L. PETYLETE ;* * *M TEYS SHE TTOE AGSSMED TECADIINE THS UTTPOUE INUTROUB SISTH ;* * * ;* * * E G S M P L ;* * * ;* * ********************************************************************;* E AG.P PC S RT C ND.E O WHW-NO-KOU YRETOES;R R5+,P)(S/#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 TST 0 ** ;* R0 = ADDRESS OF I/O LIST ** ;* R1 = ADDRESS OF DATA BUFFER ** ;* ** ;* ON RETURN, R4 CONTAINS: ** ;* ** ;* 0 = VALID REQUEST ** ;* 2 = ILLEGAL LIST OR DATA A D REUIEQ RONTIACR TORAPE O= ROZE> ;* * * 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 ;* * * ;* * 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 S OE D201/ 1HE TAY WHE TISS HI;T R5 C DE : 00LALP ; 5 14$1 FZ.I ; TYRIIOPR= 3ERROR(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 'BELL' CHARACTER. 4DDRESS ** ;* 4 = ILLEGAL RETURN TYPE ** ;* 5 = ILLEGAL I/O COMPLETE ADDRESS ** ;* ** ;********************************************************************** ; ; LPCHEK: CMP R0,#ROSTOP ;TEST LIST ADDRESS BLOS LPKE02 ;CAN'T BE IN ROS CMP R1,#ROSTOP ;TEST DATA ADDRESS BL * T A T S P L ;* * * ;* * ********************************************************************;* 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 ; ; * ****************************7; ; 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 F F 8OS LPKE02 ;CAN'T BE IN ROS EITHER CMP R0,#HICORE ;NOR CAN EITHER BE IN NON-EXISTENT BHIS LPKE02 ;MEMORY CMP R1,#HICORE BHIS LPKE02 BIT #1,R0 ;AND, FINALLY, THE ADDRESSES MUST BNE LPKE02 ;BE EVEN (WORD BOUNDARIES) BIT #1,R1 BNE LPKE02 MOV (R1),R4 ;AND, FINALLY (DID I ALREADY SAY THAT?), BLT LPKA00 ;GET NWORD AND MAK****************************************;* * * ;* * * 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 ;* * * ND.E T ENEMATSTR NCZ FN.IG INNNGIBEE THR FOC ND;E C ND.E CTSE.C PC S RT C ND.E C ND.E 0 A2RN,CR0 B SO 5 14$1 Z FN.I C ND.E N AIAGY TR, RY TND;A 20NACR E BN ERNTOU CNTMEREEC;D R0 C DE 5 14$1 FZ.I 0 = T RSRF CET;S + 1)(R R CL T)RSRF(CDRAD= T ASRL CET;S )+R2,(R1 V MO : 20NACR ; R2; ** ;* ** ;* 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) ** ;* <E SURE IT'S REASONABLE NEG R4 ;WITHIN AVAILABLE CORE. ; LPKA00: INC R4 ;CONVERT # CHARACTERS ASR R4 ;TO # WORDS ADD #HICORE,R4 CMP R1,R4 ;CHECK DATA BUFFER TO BE GREATER THAN BHI LPKE02 ;NWORD/2 WORDS FROM TOP OF CORE CMP R0,#HICORE-7-7 ;AND THAT LIST IS MORE THAN SEVEN BHI LPKE02 ;WORDS FROM TOP OF CORE ; ; NOW WE'LL C ;* * ********************************************************************;* E AG.P 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 ; 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 T,ASRL#C V MO R1T,RSRF#C V MO 0 ,RCR#N V MO 1 R-NC FG.I C ND.E STLACRT,RSRF#C V MO STFRCR R CL 1 R-NC FZ.I ; 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 R1.,#8 D AD O ER ZTOL VELEY IT? ** ;* 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. CAN'T BE <= 0 HECK FOR I/O COMPLETE ADDRESS ; CMPB #3,TYPE(R0) ;IS IT EXIT 3? BNE LPKB20 ;BRANCH IF NO MOV $EXIT(R0),R4 ;OTHERWISE, TEST THE ADDRESS CMP R4,#ROSTOP BLOS LPKE05 CMP R4,#HICORE-10. BHIS LPKE05 BIT #1,R4 BNE LPKE05 ; LPKB10: CLR R4 ;SET 'NO ERRORS' RTS PC ;AND EXIT TO CALLER ; LPKB20: BLT LPKE04 ORRI PET;S )+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 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: .IFZ