-@B  ;UPDATE LPRNTR.S14 5-11-73 ; UPDATE LPRNTR.013 09.24.72 ; UPDATE 9/21/72 LPRNTR.S12 ; UPDATE 9/12/72 LPRNTR.S11 ; UPDATE LPRNTR.010 07.19.72 11/45 VERSION FIRST ASSEMBLY ; UPDATE LPRNTR.009 06.21.72 ; UPDATE LPRNTR.008 05.12.72 ; UPDATE LPRNTR.007 05.03.72 ROS SYSTEM VERSION .TITLE LPRNTR ;*********************************************************** ;UPDATE LPTABL.S02 5-11-73 ; 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 ** ;* ** ;* ** ;* AS&ML"(.t\7 x  t\.&  7  5N5@.LN L Lxj  Hj"$& (H.rL L7 ^  ^.E@LNߋLW  .ЋW " U@L L[.^Н; UPDATE 14 MAY 73 ROS3.SYS ; UPDATE 5 MAY 73 ROS3.SYS ; UPDATE 9/29/72 ROS3.SYS ; UPDATE 09.20.72 ;ROS3.SYS ; UPDATE 8/23/72 ROS3.SYS ; UPDATE 8/17/72 ROS3.SYS ; UPDATE 8/15/72 ROS3.SYS ; UPDATE 8/1/72 ROS3.SYS ; UPDATE 7/31/72 ROS3.SYS ; UPDATE 7/28/72 ROS3.SYS ; UPDATE 07.21.72 ROS3.SYS ;* ;* G E N E R A L S Y S T E M E *********** ;* ** ;* L P R N T R ** ;* ** ;* PROGRAM IDENTIFICATION. LPRNTR - LINE PRINTER OUTPUT ** ;* SUBROUTINE. ** ;* ** ;* PURPOSE. THIS SUBROUTINE PERFORMS THE OUTPU CLP = TO CONVERT INTERNAL ASCII TO LINE PRINTER EVEN ** ;* 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. ** @ ^ 0׭,w ^^. ^  ^ ^"^.0 h   w!.V^7 -Е  Е  ^.|^ ^- -wx!^ ^.^Нv t-ppЕ  ^|.^ ^-Z N-Jw* ^.x6  Q U A T E S ;* $1145 = 1 ;1 = 11/45 0 = NOT 11/45 $1125 = 0 ;1 = 11/25 0 = NOT 11/25 $1120 = 0 ;1 = 11020 OR LESS (11/05, ETC.) $KT11C = 1 ;1 = KT11C SEGMENTATION ;0 = NO SEGMENTATION $FPP = 0 ;1 = FLOATING POINT PROCESSOR IS IN SYSTEM .IFZ $1125!$1145 .IFNZ $KT11C!$FPP XXXXXXXX .ENDC .ENDC T 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 APPLICATIONS FOR PRIORITY ALARM MESSAGES, ** ;* ETC. THE INTERNAL MESSAGE FORMAT ACCEPTED BY LPRNTR ** ;* IS EITHER ASCII OR EBCDIC. NON-PRINTABLE CHARACTERS ARE ** ;* CONVERTED TO BLANKS, ALTHOUGH THE CH;* ** ;********************************************************************** .IFG NLP .DEF ASCLP .IFNZ INEBC .DEF EBCLP .ENDC NON = 240 ;NON = NON-PRINTABLE CHARACTERS ; ; ASCLP: .IFZ $DIVA .BYTE 000,201,202,003 ;CARRIAGE 000-003 .BYTE 204,005,006,207 ; CONTROL 004-007 .BYTE 210,01^ѕ   pe^ ^&^(ЕE W ^ th^\ \$RASM = 1 ;1 = ASSEMBLER IS IN SYSTEM .IFG $KT11C-1 XXXXXXXX .ENDC $DELAY = 2 ;INDICATES TYPE OF MEMORY AND IS USED ;IN SOME DELAY LOOPS ;1 = 1.2 US CORE ;2 = 850 NS CORE ;3 = 11/45 SOLID STATE MEMORY ; STANDARD REGISTER DEFINITIONS R0 = %0 R1 = %1 R2 = %2ARACTER IS SYSGENABLE ** ;* TO ANY OTHER PRINTABLE CHARACTER. ALL THREE GENERAL I/O ** ;* EXITS ARE SUPPORTED BY LPRNTR. ** ;* ** ;* USAGE. THE ASSEMBLER LINKAGE TO LPRNTR IS: ** ;* ** ;* MOV #LIST,-(SP) ;PUSH LIST ADDRESS ON STACK ** ;* EMT LPRNTR 1,201,213 ; CODES 010-013 .BYTE 300,215,216,017 ; CODES 014-017 .ENDC .IFNZ $DIVA .BYTE NON,NON,NON,NON ; CARRIAGE .BYTE NON,NON,NON,NON ; CONTROL .BYTE NON,NON,012,NON ; CODES .BYTE 014,015,NON,NON ; CONTROLLER DIVA .ENDC .BYTE NON,NON,NON,NON ; 020-023 .BYTE NON,NON,NON,NON ; 024-027 .B ;UPDATE LPTEST.S06 6/1/73 ;UPDATE LPTEST.S05 5/25/73 ;UPDATE LPTEST.S04 5/23/73 ;UPDATE LPTEST.S03 5/21/73 ;UPDATE LPTEST.S02 5-15-73 ;INITIAL LPTEST.S01 5-11-73 .TITLE LPTEST ;*********************************************************************** ;* ;* L I N  R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 .IFNZ $FPP AC0 = %0 ; AC1 = %1 ;FLOATING AC2 = %2 ; POINT AC3 = %3 ; ACCUMULATOR AC4 = %4 ; DEFINITIONS AC5 = %5 ; .ENDC ; .IFNZ $KT11C $ROSM = 100000 ;ROS MASK FOR SYSTEM TASKS TO USE .ENDC  ** ;* ** ;* THE FORTRAN EQUIVALENT CALL IS: ** ;* ** ;* CALL LPRNTR (IADDR(LIST)) ** ;* ** ;* THE FORMAT OF THE DATA BUFFER, DATA, IS: ** ;* YTE 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 .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,E P R I N T E R T E S T ;* ;* FOR DIVA CONTROLLER ;* ;* ;* START PROGRAM AT LOCATION 1000 OCTAL ;* ;* PROGRAM HALTS IMMEDIATELY ;* ;* SET TEST # IN SWITCHES ;* ;* 0 - RUN ALL TESTS ;* 1 - TEST 1 ;* 2 - TEST 2 ;* 3 - TEST 3 ;* 4 - TEST 4 ;* ;* IF INVALID TEST NO. PROGRAM WILL HALT AND WAIT FOR TEST ;* ;* TEST 1 PRINT A FULL LINE OF EACH CHAR ASCII 040 -177 ;* ;* TEST 2 PRINT A FU ;TO 'OR' WITH ROS ADDRESSES TO POINT .IFZ $KT11C ; TO USER ASR 4 $ROSM = 0 ; .ENDC PS = 177776 ; $DEBUG = 1 ; ROS DEBUG SWITCH $CORAL = 0 ; CORE ALLOCATION ; =0 SOFTWARE ; =1 HARDWARE ; ; ; TASK CONTROL SYSGEN EQUATE CARDS ; NPRIOR = 10. ; NO. OF SOFTWARE PRIORITY ** ;* ----------------------------------- ** ;* WORD 1 ! NWORD ! ** ;* ----------------------------------- ** ;* WORD 2 ! RESRVD ! ** ;* ----------------------------------- ** ;* WORD 3 ! CHAR 1 ! CNTRL ! ** ;* ----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 120,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 LL LINE OF CHARS 40,...,177,40,...ETC ;* THEN ROTATE LINE ;* ;* TEST 3 PRINT A SINGLE CHAR ON SUCCEEDING COLS ;* DO FOR EACH CHAR ;* ;* TEST 4 FOR EACH CHAR, PRINT A LINE CONTAINING 1 CHAR, ;* THEN 2 CHARS, ..., THEN 132 CHARS ;* ;* ;* LOC ERROR ACTION ;* ;* NOT READY CHECK PRINTER ON ;* ;* ERRO LEVELS PRIBKG = NPRIOR ; PRIORITY OF BACKGROUND $BATCH = 1 ; BATCH OPTION .IFLE NPRIOR ; XXXXXXXX ;NPRIOR MUST BE GREATER THAN ZERO .ENDC MXTASK = 20 ; MAX # OF CORE TASKS IN SYSTEM NLTASK = 1 ; LARGEST TASK # OF TASKS LOADED WITH SYSTEM ;NOTE: IF OVERLAYS ARE USED, THEN THE ;FIRST OVERLAY TASK NUMBER------------------------------- ** ;* . . ** ;* . . ** ;* . . ** ;* ----------------------------------- ** ;* WORD X ! CHAR N ! CHAR N-1 ! ** ;* ----------------------------------- ** ;* 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 154-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-167R ON PRINT DONT KNOW,RESTART TEST ;* ;* CHAR OUT BUT NOT DONE OR TOO SLOW DONE CONTINUE ;* TOOK TOO MANY CHARS DONT KNOW, RESTART ;* ;* NO INTERRUPT - HANGS CHECK PRINTER READY ;* ;* NOT RUN CHECK PRINTER ;* ;* ERROR CHECH CONTROLLER ;* ;*************************************************************** IS MXTASK+1 OVTMIN = MXTASK+1 ;FIRST OVERLAY TASK NUMBER OVRLAY = 1 ;SYSTEM OVERLAY OPTION (1 = OVERLAY) ;0 = NO OVERLAY, 1 = OVERLAY .IFNZ OVRLAY ; MAXOVR = 140 ; MAX # OF OVERLAY TASKS IN SYSTEM .ENDC ;(NOT USED IF OVRLAY = 0) .IFZ OVRLAY ; MAXOVR = 0 ;SET TO ZERO ONLY IF NO OVERLAYS .ENDC TASMAX = MXTASK! ** ;* WHERE: ** ;* ** ;* NWORD = NUMBER OF CHARACTERS TO PRINT (INCLUDING THE ** ;* CONTROL CHARACTER, CNTRL), AND ** ;* NWORD > 0 FOR ASCII STRINGS ** ;* NWORD < 0 FOR EBCDIC STRINGS ** ;* " .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 .BYTE 300,NON,NON,NON ; 014-017 .BYTE NON,NON,NON,NON ; 020-023 .BYTE NON,NO#******** ; ; EQUATES ; ; LPS = 177514 ; LINE PRINTER STATUS LPB = 177516 ; LINE PRINTER BUFFER SWR = 177570 ; SWITCH REGISTER $NOTST = 4 ; 4 DIFFERENT TESTS LPSIZE = 132. FF = 14 LF = 12 CR = 15 ; PROGRAM START INITAL: ;SET STACK + INT LOCS MOV #LPINT,@#200 MOV #200,@#202 $+MAXOVR ;MAXIMUM NUMBER OF TASKS (INCL OVERLAYS .IFLE MXTASK ; XXXXXXXX ;MXTASK MUST BE GREATER THAN ZERO .ENDC .IFL NLTASK ; QTAB XXXXXXXX ;NTASK CANNOT BE NEGATIVE .ENDC .IFG NLTASK-MXTASK ; QTAB XXXXXXXX ;NTASK MUST BE <= MXTASK .ENDC .IFNZ OVRLAY ; ; % RESRVD = RESERVED FOR SYSTEM USE ** ;* CNTRL = CARRIAGE CONTROL: 0 - NO LINE FEED ** ;* N - SKIP N LINES (N=1,2,3) ** ;* FF- EJECT PAGE ** ;* LF- SKIP 1 LINE (SAME AS N=1) ** ;* CHAR K = MESSAGE IN ASCII OR EBCDIC ** ;* *&N,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 NON,NON,NON,NON ; 054-057 .BYTE NON,NON,NON,NON ; 060-063 .BYTE NON,NON,NON,NON ; 'MOV #STACK,SP ; ; START: CLR TESTNO HALT RESTRT: ;EACH TEST RETURNS HERE MOV @#SWR,R0 BMI START ; INVALID TEST CMP R0,#$NOTST ; BGT START ; INVALID TEST ASL R0 BNE LP0020 LP0000: INC TESTNO ; RUN ALL TESTS MOV TESTNO,R0 ; GET TEST NO. CMP R0,#$NOTST BLE LP0010 ; BRANCH(STATE SIZE OF DYNAMIC CORE STORAGE IN ROS ; $DYNSZ = 54000 ; RESERVE DYNAMIC CORE POOL .ENDC ; ; THE FOLLOWING IS A LIST OF PRIORITY PROPERTIES ; +1 = TIME SLICE PRIORITY (CORE OR OVERLAY) ; 0 = FIXED OVERLAY TASK (MAY BE CORE) ; -1 = FREE TASKS (CORE OR DYNAMIC OVERLAY) ; PRIP01 = -1 ; PRIORITY PROPERTY LEVEL 1 PRIP02 = -1 ; PRIORITY PROPERTY LEVEL 2 PRIP03 = 1 )* ;* FF, LF AND HT MAY BE IMBEDDED IN THE TEXT FOR MULTIPLE LINES.** ;* TAB (HT) POSITIONS ARE: 1, 9, 17, ..., 8N + 1, ... ** ;* ** ;* PROGRAMMER: 55 ** ;* DATE: 01.17.71 ** ;* ** ;* COPYRIGHT 1972 * 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,NON ; < ( + 114-117 .BYTE 246,NON,NON,NON ; & 120-123 .BYTE NON,NON,NON,NON ; + IF TEST 1 TURN AGAIN CLR TESTNO BR LP0000 LP0010: ASL R0 ; WORD INDEX LP0020: ;CHECK PRINTER BIT #100000,@#LPB BNE LP0030 HALT ; NOT READY BR LP0020 LP0030: BIT #40000,@#LPB BNE LP0040 HALT ;NOT RUN BR LP0020 LP0040: TST @#LPS BPL LP0050 , ; PRIORITY PROPERTY LEVEL 3 PRIP04 = 1 ; PRIORITY PROPERTY LEVEL 4 PRIP05 = -1 ; PRIORITY PROPERTY LEVEL 5 PRIP06 = -1 ; PRIORITY PROPERTY LEVEL 6 PRIP07 = -1 ; PRIORITY PROPERTY LEVEL 7 PRIP08 = -1 ; PRIORITY PROPERTY LEVEL 8 PRIP09 = -1 ; PRIORITY PROPERTY LEVEL 9 PRIP10 = -1 ; PRIORITY PROPERTY LEVEL 10 PRIP11 = 0 ; - ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;********************************************************************** ; .IFGE NLP-2 XXXXXX .ENDC $DIVA = 1 .IFG NLP .DEF LPRNTR .DEF LPINIT .REF QSAVEI,SAVE,TTYOUT,DSPTCH .R. 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 ; % > ? 154-157 .BYTE NON,NON,NON,NON ; 160-163 .BYTE NON,NON,NON,NON ; 164-167 / HALT ; ERROR BR LP0020 ; LP0050: CLR @#LPS ; OK NOW, CLEAR THING JMP @TEST(R0) JSR PC,PAGE TEST: .WORD START ; PAD .WORD TEST1 .WORD TEST2 .WORD TEST3 .WORD TEST4 .PAGE ; LP INTERRUPT LPINT: CLRB @#LPS TST @#LPS BPL LPINT1 HALT ;ERROR LPINT1: 0PRIORITY PROPERTY LEVEL 11 PRIP12 = 1 ; PRIORITY PROPERTY LEVEL 12 PRIP13 = -1 ; PRIORITY PROPERTY LEVEL 13 PRIP14 = -1 ; PRIORITY PROPERTY LEVEL 14 PRIP15 = -1 ; PRIORITY PROPERTY LEVEL 15 PRIP16 = 0 ; PRIORITY PROPERTY LEVEL 16 .IFNZ OVRLAY ; .IFL 16.-NPRIOR XXXXXXXX TABLES AND PARAMETERS CURRENTLY CODED XXXXXXXX FOR 1EF RESTOR .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 .IFNZ $KT11C .REF PPASV5,PPASV6,TSK.PC .REF SVPPA,IOCOMX .ENDC ;* ;* S Y S T E M E Q U A T E 2 .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 ; 214-217 * L .BYTE NON,312,113,314 ; J K L 220-223 * O C .BYTE 115,116,317,120 ; M N 3 RTI ; ; ; PAGE: MOV R0,PAGE1 ; EJECT PAGE MOV #FF,BUF MOV #BUF,R0 JSR PC,PRINT MOV PAGE1,R0 RTS PC PAGE1: .WORD 0 .PAGE PRINT: ;PRINT A LINE BIC #100,@#LPS ; R0 HAS STARTING BUFFER ADDRESS MOV #1,R1 ; OUTPUT UP TO 132 CHARS OR A CTL CHAR PRINT0: ; COUNT CHARS MOVB (R0),@#LPB ; OUTPUT 4MAXIMUM OF 16 PRIORITY LEVEL .ENDC ; ; THE FOLLOWING SYSGEN PARAMETERS SPECIFY THE NUMBER OF ; ENTRY'S IN A PRIORITY'S QPART TABLE. IF ZERO, THAT ; PRIORITY WILL NOT BE ALLOWED OVERLAY TASKS. A MAXIMUM ; OF 127 ENTRYS PER QPART WILL BE ALLOWED. ; ****NOTE: BE SURE PRIORITIES GREATER THAN NPRIOR HAVE ; TABLE SIZES OF 0 ; NEQP01 = 10. ; NO. OF ENTRYS QPART LEVEL 1 NEQP02 = 10. ; NO. OF ENTRYS QPART 5P A R A M E T E R S ;* THREAD = 0. ;LIST THREAD DEVICE = 2. ;LOGICAL DEVICE NUMBER 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 DTPAR = 14. ;VALUE OF KP6 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 250-253 * .BYTE NON,NON,NON,NON ; 254-257 .BYTE NON,134,NON,NON ; \ 260-263 7 NOP PRINT1: TSTB @#LPS BPL PRINT4 ;BRANCH IF NOT DONE CMP R1,#LPSIZE ;DONE BNE PRINT3 PRINT2: ;LAST CHAR, BUT DONE ALREADY ?????? HALT ;TOO FAST, MUST BE TAKING TOO MANY BR PRINT2 ;CHARS PRINT3: INC R1 TSTB (R0)+ BR PRINT0 PRINT4: ;NOT DONE CMP R1,#LPSIZE BEQ HLEVEL 2 NEQP03 = 10. ; NO. OF ENTRYS QPART LEVEL 3 NEQP04 = 10. ; NO. OF ENTRYS QPART LEVEL 4 NEQP05 = 10. ; NO. OF ENTRYS QPART LEVEL 5 NEQP06 = 10. ; NO. OF ENTRYS QPART LEVEL 6 NEQP07 = 10. ; NO. OF ENTRYS QPART LEVEL 7 NEQP08 = 10. ; NO. OF ENTRYS QPART LEVEL 8 NEQP09 = 10. ; NO. OF ENTRYS QPART LEVEL 9 NEQP10 = 10. ; NO. OFEAR6 FOR DATA BUFFER DTVIRT = 16. ;SYSTEM VIRTUAL EQUIVALENT OF DATA BUFFER ADDR PSR = PS ;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 F .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 310-313 * .BYTE NON,NON,NON,NON ; 314-317 * U .BYTE NON,312,113,314 ; J K L G PRINT5 ;OK, SHOULD HAPPEN AFTER FULL LINE CMP (R0),#40 BLT PRINT5 ;OK CTL CHAR ; ;ERROR ???????? HALT ;SHOULD HAVE DONE BR PRINT1 ;MAYBE SLOW - GO CHECK ; PRINT5: ;ALL OK - FAT CITY - SKIDOO BIS #100,@#LPS ;ENABLE INTERRUPT WAIT RTS PC .PAGE """"""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""3333DDDDDDD@ADD>B CMZ{? M{? JML"^1  r@λz? H0ML"{1 _$D33333333333333333333333333#"""""""""""""""""""""""""""""3333a ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & IIE = 040000 ;INTERRUPT ON PARITY OR PAPER LOW ERRORS SB = 004000 ;SET L/P BUSY (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. OJ 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 344-347 * .BYTE 131,132,NON,NON ; Y Z 350-353 * .BYTE NON,NON,NON,NON ; 354-357K ;TEST 1 TEST1: MOVB #40,CHAR T10000: MOV #LPSIZE,R1 ; LINE WIDTH MOV #BUF,R0 ; BUF ADDRESS T10010: MOVB CHAR,(R0)+ ; FILL BUFFER DEC R1 BPL T10010 MOV #BUF,R0 ; BUFFER FILLED JSR PC,PRINT ; GO PRINT INC CHAR ; DONE CMPB CHAR,#177 BLE T10000 JMP RESTRT .PAGE TEST2: ; TEST 2 MOV L ENTRYS QPART LEVEL 10 NEQP11 = 0. ; NO. OF ENTRYS QPART LEVEL 11 NEQP12 = 0. ; NO. OF ENTRYS QPART LEVEL 12 NEQP13 = 0. ; NO. OF ENTRYS QPART LEVEL 13 NEQP14 = 0. ; NO. OF ENTRYS QPART LEVEL 14 NEQP15 = 0. ; NO. OF ENTRYS QPART LEVEL 15 NEQP16 = 0. ; NO. OF ENTRYS QPART LEVEL 16 ; ; ; THE FOLLOWING ASSIGNS THE START BLOCK IN THE CORE POOL ; FOR A SPECMF CHARACTERS (1ST WORD OF DATA) RESRVD = 2 ;RESERVED (2ND WORD OF DATA) TEXT = 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 * .IFZ $DIVA STAY = 0 ;NO LINE FEE * .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 O #3*LPSIZE,R1 ; FILL BUFFER MOV #BUF,R0 T20000: MOV #40,R2 T20010: MOVB R2,(R0)+ DEC R1 BEQ T20020 INC R2 CMP R2,#200 BEQ T20000 BR T20010 T20020: ; BUFFER FULL MOV #BUF,T2BUF MOV T2BUF,R0 T20030: JSR PC,PRINT ; PRINT INC T2BUF MOV T2BUF,R0 CMPB (R0),#40 BNE T20030 JMP REPIFIC PRIORITY. ; ; NOTE: START BLOCKS MUST BE A MULTIPLE OF 4. ; $SB001 = 0. $SB002 = 4. $SB003 = 4. $SB004 = 4. $SB005 = 4. $SB006 = 4. $SB007 = 12. $SB008 = 12. $SB009 = 12. $SB010 = 12. $SB011 = 0. $SB012 = 0. $SB013 = 0. $SB014 = 0. $SB015 = 0. $SB016 = 0. ; $NBLKS = $DYNSZ/2-1/256.+1 ; NO. OF BLOCKS IN DYNAMIC CORE ; ; THE FOLLOWING ASSIGNQD * SKIP1 = 1 ;SKIP ONE LINE * CHARACTERS SKIP2 = 2 ;SKIP TWO LINES * SKIP3 = 3 ;SKIP TWREE LINES * AUTOLF = 1 ;CONTROL FOR AUTO LINE FEED MODE .ENDC .IFNZ $DIVA STAY = 15 ; CR SKIP1 = 12 ; LF SKIP2 = 21 ; DOUBLE SPACE SKIP3 = 22 ; TRIPLE SPACE AUTOLF = 12 SSTRT T2BUF: .WORD 0 .PAGE TEST3: MOV #41,CHAR T30000: MOV #1,COL ; FILL BUFFER MOV #BUF,R0 T30010: CLR CNT T30020: INC CNT CMP CNT,COL BEQ T30030 MOVB #40,(R0)+ BR T30020 T30030: MOV CHAR,(R0)+ ;HIT CHAR COL, MOVE CHAR INC COL ;SET FOR NEXT COL NEXT PRINT MOVB #LF,(R0)+ MOV #BUF,R0 JSR PC,PRINT TS STORAGE BLOCK SIZES FOR EACH PRIORITY. ; A) IF DYNAMIC-CONTAINS THE LARGEST ALLOWABLE BSIZE ; VALUE ; ; B) IF FIXED OR TIME SLICED-CONTAINS ASSIGNED BSIZE ; VALUE FOR THAT PRIORITY ; .IFL PRIP01 $PS001 = $NBLKS-$SB001 .ENDC .IFGE PRIP01 $PS001 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB001-$PS001 XXXXXXXX ; PRI 1 TOO LARGE U ; LF .ENDC DELAY = 10. ;POSITION OF DELAY COUNTER IN TIMER MODULE INDEX = 12. ;POSITION OF ARGUMENT IN TIMER MODULE JSRSUB = 14. ;POSITION OF JSR SUBROUTINE ADDRESS MAXCC = 14 ;MAX(HT,LF,FF,STAY,SKIP1,SKIP2,SKIP3) LPBLNK = 240 ;ASCII BLANK CLEAR = 100 .IIF EQ $KT11C LIST = 14. ;POSITION OF LIST ON STACK .IIF NE $KT11C LIST = 14.+W ; PRINT MOV #BUF,R0 CMP COL,#LPSIZE BLE T30010 INC CHAR CMP CHAR,#177 BLE T30000 JMP RESTRT .PAGE TEST4: ;TEST 4 MOVB #41,CHAR T40000: MOV #1,CNT T40010: MOV #1,COL ;FILL BUFFER MOV #BUF,R0 T40020: MOVB CHAR,(R0)+ INC COL CMP COL,CNT BLT T40020 X.ENDC .ENDC .IFL PRIP02 $PS002 = $NBLKS-$SB002 .ENDC .IFGE PRIP02 $PS002 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB002-$PS002 XXXXXXXX ; PRI 2 TOO LARGE .ENDC .ENDC .IFL PRIP03 $PS003 = $NBLKS-$SB003 .ENDC .IFGE PRIP03 $PS003 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB003-$PS003 Y4. ; DEPENDS OF WHETHER KPAR'S RET.PC = LIST-2 ;ARE SAVED LPS = 177514 ; LINE PRINTER STATUS LPB = 177516 ; LINE PRINTER BUFFER .PAGE ;********************************************************************** ;* ** ;* L P R N T R D A T A T A B L E S ** ;* [ ; LINE FULL UP TO CNT ; MOVE LF MOVB #LF,(R0)+ MOV #BUF,R0 JSR PC,PRINT ; PRINT LINE INC CNT CMP CNT,#LPSIZE BLE T40010 ; MAKE LINE WIDER INC CHAR CMP CHAR,#177 BLE T40000 JMP RESTRT .PAGE TEST5: ;PRINT CHAR E PER PC CARD HALT MOV @#SWR,CARD \ XXXXXXXX ; PRI 3 TOO LARGE .ENDC .ENDC .IFL PRIP04 $PS004 = $NBLKS-$SB004 .ENDC .IFGE PRIP04 $PS004 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB004-$PS004 XXXXXXXX ; PRI 4 TOO LARGE .ENDC .ENDC .IFL PRIP05 $PS005 = $NBLKS-$SB005 .ENDC .IFGE PRIP05 $PS005 = 4. ; ASSIGN 4 BLOCKS - 10] ** ;* 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. ** ;* ** ;********************************************************************** ; LPBUSY: .=.+NLP+NLP ;1 = L/P CURRENTLY IN USE ; LPDATA: .=.+NLP+NLP ;ADDRESS O_ ;CARD NO. (0-20) OCTAL T50000: CLR R0 ; BLANK LINE MOV #BUF,R1 T50010: MOVB #40,(R1)+ INC R0 CMP R0,#LPSIZE BLE T50010 MOV CARD,R0 MUL #8.,R0 ;COL NO. ADD #BUF,R0 CLR R1 T50020: MOVB #105,(R0)+ ;E INC R1 CMP R1,#8. BLT T50020 T50030: MOV #BUF,R0 JSR PC,PRINT `24 WORDS .IFL $NBLKS-$SB005-$PS005 XXXXXXXX ; PRI 5 TOO LARGE .ENDC .ENDC .IFL PRIP06 $PS006 = $NBLKS-$SB006 .ENDC .IFGE PRIP06 $PS006 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB006-$PS006 XXXXXXXX ; PRI 6 TOO LARGE .ENDC .ENDC .IFL PRIP07 $PS007 = $NBLKS-$SB007 .ENDC .IFGE PRIP07 aF ACTIVE DATA BUFFER ; ; LPFRST = . ;ADDRESS OF FIRST LIST IN THREAD LPLAST = .+2 ;ADDRESS OF LAST LIST IN THREAD .REPT NLP*NLPRTY .WORD 0 .IIF NE $KT11C .PACK .-2 .IIF EQ $KT11C .WORD .-2 .ENDR ; ; THE ABOVE PRIORITY TABLES ARE STORED AS: ; ; PRIORITY 1 'FIRST' * ; PRIORITY 1 'LAST' * ; PRIORITY 2 'FIRST' * L/P NUMBER 1 ; PR BR T50030 CARD: .WORD 0 .PAGE ; DATA TESTNO: .WORD 0 ; CURRENT TEST NUMBER CHAR: .WORD 0 COL: .WORD 0 CNT: .WORD 0 .EVEN .BLKW 20. STACK: .WORD 0 BUF: ; OUTPUT BUFFER .=. + LPSIZE + LPSIZE +LPSIZE+ 2 .END d$PS007 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB007-$PS007 XXXXXXXX ; PRI 7 TOO LARGE .ENDC .ENDC .IFL PRIP08 $PS008 = $NBLKS-$SB008 .ENDC .IFGE PRIP08 $PS008 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB008-$PS008 XXXXXXXX ; PRI 8 TOO LARGE .ENDC .ENDC .IFL PRIP09 $PS009 = $NeIORITY 2 'LAST' * ; . * ; . * ; . * ; PRIORITY NLPRTY 'LAST' * ; . * ; . * ; . * ; REPEAT FOR EACH L/P ; ; LPTASK: .=.+NLP+NLP ;THE TASK NO. WHO INITIATED THE CURRENT RQST ; LPCNT: .=.+NLP+NLP ;INDEX INTO TEXT OF CURRENT REQUEST ; LPMAX: .=.+hBLKS-$SB009 .ENDC .IFGE PRIP09 $PS009 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB009-$PS009 XXXXXXXX ; PRI 9 TOO LARGE .ENDC .ENDC .IFL PRIP10 $PS010 = $NBLKS-$SB010 .ENDC .IFGE PRIP10 $PS010 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB010-$PS010 XXXXXXXX ; PRI 10 TOO LARGE .ENDC iNLP+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 THE LENGTH OF THE ;CURRENT L/P BUFFER BEING OUTPUT (WHICH ;Il .ENDC .IFL PRIP11 $PS011 = $NBLKS-$SB011 .ENDC .IFGE PRIP11 $PS011 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB011-$PS011 XXXXXXXX ; PRI 11 TOO LARGE .ENDC .ENDC .IFL PRIP12 $PS012 = $NBLKS-$SB012 .ENDC .IFGE PRIP12 $PS012 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB012-$PS012 XXXXXXXX mS NOT NECESSARILY THE SAME AS THE CALLER'S ;BUFFER LENGTH) ; LPBUF: .= (LPSIZE/2)*NLP+. .=LPSIZE+2*NLP+. ;BUFFERS FOR LINE PRINTER OUTPUT .BOUND ; LPLIST: .REPT NLP .BOUND .WORD 1,1400,TYDONE,0,0,0,0,0,0 ;TTYOUT LISTS FOR L/P ERROR MESSAGES .ENDR .BOUND ; .MACRO .LPTMR N .BOUND .WORD 1,0,0,0 .BYTE $RES .BYTE 220 ;Ap ; PRI 12 TOO LARGE .ENDC .ENDC .IFL PRIP13 $PS013 = $NBLKS-$SB013 .ENDC .IFGE PRIP13 $PS013 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB013-$PS013 XXXXXXXX ; PRI 13 TOO LARGE .ENDC .ENDC .IFL PRIP14 $PS014 = $NBLKS-$SB014 .ENDC .IFGE PRIP14 $PS014 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS qRGUMENT AND JSR OPTIONS .WORD 0,N,LPTIME .ENDM ; LPMOD = . .LPTMR 0 ;L/P 1 TIMER MODULE .IIF GE NLP-2 .LPTMR 2 ;L/P 2 TIMER MODULE .IIF GE NLP-3 .LPTMR 4 ;L/P 3 TIMER MODULE .IIF GE NLP-4 .LPTMR 6 ;L/P4 TIMER MODULE LPUNIT: .BYTE 3,0,0,0 ;VALID LOGICAL DEVICE ADDRESSES .=LPUNIT+NLP .EVEN .IFG NLP-1 ; LPIOLS: .WORD LPLIST t .IFL $NBLKS-$SB014-$PS014 XXXXXXXX ; PRI 14 TOO LARGE .ENDC .ENDC .IFL PRIP15 $PS015 = $NBLKS-$SB015 .ENDC .IFGE PRIP15 $PS015 = 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB015-$PS015 XXXXXXXX ; PRI 15 TOO LARGE .ENDC .ENDC .IFL PRIP16 $PS016 = $NBLKS-$SB016 .ENDC .IFGE PRIP16 $PS016 = u ;ADDRESS OF LINE PRINTER .WORD LPLIST+20. ;TTY MESSAGE I/O LIST ADDRESSES FOR QUICK ACCESS .WORD LPLIST+40. .WORD LPLIST+60. .=LPIOLS+NLP+NLP ; LPMDAD: .WORD LPMOD ;TIMER MODULE ADDRESSES .WORD LPMOD+16. .WORD LPMOD+32. .WORD LPMOD+48. .=LPMDAD+NLP+NLP .ENDC ; ; .IFNZ LPBACK ; LPTTY: .WORD 0 ;SWITCH FOR LINE PRINTER BACKUP BY TTYx 4. ; ASSIGN 4 BLOCKS - 1024 WORDS .IFL $NBLKS-$SB016-$PS016 XXXXXXXX ; PRI 16 TOO LARGE .ENDC .ENDC ; ; .ENDC ; MATCH FOR .IFNZ OVRLAY ; ; ROS SYSTEM TASK NUMBERS ; ; $INPNO = 1 ; INPUT $CPTNO = MXTASK+2. ; COMPRS $INITD = 3. ; DISC INITIALIZER $FLTNO = MXTASK+4. ; FILE LIST $RLDNO = MXTASK+5. ; ROS LOADy .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.,0 .BYTE CR,LF |ER $RASNO = MXTASK+6. ; ROS ASSEMBLER TASK NUMBER $UTLNO = MXTASK+7. ; ROS UTILITY TASK $TKCNO = MXTASK+8. ; TASK C??? $TMRNO = 2. ; TIMER QUEUE PROCESSOR ; .PAGE $ABMES = 3 ; NO. OF ABORT MESSAGE BUFFERS .IFL $ABMES ; $ABMES MUST BE => 0. XXXXXX ; ABRT .ENDC ; } .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 ;ADDRESSES OF EACH LINE PSTP ; THE SYSGEN PARAMETER '$PST CONTROLS THE EXECUTION PATH*PSTP ; DURING A TASK ERROR. PSTP ; = -1 ROS + USER ROUTINES PSTP ; = 0 ROS PSTP ; = +1 USER PSTP ; PSTP $PST = 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' .EVEN .IFG0 ; PSTP ; PSTP .PAGE $CLOCK = 0 ; INTERRUPTS SOURCE OFR MAINTAINING ; ; TIMERS AND DECKS ; ; 0=DEC LINE FREQUENCY(KW11-2) ; ; 1=DDS CLOCKSX ;FOLLOWING ARE SYSGEN PARAMETERS FOR THE TIMER AND CALENDAR ROUTINES ; NORMALLY THE BASE PERIOD FOR THE TIMERS 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.,0 .BYTE CR,LF IS THE INTERRUPT PERIOD, AND ; IF THAT PERIOD IS DESIRED FOR USE BY ANY TIMER MODULE, "RESO" MUST BE ; SET TO 1, AND THAT RESOLUTION (ZERO) SPECIFIED BY THOSE MODULES. ; IF IT IS DESIRED TO MAKE THE BASE PERIOD COARSER THAN THE INTERRUPT ; PERIOD, "$TMBAS" MUST BE SET TO THE DESIRED RATIO OF BASE PERIOD TO ; INTERRUPT PERIOD. $TMBAS = 0 ;DE-SELECT ALTERNATE BASE PERIOD OPTION ; THE FOLLOWING PARAMETERS SPECIFY THE MULTIPLIERS THAT WILL BE LOADED ; INTO THE RESOLUTI .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: .WORD LPBUF ON COUNTER TABLES FOR DETERMINING THE PERIOD OF EACH ; RESOULTION. THE PERIOD OF A GIVEN RESOLUTION LEVEL DEPENDS ON ALL ; THE PRECEDING LEVELS (WITH LOWER NUMBERS), WHICH ACT AS SUCCESSIVE ; MULTIPLIERS IN COUNTING TO THE GIVEN RESOLUTION LEVEL. ; THUS, FOR "RES4", ITS PERIOD WOULD BE: ; RES4*RES3*RES2*RES1*RES0 --- IN UNITS OF THE BASE PERIOD RES0 = 1 ; 0.01 SEC RES1 = 1 ; 0.01 SEC RES2 = 2 ; 0.02 SEC RES3 ;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 .=LPSTS+NLP+NLP ; = 5 ; 0.1 SEC RES4 = 2 ; 0.2 SEC RES5 = 5 ; 1.0 SEC RES6 = 5 ; 5.0 SEC RES7 = 2 ; 10.0 SEC RES8 = 3 ; 30.0 SEC RES9 = 2 ; 60.0 SEC RES10 = 5 ; 5 MIN RES11 = 2 ; 10 MIN RES12 = 3 ; 30 MIN RES13 = 2 ; 60 MIN RES14 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 ; LPFEED: .WOR= 2 ; 2 HRS RES15 = 6 ; 12 HRS ; IN SYSTEMS WHERE THE BASE PERIOD IS GREATER THAN ONE MILLISECOND, ; "MSECR" WILL NECESSARILY HAVE A PERIOD GREATER THAN ONE MILLISECOND. MSECR = 0 ;MAX RESOLUTION: #0 AT 10 MILLISECONDS SECR = 5 ;"RES5" IS THE ONE-SECOND RESOLUTION TRES = SECR ; FOR TIME-SLICE WATCH-DOG IN RPOM $NRES = 16. ;USE MAX # OF RESOLUTIONS .IFLD 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: .WORD LPVC.1 E $NRES XXXXXXXX ;$NRES MUST BE FROM 1 TO 16 .ENDC .IFG $NRES-16. XXXXXXXX ;COME ON! MUST BE LESS THAN 17 .ENDC ; THE BASE PERIOD FOR THE TIME-OF-DAY CLOCK, ABORT, AND TIME-SLICE IS ; NORMALLY THE INTERRUPT PERIOD, AS SPECIFIED BY "TICRES". ; IF A MULTIPLIER FOR THIS INTERRUPT IS DESIRED TO PRODUCE A COARSER ; BASE PERIOD, USE THE PARAMETER "$ABMPL" TO SPECIFY THE RATIO DESIRED. TICRES = 10. ;T;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 .MACRO SAV.56 MOV @#$KPAR5,-(SP) ;MACRO TO SAVE KERNEL PAR 5 AND 6 MOV @#$KPAR6,-(SP) .ENDM .MACRO RST.56 MOV (SP)+,@#$KPAR6 ;MACRO TO RESTOR-O-D CLOCK TICKS-PER-SECOND $ABMPL = 0 ;NO T-O-D CLOCK BASE MULTIPLIER $GTICS = 0 ; IF 0, GTIME RETURNS HOURS, MIN., SEC. ; IF 1, ALSO RETURNS # MILLSECONDS TODINT = 320 ;INTERRUPT VECTOR FOR T-O-D INTERRUPT TIMINT = TODINT+4 ;INTERRUPT VECTOR FOR INTERVAL TIMER STLINT = TIMINT+4 ;VECTOR FOR STALL ALARM INTERRUPT STLREG = 167000 ;ADDRESS FOR STALL ALARM RESETE KERNEL PAR 5 AND 6 MOV (SP)+,@#$KPAR5 .ENDM ;********************************************************************** ;* ** ;* S T A R T O F L P R N T R ** ;* ** ;* ** LPRNTR: MOV R0,-(SP) ;GUESS MOV R1,- .IFNZ $CLOCK CLKENB = 167002 ;ADDRESS FOR ENABLE OF CLOCKS TODBIT = 4 ;BIT TO ENABLE TIME-OF-DAY INTERRUPT TIMBIT = 10 ;BIT TO ENABLE INTERVAL TIMER INTERRUPT STLBIT = 0 ;BIT TO ENABLE STALL ALARM INTERRUPT .ENDC .IFZ $CLOCK CLKENB = 777546 ;ADDRESS OF DEC LINE CLOCK TODBIT = 0 ; TIMBIT = 100 ;CLOCK ENABLE BIT STLBIT = 0 (SP) ; WHAT MOV R2,-(SP) ; WE'RE MOV R3,-(SP) ; DOING MOV R4,-(SP) ; HERE MOV R5,-(SP) ; SAV.56 ;SAVE KERNEL PAR 5 AND 6 MOV LIST(SP),R0 ;GET ADDRESS OF I/O LIST .IFZ $KT11C MOV DATA(R0),R1 ;GET ADDRESS OF DATA .ENDC .IFNZ $KT11C MOV DTVIRT(R0),R1 ;GET SYSTEM VIRTUAL DATA BUF ; TIMINT = 100 ; DEC LINE CLOCK TRANSFER VECTOR ADD. .ENDC $TMSLC = 1 ;SYSTEM OPTION FOR INCLUDING TIME-SLICING $SWATZ = 20. ;NUMBER OF ENTRIES IN SCHEDULER "WAIT" TABLE $TWATZ = 20. ;WORDS IN TIMER'S "WAIT" TABLE .PAGE $MTAPE = 1 ; IF = 1, MAGTAPES IN SYSTEM .IF NZ $MTAPE ; ONLY IF HAVE MAGTAPES $DATUM = 1 ; TYPE OF MAGTAPES FER ADDRESS .ENDC 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 INC R3 CMP R3,#NLP ; IF 0, PEC DRIVES (800 BPI.) ; IF 1, DATUM DRIVES (1600 BPI.) .ENDC ; $DTAPE = 1 ; DECTAPE OPTION ; NDISCS = 1 ;NO. OF DISC CONTROLLERS (0 = NO DISCS) ; $DDSDC = 1 ; USE DDS DICS ; ACTSIZ = 20. ; MAXIMUM NO. OF ENTRIES IN AUTH. CODE .IFL 20.-ACTSIZ XXXXXXXX ; ERROR-ALLOCATE MORE LOCATIONS XXXXXXXX BLT LPRA00 .ENDC MOV #3,R4 ;AT THIS POINT, THE L/P # IS NOT LEGAL ; LPRA10: MOV R4,ERROR(R0) ; RETURN ERROR ; LPRA15: RST.56 ;RESTORE CALLER'S KERNEL PAR 5/6 REGISTERS MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; THE MOV (SP)+,R3 ; YOU-KNOW-WHATS MOV (SP)+,R2 ; . MOV (SP)+,R1 ; ; FOR AUTHORIZATION CODES .ENDC ; .IFNZ NDISCS ; $DSKER = 0 ; DISK ERROR SWITCH. IF 0 ROS DOES ALL ; IF 1 USER ALSO HAS A CHANCE. ; DRESDI = 1 ; DISC RESIDENT DIRECTORY OPTION .IFL 3-NDISCS XXXXXXXX ; PRESENTLY CODED FOR MAX. OF 3 DISCS .ENDC ; NDPRT1 = 5 ; NO. OF PRIORITY LEVELS IN DISC 1 QUEUES .IFL NDPRT1-3 . 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 LPRA30 ;BRANCH IF ILLEGAL CMP R2 XXXXXXXX ; MUST BE AT LEAST THREE .ENDC MAXID1 = 500. ; MAXIMUM ID ON DISC 1 ; .IFG NDISCS-1 NDPRT2 = 7 ; NO. OF PRIORITY LEVELS IN DISC 2 QUEUES .IFL NDPRT2-3 XXXXXXXX ; MUST BE AT LEAST THREE .ENDC MAXID2 = 500. ; MAXIMUM ID ON DISC 2 .ENDC ; .IFG NDISCS-2 NDPRT3 = 3 ; NO. OF PRIORITY LEVELS IN DISC 3 QUEUE,#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 INEBC .=.-4 BR LPRA50 .ENDC S .IFL NDPRT3-3 XXXXXXXX ; MUST BE AT LEAST THREE .ENDC MAXID3 = 500. ; MAXIMUM ID ON DISC 3 .ENDC $SYSFL = NDISCS+5 ; NO. OF SYSTEM FILE ID'S IN ROS ; ; COMPID,FTDIR,CDIMGE,CDIHDR,TTFILE .IFZ DRESDI NCFILE = $SYSFL+40. ; NO. OF CORE RESIDENT FILE ID'S .ENDC .IFNZ DRESDI NCFILE = NDISCS+$SYSFL+40. ; NO. OF CORE RESIDENT; LPRA45: MOV #11.,R4 BR LPRA10 ; LPRA50: JSR PC,LPLEVL ;NOW DETERMINE THE INDEX FOR THE ;L/P AND PRIORITY VALUES .IFLE NLP ;THIS LOGIC NEEDS TO BE CONSIDERED MOV LOGMAX,R4 ; LPRA51: TBIT #AVAIL,PHYDEV(R3) ;SEE IF THIS DEVICE IS AVAILABLE BNE LPRA53 ;BRANCH IF IT IS ; LPRA52: TBIT #ALT,PHYDEV(R3) ;OOPS. BETTER SEE I ID'S ; ; INCLUDING DOD'S AND SYSTEM FILES NCRWDS = NCFILE*5 ; NO. OF CORE RESIDENT WORDS NEEDED ; ; FOR CORE DIRECTORY NCRLOC = NCRWDS+NCRWDS ; NO. OF LOCATIONS IN CORE RESIDENT ; ; DIRECTORY .ENDC ERRPRT = 1 ; PRINT-OUT DISC ERROR MESSAGES OPTION CHKPTC = 1 ;1 = CHECKPOINTING ALLOWED .IFZ $KT11C F 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 .END .IFNZ CHKPTC XXXXXXXX .ENDC .ENDC FXPART = 1 ; FIXED PARTITION OPTION $SGMNT = 1 ; SEGMENT LOAD OPTION $FTMAX = 10. ; LARGEST FILE TYPE IN SYSTEM $IDMAX = 500. ; LARGEST FILE ID IN SYSTEM-- ; ; MUST BE >= MAXID1,2,3,..,N $FTDRL = $FTMAX*3/64.+1 ; NO. OF SECTORS IN FILE TYPE DIRECTORY $ROSFW = NDISCS+$SYSFL*5 ; NO. OF WORDS IN ROS FILC ; LPRA53: MOV @#PSR,-(SP) ;PRIORITY QUEUE. INHIBIT INTERRUPTS. .LOCK DEC (R0) ;SEE IF LIST IS THREADABLE BNE LPRA80 ;BRANCH IF NO, CAUSE THAT'S A NO-NO .IFZ $KT11C MOV R0,@LPLAST(R2) ;QUEUE IT - MOV R0,LPLAST(R2) ;QUEUE IT ! .ENDC .IFNZ $KT11C MOV R0,-(SP) ;STORE SYSTEM VIRTUAL LIST ADDRESS ON STACK JSR PC,SVPPA ES $CDISZ = NCRWDS-$ROSFW/64.+1 ; NO. OF SECTORS IN CORES ; ; DIRECTORY IMAGE $TKFLN = + <*3> +1/2+1+3 & 177774 ; 5/14/73 ; $TKFLN = # WORDS IN TASK TABLES + 1 FOR 'TASKS' + ROUND UP TO 5/14/73 ; XXXXXXXXXXXXXX00 FOR DISC CONTROLER. 5/14/73 ; $TKFNS = $TKFLN/64.+1 ; NO. OF SECTORS IN TASK TABLE FILE ; $ROSIZ = 320. ; SIAZE OF ROS DI;AND CONVERT TO PACKED PHYSICAL MOV LPLAST(R2),-(SP);CONVERT THE ADDRESS OF THE LAST ENTRY IN JSR PC,PPASV6 ;THE QUEUE FROM PACKED PHYS. TO SYS VIRTUAL MOV 2(SP),@(SP)+ ;AND FINALLY, QUEUE THE CURRENT REQUEST MOV (SP)+,LPLAST(R2) ; THEN.... MOV DTPAR(R0),@#$KPAR6 ; KERNEL PAR 6 .ENDC .IFNZ $KT11C CLR R4 CMP #TSK.PC,RET.PC+2(SP) ;SEE IF CALLER IS A TASK .ENDC SK BOOT AREA. 5/14/73 ; ; ; THE FOLLOWING IS FOR DISC RESIDENT DIRECTORIES ; DIRAD1 = $ROSIZ ; BASE ADD. OF DISK RES. DIRECTORY ON 5/14/73 ; SYSTEM DISK (UNIT #1) 5/14/73 ; ; LEAVES ROOM FOR 20K ROS BOOT .IFZ DRESDI DIRLN1 = 0 ; ZERO LENGTH .ENDC .IFNZ DRESDI DIRLN1 = MAXID1-1/12.+1 ; DISC DIRECTORY 1 LENGTH .IFZ $KT11C MOV ACTIVE,R4 ;SEE IF CALLER IS A TASK .ENDC BNE LPRA55 ;BRANCH IF HE ISN'T MOV $CTASK,R4 ;OTHERWISE, GET HIS NUMBER INCB IOSTAT(R4) ;AND INCREMENT THE I/O IN PROGRESS STATUS BYTE ; LPRA55: MOV R4,SYSTEM(R0) ;SAVE TASK NO. (0 =====> NOT A TASK) TST LPBUSY(R3) ;SEE IF IT'S THE FIRST IN THE QUEUE BEQ LPRB00 ;BRANCH IF YES .IFG NDISCS-1 DIRAD2 = 0 ; DISC RESIDENT DIRECTORY ADDRESS DISC 2 DIRLN2 = MAXID2-1/12.+1 ; DISC DIRECTORY 2 LENGTH .ENDC .IFG NDISCS-2 DIRAD3 = 0 ; DISC RESIDNET DIRECTORY ADDRESS DISC 3 DIRLN3 = MAXID3-1/12.+1 ; DISC DIRECTORY 3 LENGTH .ENDC .ENDC ; ; THE FOLLOWING CONTAINS THE FILE TYPE STATUS DESCRIPTORS ; FOR EACH FILE TYPE. ; $FD000 = 41 ; FILE TY MOV (SP),@#PSR ;ELSTWISE, CLEAR THE INHIBIT CLR R4 ;NO ERRORS SO FAR ; ; THIS SECTION RETURNS TO THE CALLER (IF EXIT TYPES 1 OR 3) OR TO ; THE ROS DISPATCHER (IF EXIT TYPE 2); THE LATTER REQUIRES THAT ; THE TASK BE SUSPENDED FIRST. ; LPRA60: CMPB #2,TYPE(R0) ;IS THE EXIT TYPE = 2? BNE LPRA70 ;BRANCH IF NO TST SYSTEM(R0) ;SEE IF THIS IS A TASK CALLING BEQ LPRA70 ;BRANCH PE 0, LOG UNIT 1, NO COMPRESSION $FD001 = 1 ; FILE TYPE 1, LOG UNIT 1 $FD002 = 1 ; FILE TYPE 2, LOG UNIT 1 $FD003 = 1 ; FILE TYPE 3, LOG UNIT 1 $FD004 = 1 ; FILE TYPE 4, LOG UNIT 1 $FD005 = 101 ; FILE TYPE 5, LOG UNIT 1, CKSAVE REQUIRED $FD006 = 1 ; FILE TYPE 6, LOG UNIT 1 $FD007 = 1 ; FILE TYPE 7, LOG UNIT 1 $FD008 = 1 ; FILE IF THE CALLER IS NOT A TASK MOV (SP)+,LIST(SP) ;GOOD, HE IS A TASK; PUT HIS PSR ON STACK .IIF NE $KT11C ADD #4,SP ;SINCE CALLER IS A TASK, HE ;DOESN'T NEED THE KERNEL PAR'S MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; ALL MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV (SP)+,R1 ; REGISTERS MOV (SP)+,R0 ; TYPE 8, LOG UNIT 1 $FD009 = 1 ; FILE TYPE 9, LOG UNIT 1 .IFL 10.-$FTMAX XXXXXXXX ; ONLY SET UP FOR 10. FILE TYPES .ENDC $OVTYP = 5. ; FILE TYPE FOR OVERLAY TASKS ; ; FILE TYPE SIZE TABLE - IN SECTORS ; $DSIZE = 32768. ; SIZE OF ROS/GULF DISK 5/14/73 ; .IFNZ DRESDI $FS000 = DIRAD1+DIRLN1+$FTDRL+$CDISZ+$TKFNS .ENDC .IFZ DRESDI $ 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 CALLER'S PS BR LPRA15 ;AND GO WHERE THE REGISTER CAN BE RESTORED ; LPRA80: INC (R0) ;LIST IS NOT THREADABLE MOV (SP)+,@#PSR MOV #1,RFS000 = $FTDRL+$CDISZ+$TKFNS .ENDC $FS001 = $ROSIZ $FS002 = 300. $FS003 = 300. $FS004 = 300. $FS005 = 2500. $FS006 = 300. $FS007 = 5000. ; ROS BATCH AREA 5/14/73 $FS008 = 300. $FS009 = 300. ; $ALOD1 = $FS000+$FS001+$FS002+$FS003+$FS004 $ALOD2 = $FS005+$FS006+$FS007+$FS008+$FS009 .IFL $DSIZE-$ALOD1-$ALOD2 XXXXXXXX ; ONLY 8192 SECTO4 BR LPRA10 .PAGE ;********************************************************************** ;* ** ;* AT THIS POINT, THE REQUEST JUST QUEUED IS THE ONLY ** ;* REQUEST IN THE QUEUE, SO WE GONNA START THE OUTPUT. ** ;* INTERRUPTS ARE INHIBITED ON ENTRY, AND THE REGISTERS ** ;* ARE SET AS FOLLOWS: ** ;* RS AVAIL.- 1/2 MEGAWORDS .ENDC ; .IFNZ $BATCH $BCHID = NDISCS+$SYSFL+1 ; FILE ID FOR BATCH FILE $BCHTP = 7. ; BATCH FILE TYPE $RASIZ = 200. ; NO. OF ENTRIES IN USERS SYMBOL TABLE ; ; IN RASM ; ; NOTE: 4 WORDS/ENTRY $LSDSZ = 1000. ; NO. OF WORDS RESERVED FOR LOADERS ; ; SYMBOL DIRECTORY (LSD) ; ** ;* R0 = ADDR(LIST) ** ;* R1 = ADDR(DATA) ** ;* R2 = PRIORITY INDEX ** ;* R3 = L/P INDEX ** ;* ** ;********************************************************************** ; ; LPRB00 ; NOTE: $LSDSZ MUST BE >/= TO ; $MXOBJ*7/2 (5 WO-DS PE- SY4B6L#D $MXOBJ = 20. ; MAX NO. OF OBJECT MODULES TO BE ; ; LINKED INTO ANY GIVEN LOAD ; ; MODULE. .ENDC .ENDC ; MATCHES .IFNZ NDISCS .PAGE ; ; TTYIO SYSGEN PARAMETERS ; NTTYS = 1 ;NO. OF TELETYPES : INC LPBUSY(R3) ; SET L/P BUSY FLAG MOV (SP),@#PSR ;ENABLE INTERRUPTS MOV R1,LPDATA(R3) ;SAVE DATA BUFFER ADDRESS MOV SYSTEM(R0),LPTASK(R3) CLR LPCNT(R3) ;CLEAR THE BUFFER INDEX POINTER MOV R2,LPRIOR(R3) ;SAVE PRIORITY INDEX MOV NWORD(R1),LPMAX(R3) ;SAVE MAX NO CHARACTERS .IFNZ INEBC ;'IF EBCDIC CONVERSION' BGT LPRB10 ;IN SYSTEM SYSTTY = 0 ;LOGICAL UNIT NO. OF SYSTEM ;TTY DEVICE MSGBUF = 0 ;MESSAGE BUFFERING OPTION: IF 1, ;DISC MESSAGE BUFFERING VERSION IS ;ASSEMBLED. IF 0, CORE VERSION IS ;ASSEMBLED. DISCUN = 1 ;LOGICAL UNIT NO. OF DISC TO BE USED ;FOR MESSAGE BUFFERING D;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 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 BUFSZ = 1 ;NO. OF 64 WORD DISC SECTORS ALLOCATED ;FOR BUFFERING OF ONE MESSAGE ON DISC FILESZ = 20*DBUFSZ ;NO. OF SECTORS PER FILE NTRYS = 3 ;NO. OF TRYS TO OUTPUT A CHARACTER ;TO TTY TTOTIM = 15. ;MILLISECOND COUNT FOR TTY ;OUTPUT TIMERS TTITIM = 15. ;SECOND COUNT FOR TTY INPUT/OPERATOR JSR PC,LPCNVT ;CALL LPCNVT TO CONVERT THE USER'S .LOCK ;NEED TO INHIBIT BEFORE I/O CAN START ; LPRB35: ;FIRST LINE OF TEXT. JSR PC,LPSIO ;OTHERWISE, START I/O CLR R4 BR LPRA60 ;THEN GO SET UP FOR EXIT ; LPRB40: JMP LPIE00 .PAGE ;********************************************************************** ;* ;RESPONSE TIMERS TTWTIM = 240. ;SECOND COUNT FOR WAIT TIMER NWUCH = 5 ;NO. OF CHARS TO BE OUTPUT FOR ;WARMUP OF A TTY UNIT EOMCH = 33 ;ALTERNATE EOM CHAR (ALT KEY) EOMOPT = 0 ;EOM CHAR OPTION WHERE ; 1 = EOM IS FOLLOWED BY CR AND LF ; 0 = NOT FOLLOWED BY CR AND LF EOMPRT = 0 ;EOM PRIN ** ;* L P I N T ** ;* ** ;* LINE PRINTER INTERRUPT ROUTINE, ENTERED WHEN THE PRINTER ** ;* IS READY TO ACCEPT ANOTHER LINE OR IF AN ERROR WAS ** ;* DETECTED. ** ;* ** ;*************************************T OPTION WHERE ; 1 = EOM IS PRINTED ; 0 = EOM IS NOT PRINTED EOLCH = 013 ; CHAR BEING USED FOR END OF LINE ON ;TTY INPUT ECHOCH = 40 ;ECHO CHAR -- CHAR OUTPUT FOR NO ECHO MRCH = 25 ;MESSAGE RESTART CHAR (CONTROL U) LINELN = 72. ;LINE LENGTH: NO. OF CHARS TO BE ;TYPED IN A LINE ********************************* ; LPINT0: JSR R5,SAVE ; CALL SAVE TO TAKE CARE OF THINGS .IFZ NLP-1 CLR R3 .ENDC .IFGE NLP-2 MOV #0,R3 ;SET L/P INDEX TO ZERO (FIRST L/P) BR LPIA00 ; LPINT2: JSR R5,SAVE ; CALL SAVE TO TAKE CARE OF THINGS MOV #2,R3 ;SET L/P INDEX TO SECOND L/P .IFGE NLP-3 BR LPIA00 ; LPINT4: JS .PAGE ;*********************************************************************** ;* ** ;* SEGMENT REGISTER ADDRESSES REQUIRED BY THE PROGRAMS WHEN ** ;* IMPLEMENTED ON AN 11/45 OR 11/25, EITHER WITH SEGMENTATION. ** ;* ** .IFNZ $KT11C ;* ;* K E R N E L S E G M E N T R E G I S T E R S ;* $KPAR0 = 772340 ; $R R5,SAVE ; ET CETERA MOV #4,R3 .IFGE NLP-4 BR LPIA00 ; LPINT6: JSR R5,SAVE ; ... AND ET CETERA MOV #6,R3 .ENDC .ENDC .ENDC ; ; LPIA00: MOV #RESTOR,R5 ; SET UP R5 FOR RETURN TO RESTOR TST LPBUSY(R3) ;WE'RE GOING TO IGNORE THIS BNE LPIA01 ;INTERRUPT IF LINE PRINTER JMP (R5) ;I/O ISN'T IN PROGRESS KPAR1 = 772342 ; $KPAR2 = 772344 ;KERNEL $KPAR3 = 772346 ; PAGE $KPAR4 = 772350 ; ADDRESS $KPAR5 = 772352 ; REGISTERS $KPAR6 = 772354 ; $KPAR7 = 772356 ; ; $KPDR0 = 772300 ; $KPDR1 = 772302 ; $KPDR2 = 772304 ;KERNEL $KPDR3 = 772306 ; PAGE $KPDR4 = 772310 ; LPIA01: .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 .IFZ $KT11C MOV LPFRST(R2),R0 ;GET I/O LIST ADDRESS .ENDC .IFNZ $KT11C MOV LPFRST(R2),-(SP);CONVERT PACKED PHYSICAL LIST ADDRESS JSR ; DESCRIPTOR $KPDR5 = 772312 ; REGISTERS $KPDR6 = 772314 ; $KPDR7 = 772316 ; ;* ;* U S E R S E G M E N T R E G I S T E R S ;* $UPAR0 = 777640 ; $UPAR1 = 777642 ; $UPAR2 = 777644 ;USER $UPAR3 = 777646 ; PAGE $UPAR4 = 777650 ; ADDRESS $UPAR5 = 777652 ; REGISTERS $UPAR6 = 777654 ; $UPAR7 = 777 PC,PPASV5 ;TO SYSTEM VIRTUAL MOV (SP)+,R0 MOV DTPAR(R0),@#$KPAR6 ;INITIALIZE KERNEL PAR 6 FOR DATA ;BUFFER ADDRESS MOV LPDATA(R3),R1 ;GET DATA BUFFER ADDRESS JSR PC,LPSTAT ;GET L/P STATUS BNE LPRB40 ;BRANCH IF AN ERROR WAS DETECTED JSR PC,LPRSET ;THEN RESET THE L/P .IFNZ INEBC TST (R1) ;HERE'S WHERE WE DECIDE WH656 ; ; $UPDR0 = 777600 ; $UPDR1 = 777602 ; $UPDR2 = 777604 ;USER $UPDR3 = 777606 ; PAGE $UPDR4 = 777610 ; DESCRIPTOR $UPDR5 = 777612 ; REGISTERS $UPDR6 = 777614 ; $UPDR7 = 777616 ; .ENDC .PAGE ;********************************************************************** ;* ETHER 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: .ENDC JSR PC,LPCNVT ;AND GO SEE IF THERE'S MORE TEXT BNE LPIA10 ;(DON'T WANT TO LEAVE ANYTHING HANGING) JSR PC,LPS ** ;* IN THE FOLLOWING EQUATES, A ZERO MEANS DO NOT INCLUDE ** ;* THE OPTION. ** ;* ** ;* C A R D R E A D E R E Q U A T E S ** ;* ** ;********************************************************************** NCR = 1IO ;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 .LOCK ;NO DATA LEFT IN USER'S BUFFER, SO ;INHIBIT INTERRUPTS SO'S WE CA DEQUEUE ;THE REQUEST MOV (R0),LPFRST(R2) ;PUT NEXT GUY IN THREAD AT TOP ;NUMBER OF CARD READERS IN SYSTEM BIN = 0 ; DON'T INCLUDE BINARY MODE BCD = 1 ;1 = INCLUDE ALPHANUMERIC MODE, 0 = DONT TTYSW = 1 ;1 = SWITCH INPUT TO TTY ON COMMAND INEBC = 0 ; 1=PROVIDE OFR INTERNAL EBCDIC CODE EXEBC = 0 ; 1=PROVIDE FOR EXTERNAL EBCDIC CODE ; (029 CARD CODE) $RES = 1 ; TIMER RES. FOR CREAD (=10 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) .IFNZ $KT11C CLC ; ROR R4 ;CONVERT THE ADDRESS CLC ; TO PACKED PHYSICAL ROR R4 ; FORMAT .ENDC MOV R4,LPLAST(R2) ; LPIA20: MO.0 MSEC.) $100MS = 10. ;MULTIPLE USING $RES FOR 100 MS $500MS = 50. ;MULTIPLE USING $RES FOR 1/2 SECOND $1SEC = 100. ;MULTIPLE USING $RES FOR 1 SECOND MXTIME = 180. ;MAX SECONDS TO WAIT FOR OPR RESPONSE ; ; NOTE: THE ABOVE TIMES DO NOT NEED TO BE EXACT. SELECT THE ; PROPER VALUES TO GET AS CLOSE AS POSSIBLE TO THE ; TIMES STATES. ; ; ; C / R V E C T O R I N F O R M V #1,(R0) ;SET LIST READY 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  A T I O N ; ; CR1 = 2 ;LOGICAL UNIT NO. FOR CR # 1 CR2 = 2 ;LOGICAL UNIT NO. FOR CR # 2 CR3 = 0 ;LOGICAL UNIT NO. FOR C/R # 3 CR4 = 0 ;LOGICAL UNIT NO. FOR C/R # 4 ; ; C / R D E V I C E I / O A D D R E S S E S ; CRS.1 = 777160 ;CARD READER STATUS - C/R # 1 CRB1.1 = 777162 ;CARD READER BINARY DATA BUFFER CRB2.1 = 777164 ;CARD REA  ;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) ;TDER COMPRESSED DATA ADDRESS ; CRS.2 = 777160 ;CARD READER STATUS - C/O # 2 CRB1.2 = 777162 ;CARD READER BINARY DATA CRB2.2 = 777164 ;CARD READER COMPRESSED DATA ; CRS.3 = 0 ;CAR READER STATUS - C/R # 3 CRB1.3 = 0 ;CARD READER BINARY DATA BUFFER CRB2.3 = 0 ;CARD READER COMPRESSED DATA BUFFER ; CRS.4 = 0 ;CARD READER STATUS - C/R # 4 CRB1.4 = 0 HE TIME HAS COME TO JSR TO THE MOV R3,-(SP) ;I/O COMPLETE SUBROUTINE .IFZ $KT11C MOV R0,R1 ;SET R1 = LIST ADDRESS JSR PC,@$EXIT(R0) .ENDC .IFNZ $KT11C MOV R0,-(SP) ;LET IOCOMX LINK TO THE I/O COMPLETE MOV LPTASK(R3),-(SP);ROUTINE (IT'S KIND OF TRICKY TO GET JSR PC,IOCOMX ;TO TASKS BY A DIRECT JSR). .ENDC MOV (SP)+,R3 ;RESTORE L/P INDEX ;CARD READER BINARY DATA BUFFER CRB2.4 = 0 ;CARD READER COMPRESSED DATA BUFFER ; CRVC.1 = 230 ; C/R # 1 INTERRUPT VECTOR CRVC.2 = 230 ;C/R # 2 INTERRUPT VECTOR CRVC.3 = 0 ;C/R # 3 INTERRUPT VECTOR CRVC.4 = 0 ;C/R # 4 INTERRUPT VECTOR .PAGE ;********************************************************************** ;*  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-1 ;CODE FOR ONLY ONE PRIORITY LEVEL * TST LPFRST(R3) * BEQ LPID00 ;BRANCH IF NOBOD ** ;* L I N E P R I N T E R E Q U A T E C A R D S ** ;* ** ;********************************************************************** NLP = 1 ;NUMBER OF LINE PRINTERS IN SYSTEM NLPRTY = 3 ;NUMBER OF L/P PRIORITY LEVELS LPBACK = 1 ;1 = BACKUP L/P WITH TTY BY OPER COMMAND LPVC.1 = 200 ;L/P # 1 INTERRUPT VECTOR ADDRESS LPVY 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 ;R2 = INDEX FOR TOP PRIORITY * ; * LPIB10: ; * TST LPFRST(R2) C.2 = 200 ;L/P # 2 INTERRUPT VECTOR ADDRESS LPVC.3 = 000 ;L/P # 3 INTERRUPT VECTOR ADDRESS LPVC.4 = 000 ;L/P # 4 INTERRUPT VECTOR ADDRESS LPDT.1 = 765010 ;L/P # 1 DATA BUFFER I/O ADDRESS LPDT.2 = 765010 ;L/P # 2 DATA BUFFER I/O ADDRESS LPDT.3 = 0 ;L/P # 3 DATA BUFFER I/O ADDRESS LPDT.4 = 0 ;L/P # 4 DATA BUFFER I/O ADDRESS LFRG.1 = 765012 ;L/P # 1 LINE;IS THERE A REQUEST FOR THIS * BNE LPIB20 ;PRIORITY LEVEL? BRANCH IF YES * ADD #4,R2 ;INCREMENT INDEX .IFZ $1145 DEC R4 BGT LPIB10 ; AND GO BACK FOR ANOTHER .ENDC .IFNZ $1145 SOB R4,LPIB10 .ENDC BR LPID00 ; * LPIB20: ;  FEED REGISTER LFRG.2 = 765012 ;L/P # 2 LINE FEED REGISTER LFRG.3 = 0 ;L/P # 3 LINE FEED REGISTER LFRG.4 = 0 ;L/P # 4 LINE FEED REGISTER CNT.1 = 765014 ;L/P # 1 WORD COUNT REGISTER CNT.2 = 765014 ;L/P # 2 WORD COUNT REGISTER CNT.3 = 0 ;L/P # 3 WORD COUNT REGISTER CNT.4 = 0 ;L/P # 4 WORD COUNT REGISTER CMD.1 = 765016 ;L/P # 1 COMMAND REGISTER ! * .ENDC ; AT THIS POINT, THERE IS AN ENTRY IN THE QUEUE, AND R2 POINTS ; TO IT. ; .IFZ $KT11C MOV LPFRST(R2),R0 ;DATA I/O LIST ADDRESS MOV DATA(R0),R1 ;AND DATA BUFFER ADDRESS .ENDC .IFNZ $KT11C MOV LPFRST(R2),-(SP);GET NEXT ENTRY IN QUEUE JSR PC,PPASV5 ;CONVERT TO SYSTEM VIRTUAL MOV (SP)+,R0 ;AND PUT IN R0 MOV DTVIRT(R0),R1 ;GET SYSTEM VIRT$ CMD.2 = 765016 ;L/P # 2 COMMAND REGISTER CMD.3 = 0 ;L/P # 3 COMMAND REGISTER CMD.4 = 0 ;L/P # 4 COMMAND REGISTER STAT.1 = 765016 ;L/P # 1 STATUS REGISTER STAT.2 = 765016 ;L/P # 2 STATUS REGISTER STAT.3 = 0 ;L/P # 3 STATUS REGISTER STAT.4 = 0 ;L/P # 4 STATUS REGISTER ; ; LPSIZE = 132. %UAL EQUIVALENT OF MOV DTPAR(R0),@#$KPAR6 ;THE DATA BUFFER ADDRESS .ENDC JSR PC,LPCHEK ;DOUBLE CHECK VALUES BEQ LPIC00 ;BRANCH IF ALL'S WELL MOV #10.,ERROR(R0) ;TSK, TSK. SOMEBODY DID SOMETHING JMP LPIA10 ;WHILE IT WAS IN THE QUEUE ; ; ; REQUEST IS OK, BEGIN PREPARATIONS FOR MESSAGE OUTPUT ; ; LPIC00: MOV R1,LPDATA(R3) ;SAVE VOLATILE STUFF: DATA ADDRESS ( ;NUMBER OF CHARACTERS IN L/P BUFFER LPMXTM = 180. ;MAX NO SECONDS LPRNTR WAITS FOR OPER ACTION LPINH = 4 ;INTERRUPT LEVEL OF L/P $NLINE = 56. ; MAX LINES/PAGE (=CONTROL TAPE. $LPERR = 10. .PAGE ; ; ; ; MACRO DEF. FOR QUEUES ; .MACRO .QUE A,B,C .BOUND .LIST ME A = .-4 B = .-2 .REPT C .WORD 0 .IFZ $KT11C )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 .IFNZ INEBC BGE LPIC10 MOV #EBCLP,R2 NEG LPMAX(R3) ;SET LPMAX = ABS(NWORD) ; LPIC10: .ENDC , .WORD .-2 ; NOTE: PPA WHEN RESOLVED BY IPL .ENDC .IFNZ $KT11C .PACK .-2 .ENDC .ENDR .NLIST ME .ENDM ; ; MACRO TO SET PRIORITY LEVEL 7 ; .MACRO .LOCK PSR = 177776 .IFZ $1145 MOVB #340,@#PSR .ENDC .IFNZ $1145 SPL 7 .ENDC ; ; SET INTERRUPT LOCKOUT .ENDM ; - 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 THE LINE PRINTER'S QUEUE. ; LPID00: JSR PC,LPRSET ;RESET THE LINE PRINTER CLR LPBUSY(R3) ;CLEAR THE BUSY INDICATOR 01 .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 ;********************************************************************** ;* ** ;* THIS SECTION GETS ENTERED FROM THE INTERRUPT ROUTINE IF ** ;*5 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 ATTEMPTS, ** ;* AN ERROR MESSAGE IS GENERATED AND THE REQUEST IS ABORTED. ** ;* WARNING CONDITIONS CAUSE LPRNTR TO WAIT A PRESCRIBED 9 ** ;* PERIOD OF TIME, AFTER WHICH THE REQUEST IS ALSO ABORTED. ** ;* HOWEVER, IF IT BECOMES READY DURING THIS PERIOD, THEN I/O ** ;* WILL CONTINUE. ** ;* ** ;********************************************************************** ; ; LPIE00: BGT LPIE20 ;BRANCH IF ERROR IS NOT FATAL INC LPRTRY(R3) ;INCREMENT E=RROR 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) ;EXIT TO RESTOR ; LPIE10: MOV #LPARTY,-(SP) JSR PC,LPMSGE ;PRINT 'L/P K PARITY ERROR' MOV #6,ERROR(R1) ;TELL CAALLER 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 ;SET UP MAXIMUM TIME WE'LL WAIT CLR LPRTRY(R3) .IFZ NLP-1 MOV #LPMOD,R4 ;GET TIMER MODULE ADDRESS .ENDC E .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)+ ; JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* I ** ;* 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 ** ;* CONTINUE. AFTER LPMXTM SECONDS, LPTIME GIVES UP ON THE ** ;* OPERATOR AND ABORTS THE REQUEST. ** ;* M ** ;* ON ENTRY, R1 CONTAINS THE TIMER MODULE ADDRESS. LPTIME IS ** ;* ENTERED BY A JSR PC,LPTIME ** ;* ** ;********************************************************************** ; ; LPTIME: MOV INDEX(R1),R3 ;GET L/P INDEX FROM MODULE ARGUMENT MOV R1,-(SP) ;REORGANIZE REGISTERS THE WAY WE LQIKE'EM MOV LPDATA(R3),R1 ; R1 = ADDR(DATA) MOV LPRIOR(R3),R2 ; R2 = PRIORITY INDEX .IFZ $KT11C MOV LPFRST(R2),R0 ; R0 = ADDR(LIST) .ENDC ; R3 = L/P INDEX ; R4 = TIMER MUDULE ADDRESS .IFNZ $KT11C MOV LPFRST(R3),-(SP);CONVERT PACKED PHYSICAL LIST JSR PC,PPASV5 ;ADDRESS TO SYSTEM VIRTUAL MOV (SP)+,R0 U ; MOV DTPAR(R0),@#$KPAR6 ;INITIALIZE KPAR6 FOR DATA BUFFER ADDR .ENDC JSR PC,LPSTAT ;GET L/P STATUS BNE LPTA00 ;BRANCH IF STILL NOT READY TST (SP)+ MOV (SP)+,R5 ;OTHERWISE, SET UP TIMER RETURN MOV LPWORD(R3),R4 ;GET LENGTH OF CURRENT LINE BR LPIE05 ;TO LOOK LIKE RESTOR RETURN ; LPTA00: JSR PC,LPRSET ;AND RESET THE L/P INC LPYRTRY(R3) ;INCREMENT #ATTEMPTS COUNTER CMP LPRTRY(R3),#LPMXTM BGE LPTA10 ;BRANCH IF IT'S TIME TO QUIT MOV #$1SEC,-(SP) ;RESTART TIMER FOR ONE SECOND JSR PC,IOQTME TST (SP)+ ;POP OFF ERROR FLAG BNE LPTA10 ;WHAT'S THAT, AN ERROR? THEN BRANCH RTS PC ;RETURN TO TIMER ; ; LPTA10: MOV #7,ERROR(R0) ;SET USER'S ERROR FLAG TST (SP)]+ MOV (SP)+,R5 JMP LPIA10 ;GO TRY NEXT REQUEST. .PAGE ;********************************************************************** ;* ** ;* L P C N V T ** ;* ** ;* THIS SUBROUTINE FORMS ONE PRINTABLE LINE OF TEXT, ** ;* CONVERTING EACH CHARACTER TO TaHE L/P EVEN PARITY ASCII ** ;* FORMAT. LINKAGE IS: ** ;* ** ;* SET R0 = LIST ADDRESS ** ;* R1 = DATA ADDRESS ** ;* R2 = CONVERSION TABLE ADDRESS ** ;* R3 = L/P INDEX ** ;* JSR PC,LPCeNVT ** ;* BNE ;BRANCH IF NO MORE TEXT ** ;* ** ;********************************************************************** ; ; .IFZ $DIVA LPCNVT: ; ; MOV PC,-(SP) ;SET NO DATA FOUND FLAG MOV R0,-(SP) ;SAVE SOME REGISTERS MOV R1,-(SP) ; MOV R5,-(SP) CLR -(SPi) ;TAB POSITION COUNTER MOV LPBUFR(R3),R0 ; R0 = ADDR L/P BUFFER MOV 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 ======>Rm4 CMP R4,#CR ;IGNORE ALL CARRIAGE RETURNS BEQ LPCA15 CMP R4,#MAXCC ;IS IT A CONTROL CHARACTER? BLE LPCA05 ;BRANCH IF YES CMP R0,LPBUFR(R3) ;IF WE'RE AT THE BEGINNING OF THE BUFFER BNE LPCA10 ;AND THE CHARACTER IS NOT CONTROL, THEN INC LPMODE(R3) ;ASSUME AUTO LINE FEED MODE BR LPCA10 ; LPCA05: CMP #HT,R4 ;SEE IF CHARACTER IS A TAB q BEQ LPCA60 ;BRANCH IF 'TIS CMP R0,LPBUFR(R3) ;OTHERWISE, IF WE'RE AT THE 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 LPCA40u ;BRANCH IF L/P BUFFER IF FULL ; LPCA15: INC R5 ;STORE IN L/P BUFFER ; 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'yS BUFFER POINTER SUB LPBUFR(R3),R0 ;DETERMINE NO. WORDS IN L/P BUFFER MOV R0,R4 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 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 LPCA15 ;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 .ENDC  .PAGE .IFNZ $DIVA ; THIS VERSION IS FOR DIVA CONTROLER ; LPCNVT: MOV PC,-(SP) ; SET NO DATA STORED FLAG MOV R0,-(SP) ; SAVE REGISTERS MOV R1,-(SP) MOV R5,-(SP) CLR -(SP) ; CHAR COUNT MOV LPBUFR(R3),R0 ; ADDRESS OF LP OUTPUT BUFFER MOV LPCNT(R3),R5 ; INDEX INTO USERS BUFFER ADD R5,R1 ADD #4,R1 ; ADDRESS OF USERS BUFFER- NEXT CHAR TST R5 BNE MOV #LF,R4 ;NO CHARS TO PRINT - PRINT LF JSR PC,LPSTOR INC R5 LPCA00: ; RETURN HOME MOV R5,LPCNT(R3) ; UPDATE USER BUFFER INDEX MOV (SP)+,R4 ; GET CHAR COUNT MOV (SP)+,R5 ; RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 TST (SP)+ RTS PC ;GO HOME ; ; CMP R5,LPMAX(R3) ; ANY MORE CHARACTERS BGE LPCA00 ; BRANCH IF NO MORE ; ; STILL GOTSUM LPCA20: CLR R4 ;GET CHAR BISB (R1)+,R4 INC R5 ; BUMP INPUT INDEX CMP R4,#CR ; SEE IF CR BNE LPCA40 ; IGNORE IT IF IT IS LPCA30 CMP R5,LPMAX(R3) ; ANY MORE CHARS BLT LPCA20 MOV #CR,R4  ; NO, STORE A CR AT END OF LINE ******** JSR PC,LPSTOR BR LPCA00 ; GO HOME ; LPCA40: CMP R4,#HT ; IS IT A TAB BNE LPCA60 ; BRANCH IF NO LPCA50: MOV #LPBLNK,R4 ; TAB JSR PC,LPSTOR ; STORE BLANKS UNTIL OUTPUT INDEX IS BNE LPCA00 ; MULTIPLE OF 8 OR BUFFER IS FULL BIT #7,(SP) ; IF BUFFER FULL,HOME JAMES BNE LPCA50 ; DIDNT HIT STOP YET BR LPCA30 ; HIT STOP ; LPCA60: ; ; STORE CHAR JSR PC,LPSTOR BNE LPCA00 ; BRANCH IF BUFFER FULL - HOME BR LPCA30 ; GO CHECK BUFFER END .ENDC ;********************************************************************** ;* ** ;* L P S T O R ** ;* ** ;* CONVERT THE CHARACTER IN REGISTER R4 TO EVEN PARITY, ** ;* LINE PRINTER ASCII, THEN STORE IT IN THE LINE PRINTER ** ;* BUFFER. THE L/P READS CHARACTERS FROM INCREASING ** ;* MEMORY LOCATIONS, AND FROM LEFT (TOP BYTE) TO RIGHT ** ;* (BOTTOM BYTE). THUS, LPSTOR CANNOT PERFORM A SIMPLE ** ;* INDEXED STORE. ON ENTRY, THE REGISTERS ARE EXPECTED  ** ;* TO CONTAIN: ** ;* ** ;* R0 = ADDRESS OF L/P BUFFER ** ;* R2 = ADDRESS OF CONVERSION TABLE ** ;* ** ;* R4 IS DESTROYED, R0 IS UPDATED, AND ALL OTHER REGISTERS ** ;* ARE SAVED.  ** ;* ** ;********************************************************************** ; ; LPSTOR: .IFZ $DIVA 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 TABLE 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. .ENDC .IFNZ $DIVA .PAGE CLR -(SP) ; CLEAR BUFFER FULL FLAG CLR 12.(SP) ; SET CHAR STORED FLAG INC 4(SP) ; INC CHAR COUNTER ADD  R2,R4 ; GET ADDRESS OF OUTPUT CODE MOVB (R4),(R0)+ ; STORE IN BUFFER CMP 4(SP),#LPSIZE ; CHECK BUFFER END BLT LPST00 INC (SP) ; JUST STORED 132 ND CHAR - BUFFER FULL LPST00: TST (SP)+ ; POP BUFFER STATUS RTS PC ; HOME .ENDC .PAGE ;********************************************************************** ;*  ** ;* 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: ** ;*  ** ;* R0 = ADDRESS OF I/O LIST ** ;* R1 = ADDRESS OF DATA BUFFER ** ;* ** ;* ON RETURN, R4 CONTAINS: ** ;* ** ;* 0 = VALID REQUEST ** ;* 2 = ILLEGAL LIST OR DATA ADDRESS ** ;* 4 = ILLEGAL RETURN TYPE ** ;* 5 = ILLEGAL I/O COMPLETE ADDRESS ** ;* ** ;********************************************************************** ; ; LPCHEK: .IFZ $KT11C CMP R0,#ROSTOP ;TEST LIST ADDRESS BLOS LPKE02 ;CAN'T BE IN ROS CMP R1,#ROSTOP  ;TEST DATA ADDRESS BLOS 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 MAKE 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 .ENDC ; ; NOW WE'LL CHECK FOR I/O COMPLETE ADDRESS ; CMPB #3,TYPE(R0) ;IS IT EXIT 3? BNE LPKB20 ;BRANCH IFNO .IFZ $KT11C MOV $EXIT(R0),R4 ;OTHERWISE, TEST THE ADDRESS CMP R4,#ROSTOP BLOS LPKE05 CMP R4,#HICORE-10. BHIS LPKE05 BIT #1,R4 BNE LPKE05 .ENDC ; LPKB10: CLR R4 ;SET 'NO ERRORS' RTS PC ;AND EXIT TO CALLER ; LPKB20: BLT LPKE04 ;TEST FOR VALID EXIT TYPE CMPB #1,TYPE(R0) BLE LPKB10 ; LPKE04: MOV #4,R4 ;ILLEGAL RETURN TYPE RTS PC .IFZ $KT11C ; LPKE02: MOV #2,R4 ;ILLEGAL LIST OR DATA ADDRESS RTS PC ; LPKE05: MOV #5,R4 ;ILLEGAL I/O COMPLETE ADDRESS RTS PC .ENDC .PAGE ;********************************************************************** ;* ** ;* L P R S E T ** ;* ** ;* THIS SUBROUTINE ISSUES A RESET COMMAND TO THE LINE PRINTER, ** ;* WHICH I SUPPOSE SHOULD CLEAR IT; IN THE EVENT IT NEEDS TO ** ;* BE CLEARED, THAT IS. R3 = L/P INDEX NUMBER.  ** ;* ** ;********************************************************************** ; ; LPRSET: .IFZ $DIVA .IFZ NLP-1 MOV #CLEAR,@#CMD.1 .ENDC .IFG NLP-1 MOV #CLEAR,@LPCMD(R3) ;CLEAR IT .ENDC RTS PC ;THAT'S ALL, FOLKS! .IFNZ $DIVA RTS PC ; NO SUCH ANIMAL ON DIVA CONTROLER .ENDC .PAGE ;********************************************************************** ;* ** ;* L P S T A T ** ;* ** ;* THIS SUBROUTINE READS THE STATUS OF THE INDICATED LINE ** ;* PRINTER, THEN SETS THE CONDITION CODES ACCORDINGLY: ** ;*  ** ;* ZERO = EVERYTHING'S ALRIGHT ** ;* < ZERO = FATAL ERROR ** ;* > ZERO = OPERATOR ACTION REQUIRED ** ;* ** ;* ON ENTRY, R3 MUST CONTAIN L/P INDEX. R4 IS DESTROYED ** ;* ** ;********************************************************************** ; ; LPSTAT: .IFZ NLP-1 MOV @#STAT.1,R4 .ENDC .IFG NLP-1 MOV @LPSTS(R3),R4 ;GET STATUS .ENDC CLR -(SP) ;SET 'OK' CONDITION BIT #PARITY,R4 ;TEST FOR PARITY ERROR BNE LPSA20 ;BRANCH IF PRESENT BIT #PLOW,R4 ; BNE LPSA10 ;BRANCH IF PAPER LOW BIT #ONLINE,R4 BEQ LPSA10 ;BRANCH IF ONLINE ; LPSA00: TST (SP)+ ;SET CONDITION CODE = OK RTS PC ;THEN EXIT ; LPSA10: INC (SP)+ ;OPERATOR ACTION REQUIRED RTS PC ;EXIT ; LPSA20: DEC (SP)+ ;SET PARITY ERROR INDICATOR RTS PC ;AND EXIT .ENDC .IFNZ $DIVA CLR -(SP) ; CLEAR ERROR FLAG TST  @#LPS BPL LPSA00 INC (SP) ;ERROR LPSA00: BIT @#LPS,#140000 ; TEST RUN/READY BPL LPSA10 INC (SP) LPSA10: TST (SP)+ ; POP STATUS RTS PC .ENDC .PAGE ;********************************************************************** ;* ** ;* L P S I O ** ;* ** ;* THIS SUBROUTINE PERFORMS THE ACTUAL OUTPUT FUNCTION TO ** ;* START THE LINE PRINTER. AFTERWARDS, THE TIMER MODULE ** ;* IS ADJUSTED FOR A ONE SECOND TIMEOUT. IF THE MODULE ** ;* ISN'T QUEUED, IT WILL BE WHEN LPSIO GETS DONE WITH IT. ** ;* REQUIREMENTS ON ENTRY: ** ;*  ** ;* R4 = L/P WORD COUNT ** ;* R3 = L/P INDEX ** ;* R0 = LIST ADDRESS ** ;* IF THE OPERATOR HAS SO NOTIFIED, THE L/P OUTPUT WILL BE ** ;* DIRECTED TO THE TELETYPE VIA TTYOUT. IN THIS CASE, THE ** ;* TIMER WILL NOT BE STARTED. ** ;*  ** ;********************************************************************** ; ; LPSIO: .IFNZ LPBACK TST LPTTY(R3) ;SEE IF TTY IS TO BE USED BNE LPOB00 ;BRANCH IF YES .ENDC .IFZ $DIVA MOV R4,LPWORD(R3) NEG R4 ;L/P NEEDS NEGATIVE WORD COUNT ; LPO000: .IFZ NLP-1 ;THIS CODE IS FOR ONLY L/P IN SYSTEM MOV R4,@#CNT.1 ;STORE LINE PRINTER WORD COUNT TST LPMODE ;SEE WHICH MODE WE'RE IN BEQ LPOA00 ;BRANCH IF CARRIAGE CONTROL MOV #AUTOLF,@#LFRG.1 ;OTHERWISE, ISSUE AUTO LINE FEED BR LPOA10 ; LPOA00: CLR @#LFRG.1 ;SET TO CARRIAGE CONTROL MODE LPOA10: MOV #LPBUF,@#LPDT.1 ;STORE MEMORY BUFFER ADDRESS MOV #SB!IE!ID,@#CMD.1 ;START'ER UP .ENDC ; ; .IFG NLP-1 ;AND NOW FOR THE CODE FOR > 1 L/P IN SYSTEM MOV R4,@LPWDCT(R3) ;STORE WORD COUNT TST LPMODE(R3) ;SEE WHICH MODE WE'RE IN BEQ LPOA00 ;BRANCH IF CARRIAGE CONTROL MOV #AUTOLF,@LPFEED(R3) ;OTHERWISE, ISSUE AUTO LINE FEED BR LPOA10 ; LPOA00: CLR @LPFEED(R3) ;SET TO CARRIAGE CONTROL MODE ; LPOA10: MOV LPBUFR(R3),@LPADDR(R3) ;STORE BUFFER MEMORY ADDRESS MOV #SB!ID!IE,@LPCMD(R3) ;REV UP THE OLE ENGINE, BOYS .ENDC .ENDC .IFNZ $DIVA CLR @#LPS ;CLEAR INTERRUPT ENABLE MOV #LPBUF(R3),R4 ;LINE PRINTER BUFFER ADDRESS LPOA00: MOV (R4)+,@#LPB ;MOVE CHAR TO LINE PRINTER CONTROLLER NOP ; CLOCK IT OUT TSTB @#LPS BMI LPOA00 BIS #100,@#LPS ; NOT DONE, BUFFER BEING PRINTER ; ; ENABLE INTERRUPT AND DONE HERE .ENDC .IFZ NLP-1 ;NOW, GET ADDRESS OF TIMER MODULE MOV #LPMOD,R4 .ENDC .IFNZ NLP-1 ;THIS PART OF THE CODE PERFORMS MOV LPMDAD(R3),R4 .ENDC ; MOV #LPTIME,JSRSUB(R4) MOV R4,-(SP) MOV #$1SEC,-(SP) ;DELAY ONE SECOND JSR PC,IOQTME ;GO START TIMER TST (SP)+ RTS PC ;UND GO HOME, MEIN HERR. .PAGE ; ; ; THIS SECTION DIVERTS THE LINE PRINTER OUTPUT TO THE SYSTEM ; TELETYPE. UNLESS, OF COURSE, THIS OPTION WASN'T GENERATED ; INTO THE SYSTEM. IN WHICH CASE, WHAT ARE YOU EVEN DOING ; HERE? ; ; .IFNZ LPBACK ; ; LPOB00: MOV R5,-(SP) ;SAVE R5 MOV LPBUFR(R3),R4 ;FIRST, SAVE LIST IN LPBUF MOV #7,R5 ; LPOB10: MOV (R0)+,(R4)+ .IFZ $1145 DEC R5 BGT LPOB10 .ENDC .IFNZ $1145 SOB R5,LPOB10 .ENDC SUB #14.,R0 MOV R3,R4 ;THEN SET UP LIST FOR TTY USE ASL R4 ASL R4 ASL R4 ADD #LPDONE,R4 MOV R4,$EXIT(R0) ;STORE I/O COMPLETE ADDRESS MOV #3*256.,DEVICE(R0) ;SET DEVICE = 0, TYPE = 3 CLRB LEVEL(R0) ;PRIORITY 0 MOV #1,(R0) ;MAK E LIST THREADABLE MOV R0,-(SP) JSR PC,TTYOUT ;AND GO DO IT MOV (SP)+,R5 ;RESTORE R5 MOV LPBUFR(R3),R0 RTS PC ; ; ; THIS SECTION IS ENTERED BY TTYOUT WHEN THE MESSAGE HAS BEEN ; COMPLETELY PROCESSED. ; R1 = ADDRESS LIST ; ; LPDONE: MOV #0,R3 ;ENTRY FOR L/P INDEX 0 JMP LPDA00 ; MOV #2,R3 ;ENTRY FOR L/P INDEX 2 JMP LPDA00  ; MOV #4,R3 ;ENTRY FOR L/P INDEX 4 JMP LPDA00 ; MOV #6,R3 ;ENTRY FOR L/P INDEX 6 ; .=NLP*8.+LPDONE ; ; ; LPDA00: MOV #14.,R5 ;RESTORE ORIGINAL LIST MOV LPBUFR(R3),R0 ;LPBUF+ ADDRESS ADD R5,R0 ;PLUS 14 SO'S WE CAN RESTORE BACKWARDS ADD R5,R1 ASR R5 ; LPOB20: MOV -(R0),-(R1) ;GET THE LIST FROM THE L/P BUFFER .IFZ $1145 DEC R5 BGT LPOB20 .ENDC .IFNZ $1145 SOB R5,LPOB20 .ENDC ; ;NOW, SET UP REGISTERS AS: MOV R1,R0 ; R0 = ADDR LIST MOV LPDATA(R3),R1 ; R1 = ADDR DATA MOV (SP)+,R5 ; R5 = RETURN TO TTYOUT MOV LPRIOR(R3),R2 ; R2 = PRIORITY INDEX JMP LPIA10 ;THEN GO SEE WHAT ELSE IS TO BE DONE  .ENDC .PAGE ;********************************************************************** ;* L P C L R ** ;* THIS SUBROUTINE CLEARS A LINE PRINTER ERROR BY CLEARING ** ;* THE MEMORY ADDRESS REGISTER, LPDT.K (K = L/P NUMBER) ** ;* ** ;* R3 = L/P INDEV ** ;* JSR PC,LPCLR  ** ;* ** ;********************************************************************** ; ; LPCLR: .IFZ NLP-1 CLR @#LPDT.1 ;CLEAR MEMORY ADDRESS FOR ONLY ONE L/P .ENDC .IFG NLP-1 CLR @LPADDR(R3) ;DITTO, BUT FOR MORE THATN ONE L/P .ENDC RTS PC .ENDC .IFNZ $DIVA RTS PC ;NOTHING TO DO .ENDC .PAGE ;********************************************************************** ;* L P L E V L ** ;* ** ;* THIS SUBROUTINE CALCULATES THE INDEX REQUIRED TO ACCESS ** ;* LPFRST AND LPLAST FOR THE SPECIFIED LINE PRINTER AND PRIORITY** ;* LEVEL. LINKAGE IS: ** ;* ! ;R2 = PRIORITY (1,2,...,NLPRTY) ** ;* ;R3 = L/P INDEX ** ;* JSR PC,LPLEVL ** ;* ;RETURN WITH R2 = PRIORITY INDEX ** ;* ** ;********************************************************************** ; ; LPLEVL: .IFZ NLP+NLPRTY-2 CLR R2 .ENDC ND.E C ND.E CTSE.C C ND.E NEDO; % .IFNZ NLP+NLPRTY-2 MOV R5,-(SP) ;SAVE R5 'CAUSE WE USE IT DEC R2 ASL R2 MOV #NLPRTY,R5 ;SET MAXIMUM NUMBER PRIORITY LEVELS ;BASIC EQUATION IS: ; ; PRIORITY INDEX = NLPRTY*R3 + 2*(R2 - 1) ; ;WHERE - R3 = L/P INDEX ; R2 = PR PC S RT CRA T PUUT OLDOU CWES ESGUI ; PB#L,@15#0 V MO ; 2 1+C.PV#L,@40#3 V MO ORCTVET UPRRTEINT SE; .1VCLP@#0,NTPI#L V MO S LPR EACL; S LP@# R CL A IV$D Z FN.I C ND.E PC S RT C ND.E C ND.E 0 A0PN,LR0 B SO 5 14$1 Z FN.I C ND.E 00NALP T BG R0 C DE 5 14$1 FZ.I + 3)(R T TS LRPC,LPC R JS T SE)IORITY ; .IFZ $1145 ; LPLA00: DEC R5 ;THIS IS THE WAY THE 11/20 DOES BLT LPLA20 ; NLPRTY*R3 ADD R3,R2 BR LPLA00 ; LPLA10: .ENDC .IFNZ $1145 ;AND THIS IS HOW THE 11/45 DOES IT MUL R3,R5 ;WASN'T THAT QUICK? .ENDC ADD R5,R2 ;THEN ADD IN 2*(R2 - 1) ; LPLA20: MOV (SP)PR,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 /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 RPTRUER-+,R5 ;RESTORE YOU-KNOW-WHO .ENDC ASL R3 ;CONVERT TO DOUBLEWORD INDEX RTS PC .PAGE ;********************************************************************** ;* ** ;* L P M S G E ** ;* ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO THE SYSNT IOFR DD ARETO;S .1VCLP@#0,NTPI#L V MO R3 R CL 1 P-NL FZ.I A IV$D FZ.I : ITINLP NTPI.L CTSE.C ; ; * ********************************************************************;* * * ;* * * E.IM TONTIZALIIAITINM TEYS SATD LEAL CBED ULHO SITINLP ;* * * ;* * * . S)R(TEINPRE IN LHE T1TEM ** ;* TELETYPE. LPMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS: ** ;* ** ;* ;SET R3 = L/P INDEX ** ;* MOV #DATA,-(SP) ;PUSH DATA BUFFER ADDRESS ** ;* JSR PC,LPMSGE ** ;* BNE ;BRANCH IF LIST WASN'T ARSEACLD ANS ETES R2. ;* * * S UEAL VORCTVET UPRRTEINS RETO S1. ;* * * ;* * * : NETIOU RISTH E.INUTRON IOATIZALTINI IERNTRI PNELI ;* * * ;* * ********************************************************************;* E AG.P C ND.E PC S RT Y TTLP R CL 1 P-NL FZ.I : ONLP ; 5VAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. ** ;* ** ;********************************************************************** ; ; LPMSGE: MOV 2(SP),R4 ;GET DATA BUFFER ADDRESS FROM STACK .IFG NLP-1 ADD R3,R4 ;GET ADDRESS OF BUFFER FOR THIS L/P MOV 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 ; ; * ********************************************************************;* * * 9 (R4),R4 .ENDC MOV R5,-(SP) ;SAVE R5 .IFZ NLP-1 ;* GET ADDRESS MOV #LPLIST,R5 ;* .ENDC ;* OF LINE PRINTER .IFG NLP-1 ;* MOV LPIOLS(R3),R5 ;* I/O LIST .ENDC ;* MOV @#PSR,-(SP) ;SAVE CURRENT CPU LEVEL .IFZ $1145 MOV #340,@#PSR ;11/20 CODE TO INHIBIT INTERRUPTS .ENDC .I ;* * * . 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 ;* * * ;* * * : =FNZ $1145 SPL 7 ;11/45 CODE FOR THE SAME THING .ENDC TST DATA(R5) ;SEE IF THE LIST IS AVAILABLE BNE LPSX00 ;BRANCH IF BUSY MOV R4,DATA(R5) ;IT'S AVAILABLE, SO GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS BACK TO WHERE THEY WERE MOV R5,-(SP) ;PUSH LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE MOV (SP)+,R5 ;RESTORE R5 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 ;* * * ;* * ********************************************************************;* MOV (SP)+,(SP) ;PUT STACK IN ORDER CLZ ;SET NO-ERROR CONDITION RTS PC ; ; LPSX00: MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) ;PUT STACK IN ORDER SEZ ;SET ERROR CONDITION RTS PC ;EXIT TO CALLER ; TYDONE: CLR DATA(R1) ;SET I/O LIST AVAILABLE RTS PC .PAGE