; UPDATE CREAD.006 03.08.72 ; UPDATE CREAD.005 02.14.72 .TITLE CREAD ;********************************************************************** ;* ** ;* C R E A D ** ;* ** ;* PROGRAM IDENTIFICATION. CARD READER INPUT SUBROUTINE, ** ;* CATALOG NUMBER ; UPDATE ROS4.004 02.04.72 ; UPDATE ROS4.003 02.27.72 ; UPDATE ROS4.001 01.22.72 ; UPDATE 1/22/72 ROSI.SYS GVR ; UPDATE 1/12/72 ROS2.SYS ; UPDATE 1/11/72 ROS2.SYS ; STANDARD REGISTER DEFINITIONS R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = 177776 ; $DEBUG = 1 ; IPDATE TESTER.001 02.14.72 .TITLE PRINT ;********************************************************************** ;* ** ;* SAMPLE TASK TO TEST THE LINE PRINTER SUBROUTINE, LPRNTR. ;* ;********************************************************************** ; .DEF GARY .REF LPRNTR,EXIT,TSTAT,TPRTY,TASKS,HEADER,LPINIT ; ; THEAD: .WORD 1,CHECKO,0,500. .: imR@(F:mmh4: h,% f*$6 we*6 imR*Z ** ;* ** ;* 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. ** ;* ; ROS DEBUG SWITCH $SAVE = 104400 ; USE TRAP INSTR. TO CALL SAVE ; ; ; TASK CONTROL SYSGEN EQUATE CARDS ; NPRIOR = 16. ; NO. OF SOFTWARE PRIORITY LEVELS .IFLE NPRIOR ; XXXXXXXX ;NPRIOR MUST BE GREATER THAN ZERO .ENDC MXTASK =100. ; MAX. NUMBER OF CORE TASKS IN SYSTEM QUEU NLTASK = 1 ; LARGEST TASK # OF TASKS LOADED WITH SYSTEM .BYTE 40.,3 .WORD 0,0,30.*256.,0 .=.+80. ; ; GARY: MOV #30.,R0 CLRB TSTAT(R0) MOVB #3,TPRTY(R0) CMP TASKS,R0 BGT LARRY1 MOV R0,TASKS ; LARRY1: ASL R0 MOV #THEAD,HEADER(R0) JSR PC,LPINIT RTS PC ; ; CHECKO: MOV #LIST1,-(SP) JSR PC,CREAD CMP LIST1+10,#8. BEQ STOP MOV #LIST2,-(SP) ** ;* 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. ;NOTE: IF OVERLAYS ARE USED, THEN THE ;FIRST OVERLAY TASK NUMBER IS MXTASK+1 OVTMIN = MXTASK+1 ;FIRST OVERLAY TASK NUMBER OVRLAY = 1 ; SYSTEM OVERLAY OPTION ;0 = NO OVERLAY, 1 = OVERLAY .IFNZ OVRLAY ; MAXOVR = 20 ;MAXIMUM NUMBER OF OVERLAY TASKS .ENDC ;(NOT USED IF OVRLAY = 0) .IFZ OVRLAY ; MAXOVR JSR PC,LPRNTR BR CHECKO ; STOP: JSR PC,EXIT ; LIST1: .WORD 1 .BYTE 2,2 .WORD 0,0,0,0,BUFFER ; BUFFER: .WORD 80.,0 .=.+80. .END |9|9fQH:~|9~9T~l:~: 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) ** ;*  = 0 ;SET TO ZERO ONLY IF NO OVERLAYS .ENDC TASMAX = MXTASK+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 XXXX; UPDATE LPRNTR.005 03.08.72 ; UPDATE LPRNTR.004 02.21.72 ; UPDATE LPRNTR.003 02.14.72 ; UPDATE LPRNTR.002 02.08.72 ; UPDATE LPRNTR.001 02.04.72 .TITLE LPRNTR ;********************************************************************** ;* ** ;* L P R N T R ** ;* c~\;~;r~L<~< 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) ** XXXX ;NTASK MUST BE <= MXTASK .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 = 0 ; PRIORITY PROPERTY LEVEL 1 PRIP02 = 0 ; PRIORITY PROPERTY LEVEL 2 PRIP03 = 1 ; PRIORITY PROPERTY LEVEL 3 PRIP04 = 1  ** ;* PROGRAM IDENTIFICATION. LPRNTR - 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 PRI~<=~=~,>~>;* < 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:  ; PRIORITY PROPERTY LEVEL 4 PRIP05 = 0 ; PRIORITY PROPERTY LEVEL 5 PRIP06 = -1 ; PRIORITY PROPERTY LEVEL 6 PRIP07 = 0 ; PRIORITY PROPERTY LEVEL 7 PRIP08 = 1 ; PRIORITY PROPERTY LEVEL 8 PRIP09 = 1 ; PRIORITY PROPERTY LEVEL 9 PRIP10 = 0 ; PRIORITY PROPERTY LEVEL 10 PRIP11 = 0 ; PRIORITY PROPERTY LEVEL 11 PRIP12 = 1 ; PRNTER TO BE USED ** ;* IN REAL-TIME APPLICATIONS FOR PRIORITY ALARM MESSAGES, ** ;* ETC. THE INTERNAL MESSAGE FORMAT ACCEPTED BY LPRNTR ** ;* IS EITHER ASCII OR EBCDIC. NON-PRINTABLE CHARACTERS ARE ** ;* CONVERTED TO BLANKS, ALTHOUGH THE CHARACTER IS SYSGENABLE ** ;* TO ANY OTHER PRINTABLE CHARACTER. ALL THREE GENERAL I/O ** ;* EXITS ARE SUPPORTED BY LPRNTR. ** ;* ~?&~?~ @ ** ;* ** ;* 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 MIORITY 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 .PAGE ; ; QUEUE SYSGEN EQUATE CARDS ; DPRTY = 1 ;DYNAMIC PRIORITY ASSIGNMENT; IF ; DPRTY = 0, THE ALL TASK PRIORITIES ; WILL BE RETR ** ;* USAGE. THE ASSEMBLER LINKAGE TO LPRNTR IS: ** ;* ** ;* MOV #LIST,-(SP) ;PUSH LIST ADDRESS ON STACK ** ;* EMT LPRNTR ** ;* ** ;* THE FORTRAN EQUIVALENT CALL IS: ** ;* .;@4@M:@.}@:mm@: @:<}@_MQ@.b; @b@b; @b@Ye@.9mQ@imR@Tq@rh@9p:@.9a@4f@LC @(*^hZ&_h ! 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 "IEVED FROM TASK TABLE. ; IF DPRTY = 1, THEN CALLING PROGRAM ; CAN SELECT PRIORITY. ARG = 1 ;ARGUMENT OPTION; IF ARG = 1, THEN ; THE CALLING PROGRAM CAN PASS AN ; ARGUMENT TO THE QUEUED TASK. RGSAVE = 1 ;REGISTER SAVE OPTION. 1 = SAVE ;REGISTERS, 0 = DON'T SAVE 'EM. ; ; ***** NOTE: IF DPRTY = 0 OR #5~@~@E~tA~A$hfXh              (P@",6@" ,"62/2"0>L"0> L4 6 8 : :% 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 & ARG = 0, THEN THE CORRESPONDING ; ---- ARGUMENT SHOULD BE OMITTED FROM THE CALLING LIST. .IFL DPRTY ; XXXXXXXX ;CREATE ASSEMBLY ERROR IF DPRTY ISNT .ENDC ;ZERO OR ONE. .IFG DPRTY-1 ; XXXXXXXX ; .ENDC ; .IFL ARG ; XXXXXXXX ;CREATE ASSEMBLY ERROR IF ARG IS NO .ENDC ;ZERO OR/T~dB~Bc~TC~C( ; <<pp >>rr @@tt B,B CR 1 ERROR CR 1 SPUR INT 9,ff&f  6 @ B, :   M  :,1 @q_MQYe$Ye.   {) .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 = * ONE .IFG ARG-1 ; XXXXXXXX ; .ENDC ; .IFL RGSAVE ; XXXXXXXX ;CAUSE AN ASSEMBLY ERROR IF .ENDC ;RGSAVE ISN'T 0 OR 1 .IFG RGSAVE-1 ; XXXXXXX ; .ENDC ; $ABMES = 3 ; THREE ABORT MESSAGE BUFFERS ABRT .IFL $ABMES ; $ABMES MUST BE => 0. +; 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. ** , 4Ye(,s 1 0 && ;LC :<}" , ;.@   & w$}(9mQ.f 3  *  b;  &b(<, B ff+ B".,-2 ;PHYSICAL DEVICE TABLE CODE FOR C/R DEVICES .PAGE ;********************************************************************** ;* ;* C R E A D D A T A T A B L E S ;* ;********************************************************************** ; ; COUNT: ;CONTAINS CURRENT BYTE INDEX TO .=.+NCR+NCR ;CALLER'S DATA BUFFER ; ERRCR: ;CONTAINS COUNTER OF NUMBER OF RETRIES .=.+NCR+NCR . XXXXXX ; ABRT .ENDC ; PSTP ; THE SYSGEN PARAMETER '$PST CONTROLS THE EXECUTION PATH*PSTP ; DURING A TASK ERROR. PSTP ; = -1 ROS + USER ROUTINES PSTP ; = 0 ROS PSTP ; = +1 /;* ** ;* 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 0<  R 6M  :  R&,5@p/Mp Mw"55,@53& $: M,E@pM3   3 M O,@  W"R ,dP ,@  1 ;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: .=.+2USER PSTP ; PSTP $PST = 0 ; PSTP ; PSTP .PAGE ;FOLLOWING ARE SYSGEN PARAMETERS FOR THE TIMER AND CALENDAR ROUTINES ; NORMALLY THE BASE PERIOD FOR THE TIMERS IS THE INTERRUPT PERIOD, AND ; IF THAT PERIOD IS DESIRED FOR USE BY ANY TIMER MODULE, "RESO"3 ** ;* ** ;* 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 4rh0&f  &&  4f*:<}P,& EAp3 0 M Tq 0 :mm?,@ @3 <M0 8H   8&H, el4  -> V 4$>,@  4M> e 4>"&.d1> e 5NCR+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 6 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 RESOLUTION COUNTER TABLES FOR DETERMINING THE PERIOD OF EACH ; RESOULTION. THE PERIOD OF A GIVEN RESO7SWITCHES ** ;* 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. G>$(J01^>e3 4 M ,;>4$(0>!  *! ! +!  a>*J,@l el @  $. M * b;  &b(2,$ %(*b; bE .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 FLUTION 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 ;1/60 RES1 = 15. ;1/4 RES2 = 2 ;1/2 RES3 = 2 ;1 RES4 = 5 ;5 RES5 = 2 ;10 RES6 = H ** ;* ** ;* 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 """"""" """""""""""""""""""""""""""""""""""""""""""""""""""DDDDDDD@DDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDADD-B CTurR$}}O : ^rO :^ S: O' XMO\MZS!rS%.MZ^W M^3;r0/T;w$Dwwwwwwwwwwwwݙa ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & I.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 .BYTJ 3 ;30 RES7 = 2 ;60 RES8 = 3 RES9 = 5 RES10 = 100. RES11 = 2 RES12 = 2 RES13 = 2 RES14 = 2 RES15 = 2 TRES = 1 ; TIME-SLICE RESOLUTION USING MAXT ; ; IN TASK HEADER ; IN SYSTEMS WHERE THE BASE PERIOD IS GREATER THAN ONE MILLISECOND, ; "MSECR" WILL NECESSARILY HAVE A PERIOD GREATER THAN ONE MILLISECOND. MSECR = K$rh=.HW %B %%%rh(rh,n   `  2  C<U3B N#<"B,,; <f< CEA<a <: &<,5<  w>w* <x0f" 5 f O "*9aT0L ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;********************************************************************** ; ; .DEF IOQTME,IODME 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 USN0 ;NORMALLY 1 MSEC: HERE IS = 16.7 MSECS SECR = 3 ;"RES3" IS THE ONE-SECOND RESOLUTION $NRES = 16. ;USE MAX # OF RESOLUTIONS .IFLE $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 "O,1 3 3 s   $*Z,T3 4     s83  %4  8"& .xf<  A< 8": "<( 0""p &0 x"" 0$:mm*9p:, @   @ "S,3wD3  w 7 ZPQTM .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 TIMERQING 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 RTICRES". ; IF A MULTIPLIER FOR THIS INTERRUPT IS DESIRED TO PRODUCE A COARSER ; BASE PERIOD, USE THE PARAMETER "$ABMPL" TO SPECIFY THE RATIO DESIRED. TICRES = 60. ;# OF T-O-D CLOCK TICKS PER SECOND $ABMPL = 6 ;CLOCK BASE PERIOD = 1/10 SECOND C1COMD = 177546 ;DEVICE ADDRESS FOR HIGH-SPEED CLOCK C1CBIT = 100 ;BIT TO CONTROL FAST CLOCK INTERRUPT $TMSLC = 1 ;SYSTEM OPTION FOR INCLUDING TIME-SLICING $SWATZ = S $7  T 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 ANU;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 ;TV 20. ;NUMBER OF ENTRIES IN SCHEDULER "WAIT" TABLE $TWATZ = 20. ;WORDS IN TIMER'S "WAIT" TABLE .PAGE ; ; NDISCS = 1 ; DISC OPTION AND NUMBER OF CONTROLLERS ; ACTSIZ = 20. ; MAXIMUM NO. OF ENTRIES IN AUTH. CODE .IFL 20.-ACTSIZ XXXXXXXX ; ERROR-ALLOCATE MORE LOCATIONS XXXXXXXX ; FOR AUTHORIZATION CODES .ENDC ; .IFNZ NDISCS DRESDI = 1 XD 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) ;SYRANSITION 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 Z ; 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 XXXXXXXX ; MUST BE AT LEAST THREE .ENDC ; .IFG NDISCS-1 NDPRT2 = 7 ; NO. OF PRIORITY LEVELS IN DISC 2 QUEUES .IFL NDPRT2-3 XXXXXXXX ; MU[.MZ;@4@; M@.}@M@:mm@: @:<}@._MQ@Ye@9mQ@m@Tq@.v@@9a@4f@LC @(.MXhMp&hMWhMZhMhTORE ADDRESS OF AN RTS PC CLR 2(SP) ;CLEAR ERROR POINTER FOR CALLER RTS PC ;RETURN .END ] ;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. ;* ^ST BE AT LEAST THREE .ENDC .ENDC ; .IFG NDISCS-2 NDPRT3 = 3 ; NO. OF PRIORITY LEVELS IN DISC 3 QUEUES .IFL NDPRT3-3 XXXXXXXX ; MUST BE AT LEAST THREE .ENDC .ENDC .IFZ DRESDI NCFILE = 40. ; NO. OF CORE RESIDENT FILE ID'S .ENDC .IFNZ DRESDI NCFILE = NDISCS+40. ; NO. OF CORE RESIDENT ID'S ; ; IN_               C,zzzzz$z$zz,PPPP  U M`; 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 ** a; ; 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 ; CRB1bCLUDING DOD'S .ENDC ERRPRT = 1 ; PRINT-OUT DISC ERROR MESSAGES OPTION .ENDC CHKPTC = 0 ; CHECKPOINT CAPABILITY OPTION- ; ;******MODEL 45 ONLY FXPART = 1 ; FIXED PARTITION OPTION $SGMNT = 1 ; SEGMENT LOAD OPTION .PAGE ; ; TTYIO SYSGEN PARAMETERS ; NTTYS = 2 ;NO. OF TTY UNITS ;IN SYSTEM SYSc[ / * ), ', L/P 1 PARITY ERROR L/P 1 NOT READY  L/P 1 ABORTED  (0 (  0,&f&f  7,,0 T P d;* 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. ** ;* e: .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 fTTY = 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 DBUFSZ = 1 g Z,Z    @ _MQYe"Ye,~  *: 4Ye& ,2 0 &&  ;LC :<}. & w$9mQ(},0 s3 &p.3 3 s3 3 h ** ;********************************************************************** .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 i;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 'Cj ;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 ;RESPONSE TIMERS k &  (; M,6   &   M&,Z   w3 M&; M.~  M2e (f,2 &  :<} Tq, & f  4fl 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 mR 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 n 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 PRINT OPTION WHERE o&, 2  ) T , s33 3 "&,4s3 3   M"; M M,X 3  M % E :mm",|  M w $, 3 &< MC?p .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 q .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 ;********************************************************************** ;* ** ;* r ; 1 = EOM IS PRINTED ; 0 = EOM IS NOT PRINTED EOLCH = 12 ;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 ;* ;* G E N E R A L S s  : 0f r  Z #  *,,<   |X: C.wv&ff& Aaes!93 "( ,6 D! 3    % 3   ["x.ZRĕ J  s!5Еs$(W,   5(t120,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 154u 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 LvY S T E M E Q U A T E S ;* $1145 = 0 ;1 = 11/45 0 = 11/20 HICORE = 32767.+8192. ;TOP OF CORE (BYTE ADDRESS) .PAGE ;********************************************************************** ;* ** ;* IN THE FOLLOWING EQUATES, A ZERO MEANS DO NOT INCLUDE ** ;* THE OPTION. ** ;* w,  6 & `3   , 4W 1 .W +5(5%^,D eD   ^,!!5  n,4@& 5 5},X5 3 ",|    l &,&< f Hx-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 yIST 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 z ** ;* C A R D R E A D E R E Q U A T E S ** ;* ** ;********************************************************************** NCR = 1 ;NUMBER OF CARD READERS IN SYSTEM BIN = 1 ;1 = INCLUDE BINARY MODE, 0 = DON'T BCD = 1 ;1 = INCLUDE ALPHANUMERIC MODE, 0 = DONT TTYSW = 1 ;1 = SWITCH INP{: p0 e00& *9aw,www&,@aAa ! @wj "}0  f  `Baf * ,H 5 f C 9a,l1 <7 6& , & & & | .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 } ; 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 ~UT TO TTY ON COMMAND INEBC = 1 ;1 = PROVIDE FOR INTERNAL EBCDIC CODE EXEBC = 1 ;1 = PROVIDE FOR EXTERNAL EBCDIC CODE ; (029 CARD CODE) $RES = 0. ;BASIC TIMER RESOLUTION USED BY CREAD $1SEC = 60. ;MULTIPLE USING $RES FOR 1 SECOND $500MS = 30. ;MULTIPLE USING $RES FOR 1/2 SECOND $100MS = 6. ;MULTIPLE USING $RES FOR 100 MS MXTIME =   L 6mL" f B     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, * 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 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 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 NON ; < ( + 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 ; % N 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: MOV LOGMAX,R ;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 READER 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 88gQH:~8M~t9~9\~d:> ? 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 ; 4 ; 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 ;GET LOGICAL UNIT NO. OF ALTERNATE ASL R3 ;CON = 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 ;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 ~:k~T;~;z~D< 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 VERT 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 ; CRDA13: MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 MOV #340,@#PSR ;SET CPU LEVEL = 7 (11/20) .ENDC .IFNZ $1145 SPL 7 ;SET CPU LEVEL = 7 (11/45) .ENDC DEC (R1) VECTOR CRVC.3 = 0 ;C/R # 3 INTERRUPT VECTOR CRVC.4 = 0 ;C/R # 4 INTERRUPT VECTOR .PAGE ;********************************************************************** ;* ** ;* L I N E P R I N T E R E Q U A T E C A R D S ** ;* ** ;********************************************************************~<~4=~= 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 ;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 THE TASK'S 'I/O IN PROGRESS' FLAG MOV R4,SYSTEM(R1) ;STORE THE TASK NO. FOR ** 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 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 ~$>~>~?.~? 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 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 THE CODE PREPARES TO EXIT. IF EXIT TYPE 2 IS ;* REQUESTED, THE CALLING TASK IS SUSPENDE ;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 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 ~@=~|@~@M~lA 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 D. 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 CALLING BEQ CRDB10 ;BRANCH IF NO - SOMEBODY GOOFED CLZ ;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 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 = 765020 ;L/P # 1 STATUS REGISTER STAT.2 = 765020 ;L/P # 2 STATUS REGISTER ~A\~\B~Bk~LC ** ;* CALL LPRNTR (IADDR(LIST)) ** ;* ** ;* THE FORMAT OF THE DATA BUFFER, DATA, IS: ** ;* ** ;* ----------------------------------- ** ;* WORD 1 ! NWORD ! ** ;* ------ ;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 ; REGISTERS MOV (SP)+,R0 ; CLZ ;THEN, S STAT.3 = 0 ;L/P # 3 STATUS REGISTER STAT.4 = 0 ;L/P # 4 STATUS REGISTER ; ; LPSIZE = 132. ;NUMBER OF CHARACTERS IN L/P BUFFER LPMXTM = 180. ;MAX NO SECONDS LPRNTR WAITS FOR OPER ACTION .PAGE ~Cz~ PC (RETURN) CLR -(SP) MOV #DSPTCH,-(SP) ; JMP QSAVEI ;SUSPEND TASK; QSAVEI WILL EXIT TO DSPTCH .PAGE ;*******************= 177776 ; $DEBUG = 1 ; ROS DEBUG SWITCH $SAVE = 104400 ; USE TRAP INSTR. TO CALL SAVE ; ; ; TASK CONTROL SYSGEN EQUATE CARDS ; NPRIOR = 16. ; NO. OF SOFTWARE PRIORITY LEVELS .IFLE NPRIOR ; XXXXXXXX ;NPRIOR MUST BE GREATER THAN ZERO .ENDC MXTASK =100. ; MAX. NUMBER OF CORE TASKS IN SYSTEM QUEU NLTASK = 1 ; LARGEST TASK # OF TA~ G.~G~G>~tH NWORD = NUMBER OF CHARACTERS TO PRINT (INCLUDING THE ** ;* CONTROL CHARACTER, CNTRL), AND ** ;* NWORD > 0 FOR ASCII STRINGS ** ;* NWORD < 0 FOR EBCDIC STRINGS ** ;* RESRVD = RESERVED FOR SYSTEM USE ** ;* CNTRL = CARRIAGE CONTROL: 0 - NO LINE FEED ** ;* N - SKIP N LINES (N=1,2,3) ** *************************************************** ;* ;* 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 CRBUSY(R3) MOV (SP)+,@#PSR ;RESTORE PREVIOUS PSR (ENABLE INTERRUPTS) SKS LOADED WITH SYSTEM ;NOTE: IF OVERLAYS ARE USED, THEN THE ;FIRST OVERLAY TASK NUMBER IS MXTASK+1 OVTMIN = MXTASK+1 ;FIRST OVERLAY TASK NUMBER OVRLAY = 1 ; SYSTEM OVERLAY OPTION ;0 = NO OVERLAY, 1 = OVERLAY .IFNZ OVRLAY ; MAXOVR = 20 ;MAXIMUM NUMBER OF OVERLAY TASKS .ENDC ;(NOT USED IF OVRLAY = 0) ~HM~dI~I\~TJ ;* FF- EJECT PAGE ** ;* LF- SKIP 1 LINE (SAME AS N=1) ** ;* CHAR K = MESSAGE IN ASCII OR EBCDIC ** ;* ** ;* FF, LF AND HT MAY BE IMBEDDED IN THE TEXT FOR MULTIPLE LINES.** ;* TAB (HT) POSITIONS ARE: 1, 9, 17, ..., 8N + 1, ... ** ;* 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 TSTB LEVEL(R1) ;SEE IF CALLER WANTS ASCII OR EBCDIC BNE CRDC04 MOV #O26ASC,TABLE(R3) ;ASSUME 026 TO ASCII CONVERSION BR CRDC05 ; CRDC04: MOV #O26EBC,TABLE(R3) ; CRDC05: .ENDC JSR PC,CRSIO .IFZ OVRLAY ; MAXOVR = 0 ;SET TO ZERO ONLY IF NO OVERLAYS .ENDC TASMAX = MXTASK+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 ; ~Jk~DK~Kz~4L ** ;* PROGRAMMER: 55 ** ;* DATE: 01.17.71 ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ;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 ; . MOV #CRMOD,R5 ;GET TIMER MODULE ADDRESS FOR NCR = 1 .ENDC ; .IFG NCR-1 MOV CR QTAB XXXXXXXX ;NTASK MUST BE <= MXTASK .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 = 0 ; PRIORITY PROPERTY LEVEL 1 PRIP02 = 0 ; PRIORITY PROPERTY LEVEL 2 PRIP03 = 1 ; PRIORITY~L~$M~M~N ** ;********************************************************************** ; .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 OVMDAD(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 (SP)+ BR CRDB05 .PAGE ;********************************************************************** ;* PROPERTY LEVEL 3 PRIP04 = 1 ; PRIORITY PROPERTY LEVEL 4 PRIP05 = 0 ; PRIORITY PROPERTY LEVEL 5 PRIP06 = -1 ; PRIORITY PROPERTY LEVEL 6 PRIP07 = 0 ; PRIORITY PROPERTY LEVEL 7 PRIP08 = 1 ; PRIORITY PROPERTY LEVEL 8 PRIP09 = 1 ; PRIORITY PROPERTY LEVEL 9 PRIP10 = 0 ; PRIORITY PROPERTY LEVEL 10 PRIP11 = 0 ; PRIORITY PROPERTY LEVE~N~O.~|ORLAY .REF RELTSK .ENDC ;* ;* S Y S T E M E Q U A T E P A R A M E T E R S ;* THREAD = 0. ;LIST THREAD DEVICE = 2. ;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 = ** ;* C R I N T ** ;* ** ;* CARD READER INTERRUPT ROUTINE. THIS ROUTINE GETS ENTERED ** ;* FOR THE FOLLOWING REASONS: ** ;* ** ;* 1. CARD DONE INTERRUPT ** ;* 2. COLUMN READY INTERRUPT L 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 .PAGE ; ; QUEUE SYSGEN EQUATE CARDS ; DPRTY = 1 ;DYNAMIC PRIORITY ASSIGNMENT; IF ; DPRTY = 0, THE ALL TASK PRIORITIES ; ~O>~lP~P@@86 7|oxttnԮЮ"~\Q2jЮwήgʮwȮ 2jjwhgdwb  . / ?\ lx1w ov_ 12. ;ADDRESS OF DATA 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 IE = 040000 ;INTERRUPT ON PARITY OR PAPER ** ;* 3. CARD READER ERROR ** ;* 4. TRANSITION TO ON-LINE ** ;* 5. A BERSERK CARD READER DOING THINGS IT SHOULDN'T ** ;* OUGHTA DO. ** ;* ** ;* OUR MISSION, SHOULD WE DECIDE TO ACCEPT IT, IS TO DETERMINE ** ;* WHAT CAUSED THE INTERR WILL BE RETRIEVED FROM TASK TABLE. ; IF DPRTY = 1, THEN CALLING PROGRAM ; CAN SELECT PRIORITY. ARG = 1 ;ARGUMENT OPTION; IF ARG = 1, THEN ; THE CALLING PROGRAM CAN PASS AN ; ARGUMENT TO THE QUEUED TASK. RGSAVE = 1 ;REGISTER SAVE OPTION. 1 = SAVE ;REGISTERS, 0 = DON'T SAVE 'TR5~Q e W #      w`-~LRnXPU L/P 1 PA~RRITY ERROR L/P 1 NOT READY L/P 1 ABORTEDRR&f&f  70 T~ 0. XXXXXX ; ABRT .ENDC ; PSTP ; THE SYSGEN PARAMETER '$PST CONTROLS THE EXECUTION PATH*PSTP ; DURING A TASK ERROR. PSTP ; = -1 ROS + USER ROUTINES PSTP ; = 0 ROS 5  @& 5 55 R 3R  ~tW  RRU&<  fR  eW00& R~WwR@aAa ! @QRwj f  `BafR 5 f d~dX1 <7 6&  & & & !  @T fQQB   3 ** ;* 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. ** ;* ** ;*********************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 NCR-1 ; OF THE MOV @CRS(R3),R0 ; CARD READER TST ERRCR(R3) ; AND TEST FOR A PSTP ; = +1 USER PSTP ; PSTP $PST = 0 ; PSTP ; PSTP .PAGE ;FOLLOWING ARE SYSGEN PARAMETERS FOR THE TIMER AND CALENDAR ROUTINES ; NORMALLY THE BASE PERIOD FOR THE TIMERS IS THE INTERRUPT PERIOD, AND ; IF THAT PERIOD IS D~X!"$'(+-.03569: STORED AS: PRIORITY 1 * ; PRIORITY 2 * ; . * ; . * L/P # 1 ;BRANCH IF END OF CARD BIT #ONLINE,R0 ;TEST FOR TRANSITION TO ON-LINE BNE CRIB12 ; MOV R0,ERRCR(R3) ;ASSUME C/R ERROR AND SAVE STATUS .IFZ NCR-1 MOV #CRMOD,R0 ;PUT ADDRESS OF TIMER MODULE IN R0 .ENDC .IFG NCR-1 ;AND, IF NCR > 1..... MOV CRMDAD(R3),R0 ;GET ADDRESS OF C/R TIMER .ENDC MOV #CRTIME,8.(R0) ;SET TIMEOUT ADDRESS TO CRDERR ; 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 ;1/60 RES1 = 15. ;1/4 RES2 = 2 ;1/2 RES3 = 2 ;1 RES4 = 5 ;5 RES5 Mp Mw"55@53ZZ&_&~\ E@pM3 Z ZZ 3 ZM  W"R PZ~]@  &f  && f! x EAp3 ZZ M@ @3q~]Z <M0 ZH ZZelZZ  -Z  ZMZ eZ Z1Z ~^ eZ Z1^ZeZ3 Z ; . * ; PRIORITY NLPRTY * ; . ; . ; . ; REPEAT FOR L/P # 2, ETC. ; ; LPTASK: .=.+NLP+NLP ;THE TASK NO. WHO INITIATED THE CURRENT RQST ; LPIO MOV R0,-(SP) MOV #$500MS,-(SP) ;SET UP 500 MS DELAY JSR PC,IOQTME ;START TIMER TST (SP)+ .IFZ NCR-1 ;SUPPRESS FURTHER INTERRUPTS FROM C/R BIC #ENABLE,@#CRS.1 ; . .ENDC ; . .IFG NCR-1 ; . BIC #ENABLE,@CRS(R3); . .ENDC ; . JMP (R5) = 2 ;10 RES6 = 3 ;30 RES7 = 2 ;60 RES8 = 3 RES9 = 5 RES10 = 100. RES11 = 2 RES12 = 2 RES13 = 2 RES14 = 2 RES15 = 2 TRES = 1 ; TIME-SLICE RESOLUTION USING MAXT ; ; IN TASK HEADER ; IN SYSTEMS WHERE THE BASE PERIOD IS GREATER THAN ONE MILLISECOND, ; "MSECR" WILL NECESSARILY HAVE A PERIOD GREATEZM Z,ZZ!  Z*! ! +!  ZZlZZelZ ~|^ZZ ZMZ`Z ZcZZaZbZ %(W %B %%%~^   `   CZU3ZZ NZ^_; Zf< CEAZ5~l_Z  ZZw>w*fZ 5 f 1 3 Z3 Zs Z3 Z Zy~_Z  CM: .=.+NLP+NLP ;I/O COMPLETE ADDRESS 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 ; LPWO;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ;* ;* AT THIS POINT, ONE FULL CARD HAS BEEN READ. IF THE 'READ ANOTHER ;* CARD' FLAG (REPEAT) HAS BEEN SET, THEN ANOTHER REQUEST WILL BE ;* INITIATED IMMEDIATELY. THIS USUALLY HAPPENS WHEN A CONTROL CARD ;* HAS BEEN READ. ;* ;* CRIC00: CLR IGNORE(R3) TST REPEAT(R3) ;SHOULD WE READ ANOTHER CARD? BEQ CRCLOS ;BRANCH IF IT ISR THAN ONE MILLISECOND. MSECR = 0 ;NORMALLY 1 MSEC: HERE IS = 16.7 MSECS SECR = 3 ;"RES3" IS THE ONE-SECOND RESOLUTION $NRES = 16. ;USE MAX # OF RESOLUTIONS .IFLE $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 ; NORMAL sZ3 ZZZf< 4&_ ZAZ ZZ"P`p &Z .  _Z$~\` Z3ZwD3 Z Zw 7 D\7 Z 12345678 &=':>@9 0/~`STUVWXY _,(%\"Z -JKLMNOPQ $*];^R ! +ABCDEFGH .)[<#I ~La ? 12345678 :#@'RD: .=.+NLP+NLP ;THIS WORD CONTAINS 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,400,TYDONE,0,0,0,0 ;TTYOUT .WORD 1,400,TYDONE,0,0,0,0 ; LISTS .WORD 1,400,TYDONE,0,0,0,0N'T ; CRIC10: MOV CRFRST(R3),R1 ;GET I/O LIST ADDRESS JSR PC,CRSIO ;OTHERWISE, START THE I/O CLR REPEAT(R3) ; CARD' FLAG 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 ;* ;* ;***************************LY 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 = 60. ;# OF T-O-D CLOCK TICKS PER SECOND $ABMPL = 6 ;CLOCK BASE PERIOD = 1/10 SECOND C1COMD = 177546 ;DEVICE ADDRESS FOR HIGH-SPEED CLOCK C1CBIT = 100 ;BIT TO CONTROL FAST CLOCK INTERRUPT $TMSLC = 1 ;SYSTEM OPTION="9 ~a 0/STUVWXY ,% >?Z -JKLMNOPQ !$*); R  stuvwxy z &ABCDEFGH ~?aiklmno!"#$%&'()*+,-./`YZ[\]^_Сbcdefgh ~,cPIJKLMNO ABCDEFGHjQRS ; FOR .WORD 1,400,TYDONE,0,0,0,0 ; 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 NL******************************************* ; ; CRCLOS: MOV @#PSR,-(SP) ;SAVE CURRENT PRIORITY LEVEL .IFZ NCR-1 ;CODE FOR ONLY ONE C/R MOV CRFRST,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 FOR INCLUDING TIME-SLICING $SWATZ = 20. ;NUMBER OF ENTRIES IN SCHEDULER "WAIT" TABLE $TWATZ = 20. ;WORDS IN TIMER'S "WAIT" TABLE .PAGE ; ; NDISCS = 1 ; DISC OPTION AND NUMBER OF CONTROLLERS ; ACTSIZ = 20. ; MAXIMUM NO. OF ENTRIES IN AUTH. CODE .IFL 20.-ACTSIZ XXXXXXXX ; ERROR-ALLOCATE MORE LOCATIONS XXXXXXXX ; FOR AUTHORIZATION CODES .ENDC ; TUVWXpq\~crstuvwx0@@P~}zn|@@@@@@@@@@@@@@@a@@kMl@@@@@@@@@@@@@@@@@@[\^j@@@@@@@@@@@@@@@Z@@@@@@@@@~d@@@@@@@@@@@@@@@@@@@@@@N@@KL;@@@@@@@@@ @@o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ~d@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@e(%~ e@t0wx-47. dv_BYPne P-1 ; LPIOLS: .WORD LPLIST ;ADDRESS OF 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 .IFNZ $RASM BEQ CRCA01 .ENDC .ENDC ASR NREAD(R1) ;THEN CONVERT NO. BYTES TO NO. WORDS .IFNZ BCD .IFNZ $RASM BR CRCA05 ; CRCA01: CMP (R1),#82. ;IF USER WANTED 82 CHARACTERS, STORE BNE CRCA05 ;THE LAST TWO AS CR, LF MOV #LF*256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 MOV #340,@#PSR .IFNZ NDISCS 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 XXXXXXXX ; MUST BE AT LEAST THREE .ENDC ; .IFG NDISCS-1 NDPRT2 = 7 ; NO. OF PRIORITY LEVELS IN DISC 2 QUEUES .IFL NDPRZ-NeXTfP  @ ~e7 7   eeP~eptrv0fR0 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 CR; ; INCLUDING DOD'S .ENDC ERRPRT = 1 ; PRINT-OUT DISC ERROR MESSAGES OPTION .ENDC CHKPTC = 0 ; CHECKPOINT CAPABILITY OPTION- ; ;******MODEL 45 ONLY FXPART = 1 ; FIXED PARTITION OPTION $SGMNT = 1 ; SEGMENT LOAD OPTION .PAGE ; ; TTYIO SYSGEN PARAMETERS ; NTTYS = 2 ;NO. OF TTY UNITS &  w  w  x  j1{f f %ffҖ{f5f 1}f%f?~Di5f 4w 1f{fff(f l f1f fff ff1fUfff^fc~if}ffff f f1fw` f1f f f f1f@fwjfw&ffw~4jƕEE D$f@f f(f  Df+ŀ| n *-el.fBE, LPRDY: .IFG NLP-1 .WORD LPRD ;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 CA05 ;BRANCH IF ALPHANUMERIC AND NO ASSEMBLER .ENDC .IFNZ $RASM ;.....OR..... BEQ CRCA01 ;BRANCH IF ALPHANUMERIC AND AN ASSEMBLER .ENDC ;IS IN THE SYSTEM .ENDC ASR NREAD(R1) ;CONVERT BYTES TO WORDS .IFNZ BCD .IFNZ $RASM BR CRCA05 ; CRCA01: CMP (R1),#82. ;IF USER WANTED 82 CHARACTERS, STORE BNE CRCA05 ;THE ;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 MESSAGI n~j 5@ =fC$f5@@w, ĕ f^ff2    ށ f fĕ\ffĒ1f~$k  1fĕ\ffff(f  f=f ff$f p ĕ=ff > 6r8w f5 W<~kP45P<APp ,( &0   0 xC `0  V~l5@PAQ > <f4f& & rff4fef4f .BYTE CR,LF .ASCII 'L/P 3 NOT READY' .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. ; LAST TWO AS , MOV #LF*256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 MOV #340,@#PSR ;INHIBIT INTERRUPTS .ENDC ; . .IFNZ $1145 ; . SPL 7 ; . .ENDC ; . MOV (R0),R2 ;SAVE ADDRESS OF NEXT LIST MOV R2,CRFRST(R3) ;DEQUEUE THIS REQUEST BNE E BUFFERING DBUFSZ = 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 f `D` f~lfCD,f1f{f1f@f 4   f=ff(f@ f  J@f 3 1f1ffDfA5@U~m =ff$ff fff,fw ,Ý?f Af7/fw{f@f@f7 5~|m 5@PsQ 5Pl5Ph5 PUP= f=fPp w\ B ef @efef :J ~m  {f!{f{f}f}fff E ffff̑ .=LPXXXX+NLP+NLP LPXX: .ENDC .WORD 15.,0 .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 CRCA20 ;BRANCH IF SOMEONE'S LEFT IN QUEUE ; CRCA10: MOV RO,R4 ;SO, CLEAN IT UP. ADD #CRFRST,R4 MOV R4,CRLAST(R3) ; CRCA20: MOV (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 ;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  J{f3}f3f }ff(f  3fw ~lnff -f 6w E =ff7@f^ffw 6.f& f~n &6  L6o oZzB|~P|}|^؉ZfHgoBtsRu, AFTER ;ASSEMBLER READ REQUESTS .PAGE ;********************************************************************** ;* q AC:  ? ILL CMD! ILL PAR! NON-QUIESCENT 7 7 7 arci~,r r   rrrr W,2 0!- )!&7!#tyFrjw4wZ ~rRww @qq  w$&& & & r & HH:MM:SS MM/DD/YY s~ss ssss &e I W, !  srw*xW, ! .WORD CNT.4 ;L/P # 4 .=LPWDCT+NLP+NLP ; 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 ,-(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 ANY OTHER REQUESTS ; QUEUED FOR THIS CARD READER. ; CRCB00: TST R4 BEQ CRCB05 ;BRANCH IF REQUESTOR WASN'T A TASK DECB IOSTAT(R4) ;OTHERWISE, DECREMENT HIS I/O IN PROGRESS .IFNZ OVRLAY ;COUNTER, AND..... BNE CRCB05  ** ;* 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 =  (~s s s r DԝDԝA  q w  ы Dĥ  D0 C ~ t ``a - v6 w >6'd w 8t Օ+  d 0B` e0  w ~t%Օ- ҋ    uxf&f&~tR   4 rv  w  7 w  ;L/P # 4 .=LPADDR+NLP+NLP ; LPVECT: .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 ;********************************************************************** ;*  ;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 HIS CORE .ENDC ;(IF IT IS READY TO BE RELEASED, THAT IS) ; CRCB05: TST R2 BNE CRCB10 ;BRANCH IF SOMEBODY IS WAITING .IFZ NCR-1 ;OTHERWISE, SHUT OFF C/R INTERRUPT BIC #ENABLE!START,@#CRS.1 .ENDC  1 ;NUMBER OF CARD READERS IN SYSTEM BIN = 1 ;1 = INCLUDE BINARY MODE, 0 = DON'T BCD = 1 ;1 = INCLUDE ALPHANUMERIC MODE, 0 = DONT TTYSW = 1 ;1 = SWITCH INPUT TO TTY ON COMMAND INEBC = 1 ;1 = PROVIDE FOR INTERNAL EBCDIC CODE EXEBC = 1 ;1 = PROVIDE FOR EXTERNAL EBCDIC CODE ; (029 CARD CODE) $RES = 0. ;BASIC TIMEZu>vnu) E,~tuRROR XXXXX SXXXXX SXXXXX SXXXXX SXXXXX xuuuuuw  w 0* w| zw ~u 7 \'wVZuPuf& &  R `u n f ~dvvvvvvvvvvvvvvvvv~v ** ;* S T A R T O F L P R N T R ** ;* ** ;* ** LPRNTR: MOV R0,-(SP) ;GUESS MOV R1,-(SP) ; WHAT MOV R2,-(SP) ; WE'RE MOV R3,-(SP) ; DOING MOV R4,-(SP) ; HERE MOV  .IFG NCR-1 BIC #ENABLE!START,@CRS(R3) .ENDC CLR CRBUSY(R3) MOV CRMDAD(R3),-(SP) JSR PC,IODQTM ;DEQUEUE TIMER TST (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 R RESOLUTION USED BY CREAD $1SEC = 60. ;MULTIPLE USING $RES FOR 1 SECOND $500MS = 30. ;MULTIPLE USING $RES FOR 1/2 SECOND $100MS = 6. ;MULTIPLE USING $RES FOR 100 MS 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 /~Tw~w>~Dx~x R5,-(SP) ; MOV 14.(SP),R0 ;GET ADDRESS 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),LPUMOV 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 CRCLOS ;AND GO TELL HIM ABOUT IT .PAGE ;********************************************************************** ;* ;* THIS SECTION OF CODE IS EXECUTED WHEN A COLUMN OF DATA IS READY. ;* THE INPUT MODE (BINARY OR ALPHANUMERIC) IS DETERMINED, AND THE ;* DATA ARE PROCESSED ACCO R I N F O R M 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 M~4y~y\~$zw ×&  6  a7^ߕw wWxS ~zvNIT(R3) ;FOR MORE THAN ONE L/P BEQ LPRA20 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 ; ORDINGLY ;* ;********************************************************************** ; CRID00: .IFNZ BIN .IFNZ BCD TST CRMODE(R3) ;SEE IF WE'RE IN THE BINARY MODE BEQ CRIE00 ;BRANCH IF ALPHANUMERIC .ENDC .ENDC TST MXCNT(R3) ;SEE IF THERE'S ANYMORE INFORMATION BLE CRID30 ;THAT WE WANT ON CARD - BRANCH IF NO ;* ;* USE BYTE TO TELL US HOW AND WHERE TO USE THE 12 BITS IN  ;CARD READER 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. wߐxWe?r ߕ 2 vvvvw4x2  ߐw n L e~{e Dw$ 6 &f  ߕ [7 ~{fv v 6 6 ×ߕ&"7 |  2 7  wewߐ~|& w <vv0vvv0vvߐ& wߕ 1w7 7  YOU-KNOW-WHATS MOV (SP)+,R2 ; . 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 CRB1 ;* AS FOLLOWS. ASSUME FORMAT OF CRB1 IS 00 X1 X2 X3, WHERE ;* XX = 4 BITS EACH. ;* ;* BYTE CRB1 IN CURRENT WORD CRB1 IN NEXT WORD ;* ;* 0 X1 X2 X3 00 ----------- ;* 1 00 00 00 X1 X2 X3 00 00 ;* 2 00 00 X1 X2 X3 00 00 00 ;* 3 00 X1 X2 X3 ----------- ;* ;* .IFNZ BIN MOV CRDATA(R3),R4 = 0 ;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 ;********************************************************************** ;* 7 0 ~||We x wf hwww k7hߕw y|}}}}}||.}.}}}}.}& ߕ~| E/\1 7 T7 7 >eHfffffffffexww&& ߕw}W"~l}1f *w ccc}}}Հ6w  j 7~c~} v ߕw  S / -2LwB vAC ;  LEVEL(R0),R2 ;NOW, TEST THE PRIORITY LEVEL BLE LPRA30 ;BRANCH IF ILLEGAL CMP R2,#NLPRTY BLE LPRA40 ;BRANCH IF IT'S OK ; LPRA30: MOV #NLPRTY,R2 ;USER'S VALUE IS ILLEGAL, USE LOWEST ; LPRA40: TST (R1) ;TEST NWORD FOR VALIDITY BGT LPRA50 ;BRANCH IF > 0 AND ASCII .IFZ INEBC MOV #9.,R4 ;BUT, IF EBCDIC ISN'T SYSGENED BR LPRA10 !1 ;GET ADDRESS OF DATA BUFFER ADD #4,R1 ADD COUNT(R3),R1 ;ADD INDEX INTO BUFFER MOV BYTE(R3),R2 BEQ CRID10 DEC R2 BEQ CRID40 DEC R2 BEQ CRID50 BR CRID60 ; CRID10: MOV @CRB1(R3),R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; DATA ASL R4 ; INTO ASL R4 " ** ;* 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 VE#ߕW"5 v rv vvv`vvL2<~\~vv e1 xw&& v ߕ0wvw  ww ×&  =7:ߕ~~w5we ߐ&  # v vvvvwߐw F  0w 6 ~L7 l i   ` v!!8ߕ vwrvvvevvv EWwa~7 ww  @E @`e$ ;NWORD CAN'T BE <= 0 .ENDC .IFNZ INEBC .=.-2 ;IF EBCDIC IF USED, ONLY 0 IS ILLEGAL BNE LPRA50 MOV #9.,R4 BR LPRA10 .ENDC ; LPRA45: MOV #11.,R4 BR LPRA10 ; LPRA50: JSR PC,LPLEVL ;NOW, DETERMINE THE INDEX OF THE MOV LOGMAX,R4 ; LPRA51: TBIT #AVAIL,PHYDEV(R3) ;SEE IF THIS DEVICE IS AVAILABLE BNE LPRA53% ; POSITION ASL R4 ; .ENDC ; .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 &CTOR ADDRESS LPVC.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 'BJ& fB 6F 6 v Y~<7 7 7 7  0 vvvv0`vvt1 vw0x0x0x1 x }  `v  U~W"tqvv0x0w  dl X0ڂ6℀&ΆΆΆ2N~, ~TASK # 2  N( ;BRANCH IF IT IS ; LPRA52: TBIT #ALT,PHYDEV(R3) ;OOPS. BETTER SEE IF 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 ;BRANC)BISB R4,R0 ;SET R4 = BITS 0-7 OF CRB1 DATA SWAB R4 BISB R4,(R1) ;STORE BITS 8-11 OF CRB1 IN DATA BUFFER ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 ;BRANCH IF 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(* ;L/P # 1 LINE 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 +2~> TASK # 3 0 & & &  2h~ TASK # 4 ڂ & & ~ 2-~,H IF WE CAN USE IT. BR LPRA52 ;OTHERWISE, GO TRY NEXT ALTERNATE ; 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) -R3),R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; INTO ASL R4 ; BIT ASL R4 ; POSITIONS ASL R4 ; 4-15 SO WE .ENDC ; CAN GET THE .IFNZ $1145 ; MOST SIGNIFICANT ASH R4,4 ; 8 BITS OF CRB1 .ENDC ; .COMMAND REGISTER 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 2 TASK # 5  & & &  T2y~D TASK # 6 6 & &  l~t2L~ TASK # 7  20 ;QUEUE IT ! MOV ACTIVE,R4 ;SEE IF CALLER IS A TASK 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)+,@#1 DATA CLR R0 BISB R4,R0 ;SET R4 = BITS 0-3 OF CRB1 DATA SWAB R4 MOVB R4,(R1) ;STORE BINARY DATA AS 00 00 X1 X2 ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 SWAB R0 MOV R0,2(R1) ;STORE BINARY DATA IN NEXT WORD OF BR CRID20 ;BUFFER AS X3 00 00 00 ; CRID60: = 132. ;NUMBER OF CHARACTERS IN L/P BUFFER LPMXTM = 180. ;MAX NO SECONDS LPRNTR WAITS FOR OPER ACTION LPINH = 4 ;INTERRUPT LEVEL OF L/P .PAGE 6r~DD~D~4E~E4PSR ;ELSTWISE, CLEAR THE INHIBIT ; ; THIS SECTION RETURNS TO THE CALLER (IF EXIT TYPES 1 OR 3) OR TO ; THE ROS DISPATCHER (IF EXIT TYPE 2); THE LATTER REQUIRES THAT ; THE TASK BE SUSPENDED FIRST. ; LPRA60: CMPB #2,TYPE(R0) ;IS THE EXIT TYPE = 2? BNE LPRA70 ;BRANCH IF NO TST SYSTEM(R0) ;SEE IF THIS IS A TASK CALLING BEQ LPRA70 ;BRANCH IF THE CALLER IS NOT A TASK MOV @#PSR,14.(SP) ;GOOD, H5 BIS @CRB1(R3),(R1) ;PUT CURRENT BINARY DATA IN BUFFER ADD #2,COUNT(R3) ;AS 00 X1 X2 X3 CLR BYTE(R3) DEC MXCNT(R3) JMP (R5) ;EXIT TO RESTOR .ENDC .PAGE ;********************************************************************** ;* ;* ;* 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?}~d TASK # 8  &  D2 ~܅4 TASK # 9 & X~T 2 ~̆܆ TASK # 10 Ά  r2 7.M(; MhMh_, !",$$'(+-.03569:~H5~|H~H@ REQUEST IN THE QUEUE, SO WE GONNA START THE OUTPUT. ** ;* INTERRUPTS ARE INHIBITED ON ENTRY, AND THE REGISTERS ** ;* ARE SET AS FOLLOWS: ** ;* ** ;* R0 = ADDR(LIST) ** ;* R1 = ADDR(DATA) ** ;* R2 = PRIORITY INDEX *AH IF EOD ; CRIE15: ; TST MXCNT(R3) ;WELL THEN, IT MUST BE AN ORDINARY CHARACTER BLE CRID30 ;BRANCH IF WE DON'T NEED ANY MORE CHARACTERS MOV @CRB2(R3),R2 ;GET COMPRESSED VERSION OF CHARACTER ADD TABLE(R3),R2 ;ADD IN BASE TABLE ADDRESS MOV CRDATA(R3),R1 ;GET DATA BUFFER ADDRESS ADD #4,R1 ADD COUNT(R3),R1 ;ADD CHARACTER INDEX MOVB (R2),-(R1) ;MOVE BE~lI~IT~\J~JC^~D7   2 ~7     D  7 ~47d7lvEpjd ^  8""& $ҝʝ0 ( wZ~Zֈ~D* ;* R3 = L/P INDEX ** ;* ** ;********************************************************************** ; ; LPRB00: MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV PC,LPBUSY(R3) ;SET L/P BUSY FLAG MOV R1,LPDATA(R3) ;SAVE DATA BUFFER ADDRESS MOV $EXIT(R0),LPIOCM(R3) ;SAVE EXIT ADDRESS MOV SYSTEM(R0),LPTASK(R3) ECONVERTED CHARACTER TO CALLER'S BUFFER DEC MXCNT(R3) BR CRID30 ; CRIE20: 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) Fc~LK~Kr~ oӵeK6 w n nn V~ $@5;& H H H)7D% ދ1 1 77 b~^d7 P7 wX ;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 ; ; LPIA00: .IFZ $1145 ;CLEAR THE INTERRUPT INHIBIT MOV YE ERROR ;R4 = ERROR CODE ** ;* ** ;* 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 Z& @'w +f~4T0 tRsvR3R3 R3 RRsR3 R3 R X rY    RxRvR ]~T  rYwX  MR2xRexR2~RRx&  R& ) ~$Uf RR  xR )xR  svR3RR3 R3 RXsRrY3 R3 R  ~UM 3 tR&S  M R%R   M4S w[̑w\a~ ~k~~t\ #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 LPIA03 ;BRANCH IF AN ERROR WAS DETECTED JSR PC,LPRSET ;THEN RESET THE L/P .I] CMP R1,#HICORE BHIS CRDW19 ;BRANCH IF ADDRESS IS BEYOND CORE 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 ;BRA^LS ~ 3 R&S& V< l MCfvR ~VRxR b R J R,R< .   Xwv&ff& vSRAaes!R1 D! % 3 V~VvS  Rĕ J  s!R5ЕsRvS   5  6 & `3 xS  2~W4W 1 .W +5(5%D eD   !!5  ~|W@& 5 55 _*~8Q8ZvZQdBYf.........kkkx 7~dr wkw 7tw  7^w w >ĝ\7Zk70 , Zk"Rkw.& dk^k@j 7~ܔD A  &DCc  w 2w  w  ' 7  &w \w wXw w  fw |m`FNZ 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: .ENDC JSR PC,LPCNVT ;AND GO SEE IF THERE'S MORE TEXT BNE LPIA10 aNCH IF ADDRESS IS IN ROS CMP #HICORE,$EXIT(R1) ;OR OUTSIDE AVAILABLE CORE ; CRDA20: 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 ++b 2S3R   R&S V&<  fvS ~W eX00& vSwvS@aAa ! @vRRw f  `Ba~lXfS 5 f . 7 &  & & & !  T lxR~X~RB   !"$'(+-.03569:w*fZ 5 f 1 3 Z3 Zs Z3 Z Z~_Z   sZ3 ZZZf< ^,_ ZAZ ZZ"V`p &Z X  _Z~d`  ZwJ3 Z Zw$scgbbbV  <6 !%& &e N @ e0w &  9~Ԝ b7~brbnbE w   w ׭4b ^w ~LUw w nj  7,XR-P Dw@ 78 %(!  %?~ĝ?w N%w 77w Z e0w ,w w prtR 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-1 ;CODE FOR ONLY ONE PRIORITY LEVEL * TST LPFRST(R3) u MOV R1,-(SP) ;SET UP FOR 1 SECOND DELAY MOV #$1SEC,-(SP) ; JSR PC,IOQTME TST (SP)+ BNE CRLA00 ;LET'S GO ABORT THIS REQUEST ; CRTA10: RTS PC ;RETURN TO TIMER ROUTINES .PAGE ;********************************************************************** ;* ** ;* C R D L A Y v <7 6J\7 Z 12345678 &=':>@9 0/STUVWXY ~`_,(%\"Z -JKLMNOPQ $*];^R ! +ABCDEFGH .)[<#I ? ~Ta 12345678 :#@'="9 ~a 0/STUVWXY ,% >?Z -JKLMNOPQ !$*); R  stuvwxy z &ABCDEFGH `.<(+|I~Db   aw~< Cå å$ נA   e` ƞ  Ëנe ee ~e ѐ  @(TT@ ODT-11R V002ABEQff *;/\ $G _<^,OWEBP@>SRC-FI!XASPMCFR~,BŸ)eL x  N N Ê <%! ,c ѐhˋÜ`Eb $  P   LwZ ɋr px * 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 ;R2 = INDEX FOR TOP PRIORITY * ; y ** ;* ** ;* 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. ** ;* zbcdefgh i jklmnopq r  \()[] @y^~bz{|}~123456789:;<=>?aiklmno!"#$%&'()*+,-./`YZ[\]^_Сbcdefgh P~4cIJKLMNO ABCDEFGHjQRSTUVWXpqrstuvwx0~c@@P~}zn|@@@@@@@@@@@@@@@a@@kMl@@@@@@@@@@@@@@@@@@[\^j@@@@@@@@@@@@@@@Z@@@@@@@@@@@@@@@@@Q| * 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 * BGT LPIB10 ;AND GO BACK F} ** ;* CRDLAY IS ENTERED FROM THE TIMER ROUTINE AND R1 POINTS TO ** ;* THE TIMER MODULE. ** ;* ** ;********************************************************************** ; CRDLAY: MOV 6(R1),R3 ;GET C/R INDEX BIC #START!ENABLE,@CRS(R3) BIT #READY,@CRS(R3) ;CHECK C/R STATUS BEQ CRLA10 ~~$d@@@@@@@@@@@@@@N@@KL;@@@@@@@@@ @@o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~d@@@@@@@@@@@@@@@@@@@@@@@e(~e@t0wx-47. dv_rYPne [-NeXTfP  @ 7 3x/~e   eeP:~xG~GJ~hH~HOR ANOTHER * .ENDC * .IFNZ $1145 * SOB R4,LPIB10 .ENDC BR LPID00 ; * LPIB20: ; * .ENDC ; AT THIS POINT, THERE IS AN ENTRY IN THE QUEUE, AND R2 POINTS ; TO IT. ; MOV  ;BRANCH IF C/R IS READY DEC COUNT(R3) ;TSK, TSK. DECREMENT COUNTER BNE 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 RE ~fptrv0f 6r8w 5 W<~Q45~k~Q<A~Qp ,( &0   0 xC `0  Y~l5@~QAQ > <f4f& & rff4fef4ff `D` ffCD,f~l1f{f1f@f 4   f=ff(f@ f  J@f 3 1f1ffDfA5@ =fu+~N~N;~pO~OTER 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 ;********************************************************************** ;* ** ;*  .ENDC .IFG NCR-1 MOV CRIOLS(R3),R5 ;GET THE I/O LIST ADDRESS .ENDC ; ; MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 ;THEN, INHIBIT INTERRUPTS MOV #340,@#PSR ;11/20 CODE .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE .ENDC TST DATA(R5) ;SEE IF LIST IS AVAILABLE BNE CMSX00 ;BRANCH IF NO MOV R4,DATA(R5) ~ mf$ff fff,fw ,Ý?f Af7/fw{f@f@f7  5@~Q2~msQ 5~Ql5~Qh5 ~QU~Q= f=f~Qp w\ B ef @efef :J  ~m {f!{f{f}f}fff E ffff̑ J{f3}f3f }ff(f  3fw f;~tnf -f 6w E =ff7@f^ffw 6.J~`P~PY~PQ~QTHIS 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 ATTEMPTS, ** ;* AN ERROR MESSAGE IS GENERATED AND THE REQUEST IS ABORTED. ** ;YES - GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R5,-(SP) ;STORE LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) CLZ RTS PC ;RETURN TO CALLER ; CMSX00: MOV (SP)+,@#PSR ;LIST BUSY MOV (SP)+,R5 MOV (SP)+,(SP) SEZ ;SET ERROR INDICATOR (BUSY LIST) f& f &~n6  L6o oZzB|~P|}|^؉ZfHgoBtsRu6'd w 8t Օ+  d 0B` e0  w %Օ~t- ҋ    uxf&f&R I~u  4 rv  w  7 w Zu>vnu) ERROR XXX~|uXX SXXXXX SXXXXX SXXXXX SXXXXX xuuuuuw  w 0* w| zw  ;~hW~WJ~XX~X 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)+ ; JMP (R5) ;EXIT TO RESTOR .PAGE ;***************************; ; CRSIO: CLR COUNT(R3) ;SET COUNT = 0 CLR IGNORE(R3) MOV SYSTEM(R1),CRTASK(R3) ;STORE TASK NUMBER .IFNZ BIN CLR BYTE(R3) .ENDC .IFNZ TTYSW TST CRBKUP(R3) ;SEE IF THIS READ IS TO BE DIRECTED BNE CRSB00 ;TO THE TTY - BRANCH IF YES (OR SI) ; CRSA05: .ENDC MOV CRDATA(R3),R0 ;GET DATA ADDRESS CLR R1 ;DETERMINE MODE ~u7 \'wVZuPuf& &  R `u n f #~lvvvvvvvvvvvvvvvvv~v'~\wY~HY~Yh~8Z~Z******************************************* ;* ** ;* 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 ANDOF INPUT MOV (R0),R2 BGE CRSA10 ;NWORD < 0 ======> BINARY INC R1 ;SET R1 = 1 (BINARY) NEG R2 ; CRSA10: MOV R1,CRMODE(R3) ;STORE MODE CODE 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 .IFG NCR-1 ~w6~Lx~xE~ ;* ;* 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 ;* ;* WHERE K = 1 F&f  ߕ [7 fv~{ v 6 6 ×ߕ&"7 |  2 7  wewߐ& B~ |w <vv0vvv0vvߐ& wߕ 1w7 7 7 0 We &~|x  wf hwww k7hߕw y|}}}}}||.}.}}}}.}& ߕ E~|/\1 7 T7 Fa~p^ L/P 1 PARITY ERROR L/P 1 NOT READY L/P 1 ABORTED]T^&f&f \ 70~^&& & &      D *:]2]rhkx0 ] ~`_ & Fw0 ]s]3]3 ]]s]3 ]3 ] c ld  ~__ld ]]] ~  ldc x M]2]e(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 MOV #$1SEC,-(SP) ;RESTART TIMER FOR ONE SECOND JSR PC,IOQTME TSOR 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 #CRSB50,7 >eHfffffffffexww&& ߕw}W"~t}1f *w ccc}}}Հ6w  j 7~c v ~}ߕw  S / -2LwB vAC ;ߕW"5 v rv vvv`vvL2vv A~d~e1 xw&& v ߕ0wvw  ww ×&  =7:ߕw]2]]kx&m~P` ]& d f ]]  ] ']  s]3]]3 ]cs];~`ld3 ]3 ]  M 3 ]V^  M ]  ` Mr^ pw^ ^ |]d^< R g~@aFaMCf]]] R ]<  |w&ff& ^]Aaes!], D! % 3 o~a^ H  s!]5Еs]^  5 T (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. .PAGE ;********************************************************************** $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: .IFZ NCR-~~5we ߐ&  # v vvvvwߐw F  0w 6 ~T7 l i   ` v!!|9ߕ vwrvvvevvv EWw7 \~ww  @E @`eBJ& fB 6F 6 v 7 7 5~D7 7  0 vvvv0`vvt1 vw0x0x0x1 x }    6 & `e3 ^  ~0b4W 1 .W +5(5%D eD   !!5  o~b@& 5 55 p^   ]d^<  f^  e:c0r~ c0& Tw^@aAa ! @]]w f  `BafV^~c 5 f ;* ** ;* 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: ** ;* 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 #7,R3  `v  W"t~qvv0x0w  dl X0ڂ6℀&ΆΆΆ29~4 TASK '~# 2  N2[~$> TASK # 3 0 & & &   _ ]]B   !"~d$'(+-.03569:?@[\]^_ 789ABC01~hf23456 COLUMN 17 = FIRST CHAR % f6 w"ef6 ptr~fvfgg g,g8g3DgVo3DgVo0Egm0Egm3Fgo3Fgo ** ;********************************************************************** ; ; LPCNVT: ; ; MOV PC,-(SP) ;SET NO DATA FOUND FLAG MOV R0,-(SP) ;SAVE SOME REGISTERS MOV R1,-(SP) ; MOV R5,-(SP) CLR -(SP) ;TAB POSITION COUNTER MOV LPBUFR(R3),R0 ; R0 = ADDR L/P BUFFER MOV LPCNT(R3),R5 ; R1 = TEXT DATA BUFFER ADDRESS ADD R5,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. ; ; CRSCD TASK # 6 6 & &  2)~| ~TASK # 7  2~l TASK # 8  &  D2 ~~Xgjglgngpgrgtgvgxgw x  b Ig.Vw ^&& &&  ,~g  kxw " & wdIg5bgGgˀGg 2w  "  VKgKg5fgGg~Hh1Ggw f fw~fHe  DgGg zgGg Ig Mg_gP bgzgjgP W zgw V~h:EE YgDfMgDWg |h1Ygw*i,jR4 CMP R4,#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 00: 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 ** 4 TASK # 9 &  ~\2 ^~Ԇ܆ TASK # 10 Ά  r2 Y~L7   2 jOgWOgH@bg  -m)~8i=f h f Wgaff x =f=f && & . Gg z &  &  ~i w P w R kx  j1Gg jg %jgjgGg5bg 1Ig%jg5fg 4w8 1KgGg~(jԕOgff  Wg1Og fWg]g fWg1]gUfWgOg^fWg}SgfWg`~jOg f Wg1Wgwj f1Og Wg f  LPCA10 ;AND THE CHARACTER IS NOT CONTROL, THEN INC LPMODE(R3) ;ASSUME AUTO LINE FEED MODE BR LPCA10 ; LPCA05: CMP #HT,R4 ;SEE IF CHARACTER IS A TAB BEQ LPCA60 ;BRANCH IF 'TIS CMP R0,LPBUFR(R3) ;OTHERWISE, IF WE'RE AT THE BEGINNING BNE LPCA20 ;OF THE L/P BUFFER, WE'LL CONTINUE JSR PC,LPSTOR ;FIRST WORD IS CONTROL, TOP BYTE (LEFT) MOVB #' ,R4 ;* ** ;* 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) ** ;* ~ć7     D  7 7 ~ <zg4zg& & njgjg4jgejg4zgĒf `D` Mg_gCDf1[gGgP~pm1Wg@bg 4   Wg=fff@f  J@fg 3 1Ug1QgWgDfA5@ =fff_gf~m Wgfffw Ý?Yg Af7/Mg~Gg@bg@fg7  5@\s\ 5\l5n~`n\ ;NEEDS A BLANK MOVB #LPBLNK,(R0)+ ;YES - STORE IT ; LPCA30: ; LPCA40: MOV R5,LPCNT(R3) ;STORE CALLER'S BUFFER POINTER SUB LPBUFR(R3),R0 ;DETERMINE NO. WORDS IN L/P BUFFER MOV R0,R4 ASR R4 ;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)+  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 ; CRINIT: .IFZ NCR-1 ;FIRST, LET'S SET UPJ t   T~wwl開~dd7" @ : 7fev)-ew7s ss_~t& u Bvvvvvv9 vv & T7&f:Е<<9<2-?~쌈 "PPP)mȵ h5 \U\=f=f\p w` B ezg @ejgezg :J  8 Gg!GgGg~nIgIgKgKg E bgbgfgfg NGg3Ig3Kg }fff 6 3Ygw [g[g -f~Po w E =f]g7@fg^fWgw nff& _g &6 ~o (6o oz|~|}|^؉Zghot&tuuv&f&M & & w  ;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 MOV #40,R4 ;OTHERWISE, KEEP STORING BLANKS INC R5 JSR PC,LPSTOR ;UNTIL WE GET TO A TAB POSITION BNE LPCA40 ;OR UNTIL THE L/P BUFFER IS FULL BIT #7,(SP) BN THE INTERRUPT VECTORS MOV #CRINT1,@#CRVECT ;STORE C/R INTERRUPT ADDRESS MOV #340,@#CRVECT+2 .ENDC .IFG NCR-1 MOV #CRVECT,R0 MOV #CRINT1,R1 MOV #340,R4 MOV #NCR,R2 ; CRNA10: MOV (R0),R3 ;LOAD VECTOR ADDRESS MOV R1,(R3)+ ;STORE ADDR(CRINT) IN VECTOR MOV R4,(R3)+ ;SET PRIORITY LEVEL TO ZERO ADD  @@p- ɕe%!G~d7r& ^< 72nre"2 7VrB f  D &  ‹ & & N & ~܍ z yerEwq57q& 5E -?-~T   Ν   Be (- -- ee ~̎ Ep2~@p~p ENrDSrQUrXXrTMsDTsREqEX&rq ~qq %7 ~0qzvrp  p$ w: r &q7 q vqD pS#  8rVq@~q   Fr:W, ! 7! E\ E LPCA60 ;KEEP GOING 'TIL WE HIT A MULTIPLE BR LPCA16 ;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 ;*******************************#8.,R1 .IFZ $1145 ; DEC R2 BNE CRNA10 .ENDC ; .IFNZ $1145 SOB R2,CRNA10 .ENDC ; .ENDC ; ; NOW, LET'S CLEAR THE QUEUES OUT ; .IFZ NCR-1 CLR CRFRST MOV #CRFRST,CRLAST .ENDC .IFG NCR-1 MOV #NCR,R0 MOV #CRFRST,R1 MOV #CRLAST,R2 ; CRNA20: MOV R1 E EvÝ;`Ý1`Ý*`%<< % ÝÜ-  ~D  UUp&p-,E eet?p6  \pw ߀Lp%%~BA  J6 w  U~4G&o <-o76 w ހelo  0mH52~ r0r AC:  ? ILL CMD! ILL PAR! NON-QUIESCENT 7 7 7 alrc fr   ~rrr2sDs W,2 0!- )!&7!#yrw4www  ~sTrq h wΌ&& & & r & HH:MM:SS MM/DD/YY Ys\s_smsjsgs ~s&e I W, !  *************************************** ;* ** ;* 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,(R2)+ ;SET CRLAST = ADDR(CRFRST) CLR (R1)+ ;SET CRFRST = 0 .IFZ $1145 DEC R0 ;DECREMENT COUNTER BNE CRNA20 ;AND TRY, TRY AGAIN .ENDC .IFNZ $1145 SOB R0,CRNA20 .ENDC .ENDC RTS PC .ENDC ;ENDC FOR THE BEGINNING .IFNZ NCR STATEMENT .END ~} :-œ-. Da`> oӵeK6 w n nn V $$~$@5;& H H H)7D% ދ1 1 77 b^~d7 P7 w̑w\~ ND.E C ND.E 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 , 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 ** ;* A BUFFER ADDRESS FROM STACK .IFG NLP-1 ADD R3,R4 ;GET ADDRESS OF BUFFER FOR THIS L/P MOV (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 ~c~~|*6z90~0|9ZvtRrYd.........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 0 ,RLP#N V MO R3 R CL 1 P-! ** ;* R4 IS DESTROYED, 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) CURRENT CPU LEVEL .IFZ $1145 MOV #340,@#PSR ;11/20 CODE TO INHIBIT INTERRUPTS .ENDC .IFNZ $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) kkkx 7r w~lkw 7tw  7^w w >ĝ\7Zk70 , Zk"Rkw.& dk^k@j D A~  &DCc  w 2w  w  ' 7  &w \w wXw w  fw |t w ~\7 wtwhw  %-E e䓂 wh6 ߞ =w F6 / w :( w 2! w * w "w * U~ԕ7 w 7w 77Ҟߞ JNL 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 ; ; * ********************************************************************;* * * ;* * * ;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. .PAGE ;*************************************************** ;PUSH LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE MOV (SP)+,R5 ;RESTORE R5 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 PCw7  ww (b ww w A B` r%q~L w| 7twrjwhg E 7pwhP E tP Iw -%d~Ė w  =w 7 =w e0w ,w %@w ~ke=w @ ~ 1). ** ;* ~!644 $ .!464 $ % w   @w @ % % w  ww ~  D  &C@AEPA&fw w /w w :w   ` E[~ ` H 8 wFLew 7U4E(w T76  p$j~ew V׭dU7w @ŝŝw ; ; * ********************************************************************;* * * ;* * * 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 ;* * * ;* * ****************************************************** ** ;* 2 = ILLEGAL LIST OR DATA ADDRESS ** ;* 4 = ILLEGAL RETURN TYPE ** ;* 5 = ILLEGAL I/O COMPLETE ADDRESS ** ;* ** ;********************************************************************** ; ; LPCHEK: CMP R0,#ROSTOP ;TEST LIST ADDRESS BLOS LPKE02  ** ;********************************************************************** ; ; LPOFF: .IFNZ LPBACK .IFG NLP-1 TST R3 ;L/P NO. CAN'T BE <= 0 BLE LPDF10 CMP R3,#NLP ;OR = BGT LPDF10 DEC R3 ASL R3 INC LPTTY(R3) .ENDC ; ; .IFZ NLP-1 INC LPTTY .ENDC ; ; dt wt!~t w w Jw @eZ%ĕt72 $$w Bw .e` w ;w ĝw wJ~웷f&f 46 0c.c7$c7$c cw rc5~dccgbbbV  <6 !%& &e N @ e0w &  ~ܜ b7~brbnbE w **************;* E AG.P C ND.E PC S RT Y TTLP R CL 1 P-NL FZ.I : ONLP ; C ND.E PC S RT : 10DFLP ; ; C ND.E Y TTLP C IN 1 P-NL FZ.I ; ; C ND.E ) R3Y(TTLP C IN R3 L AS R3 C DE 10DFLP T BG = R ;O P NL,#R3 P CM 10DFLP E BL 0<=E B'TAN CO. N/P;L R3 T TS 1 P-NL FG.I CK ;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, FINALLLPDF10: RTS PC .ENDC ; LPON: .IFZ NLP-1 CLR LPTTY RTS PC .ENDC .PAGE ;********************************************************************** ;* ** ;* L P Q E R R ** ;* THIS LITTLE SUBROUTINE QUEUES THE ERROR TASK FOR EXECUTION. ** ;* ON ENTRY, R0 MUST CONTAIN THE ADDRESS OF THE I/O  w ׭4b ^w Uw ~Tw nj  7,XR-P Dw@ 78 %(!  %??~̝w N%w 77w Z e0w ,w w p~D Cå å$ נA   e` ƞ  Ëנe ee e ѐ L~  @(zYzY@ BALP Z FN.I F:OFLP ; ; * ********************************************************************;* * * ;* * * . 1)> P NLF (IN URET ROND YEROSTDES IR3 ;* * * ;* * )*LP N.,.., 32,, (1R BEUM NERNTRI PNELIE THS INTAON CR3E ERWH ;* * * ;* * * Y (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  LIST. ** ;* ** ;********************************************************************** ; ; LPQERR: CLR -(SP) MOVB ERRTSK(R0),(SP) ;GET ERROR TASK NUMBER TST (SP) BEQ LPQA00 ;BRANCH IF AN ERROR TASK IS NOT SPECIFIED CLR -(SP) CLR -(SP) CLR -(SP) JSR PC,QUEUE ;QUEUE THE ERROR TASK ; LPQA00: ODT-11R V002ABErYzY. *;/\ $G _<^,OWEBP@>SRC-FI!XASPMCFRB!~4Ÿ)eL x  N N Ê <%! ,c ѐhˋÜ`E Z$  P   LwZ ɋr pQ F)OFLPR (ON PO,LPC R JS ;* * * ;* * * : S IGEKAIN LHE T).ONLP (/P LHE TTOT PUUT OTETANSEI ROR ;* * * ) FFPO(LE YPETEL THE TTOT PUUT O/P LHE TCHITSWO TEDUS ;* * * RE AND AUTNP IORATEROPY BEDLLCAE ARS NETIOUBRSUE ESTH ;* * * ;* * * F F O P L / N O P L ;* * *  BHI LPKE02 ;WORDS FROM TOP OF CORE ; ; NOW WE'LL CHECK 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  TST (SP)+ ;POP OFF ERROR PARAMETER AND EXIT RTS PC .PAGE ;********************************************************************** ;* ** ;* LINE PRINTER INITIALIZATION ROUTINE. THIS ROUTINE: ** ;* ** ;* 1. STORES INTERRUPT VECTOR VALUES ** ;* 2. RESETS AND CLEARS THE LINE PRIN ;* * ********************************************************************;* 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 ;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 ; LPKE02: MOV #2,R4 ;ILLEGAL LIST OR DATA ADDRESS RTS PC ; LPKE05: MOV #5,R4 ;ILLEGAL I/O COMPLETE ADDRESS RTS PC .PAGE ;******************************************* TER(S). ** ;* ** ;* LPINIT SHOULD BE CALLED AT SYSTEM INITIALIZATION TIME. ** ;* ** ;********************************************************************** ; ; LPINIT: .IFZ NLP-1 CLR R3 MOV #LPINT0,@#LPVC.1 ;STORE ADDR OF INTERRUPT ROUTINE MOV #340,@#LPVC.1+2 ;SET TPC S RT N IOITNDCOR ROERO- NET;S Z CL R DEORN ICKTA SUT;P P)(S+,P)(S V MO 5 RRETOES;R R5+,P)(S V MO E AGSSMET INPRO TUTYOTTL AL;C T OUTY,TPC R JS SSREDD ASTLIH US;P P)(S,-R5 V MO REWEY HE TREHE WTOK AC BTSUPRRTEINE BLNA;E R PS@#+,P)(S V MO T IABGRO SE,BLLAAIAVS T';I ) R5A(AT,DR4 V MO Y US BIFH NCRA;B 00SXLP E BN E BLLAAIAVS ISTLIE THF IEE *************************** ;* ** ;* 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. ** ;* O INHIBIT INTERRUPTS ON ENTRY JSR PC,LPRSET ;RESET THE L/P JSR PC,LPCLR ;AND CLEAR THE L/P .ENDC ; ; .IFG NLP-1 CLR R3 MOV #NLP,R0 MOV #LPINT0,R1 MOV #340,R2 MOV #8.,R4 ; LPNA00: MOV LPVECT(R3),R5 MOV R1,(R5)+ MOV R2,(R5)+ ADD R4,R1 JSR PC,LPRSET JSR PC,LPCLR TST (R3)+ ;S 5)(RTADA T TS C ND.E NGHI TMESAE THR FOE OD C451/;1 7 L SP 5 14$1 Z FN.I C ND.E S PTRUERNT IITIBNH ITOE OD C201/;1 SR#P,@40#3 V MO 5 14$1 FZ.I L VELEU CPT ENRRCUE AV;S ) SP-(R,PS@# V MO ;* C ND.E STLIO I/ ;* 5 ,R3)(RLSIOLP V MO ;* 1 P-NL FG.I R TEINPRE IN LOF ;* C ND.E ;* R5T,ISPL#L V  ** ;********************************************************************** ; ; LPRSET: .IFZ NLP-1 MOV #CLEAR,@#CMD.1 .ENDC .IFG NLP-1 MOV #CLEAR,@LPCMD(R3) ;CLEAR IT .ENDC RTS PC ;THAT'S ALL, FOLKS! .PAGE ;********************************************************************** ;* .IFZ $1145 DEC R0 BGT LPNA00 .ENDC .IFNZ $1145 SOB R0,LPNA00 .ENDC .ENDC MOV #LPFRST,R0 MOV #LPLAST,R1 MOV R1,R2 ; LPNA10: MOV R0,(R1)+ CLR (R0)+ ;IN THE PRIORITY QUEUES CMP R0,R2 BLO LPNA10 RTS PC .ENDC .END 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 ; ; * ********************************************************************;* * * ;* * *  ** ;* 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 . 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 ;* * * ;* * * S: IGEKA ** ;* > 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 MOIN 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 ;* * * ;* * ********************************************************************;* E AG.P PC V @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 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 S OE D201/ 1HE TAY WHE TISS HI;T R5 C DE : 00LALP ; : INC (SP)+ ;OPERATOR ACTION REQUIRED RTS PC ;EXIT ; LPSA20: DEC (SP)+ ;SET PARITY ERROR INDICATOR RTS PC ;AND EXIT .PAGE ;********************************************************************** ;* ** ;* L P S I O ** ;* 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 V MO R2 L AS R2 C DE T ISE UWEE USCA 'R5E $ ** ;* 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 %G&o <-o76 w ߀elo  r~ 0mH5} :-œ-. Da`> oӵeK6 w  n~n V $@5;& H H H)7D% ދ1 1 7~77 b^d7 P7 w̑w\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 R JS ;* * * X DEINP L/= 3 ;R ( ** ;* 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. ** ;* ** ;*******************************)~~xw~~h ;* * * ) 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 ;* * ****************************************************,*************************************** ; ; LPSIO: .IFNZ LPBACK TST LPTTY(R3) ;SEE IF TTY IS TO BE USED BNE LPOB00 ;BRANCH IF YES .ENDC 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 -:~,\,v]ldlef.........kkkT~Xx 7r wkw 7tw  7^w w >ĝ\7Zk70 , Zk"Rkw.& dk@~Д^k@j D A  &DCc  w 2w  w  ' 7  &w \w wXw w  ~Hfw |t w 7 wtwhw  %-E e****************;* 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 ; ; * ********************************************************************;* * * ;* * * LRPC,LPC R JS 0 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) ;STORE1 wh6 ߞ =w F6 / w :( w 2! ~w * w "w * 7 w 7w 77Ҟߞ Jw7  ww (b ww w A ~8 B` r% w| 7twrjwhg E 7pwhP E tP ~Iw -% w  =w 7 =w e0w ,w %@w ~k2~(e=w @w Xwww;* * * 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 ;* * ********************************************************************;* E AG.P C ND.E NEDOE BTOS ISEELT HA WEE SGO4 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 .IFZ 5=w  w  dw *Ae0w v,w nHBFw 6- .~27, ( B:8w ?w 7 w 777     w %0 %7E `  ~1 W ֆ m7 yD|jNr™ `ޚ$,VHʗPڔZ7U<~D 2 7.7(%  w %=w w  w w ww   ~7mN 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 T BG R5 C DE 5 14$1 FZ.I R FEUF B/P LHE TOMFR8 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. ; ; ; THIS SECTION DIVE9w w %/w \ z \pp.  L e  ! ~B ! =L !644 $ .!464 $ % w   @w @ % % -~w  ww  D  &C@AEPA&fw w /w w :w   +~p` E ` H 8 wFLew 7U4E(w T76T 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 FRYNT;E 3 ,R#4 V MO ; 00DALP P JM 2EXND I/P LOR<RTS 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 $114=~  p$ew V׭dU7w @ŝŝwd~`t wt! w w Jw @eZ%ĕt72 $$w Bw .e` w ;w ~؛ĝw wf&f 46 0c.c7$c7$cj~P cw rc5ccgbbbV  <6 !%&\Yp rɋ ZwL   P  $ E`Üˋnhѐ c, !%< Ê NN   x Le)ŸBRCF ~PMSXAI!-FRC>SP@EBOW^,_