-B ; UPDATE CREAD.007 04.12.72 ; 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, ; UPDATE CREAD.005 02.14.72 .TITLE CREAD ;********************************************************************** ;* ** ;* C R E A D ** ;* ** ;* PROGRAM IDENTIFICATION. CARD READER INPUT SUBROUTINE, ** ;* CATALOG NUMBER **  .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. ** ;* ; UPDATE CRTABL.003 01.27.72 ; UPDATE CRTABL.002 01.24.72 ; UPDATE CRTABL.001 01.22.72 .TITLE CRTABL ;********************************************************************** ;* ;* ;* C R E A D C O N V E R S I O N T A B L E S ;* ;* THESE TABLES CONVERT FROM THE DEC CARD READER COMPRESSED MODE ;* TO INTERNAL ASCII OR EBCDIC ;* ;* ;********************************************************************** ; ; .IFG ** ;* CATALOG NUMBER ** ;* ** ;* PURPOSE. THIS GENERAL PURPOSE SUBROUTINE PROVIDES FOR ** ;* CARD READER INPUT. INPUT REQUESTS ARE QUEUED IF THE ** ;* DEVICE IS BUSY. SINCE THE CARD READER IS A SEQUENTIAL ** ;* INPUT DEVICE, ALL REQUESTS ARE QUEUED ON A FIRST-COME ** ;* FIRST-SERVE BASIS. ;* ** ;* 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. ** ;* ** ;* 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 ** ;* NCR .IFNZ BCD .DEF O26ASC O26ASC: ;COMPRESSED 026 TO INTERNAL ASCII .ASCII ' 1234567' ;COMPRESSED CODES 0-7 .ASCII /8 &=':>@/ 10-17 .ASCII '9 ' 20-27 .ASCII ' ' 30-37 .ASCII '0/STUVWX' 40-47 .ASCII 'Y _,(%\"' ; 50-57 .ASCII 'Z ' ; ** ;* ** ;* 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 AVAILABL ** ;* 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. CREAD WILL PROCESS REQUESTS FOR ANY NUMB ** ;* 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 SWITCHES ** ;* THE JSR ADDRESS TO 60-67 .ASCII ' ' ; 70-77 .ASCII '-JKLMNOP' ; 100-107 .ASCII 'Q $*];^' ; 110-117 .ASCII 'R ' ; 120-127 .ASCII ' ' ; 130-137 .ASCII '! ' ; 140-147 .ASCII ' ' ; 150-157 .ASCII ' ' ; 160-167 .ASCII ' ' E TO THE CALLING ** ;* PROGRAM. CREAD WILL PROCESS REQUESTS FOR ANY NUMBER OF ** ;* LIKE CARD READERS, SINCE THE SUBROUTINE IS REENTRANT. ** ;* MOREOVER, IN THE ALPHANUMERIC MODE, INPUT CAN BE SWITCHED ** ;* FROM THE C/R TO THE TTY AND BACK AGAIN. ** ;* ** ;* USAGE. THE ASSEMBLER CODE IS: ** ;* ER 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) ** ;* EMT CREAD 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. ** ;* ; 170-177 .ASCII '+ABCDEFG' ; 200-207 .ASCII 'H .)[<#' ; 210-217 .ASCII 'I ' ; 220-224 .BYTE 011 ;HORIZONTAL TAB 225 .ASCII ' ' ; 226-232 .BYTE 013 ;VERTICAL TAB 233 .BYTE 014 ;FORM FEED 234 .BYTE 015 ;CARRIAGE RETURN 235 .ASCII ' ' ; MOV #LIST,-(SP) ** ;* EMT CREAD ** ;* BNE LIST ERROR ONLY ** ;* THE FORMAT OF THE DATA BUFFER IS: ** ;* WORD 1 NWORD ** ;* 2 NREAD ** ;* 3+ DATA ** ;* WHERE: NWORD > 0 = NUM ** ;* 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) ** ;* < 0 = NUMBER BINARY ** ;* 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 ** ;*  236-237 .ASCII '? ' ; 240-247 .ASCII ' ' ; 250-257 .ASCII ' ' ; 260-267 .ASCII ' ' ; 270-277 .ASCII ' ' ; 300-307 .ASCII ' ' ; 310-317 .ASCII ' ' ; 320-327 .ASCII ' ' ; 330-337 .ASCII ' BER CHARACTERS TO READ (80 CHAR MAX) ** ;* < 0 = NUMBER BINARY WORDS TO READ (60 WDS MAX)** ;* NREAD = NUMBER CHARACTERS/WORDS ACTUALLY READ ** ;* (STORED BY CREAD) ** ;* ** ;* PROGRAMMER: 55 ** ;* DATE: 01.10.72 ** ;* REVISION:  WORDS TO READ (60 WDS MAX)** ;* NREAD = NUMBER CHARACTERS/WORDS ACTUALLY READ ** ;* (STORED BY CREAD) ** ;* ** ;* PROGRAMMER: 55 ** ;* DATE: 01.10.72 ** ;* REVISION: ** ;*  ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;********************************************************************** ; ; .DEF IOQTME,IODQTM .REF QTIME ; ; IOQT ' ; 340-347 .ASCII ' ' ; 350-357 .ASCII ' ' ; 360-367 .ASCII ' ' ; 370-377 .PAGE ;* ;* CONVERSION TABLE FOR COMPRESSED CREAD DATA - ;* ;* E B C D I C T O A S C I I ;* ;* .IFNZ EXEBC ;DON'T ASSEMBLE IF EBCDIC ISN'T REQUIRED .DEF O29ASC ; O29ASC: ; COMP ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;* ** ;* G U L ** ;* 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 M S ** ;* ME: 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(SP) ;RESET TIMER MOV (SP)+,R5 ;RESTORE RESSED OCTAL .ASCII ' 1234567' ; 000-007 .ASCII /8 :#@'="/ ; 010-017 .ASCII '9 ' ; 020-027 .ASCII ' ' ; 030-037 .ASCII '0/STUVWX' ; 040-047 .ASCII 'Y ,% >?' ; 050-057 .ASCII 'Z ' ; 060-067 .ASCII ' ' ; ! F E L E C T R O N I C S S Y S T E M S ** ;* ** ;********************************************************************** ; ; .PAGE ;********************************************************************** ;* ;* C R E A D P A R A M E T E R S ;* .IFG NCR ;DON'T ASSEMBLE THIS ROUTINE IF THERE ;ISN'T AT LEAST ONE C/R IN SYSTEM " ** ;********************************************************************** ; ; .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 TTYSW .DEF CRDON,CDROFF # 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 AND LET IT DO ITS THING $ 070-077 .ASCII '-JKLMNOP' ; 100-107 .ASCII 'Q !$*); ' ; 110-117 .ASCII 'R' ; 120 .BYTE 021,022,023 ;DC1 DC2 DC3 121-123 .BYTE 024,012,026,027 ;DC4 LF SYN ETB 124-127 .BYTE 030,031,032,033 ;CAN EM SS ESC 130-133 .BYTE 034,035,036,037 ;FS GS RS US 134-137 .BYTE 040,% .DEF CREAD,CRINIT .IFNZ 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 & .REF TTYIN .ENDC .REF UNSPND,DQTIME,TTYOUT,QTIME .REF ACTIVE,QSAVEI,DSPTCH,ROSTOP .REF $CTASK,IOQTME,IODQTM,IOSTAT .IFNZ BCD .REF O26ASC .IFNZ INEBC .REF O26EBC .ENDC .IFNZ EXEBC .REF O29ASC .IFNZ INEBC .REF O29EBC .ENDC .ENDC .ENDC .IFNZ OVRLAY .REF RELTSK .ENDC PSR = PS' ;(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) ;STORE ADDRESS OF AN RTS PC CLR (040,163,164 ; (S) (T) 140-143 .BYTE 165,166,167,170 ;(U) (V) (W) (X) 144-147 .BYTE 171,040,040,040 ;(Y) 150-153 .BYTE 040,040,040,040 ; 154-157 .BYTE 172,040,040,040 ;(Z) 160-163 .ASCII ' ' ; 164-167 .ASCII ' ' ; 170-177 .ASCII '&ABCDEFG' ; 200-207 ).ENDC .ENDC .ENDC .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' * ;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 .PAGE ;********************************************************************** ;* ;* C R E A D D A T A T A B L E S ;* ;********************************************************************** ; ; COUNT: 2(SP) ;CLEAR ERROR POINTER FOR CALLER RTS PC ;RETURN .END , .ASCII 'H ' ; 210-211 .BYTE 140 ; CENT 212 .ASCII '.<(+' ; 213-216 .BYTE 174 ;OR 217 .ASCII 'I' ; 220 .BYTE 001,002,003 ;SOH STX ETX 221-223 .BYTE 004,011,006,007 ;EOT HT ACK BEL 224-227 .BYTE 010,005,025,013 ;EOM ENQ NAK VT 230-23-BIT IN PHYSICAL DEV TBL CRDEV = 2 ;PHYSICAL DEVICE TABLE CODE FOR C/R DEVICES .PAGE ;********************************************************************** ;* ;* C R E A D D A T A T A B L E S ;* ;********************************************************************** ; ; COUNT: ;CONTAINS CURRENT BYTE INDEX TO .=.+NCR+NCR ;CALLER'S DATA BUFFER ; ERRCR: ;CONTAINS COUNTER OF N. ;CONTAINS CURRENT BYTE INDEX TO .=.+NCR+NCR ;CALLER'S DATA BUFFER ; ERRCR: ;CONTAINS COUNTER OF NUMBER OF RETRIES .=.+NCR+NCR ;BEFORE ABORTING REQUEST ; MXCNT: ;MAXIMUM NUMBER OF BYTES TO STORE: .=.+NCR+NCR ;2*NWORD FOR BINARY, NWORD FOR ALPHANUM. ; CRFRST: ;CARD READER QUEUE POINTER TO .=.+NCR+NCR ;BEGINNING OF QUEUE ; CRLA/; UPDATE LPRNTR.006 04.12.72 ; UPDATE LPRNTR.005 03.08.72 .TITLE LPRNTR ;********************************************************************** ;* ** ;* L P R N T R ** ;* ** ;* PROGRAM IDENTIFICATION. LPRNTR - LINE PRINTER OUTPUT ** ;* SUBROUTINE. 03 .BYTE 014,015,016,017 ;FF CR SO SI 234-237 .BYTE 040,141,142,143 ; (A) (B) (C) 240-243 .BYTE 144,145,146,147 ;(D) (E) (F) (G) 244-247 .BYTE 150,040,040,040 ;(H) 250-253 .BYTE 040,040,040,040 ; 254-257 .BYTE 151,040,040,040 ;(I) 260-263 .BYTE 040,040,040,040 ; 264-267 .BYTE 040,000,040,040 ; NUL 1UMBER OF RETRIES .=.+NCR+NCR ;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, 2ST: ;POINTER TO END OF QUEUE .=.+NCR+NCR ; ; CRBUSY: .=.+NCR+NCR ;0 = C/R NOT IN USE, 1 = C/R IN USE ; CRDATA: .=.+NCR+NCR ;ADDRESS OF CURRENT DATA BUFFER ; CRTASK: .=.+NCR+NCR ;TASK NO. FOR CURRENT I/O - 0=NON-TASK RQST ; IGNORE: .=.+NCR+NCR ;1 = IGNORE REMAINDER OF CARD BEING READ ; REPEAT: .=.+NCR+NCR ;1 = READ ANOTHER CARD [LAST O3 ** ;* ** ;* PURPOSE. THIS SUBROUTINE PERFORMS THE OUTPUT PROCESSING ** ;* AND CONTROL FUNCTIONS FOR EVERY LINE PRINTER IN THE ** ;* SYSTEM. ALL OUTPUT REQUESTS ARE QUEUED ON A PRIORITY ** ;* BASIS, THEREBY PERMITTING THE LINE PRINTER TO BE USED ** ;* IN REAL-TIME APPLICATIONS FOR PRIORITY ALARM MESSAGES, ** ;* ETC. THE INTERN4 270-273 .BYTE 040,040,040,040 ; 274-277 .BYTE 040,152,153,154 ; (J) (K) (L) 300-303 .BYTE 155,156,157,160 ;(M) (N) (O) (P) 304-307 .BYTE 161,040,040,040 ;(Q) 310-313 .BYTE 040,040,040,040 ; 314-317 .BYTE 162,040,040,040 ;(R) 320-323 .BYTE 040,040,040,040 ; 324-327 .BYTE 040,020,0451 = C/R IN USE ; CRDATA: .=.+NCR+NCR ;ADDRESS OF CURRENT DATA BUFFER ; CRTASK: .=.+NCR+NCR ;TASK NO. FOR CURRENT I/O - 0=NON-TASK RQST ; IGNORE: .=.+NCR+NCR ;1 = IGNORE REMAINDER OF CARD BEING READ ; REPEAT: .=.+NCR+NCR ;1 = READ ANOTHER CARD [LAST ONE WAS CONTROL] ; .IFNZ BCD TABLE: .=.+NCR+NCR ;CONTAINS THE ADDRESS OF THE ALPHANUMERIC 6NE WAS CONTROL] ; .IFNZ BCD TABLE: .=.+NCR+NCR ;CONTAINS THE ADDRESS OF THE ALPHANUMERIC ;CONVERSION TABLE CURRENTLY IN USE .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 7AL MESSAGE FORMAT ACCEPTED BY LPRNTR ** ;* IS EITHER ASCII OR EBCDIC. NON-PRINTABLE CHARACTERS ARE ** ;* CONVERTED TO BLANKS, ALTHOUGH THE CHARACTER IS SYSGENABLE ** ;* TO ANY OTHER PRINTABLE CHARACTER. ALL THREE GENERAL I/O ** ;* EXITS ARE SUPPORTED BY LPRNTR. ** ;* ** ;* USAGE. THE ASSEMBLER LINKAGE TO LPRNTR IS: ** ;* H0,040 ; DLE 330-333 .BYTE 040,040,040,040 ; 334-337 .BYTE 040,134 ; \ 340-341 .ASCII '()[] ' ; 342-347 .ASCII ' ' ; 350-357 .ASCII ' ' 360-367 .ASCII ' ' 370-376 .BYTE 376 ;DEL 377 .ENDE ;CONVERSION TABLE CURRENTLY IN USE .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 FOPTIONS .WORD 0,0,0 .IFG NCR-1 .WORD 1 ;FOR SECOND CARD READER .BYTE 0,120+$RES .WORD 0,2,0 .IFG NCR-2 .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 G ** ;* MOV #LIST,-(SP) ;PUSH LIST ADDRESS ON STACK ** ;* EMT LPRNTR ** ;* ** ;* THE FORTRAN EQUIVALENT CALL IS: ** ;* ** ;* CALL LPRNTR (IADDR(LIST)) ** ;* """"""" """""""""""""""""""""""""""""""""""""""""""""""""""DDDDDDD@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDADD-B CU7vSs(: 4d 'Q+MZT7+Jn^}}PrVCM4d }}^ $DwW]UUݝ8: `Q$ȋ @ B C  ` Y\rX\ t W3=:LsrPSUoU| CyW. yX N`YI 0,2,0 .IFG NCR-2 .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 .WORK 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 .BYTE 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 .ENDN ** ;* THE FORMAT OF THE DATA BUFFER, DATA, IS: ** ;* ** ;* ----------------------------------- ** ;* WORD 1 ! NWORD ! ** ;* ----------------------------------- ** ;* WORD 2 ! RESRVD ! ** LC .PAGE ;* ;* CONVERSION TABLE FOR COMPRESSED CREAD DATA - ;* ;* E B C D I C T O E B C D I C ;* ;* .IFNZ INEBC!EXEBC ;DON'T ASSEMBLE IF EBCDIC ISN'T NEEDED .DEF O29EBC ; O29EBC: ; COMPRESSED OCTAL .BYTE 100,361,362,363 ;SP 1 2 3 000-003 .BYTE 364,365,366,367 ; 4 5 6 7 004-007 .BYTE 370,171,172,173 ; 8 : # MD 1 ;C/R # 2 .BYTE 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 N; UPDATE CREAD.003 01.27.72 ; UPDATE CREAD.002 01.24.72 .TITLE CREAD ;********************************************************************** ;* ** ;* C R E A D ** ;* ** ;* PROGRAM IDENTIFICATION. CARD READER INPUT SUBROUTINE, ** ;* CATALOG NUMBER OC .ENDC ; CRMDAD: .WORD CRMOD,CRMOD+10.,CRMOD+20.,CRMOD+30. .=CRMDAD+NCR+NCR ;TABLE USED TO GET ADDRESS OF TIMER ;MODULE USING 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 MOP 010-013 .BYTE 174,175,176,177 ; @ ' = " 014-017 .BYTE 371,061,062,063 ; 9 020-023 .BYTE 064,065,066,067 ; 024-027 .BYTE 070,071,072,073 ; 030-033 .BYTE 074,075,076,077 ; 034-037 .BYTE 360,141,342,343 ; 0 / S T 040-043 .BYTE 344,345,346,347 ; U V W X 044-047 Q ;MODULE USING 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; CONTAINSR;* ----------------------------------- ** ;* WORD 3 ! CHAR 1 ! CNTRL ! ** ;* ----------------------------------- ** ;* . . ** ;* . . ** ;* . . ** ;* ----------------------------------- SDE TO INDICATE WHICH .=.+NCR+NCR ;SET OF BITS TO USE FROM NEXT COLUMN ; BINARY: ;USED IN BINARY MODE; CONTAINS 4 BITS .=.+NCR+NCR ;CARRIED OVER FROM PREVIOUS COLUMNS ; CRMODE: .=.+NCR+NCR ;1 = CURRENT REQUEST IS IN BINARY .ENDC .PAGE ; ; C / R S T A T U S B I T S ( C R S ) ; CRERR = 100000 ;C/R ERROR DONE = 040000 ;CARD DONE HOPPER = T .BYTE 350,151,340,153 ; Y , 050-053 .BYTE 154,155,156,157 ; % UNDL > ? 054-057 .BYTE 351,041,042,043 ; Z 060-063 .BYTE 044,045,046,047 ; 064-067 .BYTE 050,051,052,053 ; 070-073 .BYTE 054,055,056,057 ; 074-077 .BYTE 140,321,322,323 ; - J K L 100-103 .BYTE 324,U 4 BITS .=.+NCR+NCR ;CARRIED OVER FROM PREVIOUS COLUMNS ; CRMODE: .=.+NCR+NCR ;1 = CURRENT REQUEST IS IN BINARY .ENDC .PAGE ; ; C / R S T A T U S B I T S ( C R S ) ; CRERR = 100000 ;C/R ERROR DONE = 040000 ;CARD DONE HOPPER = 020000 ;INPUT HOPPER EMPTY / OUTPUT HOPPER FULL CHECK = 010000 ;C/R CHECK ERROR TIMING = 004000 ;C/R TIMING V ** ;* WORD X ! CHAR N ! CHAR N-1 ! ** ;* ----------------------------------- ** ;* ** ;* WHERE: ** ;* ** ;* NWORD = NUMBER OF CHARACTERS TO PRINT (INCLUDING THE ** ;* CONTROL CHARACTER, CNTRL), AND W 020000 ;INPUT HOPPER EMPTY / OUTPUT HOPPER FULL CHECK = 010000 ;C/R CHECK ERROR TIMING = 004000 ;C/R TIMING ERROR ONLINE = 002000 ;TRANSITION TO ON-LINE BUSY = 001000 ;HOPPER EMPTY READY = 000400 ;C/R READY COLUMN = 000200 ;COLUMN READY ENABLE = 000100 ;INTERRUPT ENABLE EJECT = 000002 ;SUPPRESS COLUMN READY (EJECT CARD) START = 000001 X325,326,327 ; M N O P 104-107 .BYTE 330,131,132,133 ; Q ! $ 110-113 .BYTE 134,135,136,137 ; * ) ; NOT 114-117 .BYTE 331,021,022,023 ; R DC1 DC2 DC3 120-123 .BYTE 024,025,026,027 ;DC4 LF SYN ETB 124-127 .BYTE 030,031,032,033 ;CAN EM SS ESC 130-133 .BYTE 034,035,036,037 ;FS GS RS US 134-137 .BYTE 320,241,242,243 ; YERROR ONLINE = 002000 ;TRANSITION TO ON-LINE BUSY = 001000 ;HOPPER EMPTY READY = 000400 ;C/R READY COLUMN = 000200 ;COLUMN READY ENABLE = 000100 ;INTERRUPT ENABLE EJECT = 000002 ;SUPPRESS COLUMN READY (EJECT CARD) START = 000001 ;START I/O SWITCH = 6004 ;BINARY CODE FOR SWITCH TO TTY (12-11-7 ) EOD = 6003 ;LOGICAL END-OF-DATA (Z ** ;* NWORD > 0 FOR ASCII STRINGS ** ;* NWORD < 0 FOR EBCDIC STRINGS ** ;* RESRVD = RESERVED FOR SYSTEM USE ** ;* CNTRL = CARRIAGE CONTROL: 0 - NO LINE FEED ** ;* N - SKIP N LINES (N=1,2,3) ** ;* FF- EJECT PAGE ** ;* LF- SKIP 1 L[ ;START I/O SWITCH = 6004 ;BINARY CODE FOR SWITCH TO TTY (12-11-7 ) EOD = 6003 ;LOGICAL END-OF-DATA (12-11-8-9) $029 = 6002 ;029 CARD CODE (12-11-8 ) $026 = 6001 ;026 CARD CODE (12-11-9 ) THREAD = 0. ;* DEVICE = 2. ;* S Y S T E M TYPE = 3. ;* $EXIT = 4. ;* LEVEL = 6. \ (S) (T) 140-143 .BYTE 244,245,246,247 ;(U) (V) (W) (X) 144-147 .BYTE 250,240,252,253 ;(Y) 150-153 .BYTE 254,255,256,257 ; 154-157 .BYTE 251,341,142,143 ;(Z) 160-163 .BYTE 144,145,146,147 ; 164-167 .BYTE 150,040,352,353 ;DS 170-173 .BYTE 354,355,356,357 ; ]12-11-8-9) $029 = 6002 ;029 CARD CODE (12-11-8 ) $026 = 6001 ;026 CARD CODE (12-11-9 ) THREAD = 0. ;* DEVICE = 2. ;* S Y S T E M TYPE = 3. ;* $EXIT = 4. ;* LEVEL = 6. ;* I / O L I S T ERRTSK = 7. ;* ERROR = 8. ;* SYSTEM = 10. ;* E Q U A T ^INE (SAME AS N=1) ** ;* CHAR K = MESSAGE IN ASCII OR EBCDIC ** ;* ** ;* FF, LF AND HT MAY BE IMBEDDED IN THE TEXT FOR MULTIPLE LINES.** ;* TAB (HT) POSITIONS ARE: 1, 9, 17, ..., 8N + 1, ... ** ;* ** ;* PROGRAMMER: 55 ** ;* DATE: 01.17.71 _;* I / O L I S T ERRTSK = 7. ;* ERROR = 8. ;* SYSTEM = 10. ;* E Q U A T E S DATA = 12. ;* ; ; 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 `174-177 .BYTE 120,301,302,303 ; & A B C 200-203 .BYTE 304,305,306,307 ; D E F G 204-207 .BYTE 310,111,112,113 ; H CNT . 210-213 .BYTE 114,115,116,117 ; < ( + OR 214-217 .BYTE 311,001,002,003 ; I SOH STX ETX 220-223 .BYTE 004,005,006,007 ;EOT HT ACK BEL 224-227 .BYTE 010,011,012,013 ;EOM ENQ NAK VT 230-233 .BaE S DATA = 12. ;* ; ; 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 b ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* ** ;********************************************************************** ; .IFG NLP c.=CRADDR+NCR .EVEN ; CRS: .WORD CRS.1 ;ADDRESS OF CARD READER STATUS WORDS .WORD CRS.2 .WORD CRS.3 .WORD CRS.4 .=CRS+NCR+NCR ; CRB1: .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.4dYTE 014,015,016,017 ;FF CR SO SI 234-237 .BYTE 300,201,202,203 ; (A) (B) (C) 240-243 .BYTE 204,205,206,207 ;(D) (E) (F) (G) 244-247 .BYTE 210,200,212,213 ;(H) 250-253 .BYTE 214,215,216,217 ; 254-257 .BYTE 211,101,102,103 ;(I) 260-263 .BYTE 104,105,106,107 ; 264-267 .BYTE 110,000,312,31e .WORD CRS.4 .=CRS+NCR+NCR ; CRB1: .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 f.DEF LPRNTR .DEF LPINIT .REF QSAVEI,SAVE,TTYOUT,DSPTCH .REF QUEUE,IOQTME,IODQTM,IOSTAT .REF ASCLP,ACTIVE,UNSPND,$CTASK .REF PHYDEV,ALTDEV,LOGMAX .DEF LPON,LPOFF .IFNZ INEBC .REF EBCLP .ENDC .IFNZ LPBACK .DEF LPTTY .ENDC .IFNZ OVRLAY .REF RELTSK .ENDC ;* ;* S Y S T E M E Q U A T E P A R A M E T E R S ;* THREAD = g .=CRB2+NCR+NCR ; .IFNZ NCR-1 CRVECT: .WORD CRVC.1 ;INTERRUPT VECTOR ADDRESSES C/R # 1 .WORD CRVC.2 ;C/R # 2 .WORD CRVC.3 ;C/R # 3 .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+Nh3 ; NUL 270-273 .BYTE 314,315,316,317 ; 274-277 .BYTE 152,221,222,223 ;CFX (J) (K) (L) 300-303 .BYTE 224,225,226,227 ;(M) (N) (O) (P) 304-307 .BYTE 230,220,232,233 ;(Q) 310-313 .BYTE 234,235,236,237 ; 314-317 .BYTE 231,121,122,123 ;(R) 320-323 .BYTE 124,125,126,127 ; i;C/R # 2 .WORD CRVC.3 ;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 j 0. ;LIST THREAD DEVICE = 2. ;LIGICAL DEVICE NO TYPE = 3. ;EXIT TYPE $EXIT = 4. ;I/O COMPLETE ADDR ERRTSK = 6. ;ERROR TASK NO. LEVEL = 7. ;I/O PRIORITY ERROR = 8. ;ERROR PARAMETER SYSTEM = 10. ;RESERVED DATA = 12. ;ADDRESS OF DATA PSR = PS ;CPU STATUS REGISTER AVAIL = 100000 kCR+NCR ERMS: .ENDC .WORD 12.,0 .BYTE CR,LF .ASCII 'CR 1 ERROR' .IFG NCR-1 .WORD 12.,0 .BYTE CR,LF .ASCII 'CR 2 ERROR' .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 l 324-327 .BYTE 130,021,332,333 ; DLE 330-333 .BYTE 334,335,336,337 ; 334-337 .BYTE 160,261,262,263 ; \ ( ) 340-343 .BYTE 264,265,266,267 ; [ ] 344-347 .BYTE 270,260,272,273 ; 350-353 .BYTE 274,275,276,277 ; 354-357 .BYTE 271,161,162,163 ; 360-363 m .BYTE CR,LF .ASCII 'CR 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 n;'AVAILABLE' BIT IN PHYSICAL DEVICE TABLE ALT = 040000 ;'ALTERNATE DEVICE' BIT IN PHYSICAL DEVICE TBL LPDEV = 3 ;PHYSICAL DEVICE TABLE CODE FOR L/P DEVI ;* ;* L P R N T R E Q U A T E P A R A M E T E R S ;* ID = 100000 ;INTERRUPT ON L/P DONE IE = 040000 ;INTERRUPT ON PARITY OR PAPER LOW ERRORS SB = 004000 ;SET L/P BUSY (START I/O) DONE = 100000 ;DONE STATUS BIT BUSYo .WORD RAND,RAND+20.,RAND+40.,RAND+60. .=RANDOM+NCR+NCR RAND: .ENDC .WORD 16.,0 .BYTE CR,LF .ASCII 'CR 1 SPUR INT ' .IFG NCR-1 .WORD 16.,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 p .BYTE 164,165,166,167 ; 364-367 .BYTE 170,060,372,373 ; 370-373 .BYTE 374,375,376,377 ; DEL 374-377 .ENDC .PAGE .IFNZ INEBC ;COMPRESSED 026 TO INTERNAL EBCDIC .DEF O26EBC O26EBC: .BYTE 100 ;SPACE .BYTE 361 ;1 .BYTE 362 ;2 .BYTE 363 ;3 .BYTE 36qSPUR INT ' .IFG NCR-1 .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 = 040000 ;BUSY STATUS BIT PARITY = 000030 ;PARITY ERROR STATUS BITS READY = 000004 ;PRINTER READY STATUS BIT ONLINE = 000002 ;PRINTER ON-LINE STATUS BIT PLOW = 000001 ;PAPER LOW STATUS BIT NWORD = 0 ;NO. OF CHARACTERS (1ST WORD OF DATA) RESRVD = 2 ;RESERVED (2ND WORD OF DATA) TEXT = 4 ;BEGINNING OF MESSAGE (3RD WORD OF DATA) HT s .ENDC .ENDC .PAGE ;********************************************************************** ;* ** ;* C R E A D ** ;* ** ;********************************************************************** ; ; CREAD: MOV R1,-(SP) ;SAVE MOV R2,-(SP) ; THE t4 ;4 .BYTE 365 ;5 .BYTE 366 ;6 .BYTE 367 ;7 .BYTE 370 ;8 .BYTE 100 ;NOT USED .BYTE 120 ;& (AMPERSAN) .BYTE 176 ;= (EQUALS) .BYTE 175 ;' (APOSTROPHE) .BYTE 172 ;: (COLON) .BYTE 156 ;> (GREATER THAN) .BYTE 174 ;@ (AT SIGN) .BYTE 37u ** ;* 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 v = 11 ;HORIZONTAL TAB * CARRIAGE LF = 12 ;LINE FEED * FF = 14 ;FORM FEED (PAGE EJECT) * CONTROL CR = 15 ;CARRIAGE RETURN * STAY = 0 ;NO LINE FEED * SKIP1 = 1 ;SKIP ONE LINE * CHARACTERS SKIP2 = 2 ;SKIP TWO LINES * SKIP3 = 3 ;SKIP TWREE LINES * AUwMOV R3,-(SP) ; CALLING MOV R4,-(SP) ; PROGRAM'S MOV R5,-(SP) ; REGISTERS MOV 12.(SP),R1 ;GET I/O LIST ADDRESS, PUT IN R1 MOV 10.(SP),12.(SP) ;PUT PC AT BOTTOM OF STACK FOR EASY EXIT MOV R0,10.(SP) ;THEN SAVE R0. STACK NOW LOOKS LIKE: ; ; PC (BOTTOM) ; R0 x1 ;9 .BYTE 100 ;NOT USED (21) .BYTE 100 ;NOT USED (22) .BYTE 100 ;NOT USED (23) .BYTE 100 ;NOT USED (24) .BYTE 100 ;NOT USED (25) .BYTE 100 ;NOT USED (26) .BYTE 100 ;NOT USED (27) .BYTE 100 ;NOT USED (30) .BYTE 100 ;NOT USED (31) .BYTE 100 ;NOT USED (32) .BYTy MOV 12.(SP),R1 ;GET I/O LIST ADDRESS, PUT IN R1 MOV 10.(SP),12.(SP) ;PUT PC AT BOTTOM OF STACK FOR EASY EXIT MOV R0,10.(SP) ;THEN SAVE R0. STACK NOW LOOKS LIKE: ; ; PC (BOTTOM) ; R0 ; R1 ; R2 ; R3 zTOLF = 1 ;CONTROL FOR AUTO LINE FEED MODE DELAY = 4. INDEX = 6. JSRSUB = 8. MAXCC = 14 ;MAX(HT,LF,FF,STAY,SKIP1,SKIP2,SKIP3) LPBLNK = 240 ;ASCII BLANK CLEAR = 100 .PAGE ;********************************************************************** ;* ** ;* L P R N T R D A T A T A B L E S ** ;* { ; R1 ; R2 ; R3 ; R4 ; 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 |E 100 ;NOT USED (33) .BYTE 100 ;NOT USED (34) .BYTE 100 ;NOT USED (35) .BYTE 100 ;NOT USED (36) .BYTE 100 ;NOT USED (37) .BYTE 360 ;0 .BYTE 141 ;/ (SLASH) .BYTE 342 ;S .BYTE 343 ;T .BYTE 344 ;U .BYTE 345 ;V .BYTE 346 ;W .BYTE 347 } ; R4 ; 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 ~ ** ;* THE FOLLOWING TABLE AND BUFFER DEFINITIONS ASSUME A ** ;* MAXIMUM OF FOUR (4) LINE PRINTERS WILL EVER BE USED. IF ** ;* NLP > 4, THEN SOME CODE WILL HAVE TO BE ADDED. ** ;* ** ;********************************************************************** ; LPBUSY: .=.+NLP+NLP ;1 = L/P CURRENTLY IN USE  DEVICE(R1),R2 ;GET DEVICE NO. CLR R3 ; CRDA00: CMPB R2,CRADDR(R3) ;COMPARE TO VALID DEVICE NUMBERS * BEQ CRDA10 ;BRANCH IF OK * C .IFG NCR-1 TST (R3)+ CMP R3,#NCR+NCR BNE CRDA00 * R .ENDC NO. * ; CRDW01: MOV #1,R4 ;ILLEGAL DEVICE NUMBER ;X .BYTE 350 ;Y .BYTE 100 ;NOT USED (051) .BYTE 100 ;NOT EQUAL (0-2-8 PUNCH) .BYTE 153 ;, (COMMA) .BYTE 115 ;( (LEFT PARENTHESIS) .BYTE 154 ;% (PERCENT) .BYTE 261 ;\ (BACKSLASH) .BYTE 100 ; (SQUARE) .BYTE 351 ;Z .BYTE 100 ;NOT USED (061) .BYTE 100 ;BRANCH IF OK * 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: ; LPDATA: .=.+NLP+NLP ;ADDRESS OF ACTIVE DATA BUFFER ; LPFRST: ; * .=NLP+NLP*NLPRTY+. ;ADDRESS OF FIRST LIST IN THREAD " ; " LPLAST: ; * .=NLP+NLP*NLPRTY+. ;ADDRESS OF LAST LIST IN QUEUE " ; ================================ BR CRDAXX ; CRDW06: MOV (SP)+,@#PSR MOV #6,R4 ;LIST NOT THREADABLE BR CRDAXX ; CRDW09: MOV #9.,R4 ;LIST IS IN ROS ; 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 ;NOT USED (062) .BYTE 100 ;NOT USED (063) .BYTE 100 ;NOT USED (064) .BYTE 100 ;NOT USED (065) .BYTE 100 ;NOT USED (066) .BYTE 100 ;NOT USED (067) .BYTE 100 ;NOT USED (070) .BYTE 100 ;NOT USED (071) .BYTE 100 ;NOT USED (072) .BYTE 100 ;NOT USED (073) .BYTE 100 ;NOT MOV #9.,R4 ;LIST IS IN 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 CALLE ; " ; " ; ====> STORED AS: PRIORITY 1 * ; PRIORITY 2 * ; . * ; . * L/P # 1 ; . * ; PRIORITY NLPRTY * CODE RTS PC ;THEN EXIT BACK TO CALLER ; CRDA10: 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) ;TEST THREAD WORD OF LIST BNE CRDW06 ;AND BRANCH IF NOT ONE (THAT'S A NO-NO) MOV R1,@CRLAST(R3) ;QUEUE THE REQ USED (074) .BYTE 100 ;NOT USED (075) .BYTE 100 ;NOT USED (076) .BYTE 100 ;NOT USED (077) .BYTE 240 ;- (MINUS) .BYTE 321 ;J .BYTE 322 ;K .BYTE 323 ;L .BYTE 324 ;M .BYTE 325 ;N .BYTE 326 ;O .BYTE 327 ;P .BYTE 330 ;Q .BYTE R ; CRDA10: .IFLE NLP ;DON'T ASSEMBLE; NEEDS TO BE CONSIDERED MOV LOGMAX,R4 ; CRDA11: TBIT #AVAIL,PHYDEV(R3) ;SEE IF THIS DEVICE IS AVAILABLE BNE CRDA13 ;BRANCH IF C/R IS AVAILABLE ; CRDA12: TBIT #ALT,PHYDEV(R3) ;OOPS. BETTER SEE IF WE HAVE BEQ CRDW10 ;AN ALTERNATE. BRANCH IF NO DEC R4 BLE CRDW10 ;BRANCH IF NO MORE DEVIC ; . ; . ; . ; REPEAT FOR L/P # 2, ETC. ; ; LPTASK: .=.+NLP+NLP ;THE TASK NO. WHO INITIATED THE CURRENT RQST ; LPIOCM: .=.+NLP+NLP ;I/O COMPLETE ADDRESS OF CURRENT REQUEST ; LPCNT: .=.+NLP+NLP ;IUEST 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 USE WHEN I/O IS COMPLT BR CRDA16 ;BRANCH IF 'TIS ; CRDA15: CLR SYSTEM(R0) ;ZERO MEANS REQUESTOR IS NOT A TASK 100 ;NOT USED (111) .BYTE 100 ;NOT USED (112) .BYTE 133 ;$ (DOLLAR SIGN) .BYTE 134 ;* (ASTERISK) .BYTE 265 ;] (RIGHT BRACKET) .BYTE 136 ;; (SEMI-COLON) .BYTE 152 ;^ (DELTA = 11-7-8) .BYTE 331 ;R .BYTE 100 ;NOT USED (121) .BYTE 100 ;NOT USED (122) .BYTE 100 ;NES MOV ALTDEV(R3),R3 ;GET LOGICAL UNIT NO. OF ALTERNATE ASL R3 ;CONVERT TO WORD INDEX CMPB #CRDEV,PHYDEV(R3) ;SEE IF THE DEVICE IS COMPATIBLE BEQ CRDA11 ;BRANCH IF WE CAN USE IT BR CRDA12 ;OTHERWISE, GO TRY NEXT NEXT ALTERNATE .ENDC ; CRDA13: MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 MOV #340,@#PSR ;SET CPU LEVEL = 7 (11/20) .ENDEX INTO TEXT OF CURRENT REQUEST ; LPMAX: .=.+NLP+NLP ;MAXIMUM VALUE OF LPCNT (= NWORD) ; LPRTRY: .=.+NLP+NLP ;NO. OF ATTEMPTS OF CURRENT REQUEST ; LPRIOR: .=.+NLP+NLP ;PRIORITY INEDX FOR CURRENT REQUEST ; LPMODE: .=.+NLP+NLP ;0 = CARRIAGE CTRL MODE; 1 = AUTO LINE FEED ; LPWORD: .=.+NLP+NLP ;THIS WORD CONTAINS THE LENGTH OF THE ;CURRENT L/P BUF ; 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 SUSPENDED. OTHERWISE, CONTROL ;* IS RETURNED TO THE CALLER. ;* ;********************************************************************** ;* ; CRDB05: OT USED (123) .BYTE 100 ;NOT USED (124) .BYTE 100 ;NOT USED (125) .BYTE 100 ;NOT USED (126) .BYTE 100 ;NOT USED (127) .BYTE 100 ;NOT USED (130) .BYTE 100 ;NOT USED (131) .BYTE 100 ;NOT USED (132) .BYTE 100 ;NOT USED (133) .BYTE 100 ;NOT USED (134) .BYTE 100 ;NOT USED (1NDC .IFNZ $1145 SPL 7 ;SET CPU LEVEL = 7 (11/45) .ENDC DEC (R1) ;TEST THREAD WORD OF LIST BNE CRDW06 ;AND BRANCH IF NOT ONE (THAT'S A NO-NO) 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 FER 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,0 ; FOR .WORD 1,400,TYDONE,0,0,0,0 ; MESSAGES .=NLP*14.+LPLIST ; LPMOD: .WORD 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 ;SET CONDITION CODE ZERO BR CRSAVE ;AND SUSPEND CALLER ; CRDB10: ;WE MUST RETURN TO THE35) .BYTE 100 ;NOT USED (136) .BYTE 100 ;NOT USED (137) .BYTE 132 ;! (EXCLAMATION POINT) .BYTE 100 ;NOT USED (141) .BYTE 100 ;NOT USED (142) .BYTE 100 ;NOT USED (143) .BYTE 100 ;NOT USED (144) .BYTE 100 ;NOT USED (145) .BYTE 100 ;NOT USED (146) .BYTE 100 ;NOT USED (147) INCB IOSTAT(R4) ;INCREMENT THE TASK'S 'I/O IN PROGRESS' FLAG MOV R4,SYSTEM(R1) ;STORE THE TASK NO. FOR USE WHEN I/O IS COMPLT BR CRDA16 ;BRANCH IF 'TIS ; CRDA15: CLR SYSTEM(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 ;************************************************************* 1,$RES*256.+050000,0,0,LPTIME ;TIMER .WORD 1,$RES*256.+050000,0,2,LPTIME ; MODULE .WORD 1,$RES*256.+050000,0,4,LPTIME ; FOR .WORD 1,$RES*256.+050000,0,6,LPTIME ; DELAYS .=NLP*10.+LPMOD ; LPUNIT: .BYTE 3,0,0,0 ;VALID LOGICAL DEVICE ADDRESSES .=LPUNIT+NLP .EVEN .IFG NLP-1 ; LPIOLS: .WORD LPLIST ;ADDRESS OF LINE PRINTER .WORD LPLIST+14. ;TTY MESSAGE I/O 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, SET NO-ERROR CONDITION CODE RTS PC ;AND EXIT ; ; THIS LITTLE SUBROUTINE SUSPENDS THE CALLING TASK. LINKAGE IS ; ; .BYTE 100 ;NOT USED (150) .BYTE 100 ;NOT USED (151) .BYTE 100 ;NOT USED (152) .BYTE 100 ;NOT USED (153) .BYTE 100 ;NOT USED (154) .BYTE 100 ;NOT USED (155) .BYTE 100 ;NOT USED (156) .BYTE 100 ;NOT USED (157) .BYTE 100 ;NOT USED (160) .BYTE 100 ;NOT USED (161) ********* ;* ;* ;* THIS SECTION OF THE CODE PREPARES TO EXIT. IF EXIT TYPE 2 IS ;* REQUESTED, THE CALLING TASK IS SUSPENDED. OTHERWISE, CONTROL ;* IS RETURNED TO THE CALLER. ;* ;********************************************************************** ;* ; CRDB05: MOV (SP)+,@#PSR ;FIRST, RESET THE CPU INTERRUPT LEVEL ; CRDB06: CMPB #2,TYPE(R1) ;THEN SEE IF WE'RE IN A TYPE 2 RETURN BNE CRDB10 ;BRANCH IF NO TST ACTI LISTS .WORD LPLIST+28. ;FOR QUICK ACCESS .WORD LPLIST+42. ; .=LPIOLS+NLP+NLP ; LPMDAD: .WORD LPMOD ;TIMER MODULE ADDRESSES .WORD LPMOD+10. ;FOR QUICK ACCESS .WORD LPMOD+20. ; .WORD LPMOD+30. ; .=LPMDAD+NLP+NLP .ENDC ; ; .IFNZ LPBACK ; LPTTY: .WORD 0 ;SWITCH FOR LINE PRINTER BACKUP BY TTY .WORD 0 ; SEZ SET Z BIT IN CONDITION CODE ; -OR- CLZ IF Z IS TO BE ZERO ; JMP CRSAVE (OR BR, IF CLOSE ENOUGH) ; ; CRSAVE: MOV @#PSR,-(SP) ;SAVE CONDITION CODE MOV 12.(SP),R0 ;RESTORE R0 MOV 14.(SP),12.(SP) ;MOVE OLD PC UP ONE NOTCH IN STACK MOV (SP)+,12.(SP) ;MOVE CC JUST ONE NOTCH BELOW PC MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 ;STACK N.BYTE 100 ;NOT USED (162) .BYTE 100 ;NOT USED (163) .BYTE 100 ;NOT USED (164) .BYTE 100 ;NOT USED (165) .BYTE 100 ;NOT USED (166) .BYTE 100 ;NOT USED (167) .BYTE 100 ;NOT USED (170) .BYTE 100 ;NOT USED (171) .BYTE 100 ;NOT USED (172) .BYTE 100 ;NOT USED (173) .BYTE 10VE ;ELSTWISE, MAKE SURE A TASK IS CALLING BEQ CRDB10 ;BRANCH IF NO - SOMEBODY GOOFED CLZ ;SET CONDITION CODE ZERO BR CRSAVE ;AND SUSPEND CALLER ; CRDB10: ;WE MUST RETURN TO THE CALLER MOV (SP)+,R5 ;FIRST, MOV (SP)+,R4 ; RESTORE MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV .WORD 0 ; 0 = PRINT ON L/P .WORD 0 ; 1 = PRINT ON TTY .=LPTTY+NLP+NLP .ENDC ; LPARTY: .IFG NLP-1 .WORD LPRTY ;ADDRESSES OF DATA BUFFERS FOR .WORD LPRTY+24. ;EACH LINE PRINTER .WORD LPRTY+48. ; .WORD LPRTY+72. .=LPARTY+NLP+NLP LPRTY: .ENDC .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 1 PARITY ERROOW LOOKS LIKE: PSR (CC) MOV (SP)+,R2 ; PC (TASK) MOV (SP)+,R1 ; TOP OF STACK =====> PC (RETURN) CLR -(SP) MOV #DSPTCH,-(SP) ; JMP QSAVEI ;SUSPEND TASK; QSAVEI WILL EXIT TO DSPTCH .PAGE ;********************************************************************** ;* ;* AT THIS POINT, THE CURRENT REQUEST IS THE FIRST REQUEST IN THE ;* QUEUE. IF THE C/R0 ;NOT USED (174) .BYTE 100 ;NOT USED (175) .BYTE 100 ;NOT USED (176) .BYTE 100 ;NOT USED (177) .BYTE 116 ;+ (PLUS) .BYTE 301 ;A .BYTE 302 ;B .BYTE 303 ;C .BYTE 304 ;D .BYTE 305 ;E .BYTE 306 ;F .BYTE 307 ;G .BYTE 310 (SP)+,R1 ; REGISTERS MOV (SP)+,R0 ; CLZ ;THEN, SET NO-ERROR CONDITION CODE RTS PC ;AND EXIT ; ; THIS LITTLE SUBROUTINE SUSPENDS THE CALLING TASK. LINKAGE IS ; ; SEZ SET Z BIT IN CONDITION CODE ; -OR- CLZ IF Z IS TO BE ZERO ; JMP CRSAVE (OR BR, IF CLOSE ENOUGH) ; ; CRSAVE: MOV @#PSR,-(SP) ;SAVE R' .IFG NLP-1 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 2 PARITY ERROR' .IFG NLP-2 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 3 PARITY ERROR' .IFG NLP-3 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 4 PARITY ERROR' .ENDC .ENDC .ENDC ; LPRDY: .IFG NLP-1 .WORD LPRD ;ADDRESSES OF EACH LINE PRINTER DATA BUFFER .WORD 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) MOV R0,CRDATA(R3) ;STORE ADDRESS OF DATA BUFFER .IFNZ BCD TST TABLE(R3) ;IF TABLE IS NON-ZERO, THEN A MODE ;H .BYTE 100 ;NOT USED (211) .BYTE 100 ;NOT USED (212) .BYTE 113 ;. (PERIOD) .BYTE 235 ;) (RIGHT PARENTHESIS) .BYTE 264 ;[ (LEFT BRACKET) .BYTE 114 ;< (LESS THAN) .BYTE 073 ;# (POUND/NUMBER SIGN) .BYTE 311 ;I .BYTE 100 ;NOT USED (221) .BYTE 100 ;NOT USED (222) .BYTCONDITION CODE MOV 12.(SP),R0 ;RESTORE R0 MOV 14.(SP),12.(SP) ;MOVE OLD PC UP ONE NOTCH IN STACK MOV (SP)+,12.(SP) ;MOVE CC JUST ONE NOTCH BELOW PC MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 ;STACK NOW LOOKS LIKE: PSR (CC) MOV (SP)+,R2 ; PC (TASK) MOV (SP)+,R1 ; TOP OF STACK =====> PC (RETURN) CLR -(SP) MOV LPRD+22. .WORD LPRD+44. .WORD LPRD+66. .=LPRDY+NLP+NLP LPRD: .ENDC .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 1 NOT READY' .EVEN .IFG NLP-1 .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 2 NOT READY' .EVEN .IFG NLP-2 .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 3 NOT READY' .EVEN .IFG NLP-3 .WORD 17.,0 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 ;OTHERWISE, START UP C/R MOV CRFRST(R3),R1 ;RESTORE LIST ADDRESS BR CRDB06 ; CRDC10: MOV #ERMSGE,-(SP) E 100 ;NOT USED (223) .BYTE 100 ;NOT USED (224) .BYTE 005 ; HORIZONTAL TAB .BYTE 100 ;NOT USED (226) .BYTE 100 ;NOT USED (227) .BYTE 100 ;NOT USED (230) .BYTE 100 ;NOT USED (231) .BYTE 100 ;NOT USED (232) .BYTE 013 ;VERTICAL TAB .BYTE 014 ;FORM FEED .BYTE 015 #DSPTCH,-(SP) ; JMP QSAVEI ;SUSPEND TASK; QSAVEI WILL EXIT TO DSPTCH .PAGE ;********************************************************************** ;* ;* AT THIS POINT, THE CURRENT REQUEST IS THE FIRST REQUEST IN THE ;* QUEUE. IF THE C/R IS READY, THEN I/O WILL BE INITIATED. ;* OTHERWISE, OPERATOR ACTION WILL BE REQUIRED. CRDC00 IS ;* ENTERED WITH INTERRUPTS MASKED. ;* ;* ;***************************************************************** .BYTE CR,LF .ASCII 'L/P 4 NOT READY' .EVEN .ENDC .ENDC .ENDC ; LPXXXX: .IFG NLP-1 .WORD LPXX .WORD LPXX ;ADDRESSES OF LINE PRINTER ABORT .WORD LPXX+20. ;MESSAGE DATA BUFFERS .WORD LPXX+40. ; .WORD LPXX+60. ; .=LPXXXX+NLP+NLP LPXX: .ENDC .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 1 ABORTED' ;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 CRMDAD(R3),R5 ;GET TIMER MODULE ADDRESS FOR NCR > 1 .ENDC ; . MOV #CRDLAY,8.(R5) ;STORE ADDRESS OF CRDLAY IN ;CARRIAGE RETURN .BYTE 100 ;NOT USED (236) .BYTE 100 ;NOT USED (237) .BYTE 157 ;? (QUESTION MARK) .BYTE 100 ;NOT USED (241) .WORD 040100 ; (242-243) .WORD 040100 ; (244-245) .WORD 040100 ; (246-247) .WORD 040100 ; (250-251) .WORD 040100 ; (252-253) .WORD 040100 ; ***** ; ; CRDC00: INC CRBUSY(R3) MOV (SP)+,@#PSR ;RESTORE PREVIOUS PSR (ENABLE INTERRUPTS) MOV R0,CRDATA(R3) ;STORE ADDRESS OF DATA BUFFER .IFNZ BCD TST TABLE(R3) ;IF TABLE IS NON-ZERO, THEN A MODE BNE CRDC05 ;HAS ALREADY BEEN DEFINED TSTB LEVEL(R1) ;SEE IF CALLER WANTS ASCII OR EBCDIC BNE CRDC04 MOV #O26ASC,TABLE(R3) ;ASSUME 026 TO ASCII CONVERSION .EVEN .IFG NLP-1 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 2 ABORTED' .EVEN .IFG NLP-2 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 3 ABORTED' .EVEN .IFG NLP-3 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 4 ABORTED' .EVEN .ENDC .ENDC .ENDC ; LPBUFR: .WORD LPBUF ;ADDRESSES OF L/P PRINT BUFFERS 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 ;********************************************************************** ;* ** ;* C R I N T ** ;* (254-255) .WORD 040100 ; (256-257) .WORD 040100 ; (260-261) .WORD 040100 ; (262-263) .WORD 040100 ; (264-265) .WORD 040100 ; (266-267) .WORD 040100 ; (270-271) .WORD 040100 ; (272-273) .WORD 040100 ; (274-275) .WORD 040100 ; (276-277) .WORD 040100 ; (300-301) BR CRDC05 ; CRDC04: MOV #O26EBC,TABLE(R3) ; CRDC05: .ENDC JSR PC,CRSIO ;OTHERWISE, START UP C/R MOV CRFRST(R3),R1 ;RESTORE LIST ADDRESS BR CRDB06 ; CRDC10: MOV #ERMSGE,-(SP) ;PUT ADDRESS OF ERROR MESSAGE ON STACK JSR PC,CRMSGE ;PRINT MESSAGE MOV #MXTIME,COUNT(R3) ;SET UP FOR MAXIMUM TIME DELAY .IFZ NCR-1 ; . MOV #C .WORD LPBUF+LPSIZE .WORD LPBUF+LPSIZE+LPSIZE .WORD LPBUF+LPSIZE+LPSIZE+LPSIZE .WORD LPBUF+LPSIZE+LPSIZE+LPSIZE+LPSIZE .=LPBUFR+NLP+NLP+2 .PAGE .IFG NLP-1 ; LPSTS: .WORD STAT.1 ;ADDRESS OF L/P STATUS REGISTERS - L/P # 1 .WORD STAT.2 ;L/P # 2 .WORD STAT.3 ;L/P # 3 .WORD STAT.4 ;L/P # 4 .=LPSTS+NLP+NLP ; LPCMD: .WORD CMD.1 ** ;* CARD READER INTERRUPT ROUTINE. THIS ROUTINE GETS ENTERED ** ;* FOR THE FOLLOWING REASONS: ** ;* ** ;* 1. CARD DONE INTERRUPT ** ;* 2. COLUMN READY INTERRUPT ** ;* 3. CARD READER ERROR ** ;* 4. TRANSITION TO ON-LINE .WORD 040100 ; (302-303) .WORD 040100 ; (304-305) .WORD 040100 ; (306-307) .WORD 040100 ; (310-311) .WORD 040100 ; (312-313) .WORD 040100 ; (314-315) .WORD 040100 ; (316-317) .WORD 040100 ; (320-321) .WORD 040100 ; (322-323) .WORD 040100 ; (324-325) RMOD,R5 ;GET TIMER MODULE ADDRESS FOR NCR = 1 .ENDC ; .IFG NCR-1 MOV CRMDAD(R3),R5 ;GET TIMER MODULE ADDRESS FOR NCR > 1 .ENDC ; . MOV #CRDLAY,8.(R5) ;STORE ADDRESS OF CRDLAY IN TIMER MODULE MOV R5,-(SP) ;ADDRESS OF TIMER MODULE ONTO STACK MOV #$1SEC,-(SP) ;REQUEST 1 SECOND DELAY JSR PC,IOQTME TST (SP)+ BR CRDB05 ;ADDRESS OF L/P COMMAND REGISTER - L/P # 1 .WORD CMD.2 ;L/P # 2 .WORD CMD.3 ;L/P # 3 .WORD CMD.4 ;L/P # 4 .=LPCMD+NLP+NLP ; LPWDCT: .WORD CNT.1 ;ADDRESS OF L/P WORD COUNT REGISTER - L/P # 1 .WORD CNT.2 ;L/P # 2 .WORD CNT.3 ;L/P # 3 .WORD CNT.4 ;L/P # 4 .=LPWDCT+NLP+NLP ; LPFEED: .WORD LFRG.1 ;ADDRESS OF L/P  ** ;* 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 INTERRUPT, AND TAKE CARE OF IT. ** ;* ** ;*************************************.WORD 040100 ; (326-327) .WORD 040100 ; (330-331) .WORD 040100 ; (332-333) .WORD 040100 ; (334-335) .WORD 040100 ; (336-337) .WORD 040100 ; (340-341) .WORD 040100 ; (342-343) .WORD 040100 ; (344-345) .WORD 040100 ; (346-347) .WORD 040100 ; (350-351) .WORD 04 .PAGE ;********************************************************************** ;* ** ;* C R I N T ** ;* ** ;* CARD READER INTERRUPT ROUTINE. THIS ROUTINE GETS ENTERED ** ;* FOR THE FOLLOWING REASONS: ** ;* LINE FEED REGISTER / L/P # 1 .WORD LFRG.2 ;L/P # 2 .WORD LFRG.3 ;L/P # 3 .WORD LFRG.4 L/P # 4 .=LPFEED+NLP+NLP ; LPADDR: .WORD LPDT.1 ;ADDRESS OF L/P MEMORY ADDR REGISTER - L/P # 1 .WORD LPDT.2 ;L/P # 2 .WORD LPDT.3 ;L/P # 3 .WORD LPDT.4 ;L/P # 4 .=LPADDR+NLP+NLP ; LPVECT: .WORD LPVC.1 ;L/P # 1 INTERRUPT VECTOR ADDRESS .(b; hbhb; hbh, 12345678 &=':>@9 0/ST,$UVWXY _,(%\"Z -JKLMNOP,HQ $*];^R ! ,0100 ; (352-353) .WORD 040100 ; (354-355) .WORD 040100 ; (356-357) .WORD 040100 ; (360-361) .WORD 040100 ; (362-363) .WORD 040100 ; (364-365) .WORD 040100 ; (366-367) .WORD 040100 ; (370-371) .WORD 040100 ; (372-373) .WORD 040100 ; (374-375) .WORD 040100 ** ;* 1. CARD DONE INTERRUPT ** ;* 2. COLUMN READY INTERRUPT ** ;* 3. CARD READER ERROR ** ;* 4. TRANSITION TO ON-LINE ** ;* 5. A BERSERK CARD READER DOING THINGS IT SHOULDN'T ** ;* OUGHTA DO. ** ;* .WORD LPVC.2 ;L/P # 2 INTERRUPT VECTOR ADDRESS .WORD LPVC.3 ;L/P # 3 INTERRUPT VECTOR ADDRESS .WORD LPVC.4 ;L/P # 4 INTERRUPT VECTOR ADDRESS .=LPVECT+NLP+NLP .ENDC .PAGE ;********************************************************************** ;* ** ;* S T A R T O F L P R N T R ** ;* l +ABCDEFGH .)[<#D,I ? , , x, 12345678 :#@'="9 4, 0/STUVWXY ,% >?Z -JKL,DMNOPQ !$*); R  stuvwx=,hy z &ABCDEFGH `.,<(+|I   abcdefgh H,i ; (376-377) .ENDC .ENDC .ENDC .END ** ;* OUR MISSION, SHOULD WE DECIDE TO ACCEPT IT, IS TO DETERMINE ** ;* WHAT CAUSED THE INTERRUPT, AND TAKE CARE OF IT. ** ;* ** ;********************************************************************** ; CRINT1: $SAVE ;LET ROS SAVE THE WORLD .IFZ NCR-1 CLR R3 .ENDC .IFG NCR-1 ;...FOR C/R # 1 ** ;* ** LPRNTR: MOV R0,-(SP) ;GUESS MOV R1,-(SP) ; WHAT MOV R2,-(SP) ; WE'RE MOV R3,-(SP) ; DOING MOV R4,-(SP) ; HERE MOV R5,-(SP) ; MOV 14.(SP),R0 ;GET ADDRESS OF LIST MOV DATA(R0),R1 ;GET ADDRESS OF jklmnopq r ,  \()[] , @yz{|}~123456789:;f,<=>?aiklmno!"#$%&'()*+,-./},@`YZ[\]^_С,dbcdefgh P,IJKLMNO ,ABCDEFGHj+,QRSTUVWXpqrsG,tuvwx0@@P~}zn|; UPDATE TESTER.002 02.21.72 ; 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: MOV #0,R3 ; BR CRIA00 ; CRINT2: $SAVE ;......FOR C/R # 2 MOV #2,R3 ; .ENDC .IFG NCR-2 BR CRIA00 ; CRINT3: $SAVE ;.........FOR C/R # 3 MOV #4,R3 .ENDC .IFG NCR-3 BR CRIA00 ; CRINT4: $SAVE CRIA00 ;............FOR C/R # 4 MOV #6,R3 .ENDC ; CRIA00: DATA JSR PC,LPCHEK ;GO CHECK SOME OF THE INFO BNE LPRA10 ;OOPS, SOMETHING HAPPENED. GO TELL CALLER CLR R3 ;CHECK L/P DEVICE ADDRESS .IFZ NLP-1 CMPB DEVICE(R0),LPUNIT ;FOR ONE L/P BEQ LPRA20 .ENDC .IFG NLP-1 LPRA00: CMPB DEVICE(R0),LPUNIT(R3) ;FOR MORE THAN ONE L/P BEQ LPRA20 INC R3 CMP R3,#NLP BLT LPRA00@@@@@@@,@@@@@@@@a@@kMl@@@@@@@@@@@@,<@@@@@@[\^j@@@@@@@@@@@@@@@,`Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Nÿ,@@KL;@@@@@@@@@ @@o@@@@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .WORD 1,CHECKO,0,500. .BYTE 40.,3 .WORD 0,0,30.*256.,0 .=.+80. ; ; GARY: MOV #100,@#177564 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 #80.,BUFFER MOV #LIST1,-(SP) TST CRBUSY(R3) ;SEE IF CREAD EXPECTED AN INTERRUPT BNE CRIB00 ; MOV #RANDOM,-(SP) JSR PC,CRMSGE ;PRINT 'CR K SPUR INT ' JMP (R5) ;EXIT TO RESTOR TO CLEAR INTERRUPT ; ; NOW FIGURE OUT WHY WE GOT AN INTERRUPT ; CRIB00: TST IGNORE(R3) ;SEE IF THIS INTERRUPT SHOULD BE IGNORED BEQ CRIB10 ;BRANCH IF NO .IFZ NCR-1 ;OTHERWISE, SEE IF END OF CARD H .ENDC MOV #3,R4 ;AT THIS POINT, THE L/P # IS NOT LEGAL ; LPRA10: MOV R4,ERROR(R0) ;THIS IS AN ERROR EXIT - THE REQUEST JSR PC,LPQERR ;GO QUEUE THE ERROR (IF THERE IS ONE) ; LPRA15: MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; THE MOV (SP)+,R3 ; YOU-KNOW-WHATS MOV (SP)+,R2 ; . MOV (SP)+,R1 ; .  JSR PC,CREAD CMP LIST1+10,#7 BEQ STOP MOV #LIST2,-(SP) MOV BUFFER+2,BUFFER ;GET ACTUAL WORD COUNT MOV #BUFFER+82.,R0 MOV #80.,R1 ; LOOP: MOVB (R0)+,(R0) SUB #2,R0 DEC R1 BGT LOOP MOVB CNTRL,BUFFER+4 JSR PC,LPRNTR MOV #1,CNTRL BR CHECKO ; STOP: CLR LIST1+10 CLRB IOSTAT+30. MOAS BIT #DONE,@#CRS.1 ;COME AND GONE .ENDC ; .IFG NCR-1 ; BIT #DONE,@CRS(R3) .ENDC BNE CRCLOS ;BRANCH TO CLOSE OUT THIS REQUEST JMP (R5) ; CRIB10: .IFZ NCR-1 ;GET MOV @#CRS.1,R0 ; THE TST ERRCR ; CURRENT .ENDC ; STATUS .IFG NCR-1 ; OF THE MOV (SP)+,R0 ; . MOV (SP)+,(SP) ;PUT PC ON TOP OF OLD LIST ADDRESS RTS PC ;AND GO, GO, GO - HOME, HOME, HOME ; ; LPRA20: .IFG NLP-1 ;R3 NOW CONTAINS THE L/P INDEX (0,1,...) ASL R3 ;CONVERT IT TO A WORD INDEX (0,2,...) .ENDC MOVB LEVEL(R0),R2 ;NOW, TEST THE PRIORITY LEVEL BLE LPRA30 ;BRANCH IF ILLEGAL CMP R2,#NLPR.*.*uDZH:d~.*)~*~+8~+ .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 ** ;* PARITY ASCII. MOV @CRS(R3),R0 ; CARD READER TST ERRCR(R3) ; AND TEST FOR A .ENDC ; PREVIOUS ERROR ; CRIB12: BEQ CRIB20 ;BRANCH IF NO PREVIOUS ERROR JMP (R5) ;OTHERWISE, EXIT TO RESTOR ; CRIB15: JMP CRID00 ;THIS IS HERE 'CAUSE A BRANCH WON'T REACH ; CRIB20: BIT #COLUMN,R0 ;TEST FOR COLUMN READY BNE TY 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 ;NWORD CAN'T BE <= 0 .ENDC .IFNZ INEBC .=.-2 ;IF EBCDIC IF USED, ONLY 0~,G~,~,W~v- ** ;* 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. ** ;* ** ;*********************************CRIB15 ;BRANCH IF A COLUMN OF DATA IS READY BIT #DONE,R0 ;TEST FOR CARD DONE BNE CRIC00 ;BRANCH IF END OF CARD BIT #ONLINE,R0 ;TEST FOR TRANSITION TO ON-LINE BNE 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 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 .IFLE NLP ;THIS LOGIC NEEDS TO BE CONSIDERED MOV LOGMAX,R4 ; LPRA51: TBIT #AVAIL,PHYDEV(R3) ;SEE IF THIS DEVICE IS AVAILABLE BNE LPRA53 ;BRANCH IF IT IS ; LPRA52: TBIT ~-f~f.~.u************************************* .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 014,215,216,017 ; 014-017 .BYTE NON,NON,NON,NO CRMDAD(R3),R0 ;GET ADDRESS OF C/R TIMER .ENDC MOV #CRTIME,8.(R0) ;SET TIMEOUT ADDRESS TO CRDERR MOV R0,-(SP) MOV #$500MS,-(SP) ;SET UP 500 MS DELAY JSR PC,IOQTME ;START TIMER TST (SP)+ .IFZ NCR-1 ;SUPPRESS FURTHER INTERRUPTS FROM C/R BIC #ENABLE,@#CRS.1 ; . .ENDC ; . .IFG NCR-1 ; . #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 ;BRANCH IF WE CAN USE IT. BR LPRA52 ;OTH~V/~/~F0 ~0N ; 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 .BYTE 060,261,262,063 ; 0 1 2 BIC #ENABLE,@CRS(R3); . .ENDC ; . JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ;* ;* AT THIS POINT, ONE FULL CARD HAS BEEN READ. IF THE 'READ ANOTHER ;* CARD' FLAG (REPEAT) HAS BEEN SET, THEN ANOTHER REQUEST WILL BE ;* INITIATED IMMEDIATELY. THIS USUALLY HAPPENS WHEN A CONTROL CARD ;* HAS BEEN READ. ;* ;* CRIC00: ERWISE, GO TRY NEXT ALTERNATE .ENDC ; LPRA53: MOV @#PSR,-(SP) ;PRIORITY QUEUE. INHIBIT INTERRUPTS. .IFZ $1145 MOV #340,@#PSR .ENDC .IFNZ $1145 SPL 7 .ENDC DEC (R0) ;SEE IF LIST IS THREADABLE BNE LPRA80 ;BRANCH IF NO, CAUSE THAT'S A NO-NO MOV R0,@LPLAST(R2) ;QUEUE IT - MOV R0,LPLAST(R2) ;QUEUE IT ! MOV AC~61~1~&2)~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 120,321,322,123 ; P Q R S 120-1CLR IGNORE(R3) TST REPEAT(R3) ;SHOULD WE READ ANOTHER CARD? BEQ CRCLOS ;BRANCH IF IT ISN'T ; CRIC10: MOV CRFRST(R3),R1 ;GET I/O LIST ADDRESS JSR PC,CRSIO ;OTHERWISE, START THE I/O CLR REPEAT(R3) ; CARD' FLAG JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ;* ;* THIS SECTION CLOSES OUT A REATIVE,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)+,@#PSR ;ELSTWISE, CLEAR THE INHIBIT ; ~38~3~4G~~423 .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 154-157 E E .BYTE 120,321,D REQUEST AND, IF NECESSARY, ;* UNSUSPENDS THE CALLER OR JSR'S TO THE I/O COMPLETE ROUTINE ;* ;* ;********************************************************************** ; ; CRCLOS: MOV @#PSR,-(SP) ;SAVE CURRENT PRIORITY LEVEL .IFZ NCR-1 ;CODE FOR ONLY ONE C/R MOV CRFRST,R0 ;GET LIST ADDRESS =====>R0 MOV CRDATA,R1 ;GET DATA ADDRESS =====>R1 MOV COUNT,NREAD(R1) .IFNZ BIN .IFNZ BCD ; 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, HE IS A TASK, PUT PSR ON STACK MO~4W~n5~5f~^6322,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 NON,NON,NON,NON ; 000-003 .BYTE NON,NON,NON,NON ; 004-007 .BYTE NON,NON,NON,NON ; 010-013 .BYTE NON,NON,NON,NON ; TST CRMODE ;IF IT'S BINARY DATA WE READ .IFZ $RASM BEQ CRCA05 .ENDC .IFNZ $RASM BEQ CRCA01 .ENDC .ENDC ASR NREAD(R1) ;THEN CONVERT NO. BYTES TO NO. WORDS .IFNZ BCD .IFNZ $RASM BR CRCA05 ; CRCA01: CMP (R1),#82. ;IF USER WANTED 82 CHARACTERS, STORE BNE CRCA05 ;THE LAST TWO AS CR, LF MOV #LF*V (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; ALL MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV (SP)+,R1 ; REGISTERS MOV (SP)+,R0 ; CLR -(SP) ;SET INVOLUNTARY SUSPEND FLAG JSR PC,QSAVEI ;AND LET QSAVEI SUSPEND 'IM JMP DSPTCH ;THEN GO TO THE SYSTEM DISPATCHER ; LPRA70: MOV R4,ERROR(R0) ;STORE ERROR CODE ~6u~N7~7 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 NON,NON,NON,NON ; 054256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 MOV #340,@#PSR ;INHIBIT INTERRUPTS .ENDC ; . .IFNZ $1145 ; . SPL 7 ; . .ENDC ; . MOV (R0),R2 ;DEQUEUE THE REQUEST MOV R2,CRFRST ;SAVE ADDRESS OF NEXT LIST BNE CRCA20 ;BRANCH IF QUEUE ISN'T EMPTY BR LPRA15 ;AND GO WHERE THE REGISTER CAN BE RESTORED ; LPRA80: INC (R0) ;LIST IS NOT THREADABLE MOV (SP)+,@#PSR MOV #1,R4 BR LPRA10 .PAGE ;********************************************************************** ;* ** ;* AT THIS POINT, THE REQUEST JUST QUEUED IS THE ONLY ** ;* REQUEST IN THE QUEUE, SO WE GONNA STAR~>8 ~8~.9~9-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,NON ; < ( + 114-117 ; CRCA10: MOV #CRFRST,CRLAST ;CLEAN UP QUEUE ; CRCA20: MOV (SP)+,@#PSR ;RESTORE ORIGINAL CPU LEVEL MOV CRTASK,R4 ;SET R4 = TASK NO. OF CALLER (0=NO TASK) .ENDC ; ;********** .IFG NCR-1 ;CODE FOR MORE THAN ONE C/R MOV CRFRST(R3),R0 ;GET LIST ADDRESS =====>R0 MOV CRDATA(R3),R1 ;GET DATA ADDRESS =====>R1 MOV COUNT(R3),NREAD(R1) ;STORE NO. CHARACTERS READ .IFNT THE OUTPUT. ** ;* INTERRUPTS ARE INHIBITED ON ENTRY, AND THE REGISTERS ** ;* ARE SET AS FOLLOWS: ** ;* ** ;* R0 = ADDR(LIST) ** ;* R1 = ADDR(DATA) ** ;* R2 = PRIORITY INDEX ** ;* R3 = L/P INDEX ~:)~:~;8~;.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 ; % > ? 154-157 .BYTE NON,NOZ BIN .IFNZ BCD TST CRMODE(R3) ;SEE WHICH MODE WE'RE IN .IFZ $RASM BEQ CRCA05 ;BRANCH IF ALPHANUMERIC AND NO ASSEMBLER .ENDC .IFNZ $RASM ;.....OR..... BEQ CRCA01 ;BRANCH IF ALPHANUMERIC AND AN ASSEMBLER .ENDC ;IS IN THE SYSTEM .ENDC ASR NREAD(R1) ;CONVERT BYTES TO WORDS .IFNZ BCD .IFNZ $RASM BR ** ;* ** ;********************************************************************** ; ; 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) CLR LPCNT(R3) ;CLE~;H~v<~<W~f=N,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 ; 214-217 * L .B CRCA05 ; CRCA01: CMP (R1),#82. ;IF USER WANTED 82 CHARACTERS, STORE BNE CRCA05 ;THE LAST TWO AS , MOV #LF*256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 MOV #340,@#PSR ;INHIBIT INTERRUPTS .ENDC ; . .IFNZ $1145 ; . SPL 7 ; . .ENDC ; . AR THE BUFFER INDEX POINTER MOV R2,LPRIOR(R3) ;SAVE PRIORITY INDEX MOV NWORD(R1),LPMAX(R3) ;SAVE MAX NO CHARACTERS .IFNZ INEBC ;'IF EBCDIC CONVERSION' BGT LPRB10 ;BRANCH IF ASCII NEG LPMAX(R3) ;OTHERWISE, FORCE POSITIVE LPRB10: .ENDC CLR LPRTRY(R3) ;SET NO. ATTEMPTS TO ZERO ; LPRB20: JSR PC,LPRSET ;RESET THE LINE PRINTER MO~=f~V>~>u~F?YTE 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 250-253 * .BYTE NON, MOV (R0),R2 ;SAVE ADDRESS OF NEXT LIST MOV R2,CRFRST(R3) ;DEQUEUE THIS REQUEST BNE CRCA20 ;BRANCH IF SOMEONE'S LEFT IN QUEUE ; CRCA10: MOV RO,R4 ;SO, CLEAN IT UP. ADD #CRFRST,R4 MOV R4,CRLAST(R3) ; CRCA20: 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) ; V #ASCLP,R2 ;GET ADDRESS OF ASCII TO EVEN-PARITY-ASCII .IFNZ INEBC TST NWORD(R1) BGE LPRB30 MOV #EBCLP,R2 ;LOAD EBCDIC TO EVEN-PARITY-ASCII TABLE ADDR ; LPRB30: .ENDC JSR PC,LPCNVT ;CALL LPCNVT TO CONVERT THE USER'S ;FIRST LINE OF TEXT. JSR PC,LPSIO ;OTHERWISE, START I/O CLR R4 BR LPRA60 ;THEN GO SET UP FOR EXIT ~?~6@ ~@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 310-313 * .BYTE  MOV #1,(R0) CMPB #2,TYPE(R0) BEQ CRCA40 ;BRANCH IF EXIT 2 BGT CRCB00 ;BRANCH IF WE DON'T CARE (EXIT 1) CMPB #3,TYPE(R0) ;OTHERWISE, IT'S EXIT 3 - BUT BNE CRCB00 ;MAKE SURE ANYWAY MOV R0,R1 ;GET I/O COMPLETE SUBROUTINE ADDRESS MOV $EXIT(R1),R0 ;PUT IN R0 CMP R0,#ROSTOP ;CHECK FOR VALIDITY BLOS CRCB00 CMP R0,#HICO .PAGE ;********************************************************************** ;* ** ;* L P I N T ** ;* ** ;* LINE PRINTER INTERRUPT ROUTINE, ENTERED WHEN THE PRINTER ** ;* IS READY TO ACCEPT ANOTHER LINE OR IF AN ERROR WAS ** ;* DETECTED. ~&A~A~B)~BNON,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 344-347 * .BYTE 131,132,RE BHIS CRCB00 MOV R2,-(SP) MOV R3,-(SP) ;ADDRESS LOOKS GOOD, SO SAVE THE MOV R4,-(SP) ;VOLATILE REGISTERS MOV R5,-(SP) JSR PC,(R0) ;AND LINK TO THE I/O COMPLETE ROUTINE MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 BR CRCB00 ;THEN BRANCH TO COMMON CODE ; CRCA40: TST R4  ** ;* ** ;********************************************************************** ; LPINT0: $SAVE ;CALL SAVE TO TAKE CARE OF THINGS .IFZ NLP-1 CLR R3 .ENDC .IFGE NLP-2 MOV #0,R3 ;SET L/P INDEX TO ZERO (FIRST L/P) BR LPIA00 ; LPINT2: $SAVE ;CALL SAVE TO TAKE CARE OF THINGS ~C8~~C~CH~nDNON,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 ;EXIT TYPE 2 - NEED TO UNSUSPEND TASK BLE CRCB00 ;BUT FIRST, IS IT A TASK? BRANCH IF NO MOV R4,-(SP) ;OK - LET'S UNSUSPEND THE TASK CLR -(SP) JSR PC,UNSPND TST (SP)+ ;IGNORE ERRORS ; ; BEFORE WE EXIT, WE NEED TO SEE IF THERE ARE ANY OTHER REQUESTS ; QUEUED FOR THIS CARD READER. ; CRCB00: TST R4 BEQ CRCB05 ;BRANCH IF REQUESTOR WASN'T A TASK DECB IOST  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 #LPINH*32.,@#PSR ;INHIBIT INTER ~DW~^E~Ef~NF ********************************* ; CRINT1: $SAVE ;LET ROS SAVE THE WORLD .IFZ NCR-1 CLR R3 .ENDC .IFG NCR-1 ;...FOR C/R # 1 MOV #0,R3 ; BR CRIA00 ; CRINT2: $SAVE ;......FOR C/R # 2 MOV #2,R3 ; .ENDC .IFG NCR-2 BR CRIA00 ; CRINT3: $SAVE ;.........FOR C/R # AT(R4) ;OTHERWISE, DECREMENT HIS I/O IN PROGRESS .IFNZ OVRLAY ;COUNTER, AND..... BNE CRCB05 ;IF HE IS IN AN OVERLAY SYSTEM, AND..... MOV R4,-(SP) ;HIS COUNTER WENT TO ZERO (NO MORE I/O GOING), JSR PC,RELTSK ;THEN LET THE OVERLAY MONITOR RELEASE HIS CORE .ENDC ;(IF IT IS READY TO BE RELEASED, THAT IS) ; CRCB05: TST R2 BNE CRCB10 ;BRANCH IF SOMEBODY IS WAIRUPTS 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 .IFNZ INEBC TST (R1) ~Fu~>G~G~.H3 MOV #4,R3 .ENDC .IFG NCR-3 BR CRIA00 ; CRINT4: $SAVE CRIA00 ;............FOR C/R # 4 MOV #6,R3 .ENDC ; CRIA00: TST CRBUSY(R3) ;SEE IF CREAD EXPECTED AN INTERRUPT BNE CRIB00 ; MOV #RANDOM,-(SP) JSR PC,CRMSGE ;PRINT 'CR K SPUR INT ' JMP (R5) ;EXIT TO RESTOR TO CLEAR INTERRUPT ; ; NOW FIGURE OUT WHYTING .IFZ NCR-1 ;OTHERWISE, SHUT OFF C/R INTERRUPT BIC #ENABLE!START,@#CRS.1 .ENDC .IFG NCR-1 BIC #ENABLE!START,@CRS(R3) .ENDC CLR CRBUSY(R3) MOV CRMDAD(R3),-(SP) JSR PC,IODQTM ;DEQUEUE TIMER TST (SP)+ JMP (R5) ;AND EXIT TO RESTOR ; ; ; CRCB10: MOV R2,R1 ;BEFORE WE START ANYTHING, MAKE SURE CRCB15: MOV DATA ;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 ;(DON'T WANT TO LEAVE ANYTHING HAN ~H~I~I WE GOT AN INTERRUPT ; CRIB00: TST IGNORE(R3) ;SEE IF THIS INTERRUPT SHOULD BE IGNORED BEQ CRIB10 ;BRANCH IF NO .IFZ NCR-1 ;OTHERWISE, SEE IF END OF CARD HAS BIT #DONE,@#CRS.1 ;COME AND GONE .ENDC ; .IFG NCR-1 ; BIT #DONE,@CRS(R3) .ENDC BNE CRCLOS ;BRANCH TO CLOSE OUT THIS REQUEST JMP (R5) ; CRIB10: .IFZ(R1),R0 ;THE LIST IS STILL VALID, ETC. JSR PC,CRCHEK BNE CRCB20 ;BRANCH IF NO GOOD MOV R0,CRDATA(R3) JSR PC,CRSIO ;OTHERWISE, START I/O JMP (R5) ; ; CRCB20: MOV R4,ERROR(R0) ;STORE ERROR CODE IN USER'S LIST BR CRCLOS ;AND GO TELL HIM ABOUT IT .PAGE ;********************************************************************** ;* ;* THIS SECTION OF CODE IS EXECUTEDGING) JSR PC,LPSIO ;START 'ER UP AGAIN BOYS, WE GOT A NEW CUSTOMER JMP (R5) ;THEN GET OUT OF HERE (GO TO RESTOR) ; LPIA10: MOV @#PSR,-(SP) ;SAVE CURRENT CPU STATUS LEVEL MOV LPRIOR(R3),R2 ;GET PRIORITY INDEX .IFZ $1145 ;NO DATA LEFT IN USER'S BUFFER MOV #340,@#PSR ;SO, INHIBIT INTERRUPTS SO'S WE CAN .ENDC ;DEQUEUE THE REQUEST .IFNZ $1145 ~J)~J~J9~vK 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 .ENDC ; PREVIOUS ERROR ; CRIB12: BEQ CRIB20 ;BRANCH IF NO PREVIOUS ERROR JMP  WHEN A COLUMN OF DATA IS READY. ;* THE INPUT MODE (BINARY OR ALPHANUMERIC) IS DETERMINED, AND THE ;* DATA ARE PROCESSED ACCORDINGLY ;* ;********************************************************************** ; CRID00: .IFNZ BIN .IFNZ BCD TST CRMODE(R3) ;SEE IF WE'RE IN THE BINARY MODE BEQ CRIE00 ;BRANCH IF ALPHANUMERIC .ENDC .ENDC TST MXCNT(R3) ;SEE IF THERE'S ANYMORE INFORMATION  SPL 7 .ENDC MOV (R0),LPFRST(R2) ;PUT NEXT GUY IN THREAD AT TOP OF QUEUE BNE LPIA20 ;BRANCH IF THERE'S MORE IN QUEUE MOV R2,R4 ;OTHERWISE, PLACE THIS PRIORITY'S ADD #LPFRST,R4 ;QUEUE IN THE NOMINAL STATE (NO ENTRIES) MOV R4,LPLAST(R2) ; LPIA20: MOV #1,(R0) ;SET LIST REASY MOV (SP)+,@#PSR ;UN-INHIBIT THE INTERRUPTS MOV LPTASK(R3),R4 ;GET TASK ~KH~fL~LW~VM (R5) ;OTHERWISE, EXIT TO RESTOR ; CRIB15: JMP CRID00 ;THIS IS HERE 'CAUSE A BRANCH WON'T REACH ; CRIB20: BIT #COLUMN,R0 ;TEST FOR COLUMN READY BNE CRIB15 ;BRANCH IF A COLUMN OF DATA IS READY BIT #DONE,R0 ;TEST FOR CARD DONE BNE CRIC00 ;BRANCH IF END OF CARD BIT #ONLINE,R0 ;TEST FOR TRANSITION TO ON-LINE BNE CRIB12 ; MOV R0,ERR BLE CRID30 ;THAT WE WANT ON CARD - BRANCH IF NO ;* ;* USE BYTE TO TELL US HOW AND WHERE TO USE THE 12 BITS IN CRB1 ;* AS FOLLOWS. ASSUME FORMAT OF CRB1 IS 00 X1 X2 X3, WHERE ;* XX = 4 BITS EACH. ;* ;* 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 00NO. OF REQUESTOR BEQ LPIA25 ;BRANCH IF NOT A TASK DECB IOSTAT(R4) ;OTHERWISE, DECREMENT HIS I/O IN PROGRESS .IFNZ OVRLAY ;STATUS BYTE BNE LPIA25 ;AND, IF IT BECOMES ZERO, THEN..... MOV R4,-(SP) ;GO THO THE OVERLAY MONITOR SO THE TASK'S JSR PC,RELTSK ;CORE CAN BE RELEASED .ENDC ; LPIA25: CMPB TYPE(R0),#2 ;WAS IT AN EXIT 2 REQUEST? BGT LPIA40~Mf~FN~Nu~6O CR(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 MOV R0,-(SP) MOV #$500MS,-(SP) ;SET UP 500 MS DELAY JSR PC,IOQTME ;START TIMER TST (SP)+ .I! 00 ;* 3 00 X1 X2 X3 ----------- ;* ;* .IFNZ BIN MOV CRDATA(R3),R1 ;GET ADDRESS OF DATA BUFFER ADD #4,R1 ADD COUNT(R3),R1 ;ADD INDEX 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 " ;BRANCH IF EXIT 3 BLT LPIB00 ;BRANCH IF EXIT 1 MOV LPTASK(R3),-(SP);OK - IT'S EXIT 2 BEQ LPIA30 CLR -(SP) JSR PC,UNSPND ;SO, UNSUSPEND IT ; LPIA30: TST (SP)+ ;POP OFF ERROR BR LPIB00 ; LPIA40: MOV R5,-(SP) ;THE TIME HAS COME TO JSR TO THE MOV R3,-(SP) ;I/O COMPLETE SUBROUTINE JSR PC,@LPIOCM(R3) MOV (SP)#~O~&P ~P~Q$FZ NCR-1 ;SUPPRESS FURTHER INTERRUPTS FROM C/R BIC #ENABLE,@#CRS.1 ; . .ENDC ; . .IFG NCR-1 ; . BIC #ENABLE,@CRS(R3); . .ENDC ; . JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ;* ;* AT THIS POINT, ONE FULL CARD HAS BE%;SHIFT ASL R4 ; DATA ASL R4 ; INTO ASL R4 ; 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 &+,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) * BEQ LP'~Q~R)~~R(EN READ. IF THE 'READ ANOTHER ;* CARD' FLAG (REPEAT) HAS BEEN SET, THEN ANOTHER REQUEST WILL BE ;* INITIATED IMMEDIATELY. THIS USUALLY HAPPENS WHEN A CONTROL CARD ;* HAS BEEN READ. ;* ;* CRIC00: CLR IGNORE(R3) TST REPEAT(R3) ;SHOULD WE READ ANOTHER CARD? BEQ CRCLOS ;BRANCH IF IT ISN'T ; CRIC10: MOV CRFRST(R3),R1 ;GET I/O LIST ADDRESS JSR PC,CRSIO ;OTHERWISE, START THE I/O CLR REPE) ; .IFNZ BIN ; CRID40: MOV @CRB1(R3),R4 ;GET CURRENT COLUMN OF DATA CLR R0 BISB R4,R0 ;SET R4 = BITS 0-7 OF CRB1 DATA SWAB R4 BISB R4,(R1) ;STORE BITS 8-11 OF CRB1 IN DATA BUFFER ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 ;BRANCH IF NO MORE CARD DATA IS REQUIRED MOVB R0,3(R1) *ID00 ;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 * ; * LPIB10: +~R9~nS~SH~^T,AT(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 ;* ;* ;********************************************************************** ; ; CRCLOS: MOV @#PSR,-(SP) ;SAVE CURRENT PRIORITY LEVEL .IFZ NCR-1 - ;STORE 8 BITS OF BINARY DATA IN TOP BYTE BR CRID20 ;OF DATA BUFFER ; CRID50: MOV @CRB1(R3),R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; INTO ASL R4 ; BIT ASL R4 ; POSITIONS ASL R4 ; 4-15 SO WE .ENDC ; CAN GET THE .IFNZ $1145 ; . ; * 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 FOR ANOTHER * .ENDC /~TW~NU~Uf~>V0 ;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 .IFNZ $RASM BEQ CRCA01 .ENDC .ENDC ASR NREAD(R1) ;THEN CONVERT NO. BYTES TO NO. WORDS .I1 MOST SIGNIFICANT ASH R4,4 ; 8 BITS OF CRB1 .ENDC ; DATA CLR R0 BISB R4,R0 ;SET R4 = BITS 0-3 OF CRB1 DATA SWAB R4 MOVB R4,(R1) ;STORE BINARY DATA AS 00 00 X1 X2 ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 SWAB R0 MOV 2 * .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 LPFRST(R2),R0 ;DATA I/O LIST ADDRESS 3~Vu~.W~W~X4FNZ BCD .IFNZ $RASM BR CRCA05 ; CRCA01: CMP (R1),#82. ;IF USER WANTED 82 CHARACTERS, STORE BNE CRCA05 ;THE LAST TWO AS CR, LF MOV #LF*256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 MOV #340,@#PSR ;INHIBIT INTERRUPTS .ENDC ; . .IFNZ $1145 ; . SPL 7 ; . 5 R0,2(R1) ;STORE BINARY DATA IN NEXT WORD OF BR CRID20 ;BUFFER AS X3 00 00 00 ; CRID60: BIS @CRB1(R3),(R1) ;PUT CURRENT BINARY DATA IN BUFFER ADD #2,COUNT(R3) ;AS 00 X1 X2 X3 CLR BYTE(R3) DEC MXCNT(R3) JMP (R5) ;EXIT TO RESTOR .ENDC .PAGE ;********************************************************************** ;* ;* ;* A L P H A N U M E R I C M O D E ;*6 MOV DATA(R0),R1 ;AND DATA BUFFER ADDRESS JSR PC,LPCHEK ;DOUBLE CHECK VALUES BEQ LPIC00 ;BRANCH IF ALL'S WELL MOV #10.,ERROR(R0) ;TSK, TSK. SOMEBODY DID SOMETHING BR LPIA10 ;WHILE IT WAS IN QUEUE ; ; ; REQUEST IS OK, BEGIN PREPARATIONS FOR MESSAGE OUTPUT ; ; LPIC00: MOV R1,LPDATA(R3) ;SAVE VOLATILE STUFF: DATA ADDRESS MOV $EXIT(R0),LPIOCM(R3) ; 7 ~X~Y~Y~Y8 .ENDC ; . MOV (R0),R2 ;DEQUEUE THE REQUEST MOV R2,CRFRST ;SAVE ADDRESS OF NEXT LIST BNE CRCA20 ;BRANCH IF QUEUE ISN'T EMPTY ; CRCA10: MOV #CRFRST,CRLAST ;CLEAN UP QUEUE ; CRCA20: MOV (SP)+,@#PSR ;RESTORE ORIGINAL CPU LEVEL MOV CRTASK,R4 ;SET R4 = TASK NO. OF CALLER (0=NO TASK) .ENDC ; ;********** .IFG NCR-1 ;CODE FO9 ;* THIS SECTION CONVERTS THE CURRENT COLUMN CHARACTER TO THE ;* SPECIFIED FORMAT AND STORES IT IN THE DATA BUFFER. IT ALSO ;* CHECKS COLUMN 1 OF EACH CARD FOR CONTROL INFORMATION (FORMAT ;* OF CARDS, ETC.). ;* .IFNZ BCD ; CRIE00: INC COUNT(R3) ;INCREMENT CHARACTER (COLUMN) COUNT CMP COUNT(R3),#1 ;IS THIS THE FIRST COLUMN? BNE CRIE15 ;BRANCH IF NO MOV @CRB1(R3),R4 ;OTHERWISE, GET BINARY C: I/O COMPLETE MOV R2,LPRIOR(R3) ; PRIORITY INDEX MOV SYSTEM(R0),LPTASK(R3) ;STORE THE TASK NUMBER OF CLR LPCNT(R3) ;THE REQUESTING PROGRAM MOV #ASCLP,R2 ; MOV (R1),LPMAX(R3) ; NWORD .IFNZ INEBC BGE LPIC10 MOV #EBCLP,R2 NEG LPMAX(R3) ;SET LPMAX = ABS(NWORD) ; ;@@.*- z.XpFBuo~vZ6kwhw 6k8w6h2w0ȥĥ % % v6 &x1x npw_]~ZtR e W #      wR$Q_:[D[R[`[n[prt W~f[ CR 1 ERROR CR 1 SPUR INT f&f  6 @ HB \[ 1<R MORE THAN ONE C/R MOV CRFRST(R3),R0 ;GET LIST ADDRESS =====>R0 MOV CRDATA(R3),R1 ;GET DATA ADDRESS =====>R1 MOV COUNT(R3),NREAD(R1) ;STORE NO. CHARACTERS READ .IFNZ BIN .IFNZ BCD TST CRMODE(R3) ;SEE WHICH MODE WE'RE IN .IFZ $RASM BEQ CRCA05 ;BRANCH IF ALPHANUMERIC AND NO ASSEMBLER .ENDC .IFNZ $RASM ;.....OR..... BEQ CRCA01 ;BRA=ARD IMAGE .IFNZ TTYSW CMP R4,#SWITCH ;SEE IF COMMAND IS TO SWITCH TO TTY BNE CRIE10 INC CRBKUP(R3) ;SET FLAG TO SWITCH TO TTY BACKUP BR CRIF10 ;THEN GO SET 'READ ANOTHER CARD' FLAG .ENDC ; CRIE10: CMP R4,#$026 ;026 CONTROL COMMAND? BEQ CRIF00 ;BRANCH IF YES .IFNZ EXEBC CMP R4,#$029 ;029 CONTROL COMMAND? BEQ CRIF30 >LPIC10: .ENDC CLR LPRTRY(R3) ;CLEAR # ATTEMPTS COUNTER JSR PC,LPCNVT ;SET UP BUFFER, CONVERT TO L/P ASCII JSR PC,LPRSET ;RESET THE L/P JSR PC,LPSIO ;START THE L/P I/O JMP (R5) ;THEN RETURN TO RESTOR, WHO'LL CLEAR THE INT. ; ; ; NO REQUESTS ARE LEFT IN THE LINE PRINTER'S QUEUE. ; LPID00: JSR PC,LPRSET ;RESET THE LINE PRINTER CLR LPBUSY(R3) ;CLE?~[ {*[s*[ ,*[([&    & tw3.[~V\b6[e6[_Bbd[ 6"[:[_f< 4  ,[t[ M 2[_~bp.p dMw5B~\5@53$[:[N_& E@pM3 2[ 4[([ 3 4[M .[ Z[ ([:~F]@  &f  && J! EAp3 @NCH IF ALPHANUMERIC AND AN ASSEMBLER .ENDC ;IS IN THE SYSTEM .ENDC ASR NREAD(R1) ;CONVERT BYTES TO WORDS .IFNZ BCD .IFNZ $RASM BR CRCA05 ; CRCA01: CMP (R1),#82. ;IF USER WANTED 82 CHARACTERS, STORE BNE CRCA05 ;THE LAST TWO AS , MOV #LF*256.+CR,80.(R1) .ENDC ; CRCA05: .ENDC .ENDC .IFZ $1145 A ;BRANCH IF 029 .ENDC CMP R4,#EOD ;LOGICAL END-OF-DATA? BEQ CRIE20 ;BRANCH IF EOD ; CRIE15: ; TST MXCNT(R3) ;WELL THEN, IT MUST BE AN ORDINARY CHARACTER BLE CRID30 ;BRANCH IF WE DON'T NEED ANY MORE CHARACTERS MOV @CRB2(R3),R2 ;GET COMPRESSED VERSION OF CHARACTER ADD TABLE(R3),R2 ;ADD IN BASE TABLE ADDRESS MOV CRDATA(R3),R1 ;GET DATA BAR 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 ;********************************************************************** ;* ** ;* THIS SECTION GETS ENTERED FROM THE INTERRUC,[R[ R M@ :3.[ ~]*M0_Nb.[el"[V[  -`[  V[M`[ e"[ &[1`[ e"[U~6^ &[1^`[e"[3 V[ &[M "[,"[`[!  8[*! ! +!  &[b[l6[.[el"[ &[([9~^ 2[M([b6[ 4[e6[([c6[d6[ %(W %B %%% ~&_  `   C^[U3$[d[ D 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 CRCA20 ;BRANCH IF SOMEONE'S LEFT IN QUEUE ; CRCA10: MOV RO,R4 ;SO, CLEAN IT UP. ADD #CRFRST,R4 EBUFFER ADDRESS ADD #4,R1 ADD COUNT(R3),R1 ;ADD CHARACTER INDEX MOVB (R2),-(R1) ;MOVE CONVERTED CHARACTER TO CALLER'S BUFFER DEC MXCNT(R3) BR CRID30 ; CRIE20: 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 ADDREFPT 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. ** ;* WARNING CONDITIONS CAUSE LPRNTR TOGH"[_; ^[f< F _e5^[  "[([v~_wlwX_bD[ 5 f _b_b1 3 "[3 2[s 0[3 V[ 8[.[   sZ[3 ~`$[,[:[f N_ &[A^[ Z[D["b`p &  _.[  ([w3 ~`8[ 4[wb&a(0x~ax- `w HMOV 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 ;BRANCH IF WE DON'T CARE (EXIT 1) CMPB #3,TYPE(R0) ;OTHERWISE, IT'S EXIT 3 - BUT BNE CRCB00 ;MAKE SURE ANYISS UP. ; CRIF00: .IFNZ INEBC MOV CRFRST(R3),R0 ;GET I/O LIST ADDRESS TSTB LEVEL(R0) ;TEST LEVEL TO DETERMINE MODE BNE CRIF20 ;1 = EBCDIC .ENDC MOV #O26ASC,TABLE(R3) ;0 = ASCII ; CRIF10: INC REPEAT(R3) ;SET 'READ ANOTHER CARD FLAG' BR CRID30 ; CRIF20: .IFNZ INEBC MOV #O26EBC,TABLE(R3) ;SET FOR 026 TO EBCDIC CONVERSION J WAIT A PRESCRIBED ** ;* PERIOD OF TIME, AFTER WHICH THE REQUEST IS ALSO ABORTED. ** ;* HOWEVER, IF IT BECOMES READY DURING THIS PERIOD, THEN I/O ** ;* WILL CONTINUE. ** ;* ** ;********************************************************************** ; ; LPIE00: BGT LPIE20 ;BRANCH IF ERROR IS NOT FATAL INC LPRTRY(R3)KTa Z x_`b6 vTa z_nb" RpabaP~~a~a _([_n\ Z[ &[_]_X^HpaVa_:a3~nbPpaߕVa_&a5@pM_]f__ba \7 j([f 12345678 &=':>@9 ~b0/STLWAY MOV R0,R1 ;GET I/O COMPLETE SUBROUTINE ADDRESS MOV $EXIT(R1),R0 ;PUT IN R0 CMP R0,#ROSTOP ;CHECK FOR VALIDITY BLOS CRCB00 CMP R0,#HICORE BHIS CRCB00 MOV R2,-(SP) MOV R3,-(SP) ;ADDRESS LOOKS GOOD, SO SAVE THE MOV R4,-(SP) ;VOLATILE REGISTERS MOV R5,-(SP) JSR PC,(R0) ;AND LINK TO THE I/O COMPLETE ROUTINE MOV M BR CRIF10 .ENDC ; ; 029 CONTROL CARD. SET FOR PROPER CONVERSION ; .IFNZ EXEBC CRIF30: MOV CRFRST(R3),R0 ;GET I/O LIST ADDRESS .IFNZ INEBC TSTB LEVEL(R0) ;TEST FOR INTERNAL FORMAT TYPE BNE CRIF40 ;BRANCH IF EBCDIC .ENDC MOV #O29ASC,TABLE(R3) ;OTHERWISE, SET FOR 029-ASCII BR CRIF10 .IFNZ INEBC ; CRIF40: MOV #O29EBC,TABLE(R3) N ;INCREMENT ERROR COUTNER CMP #LPERR,LPRTRY(R3) ;WE CAN ONLY HACK LPERR ERRORS BLE LPIE10 ;BRANCH IF WE MUST GIVE UP LPIE05: JSR PC,LPCLR ;CLEAR THE ERROR JSR PC,LPRSET ;AND RESET THE L/P JSR PC,LPSIO ;START THE I/O AGAIN JMP (R5) ;EXIT TO RESTOR ; LPIE10: MOV #LPARTY,-(SP) JSR PC,LPMSGE ;PRINT 'L/P K PARITY ERROR' MOV OUVWXY _,(%\"Z -JKLMNOPQ $*];^R ! +ABCDEFGH .)[<#I ~^c ? 12345678 :#@'="~c9 0/STUVWXY ,% >?Z -JKLMNOPQ !$*); R  stuvwxy z &ABCDEFG~NdH `.<(+|I   abcdefgh i jklmnopq r  \()[] P(SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 BR CRCB00 ;THEN BRANCH TO COMMON CODE ; CRCA40: TST R4 ;EXIT TYPE 2 - NEED TO UNSUSPEND TASK BLE CRCB00 ;BUT FIRST, IS IT A TASK? BRANCH IF NO MOV R4,-(SP) ;OK - LET'S UNSUSPEND THE TASK CLR -(SP) JSR PC,UNSPND TST (SP)+ ;IGNORE ERRORS ; ; BQ ;029-EBCDIC BR CRIF10 .ENDC .ENDC .ENDC .PAGE ;********************************************************************** ;* ** ;* C R C H E K ** ;* ** ;* THIS SUBROUTINE CHECKS THOSE PARTS OF THE LIST AND DATA ** ;* BUFFER WHICH ARE COMMON TOR #6,ERROR(R1) ;TELL CALLER WHAT HAPPENED JMP LPIA10 ;GO TRY NEXT QUEUED REQUEST ; ; ; LINE PRINTER ERROR IS NOT PERMANENT. PRINT AN OPERATOR NOTIFICATION ; MESSAGE, THEN SET UP ONE SECOND DELAY. ; ; LPIE20: MOV #LPRDY,-(SP) JSR PC,LPMSGE ;PRINT 'L/P K NOT READY' JSR PC,LPRSET ;SET UP MAXIMUM TIME WE'LL WAIT CLR LPRTRY(R3) .IFZ NLP-1 MOV #LPMOD,R4 ;GET TIMER MODULS d~d@yz{|}~123456789:;<=>?aiklmno!"#$%&'()*+,-./`YZ[\]^_СbcdefgB~>eh PIJKLMNO ABCDEFGHjQRSTUVWXp~eqrstuvwx0CE!^[__n|@@@@@@@@@@@@@@@a@@kMl@@@@@@@@@@@@@@@@@@[\^j@@@@@@@@@@@@@@@Z@@@@@@@~.f@@@@@@@@@@@@@@@@@@@@@@@@N@@KL;@@@@@@@@@ @@o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TEFORE WE EXIT, WE NEED TO SEE IF THERE ARE ANY OTHER REQUESTS ; QUEUED FOR THIS CARD READER. ; CRCB00: TST R4 BEQ CRCB05 ;BRANCH IF REQUESTOR WASN'T A TASK DECB IOSTAT(R4) ;OTHERWISE, DECREMENT HIS I/O IN PROGRESS .IFNZ OVRLAY ;COUNTER, AND..... BNE CRCB05 ;IF HE IS IN AN OVERLAY SYSTEM, AND..... MOV R4,-(SP) ;HIS COUNTER WENT TO ZERO (NO MORE I/O GOING), JSR PC,RELTSK U BOTH THE ORIGINAL CHECK (WHEN ** ;* QUEUEING) AND THE RECHECK (PRIOR TO INITIATING I/O). ** ;* ANYTHING THAT COULD CAUSE CREAD TO HONK UP THE REAL-TIME ;* SYSTEM. LINKAGE IS: ** ;* ** ;* R1 = ADDR(LIST) ** ;* R0 = ADDR(DATA) ** ;* R3 = C/R INDEX VE 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 ;*********************************************************************W@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% f6 wt"ef6 ptrv~g4g@gLgXgdgpg3|go3|go0}g6n0}g6n3~go3~goW~gggggggggw x  b g.w ^&& &&  ,~h  {xw "җ& w<g5ggX ;THEN LET THE OVERLAY MONITOR RELEASE HIS CORE .ENDC ;(IF IT IS READY TO BE RELEASED, THAT IS) ; CRCB05: TST R2 BNE CRCB10 ;BRANCH IF SOMEBODY IS WAITING .IFZ NCR-1 ;OTHERWISE, SHUT OFF C/R INTERRUPT BIC #ENABLE!START,@#CRS.1 .ENDC .IFG NCR-1 BIC #ENABLE!START,@CRS(R3) .ENDC CLR CRBUSY(R3) MOV CRMDAD(R3),-(SP) JSR Y ** ;* JSR PC,CRCHEK ** ;* BNE ERROR ;R4 = ERROR CODE ** ;* ** ;* ALL REGISTERS USED BY CRCHEK ARE SAVED AND RESTORED. ** ;* ** ;********************************************************************** ; ; CRCHEK: 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 AND ABORTS THE REQUEST. [ˀg 2w  "  Vgg5gg1gQ~hw  g  gw~4gHe  |gg gg g ggP gggP W gw VE~hE gD,ggDg |4i1gw*PidjtjjjjjjjjjkkkgWgH@g  -m=l~vig h g gaf,g P = g=g && &  g z &  &  w PO~i w R {x  \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 MOV R0,CRDATA(R3) JSR PC,CRSIO ;OTHERWISE, START I/O JMP (R5) ; ; CRCB20: MOV R4,ERROR(R0) ;STO]CLR R4 CMP #ROSTOP,R1 ;TEST FOR LEGAL I/O LIST ADDRESS BHIS CRDW19 ;BRANCH IF ILLEGAL CMP R1,#HICORE BHIS CRDW19 ;BRANCH IF ADDRESS IS BEYOND CORE 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 ^ ** ;* ** ;* ON ENTRY, R1 CONTAINS THE TIMER MODULE ADDRESS. LPTIME IS ** ;* ENTERED BY A JSR PC,LPTIME ** ;* ** ;********************************************************************** ; ; LPTIME: MOV INDEX(R1),R3 ;GET L/P INDEX FROM MODULE ARGUMENT MOV R1,-(SP) ;REORGAN_j1g g %ggΕg5g 1g%g5g 4w 1gg^~fjgf,g x g1g ggg gg1gUggg^gg}ggggR~j g g1gwj g1g g g g1g@gwrgw&ggw”EE D(g@g d~Vk f,g  Dg+ŀ| n *-el.gBE,I  5@ =gC(g~k5`RE ERROR CODE IN USER'S LIST BR CRCLOS ;AND GO TELL HIM ABOUT IT .PAGE ;********************************************************************** ;* ;* THIS SECTION OF CODE IS EXECUTED WHEN A COLUMN OF DATA IS READY. ;* THE INPUT MODE (BINARY OR ALPHANUMERIC) IS DETERMINED, AND THE ;* DATA ARE PROCESSED ACCORDINGLY ;* ;********************************************************************** ; CRID00: .IFNZ BIN .IFNZ BCD TSaIF EXITS 1 OR 2 CMP #ROSTOP,$EXIT(R1) ;CHECK I/O COMPLETE ADDRESS BHIS CRDW03 ;BRANCH IF ADDRESS IS IN ROS CMP #HICORE,$EXIT(R1) ;OR OUTSIDE AVAILABLE CORE ; 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 bIZE REGISTERS THE WAY WE LIKE'EM MOV LPDATA(R3),R1 ; R1 = ADDR(DATA) MOV LPRIOR(R3),R2 ; R2 = PRIORITY INDEX MOV LPFRST(R2),R0 ; R0 = ADDR(LIST) ; R3 = L/P INDEX ; R4 = TIMER MUDULE ADDRESS JSR PC,LPSTAT ;GET L/P STATUS BNE LPTA00 ;BRANCH IF STILL NOT READY TST (SP)+ MOV (SP)+,R5 ;OTHERWISE, SET UP TIMER Rc@@w ĕ g^gg2    ށ g gĕ\ggĒ1g  1gĕ\gg|~Flgf,g   g=g gf(g | ĕ=gg : 6n8w 5 W<0Z450Z<A0Zp ,~l( &0   0 {xC `0  5@0ZA:Z ~6m> <g4g& & ngg4geg4gf `D` ggCD0g1gdT 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 CRB1 ;* AS FOLLOWS. ASSUME FORMAT OF CRB1 IS 00 X1 X2 X3, WHERE ;* XX = 4 BITS EACH. ;* ;* BYTE CRB1 IN CURRENT WORD e BEQ CRDW05 ;BRANCH IF ZERO 'CAUSE IT'S NO GOOD BGT CRDA30 NEG R2 ;SET IT +++++ (PLUS, THAT IT) ASL R2 ;BINARY MODE NWORD = WORDS, NEED BYTES ; CRDA30: ADD R0,R2 ;TEST VALIDITY OF DATA BUFFER ADDRESS CMP R2,#HICORE ;WHEN ADDED TO NWORD BHIS CRDW05 ;BRANCH IF WE WENT OUT OF CORE ; CRKX00: TST R4 RTS PC ; CRDW05: INC fETURN 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 TST (SP)+ ;POP OFF ERROR FLAG gg1g@~mg 4   g=gf,g@g  J@g 3 1g1ggDgA5@ = gf(gg g~&ngf0gw Ý?g Ag7/g~g@g@g7  5@0Zs:Z 50Zl50Zh5\~n 0ZU0Z=g= g0Zp w` B eg @egeg :J   g!gggg~ogg E gggg̐ Ng3g3g }gf,g  3h CRB1 IN NEXT WORD ;* ;* 0 X1 X2 X3 00 ----------- ;* 1 00 00 00 X1 X2 X3 00 00 ;* 2 00 00 X1 X2 X3 00 00 00 ;* 3 00 X1 X2 X3 ----------- ;* ;* .IFNZ BIN MOV CRDATA(R3),R1 ;GET ADDRESS OF DATA BUFFER ADD #4,R1 ADD COUNT(R3),R1 ;ADD INDEX INTO BUFFER MOV BYTE(R3),R2 BEQ i R4 CRDW04: INC R4 CRDW03: INC R4 CRDW02: INC R4 INC R4 BR CRKX00 CRDW19: MOV #9.,R4 BR CRKX00 .PAGE ;********************************************************************** ;* ** ;* C R T I M E ** ;* ** j 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 ;********************************************************************** ;* kgw gg -g ~ow E = gg7@g^ggw 6.f& g &6  (~p6p pz|~|}|nZgVhpt6tuu(v&f&M & & X wq~~p ENrDSrQU~prXXrTMsDTsREqEX6rq  rl CRID10 DEC R2 BEQ CRID40 DEC R2 BEQ CRID50 BR CRID60 ; CRID10: MOV @CRB1(R3),R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; DATA ASL R4 ; INTO ASL R4 ; POSITION ASL R4 ; .ENDC ; .IFNZ $1145 ; ASH R4,4m ;* THIS ROUTINE IS ENTERED WHENEVER AN EXPECTED CARD ** ;* READER INTERRUPT IS NOT RECEIVED. AN APPROPRIATE ** ;* OPERATOR ACTION MESSAGE IS PRINTED, AND THE C/R ** ;* STATUS IS TESTED EVERY SECOND THEREAFTER ** ;* ** ;********************************************************************** ; ; ;CRTIME IS ENTERED FROM n ** ;* 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: ** ;* ** ;* SET R0 = LIST oq & %7 zvrp  p$ w: ~nq(r N r7 q vrD pS#  HrVq   Vr:W, ! ~q 7!@ E0Z @r AC:  ? ILL CMD! ILL A~^rPAR! NON-QUIESCENT 7 7 7 a|rc vr   r sBsTs W,2 0!n~r- )!&7!#p ; .ENDC ; MOV R4,(R1) ;STORE BINARY DATA ; CRID20: INC BYTE(R3) .ENDC ; CRID30: JMP (R5) ;EXIT TO RESTOR ; .IFNZ BIN ; CRID40: MOV @CRB1(R3),R4 ;GET CURRENT COLUMN OF DATA CLR R0 BISB R4,R0 ;SET R4 = BITS 0-7 OF CRB1 DATA SWAB R4 BISB R4,(R1) ;STORE BITS 8-11 OF CRB1 IN DATA BUFFER qTIMER ROUTINES CRTIME: ;R1 POINTS TO THE TIMER MODULE LIST MOV 6(R1),R3 ;SET R3 = C/R INDEX MOV @CRS(R3),R0 BIS #4,R0 ;SET BIT 2 = 1 TO SIGNAL C/R ERROR CONDITION MOV R0,ERRCR(R3) ;STORE ERROR MOV #ERMSGE,-(SP) ;PRINT MESSAGE JSR PC,CRMSGE MOV #MXTIME,COUNT(R3) ;SET MAXIMUM DELAY THAT WE'LL MOV #CRDLAY,8.(R1) ;WAIT FOR CORRECTIVE ACTION rADDRESS ** ;* R1 = DATA ADDRESS ** ;* R2 = CONVERSION TABLE ADDRESS ** ;* R3 = L/P INDEX ** ;* JSR PC,LPCNVT ** ;* BNE ;BRANCH IF NO MORE TEXT ** ;* ** ;*************************syrx4xxx ڌdrq  x&& & & rM~Ns & HH:MM:SS MM/DD/YY islsos}szsws &e I W, ! E~s z sdsw*xW, ! srs ^s DԝDԝA  q w ~>t ы Dĥ  D0 C ``a - v6 w 6'd w ~tt ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 ;BRANCH IF NO MORE CARD DATA IS REQUIRED MOVB R0,3(R1) ;STORE 8 BITS OF BINARY DATA IN TOP BYTE BR CRID20 ;OF DATA BUFFER ; CRID50: MOV @CRB1(R3),R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; INTO ASL R4 ; BIT u CLR @CRS(R3) ;STORE NEW TIMEOUT ENTRY AND CRTA00: ;DISABLE INTERRUPTS 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 ;*******************************************************************v********************************************* ; ; 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 ; ADD #4,R1 ; wt Օ+  d 0B` e0  w ^%Օ- ҋ   ~.u fuxf&f&   4 rv  w X~u 7 w uvu) ERROR XXXXX SXXXXX SXXXXX SXXXXX SXXXXX uuuuuw ~v w ʉĉ w| zw  7 \'wVuPvf& & x ASL R4 ; POSITIONS ASL R4 ; 4-15 SO WE .ENDC ; CAN GET THE .IFNZ $1145 ; MOST SIGNIFICANT ASH R4,4 ; 8 BITS OF CRB1 .ENDC ; DATA CLR R0 BISB R4,R0 ;SET R4 = BITS 0-3 OF CRB1 DATA SWAB R4 MOVB R4,(R1) y*** ;* ** ;* C R D L A 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 Cz R5 = CURRENT INDEX INTO DATA CMP R5,LPMAX(R3) BGE LPCA70 CLR LPMODE(R3) ;SET L/P MODE TO CARRIAGE CONTROL ; ; ; LPCA00: CLR R4 BISB (R1)+,R4 ;GET NEXT CHARACTER FROM TEXT ======>R4 CMP R4,#CR ;IGNORE ALL CARRIAGE RETURNS BEQ LPCA15 CMP R4,#MAXCC ;IS IT A CONTROL CHARACTER? BLE LPCA05 ;BRANCH IF NO CMP R0,LPBUFR(R3) ;IF WE'RE { R ~vu & n fRL @wwwww w wwwwwwwwww~w~w~w| ;STORE BINARY DATA AS 00 00 X1 X2 ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 SWAB R0 MOV R0,2(R1) ;STORE BINARY DATA IN NEXT WORD OF BR CRID20 ;BUFFER AS X3 00 00 00 ; CRID60: BIS @CRB1(R3),(R1) ;PUT CURRENT BINARY DATA IN BUFFER ADD #2,COUNT(R3) ;AS 00 X1 X2 X3 CLR BYTE(R3) DEC }/R ** ;* REQUEST, BUT ONLY AFTER MXTIME SECONDS HAVE ELAPSED. ** ;* ** ;* CRDLAY IS ENTERED FROM THE TIMER ROUTINE AND R1 POINTS TO ** ;* THE TIMER MODULE. ** ;* ** ;********************************************************************** ; CRDLAY: MOV 6(R1),R3 ;GET C~AT THE BEGINNING OF THE BUFFER BNE LPCA10 ;AND THE CHARACTER IS NOT CONTROL, THEN INC LPMODE(R3) ;ASSUME AUTO LINE FEED MODE BR LPCA10 ; LPCA05: CMP #HT,R4 ;SEE IF CHARACTER IS A TAB BEQ LPCA60 ;BRANCH IF 'TIS CMP R0,LPBUFR(R3) ;OTHERWISE, IF WE'RE AT THE BEGINNING BNE LPCA20 ;OF THE L/P BUFFER, WE'LL CONTINUE JSR PC,LPSTOR ;FIRST WORD IS CONTROL ~vx~x~fy~yMXCNT(R3) JMP (R5) ;EXIT TO RESTOR .ENDC .PAGE ;********************************************************************** ;* ;* ;* A L P H A N U M E R I C M O D E ;* ;* THIS SECTION CONVERTS THE CURRENT COLUMN CHARACTER TO THE ;* SPECIFIED FORMAT AND STORES IT IN THE DATA BUFFER. IT ALSO ;* CHECKS COLUMN 1 OF EACH CARD FOR CONTROL INFORMATION (FORMAT ;* OF CARDS, ETC.). ;* .IFNZ BCD ; CRIE00: INC /R INDEX BIC #START!ENABLE,@CRS(R3) BIT #READY,@CRS(R3) ;CHECK C/R STATUS BEQ CRLA10 ;BRANCH IF C/R IS READY DEC COUNT(R3) ;TSK, TSK. DECREMENT COUNTER 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 , TOP BYTE (LEFT) MOVB #' ,R4 ;IS IGNORED BY PER DATA CONTROLLER SUB #2,(SP) ;CONTROL CHARS DON'T COUNT FOR TAB POSIT ; LPCA10: JSR PC,LPSTOR ;CONVERT CHARACTER TO L/P ASCII AND BNE LPCA40 ;BRANCH IF L/P BUFFER IF FULL ; LPCA15: INC R5 ;STORE IN L/P BUFFER ; LPCA16: CMP R5,LPMAX(R3) ;IF WE HAVEN'T EXCEEDED MAXIMUM SIZE, BLT LPCA00 ;WE'LL GO BACK*~Vzw z×&  ~z6  a7^ߕx xW{xS w xߐxWe?r ߕ 2 v~F{vx4{x2  ߐw L ee Dw 6 &f DJ~{  COUNT(R3) ;INCREMENT CHARACTER (COLUMN) COUNT CMP COUNT(R3),#1 ;IS THIS THE FIRST COLUMN? BNE CRIE15 ;BRANCH IF NO MOV @CRB1(R3),R4 ;OTHERWISE, GET BINARY CARD IMAGE .IFNZ TTYSW CMP R4,#SWITCH ;SEE IF COMMAND IS TO SWITCH TO TTY BNE CRIE10 INC CRBKUP(R3) ;SET FLAG TO SWITCH TO TTY BACKUP BR CRIF10 ;THEN GO SET 'READ ANOTHER CARD' FLAG .ENDC ;  JMP CRCLOS ;THEN GO TO DEQUEUE THE REQUEST AND EXIT ; CRLA10: MOV (SP)+,R5 ;SET TIMER TO RETURN TO LOOK LIKE RESTOR JMP CRIC10 ;AND GO RESTART THE I/O .PAGE ;********************************************************************** ;* C R M S G E ** ;* ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO FOR MORE ; LPCA20: BIT #1,R0 ;CHECK TO SEE IF THE RIGHTMOST BYTE BEQ LPCA30 ;NEEDS A BLANK MOVB #LPBLNK,(R0)+ ;YES - STORE IT ; LPCA30: ; LPCA40: MOV R5,LPCNT(R3) ;STORE CALLER'S BUFFER POINTER SUB LPBUFR(R3),R0 ;DETERMINE NO. WORDS IN L/P BUFFER MOV R0,R4 ASR R4 ;AND LEAVE IT IN R4 ; LPCA50: TST (SP)+ ;POP OFF TAB COUNTER MOߕ S7 fv w 6 6 ×ߕ&~6| 7  xexߐ& x <vw0wv0wvߐ& &wߕ4~| 1x7 7 *7 0 Wexf ww J `7]ߕx y}}}*}@}p}p}}}J~&}}p}& @ߕ(1 7 x7 7 belfffffffffe x&& xߕx}u CRIE10: CMP R4,#$026 ;026 CONTROL COMMAND? BEQ CRIF00 ;BRANCH IF YES .IFNZ EXEBC CMP R4,#$029 ;029 CONTROL COMMAND? BEQ CRIF30 ;BRANCH IF 029 .ENDC CMP R4,#EOD ;LOGICAL END-OF-DATA? BEQ CRIE20 ;BRANCH IF EOD ; CRIE15: ; TST MXCNT(R3) ;WELL THEN, IT MUST BE AN ORDINARY CHARACTER BLE CRID30  THE SYSTEM ** ;* TELETYPE. CRMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS ** ;* ** ;* SET R3 = C/R INDEX ** ;* MOV #DATA-(SP) PUSH DATA BUFFER ADDRESS ** ;* JSR PC,CRMSGE ** ;* BNE BNE IF LIST WASNV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 TST (SP)+ ;POP OFF FLAG, WHICH SETS THE CONDITION RTS PC ;CODE: ZERO = DATA STORED ; NON-ZERO = NO DATA STORED ; ; LPCA60: ;CHARACTER IS A TAB, FILL IN BLANKS CMP R0,LPBUFR(R3) ;IS THIS THE FIRST CHARACTER OF THE LINE BNE LPCA65 ;BRANCH IF NO INC ~}W"1f \w ccc}}}Հ6w @ f7~~_ w ߕx  O . ,IxB v>C 8ߕW"2 v rv vv`vL2~~v e1 x&& J ߕ0xvw z w `×&  =7:ߕx5x~e ߐ& 耂 # w vvxߐw  tw  ;BRANCH IF WE DON'T NEED ANY MORE CHARACTERS MOV @CRB2(R3),R2 ;GET COMPRESSED VERSION OF CHARACTER ADD TABLE(R3),R2 ;ADD IN BASE TABLE ADDRESS MOV CRDATA(R3),R1 ;GET DATA BUFFER ADDRESS ADD #4,R1 ADD COUNT(R3),R1 ;ADD CHARACTER INDEX MOVB (R2),-(R1) ;MOVE CONVERTED CHARACTER TO CALLER'S BUFFER DEC MXCNT(R3) BR CRID30 ; CRIE20: MOV CRFRST(R3),R1 ;EOD READ - GET AD'T AVAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. ** ;* ** ;********************************************************************** ; CRMSGE: MOV 2(SP),R4 ;GET DATA BUFFER ADDRESS FROM STACK .IFG NCR-1 ADD R3,R4 ;GET ADDRESS OF BUFFER FOR THIS C/R MO LPMODE(R3) ;OTHERWISE, FORCE TO AUTO-INCREMENT MODE ; LPCA65: MOV #40,R4 ;KEEP STORING BLANKS JSR PC,LPSTOR ;UNTIL WE GET TO A TAB POSITION BNE LPCA40 ;OR UNTIL THE L/P BUFFER IS FULL BIT #7,(SP) BNE LPCA65 ;KEEP GOING 'TIL WE HIT A MULTIPLE BR LPCA15 ;OF 8 (PLUS ONE) = 1, 9, 17 ; ; LPCA70: TST R5 ;WE GET HERE IF: BNE LPCA50  6 7 ~~Dd 0a<   ` v!!.*ߕ vwrvvevv EWxwx #~ @E @`ew& fw F 6 v 7 n7 l7 j7 f 0 vvv7~n0`vt1 wx0{x0x0x1 y }  v  W"tqww 0!x0$~x  .ʁt&Ѓ|h @ꂜF򄐅6ކކކDRESS OF LIST MOV #7,ERROR(R1) ;SET EOD ENCOUNTERED ERROR CODE INC IGNORE(R3) ;SET 'IGNORE CARD' FLAG JMP (R5) ; ; 026 CONTROL CARD READ. SET CONVERSION TABLE ADDRESS UP. ; CRIF00: .IFNZ INEBC MOV CRFRST(R3),R0 ;GET I/O LIST ADDRESS TSTB LEVEL(R0) ;TEST LEVEL TO DETERMINE MODE BNE CRIF20 ;1 = EBCDIC .ENDC MOV #O26ASC,TABLE(R3) ;0 = ASCII V (R4),R4 .ENDC MOV R5,-(SP) ;SAVE R5 .IFZ NCR-1 MOV #CRLIST,R5 .ENDC .IFG NCR-1 MOV CRIOLS(R3),R5 ;GET THE I/O LIST ADDRESS .ENDC ; ; MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 ;THEN, INHIBIT INTERRUPTS MOV #340,@#PSR ;11/20 CODE .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE .ENDC  ; 1. THERE IS NO MORE TO PRINT MOV #SKIP1,R4 ; 2. USER HAS NWORD = 0 BR LPCA10 ;IF (2) IS TRUE, THEN STORE A SINGLE ;LINE SKIP AND PRINT IT .PAGE ;********************************************************************** ;* ** ;* L P S T O R ** ;* 2~^ TASK # 2  ^2~ցNT~N TASK # 3 @ & & &  2~Ƃ; CRIF10: INC REPEAT(R3) ;SET 'READ ANOTHER CARD FLAG' BR CRID30 ; CRIF20: .IFNZ INEBC MOV #O26EBC,TABLE(R3) ;SET FOR 026 TO EBCDIC CONVERSION BR CRIF10 .ENDC ; ; 029 CONTROL CARD. SET FOR PROPER CONVERSION ; .IFNZ EXEBC CRIF30: MOV CRFRST(R3),R0 ;GET I/O LIST ADDRESS .IFNZ INEBC TSTB LEVEL(R0) ;TEST FOR INTERNAL FORMAT TYPE BNE TST DATA(R5) ;SEE IF LIST IS AVAILABLE BNE CMSX00 ;BRANCH IF NO MOV R4,DATA(R5) ;YES - GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R5,-(SP) ;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  ** ;* CONVERT THE CHARACTER IN REGISTER R4 TO EVEN PARITY, ** ;* LINE PRINTER ASCII, THEN STORE IT IN THE LINE PRINTER ** ;* BUFFER. THE L/P READS CHARACTERS FROM INCREASING ** ;* MEMORY LOCATIONS, AND FROM LEFT (TOP BYTE) TO RIGHT ** ;* (BOTTOM BYTE). THUS, LPSTOR CANNOT PERFORM A SIMPLE ** ;* INDEXED STORE. ON ENTRY, THE REGISTERS ARE EXPECTED ** ;* TO CONTAIN TASK # 4  & &  2~> TASK # ~ 5  & & &  d2 ~.T TASK # 6 F & &  2~CRIF40 ;BRANCH IF EBCDIC .ENDC MOV #O29ASC,TABLE(R3) ;OTHERWISE, SET FOR 029-ASCII BR CRIF10 .IFNZ INEBC ; CRIF40: MOV #O29EBC,TABLE(R3) ;029-EBCDIC BR CRIF10 .ENDC .ENDC .ENDC .PAGE ;********************************************************************** ;* ** ;* C R BUSY MOV (SP)+,R5 MOV (SP)+,(SP) SEZ ;SET ERROR INDICATOR (BUSY LIST) RTS PC ;RETURN TO CALLER ; CRTTY: CLR DATA(R1) ;TTY I/O COMPLETE SUBROUTINE RTS PC ;SET LIST NOT BUSY AND EXIT .PAGE ;********************************************************************** ;* ** ;* : ** ;* ** ;* R0 = ADDRESS OF L/P BUFFER ** ;* R2 = ADDRESS OF CONVERSION TABLE ** ;* ** ;* R4 IS DESTROYED, R0 IS UPDATED, AND ALL OTHER REGISTERS ** ;* ARE SAVED. ** ;*  TASK # 7  ~2~ TASK # 8  &  T2 ~D TASK # 9 6  2 lC H E K ** ;* ** ;* THIS SUBROUTINE CHECKS THOSE PARTS OF THE LIST AND DATA ** ;* BUFFER WHICH ARE COMMON TO BOTH THE ORIGINAL CHECK (WHEN ** ;* QUEUEING) AND THE RECHECK (PRIOR TO INITIATING I/O). ** ;* ANYTHING THAT COULD CAUSE CREAD TO HONK UP THE REAL-TIME ;* SYSTEM. LINKAGE IS: ** ;* C R S I O ** ;* ** ;* CARD READER START I/O SUBROUTINE. CRSIO SETS UP ALL ** ;* COUNTERS, INITIATES A C/R READ REQUEST, AND STARTS ** ;* UP A TIMER (100 MS DELAY) TO MAKE SURE WE DON'T HANG ** ;* IF AN INTERRUPT ISN'T RECEIVED. CRDQTM, A SECOND ** ;* ENTRY, WILL DEQUEUE (STOP) THIS TIMER REQUEST BY USING ** ;* SUBROUTINE DQTIM ** ;********************************************************************** ; ; LPSTOR: INC 2(SP) ;INCREMENT TAB COUNTER CLR 10.(SP) ;SET 'DATA STORED' FLAG CLR -(SP) ;SET 'L/P BUFFER NOT FULL' FLAG ADD R2,R4 ;ADD TABLE BASE ADDRESS TO ASCII CODE MOVB (R4),(R0)+ ;CONVERT BYT' STORE IN LPBUF ; LPST00: CMP R0,LPBUFR+~ TASK # 10 ~ކ  2 ~v7    2 o~7     T  7 7d7 ** ;* R1 = ADDR(LIST) ** ;* R0 = ADDR(DATA) ** ;* R3 = C/R INDEX ** ;* JSR PC,CRCHEK ** ;* BNE ERROR ;R4 = ERROR CODE ** ;* ** ;* ALL REGISTERS USEDE. USAGE IS: ** ;* ** ;* R1 = ADDR(LIST) ** ;* MOV #CRINDX,R3 ;SET R3 = C/R INDEX ** ;* JSR PC,CRSIO ** ;* ** ;* REGISTERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* 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 ;********************************************************************** ;* ** ;* L P C H E K ** ;* lvEpj%~fd ^ TF r""& $ҝ$ʝ0 ( dwZZ,~ވ~n!w @ Z g& gN@f:g g(. *b 'xww ~V[vv&- e? 6  e|~ΉKC& vvw D%%E BY CRCHEK ARE SAVED AND RESTORED. ** ;* ** ;********************************************************************** ; ; CRCHEK: CLR R4 CMP #ROSTOP,R1 ;TEST FOR LEGAL I/O LIST ADDRESS BHIS CRDW19 ;BRANCH IF ILLEGAL CMP R1,#HICORE BHIS CRDW19 ;BRANCH IF ADDRESS IS BEYOND CORE MOVB TYPE(R1),R2 ;CHECK FOR VALID EXIT TYPE  ** ;********************************************************************** ; ; 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)  ** ;* THIS SUBROUTINE PERFORMS CHECKS ON THE I/O LIST AND DATA ** ;* BUFFER THAT COULD BOMB LPRNTR. THESE TESTS ARE PERFORMED ** ;* WHEN THE REQUEST IS QUEUED AND WHEN ITS I/O IS STARTED. ** ;* THE REGISTERS MUST CONTAIN: ** ;* ** ;* R0 = ADDRESS OF I/O LIST ** ;* R1 = ADDRESS OF DATA B Cw  eBA  J6 ~Fw 0 "$*"EW  91 7`u  ``Du7f~BA<WCEqJ7uœ& ‹ & 5@& Œ Œ$Œ ~6A `BAW,J t   w開~ BLE CRDW02 ;BRANCH IF <= 0 * CMP R2,#3 ; * ONLY 1,2,3 ARE VALID BGT CRDW02 ;BRANCH IF > 3 * BNE CRDA20 ;BRANCH IF EXITS 1 OR 2 CMP #ROSTOP,$EXIT(R1) ;CHECK I/O COMPLETE ADDRESS BHIS CRDW03 ;BRANCH IF ADDRESS IS IN ROS CMP #HICORE,$EXIT(R1) ;OR OUTSIDE AVAILABLE CORE ; CRDA20: CMP #ROSTOP,R0 ;NOW, MAKE SURE  ; CRSA05: .ENDC MOV CRDATA(R3),R0 ;GET DATA ADDRESS CLR R1 ;DETERMINE MODE OF 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 GOUFFER ** ;* ** ;* ON RETURN, R4 CONTAINS: ** ;* ** ;* 0 = VALID REQUEST ** ;* 2 = ILLEGAL LIST OR DATA ADDRESS ** ;* 4 = ILLEGAL RETURN TYPE ** ;* 5 = ILLEGAL I/dd~&7" @ : 7fxv)-lt`x7s ss& fu Bvvvv9 v~ D& t7&f:Е<<9<2- "PPP)mȵ ~ @@p- ɕe%!G7r& ^< 72~nre"DATA ADDRESS IS VALID BHIS CRDW04 ;BRANCH IF IT'S IN ROS CMP R0,#HICORE BHIS CRDW04 ;OR OUTSIDE AVAILABLE CORE MOV (R0),R2 ;GET WORD COUNT BEQ CRDW05 ;BRANCH IF ZERO 'CAUSE IT'S NO GOOD BGT CRDA30 NEG R2 ;SET IT +++++ (PLUS, THAT IT) ASL R2 ;BINARY MODE NWORD = WORDS, NEED BYTES ; CRDA30: ADD R0,R2 ;TEST VALIDITY OT'S TA GET THE ADDRESS OF MOV #CRMOD,R1 ;THE TIMER MODULE FOR THIS C/R .ENDC .IFG NCR-1 MOV CRMDAD(R3),R1 ;GET ADDRESS OF TIMER MODULE .ENDC MOV R1,-(SP) ; MOV #$1SEC,-(SP) ;SET UP FOR 1 SECOND DELAY JSR PC,IOQTME ;REV UP THE OLE TIMER MOV #CRTIME,8.(R1) ;AND STORE TIMEOUT ADDRESS TST (SP)+ ; ; CRSA20: MOV R2,MXCNT(R3) ;STOREO COMPLETE ADDRESS ** ;* ** ;********************************************************************** ; ; LPCHEK: CMP R0,#ROSTOP ;TEST LIST ADDRESS BLOS LPKE02 ;CAN'T BE IN ROS CMP R1,#ROSTOP ;TEST DATA ADDRESS BLOS LPKE02 ;CAN'T BE IN ROS EITHER CMP R0,#HICORE ;NOR CAN EITHER BE IN NON-EXISTENT BHIS LPKE2 7VrB f  D &  ‹ & & N & yerEwd~q57q& 5E -?-   Ν  ~~ Be (- -- ee  E E ~EvÝ;`Ý1`Ý*`%<< % ÝÜ-    UUp&p-F DATA BUFFER ADDRESS CMP R2,#HICORE ;WHEN ADDED TO NWORD BHIS CRDW05 ;BRANCH IF WE WENT OUT OF CORE ; CRKX00: TST R4 RTS PC ; CRDW05: INC R4 CRDW04: INC R4 CRDW03: INC R4 CRDW02: INC R4 INC R4 BR CRKX00 CRDW19: MOV #9.,R4 BR CRKX00 .PAGE ;**********************************************************************  MAXIMUM NUMBER WORDS (CHARACTERS) ;NOW, WE CAN FINALLY START THE I/O MOV #ENABLE!START,@CRS(R3) ; RTS PC ;RETURN TO HE WHO CALLS ;* ;* ;* THIS SECTION RE-DIRECTS THE C/R INPUT TO THE SYSTEM TELETYPE. ;* THE TELETYPE USER MAY REINSTATE THE C/R INPUT BY TYPING THE ;* CHARACTER 'BELL', FOLLOWED BY A ;* ;* NOTE: THE SYSTEM OPERATOR CAN ALSO SWITCH INPUT BY THE ;* COMMANDS: ;* 02 ;MEMORY CMP R1,#HICORE BHIS LPKE02 BIT #1,R0 ;AND, FINALLY, THE ADDRESSES MUST BNE LPKE02 ;BE EVEN (WORD BOUNDARIES) BIT #1,R1 BNE LPKE02 MOV (R1),R4 ;AND, FINALLY (DID I ALREADY SAY THAT?), BLT LPKA00 ;GET NWORD AND MAKE SURE IT'S REASONABLE NEG R4 ;WITHIN AVAILABLE CORE. ; LPKA00: INC R4 ;CONVERT~n,E eet?p6  \pw Lp%%BA  J6 w l f~UG&o <-~^o76 w ߀elo  0mH5} :-œ-. Da`~֐> oӵeK6 w J nn V $@5;&  ;* ** ;* C R T I M E ** ;* ** ;* THIS ROUTINE IS ENTERED WHENEVER AN EXPECTED CARD ** ;* READER INTERRUPT IS NOT RECEIVED. AN APPROPRIATE ** ;* OPERATOR ACTION MESSAGE IS PRINTED, AND THE C/R ** ;* STATUS IS TESTED EVERY SECOND THEREAFTER  CR,K SWITCH TO C/R : K ;* TY,K SWITCH C/R : K TO TTY ;* ;* WHERE K = 1 FOR C/R : 1, ETC. ;* ;* ; .IFNZ TTYSW ; CRSB00: .IFNZ BIN TST @CRDATA(R3) ;CAN'T SWITCH IF IT'S BINARY BNE CRSA05 .ENDC .IFZ NCR-1 ;GET THE TTY I/O LIST ADDRESS MOV #CRLIST,R0 .ENDC .IFG NCR-1 MOV CRIOLS(R3),R0 .ENDC  # CHARACTERS ASR R4 ;TO # WORDS ADD #HICORE,R4 CMP R1,R4 ;CHECK DATA BUFFER TO BE GREATER THAN BHI LPKE02 ;NWORD/2 WORDS FROM TOP OF CORE CMP R0,#HICORE-7-7 ;AND THAT LIST IS MORE THAN SEVEN BHI LPKE02 ;WORDS FROM TOP OF CORE ; ; NOW WE'LL CHECK FOR I/O COMPLETE ADDRESS ; CMPB #3,TYPE(R0) ;IS IT EXIT 3? BNE LPKB20 ;BRANCH IF NO H H H)7~ND% ދ1 1 77 b^d7 P7 w6~Ƒ̑w\~>~ ** ;* ** ;********************************************************************** ; ; ;CRTIME IS ENTERED FROM TIMER ROUTINES CRTIME: ;R1 POINTS TO THE TIMER MODULE LIST MOV 6(R1),R3 ;SET R3 = C/R INDEX MOV @CRS(R3),R0 BIS #4,R0 ;SET BIT 2 = 1 TO SIGNAL C/R ERROR CONDITION MOV R0,ERRCR(R3) ;STORE E CMP (R0),#1 ;IS IT IN USE? BNE CRSA05 ;BRACH AND USE C/R IF IT'S BUSY MOV #CRSB50,$EXIT(R0) ;NOT BUSY. SET I/O COMPLETE ADDR MOV DATA(R1),DATA(R0) ;MOVE ADDR(DATA) INTO TTY LIST MOV R0,-(SP) MOV CRMDAD(R3),-(SP) JSR PC,IODQTM ;STOP THE TIMER TST (SP)+ JSR PC,TTYIN ;CALL TTYIN TO READ DATA RTS PC ;* ;* ;* ENTRY HERE WHEN INPUT REQUES MOV $EXIT(R0),R4 ;OTHERWISE, TEST THE ADDRESS CMP R4,#ROSTOP BLOS LPKE05 CMP R4,#HICORE-10. BHIS LPKE05 BIT #1,R4 BNE LPKE05 ; LPKB10: CLR R4 ;SET 'NO ERRORS' RTS PC ;AND EXIT TO CALLER ; LPKB20: BLT LPKE04 ;TEST FOR VALID EXIT TYPE CMPB #1,TYPE(R0) BLE LPKB10 ; LPKE04: MOV #4,R4 ;ILL9~.~.*DZ.*v"[bf......~...kkkx 7r wkw 7tw  7^w w >~ĝ\7Zk70 , Zk"RkwRROR MOV #ERMSGE,-(SP) ;PRINT MESSAGE JSR PC,CRMSGE MOV #MXTIME,COUNT(R3) ;SET MAXIMUM DELAY THAT WE'LL MOV #CRDLAY,8.(R1) ;WAIT FOR CORRECTIVE ACTION CLR @CRS(R3) ;STORE NEW TIMEOUT ENTRY AND CRTA00: ;DISABLE INTERRUPTS MOV R1,-(SP) ;SET UP FOR 1 SECOND DELAY MOV #$1SEC,-(SP) ; JSR PC,IOQTME TST (SP)+ T IS COMPLETE (TTY I/O COMPLETE ;* SUBROUTINE). ON ENTRY, R1 POINTS TO TTY LIST. ;* ;* ; CRSB50: .IFZ NCR-1 ;FIRST, WE NEED THE C/R INDEX CLR R3 ;FOR ONE C/R, IT'S SIMPLE! .ENDC .IFG NCR-1 ;FOR MORE THAN TWO, IT AIN'T SO EASY MOV R1,R3 ;(UNLESS, OF COURSE, WE'RE ON THE 11/45) SUB #CRLIST,R3 ;GET DISPLACEMENT OF THIS LIST FROM BEZ CRSB80 ;THE FIRST LEGAL 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 ;********************************************************************** ;* ** ;* L P R S E T ** ;* .& dk^k@j D A  &DCc  w 2w  w  ~' 7  &w \w wXw w  fw |t w 7 wtwhw  %-E eS~䓂 wh6 ߞ =w F6 / w :( w 2! w * w "w * 7 w 7w 77Ҟߞ JN~w7  ww (b ww w A B` r% w| 7twrjwhg~v E 7 BNE CRLA00 ;LET'S GO ABORT THIS REQUEST ; CRTA10: RTS PC ;RETURN TO TIMER ROUTINES .PAGE ;********************************************************************** ;* ** ;* C R D L A Y ** ;* ** ;* THIS ROUTINE IS ENTERED ONCE EVERY SECOND AND IS INIIST .IFZ $1145 CLR R4 ;THE C/R INDEX IS = DISP/7 ; CRSB60: SUB #7,R3 BLT CRSB70 TST (R4)+ BR CRSB60 ; CRSB70: MOV R4,R3 .ENDC .IFNZ $1145 DIV #7,R3 .ENDC .ENDC ; CRSB80: MOV #CRTTY,$EXIT(R1) ;SET TTY LIST BACK TO ORIGINAL FORM MOV CRDATA(R3),R4 ;GET DATA ADDRRESS AND CHECK FOR THE CMPB  ** ;* THIS SUBROUTINE ISSUES A RESET COMMAND TO THE LINE PRINTER, ** ;* WHICH I SUPPOSE SHOULD CLEAR IT; IN THE EVENT IT NEEDS TO ** ;* BE CLEARED, THAT IS. R3 = L/P INDEX NUMBER. ** ;* ** ;********************************************************************** ; ; LPRSET: .IFZ NLP-1 MOV #CLEAR,@#CMD.1 .ENDC .IFG pwhP E tP Iw -% w  =w 7  ~=w e0w ,w %@w ~ke=w @w Xwww=w  w  {~fdw *Ae0w v,w nHBFw 6- .27, ( B:8w ?w 7 <~ޗw 777     w %0 %7E `  1 W ֆ m7 yD|jTIALLY ** ;* ACTIVATED BY CRTIME. IT PURPOSE IS TO PATIENTLY SIT AND ** ;* WAIT FOR THE CARD READER TO GET READY. HOWEVER, NOT BEING ** ;* A VERY PATIENT INDIVIDUAL, HE JUST MIGHT ABORT THE C/R ** ;* REQUEST, BUT ONLY AFTER MXTIME SECONDS HAVE ELAPSED. ** ;* ** ;* CRDLAY IS ENTERED FROM THE TIMER ROUTINE AND R1 POINTS TO ** ;* THE TIMER MODULE.  #BELL,4(R4) ;RETURN TO C/R CHARACTER BEQ CRSC00 ;AND BRANCH IF WE FOUND IT TST ERROR(R1) ;THEN CHECK FOR AN ERROR BEQ CRSB90 ;BRANCH IF NONE MOV CRFRST(R3),R0 ;OOPS - SET ERROR FLAG MOV #7,ERROR(R0) ; CRSB90: MOV (SP)+,R5 ;SET FOR FOR TTYIN RETURN BY JMP (R5) MOV NREAD(R4),COUNT(R3) JMP CRCLOS ;GO CLOSE OUT THIS REQUEST ; ; ; THIS SECTION NLP-1 MOV #CLEAR,@LPCMD(R3) ;CLEAR IT .ENDC RTS PC ;THAT'S ALL, FOLKS! .PAGE ;********************************************************************** ;* ** ;* L P S T A T ** ;* ** ;* THIS SUBROUTINE READS THE STATUS OF THE INDICATED ~VNr™ `ޚ$,VHʗPڔZ7U<D 2 7.7(%  w %~Θ=w w  w w ww   7mw w %/w s~F\ z \pp.  L e  ! B ! =L !644 $ .!464 $~ % w   @w @ % % w  ww   ** ;* ** ;********************************************************************** ; CRDLAY: MOV 6(R1),R3 ;GET C/R INDEX BIC #START!ENABLE,@CRS(R3) BIT #READY,@CRS(R3) ;CHECK C/R STATUS BEQ CRLA10 ;BRANCH IF C/R IS READY DEC COUNT(R3) ;TSK, TSK. DECREMENT COUNTER BNE CRTA00 ;GO WAIT SOME IF MXTIME SEC. HAV SETS UP THE LOGIC TO SWITCH BACK TO THE CARD ; READER. ENTERED WHEN THE OPERATOR ENTERS A 'BELL' CHARACTER. ; ; CRSC00: CLR CRBKUP(R3) ;CLEAR C/R BACKUP FLAG INC REPEAT(R3) ;SET 'READ ANOTHER CARD' FLAG MOV (SP)+,R5 ;SET R5 FOR TTYIN RETURN BY JMP (R5) JMP CRIC00 ;AND GO START ANOTHER CARD .ENDC .PAGE ;********************************************************************** ;* LINE ** ;* PRINTER, THEN SETS THE CONDITION CODES ACCORDINGLY: ** ;* ** ;* ZERO = EVERYTHING'S ALRIGHT ** ;* < ZERO = FATAL ERROR ** ;* > ZERO = OPERATOR ACTION REQUIRED ** ;* ** ;* ON ENTRY, R3 MUST CONTAIN L/P INDEX. R4 ID  &C@A~6EPA&fw w /w w :w   ` E ` H 8 wF~Lew 7U4E(w T76  p$ew V׭dU~&7w @ŝŝwdt wt! w w Jw @eZ%ĕ/~t72 $$w Bw .e` w ;w EN'T ELAPSED CRLA00: MOV (SP)+,R5 ;PUT TIMER RETURN ADDRESS IN R5 MOV CRFRST(R3),R1 ;GET USER'S LIST ADDRESS MOV #7,ERROR(R1) ;SET I/O REQUEST ABORTED ERROR CODE JMP CRCLOS ;THEN GO TO DEQUEUE THE REQUEST AND EXIT ; CRLA10: MOV (SP)+,R5 ;SET TIMER TO RETURN TO LOOK LIKE RESTOR JMP CRIC10 ;AND GO RESTART THE I/O .PAGE ;******************************************************* ** ;* C R D O N / C R D O F F ** ;* ** ;* THESE SUBROUTINES ARE CALLED BY OPERATOR INPUT AND ARE ** ;* USED TO SWITCH THE C/R INPUT TO THE TELETYPE (CRDOFF) ** ;* OR REINSTATE INPUT FROM THE C/R (CRDON). THE LINKAGE IS: ** ;* ** ;* S DESTROYED ** ;* ** ;********************************************************************** ; ; LPSTAT: .IFZ NLP-1 MOV @#STAT.1,R4 .ENDC .IFG NLP-1 MOV @LPSTS(R3),R4 ;GET STATUS .ENDC CLR -(SP) ;SET 'OK' CONDITION BIT #PARITY,R4 ;TEST FOR PARITY ERROR BNE LPSA20 ;BRANCH IF PRESENT ĝw wf&f P~46 0c.c7$c7$c cw rc5ccgbbbV  <6 8~ !%& &e N @ e0w &   b7~brbnbE(~ w   w ׭4b ^w Uw w nj  7,XRO~~-P Dw@ 78 %*************** ;* C R M S G E ** ;* ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO THE SYSTEM ** ;* TELETYPE. CRMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS ** ;* ** ;* SET R3 = C/R INDEX JSR PC,CRDON (OR CRDOFF) ** ;* ** ;* WHERE R3 CONTAINS THE CARD READER NUMBER (1, 2, 3, ..., NCR) ;* ** ;* R3 IS DESTROYED ON RETURN. ** ;* ** ;********************************************************************** ;  BIT #PLOW,R4 ; BNE LPSA10 ;BRANCH IF PAPER LOW BIT #ONLINE,R4 BEQ LPSA10 ;BRANCH IF ONLINE ; LPSA00: TST (SP)+ ;SET CONDITION CODE = OK RTS PC ;THEN EXIT ; LPSA10: INC (SP)+ ;OPERATOR ACTION REQUIRED RTS PC ;EXIT ; LPSA20: DEC (SP)+ ;SET PARITY ERROR INDICATOR RTS PC ;AND(!  %??w N%w w~77w Z e0w ,w w p Cå å$ נA  ~n  e` ƞ  Ëנe ee e ѐ  @(ee @ s~ODT-11R V002ABE"[ee *;/\ $G _<^,OWEBP@>SRC-FI!XASPMCFRBŸ)eL x  N ~^N  ** ;* MOV #DATA-(SP) PUSH DATA BUFFER ADDRESS ** ;* JSR PC,CRMSGE ** ;* BNE BNE IF LIST WASN'T AVAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. ** ;* ** ;***************************************; CRDOFF: .IFNZ TTYSW .IFG NCR-1 TST R3 ;C/R NO. CAN'T BE <= 0 BLE CRDF10 CMP R3,#NCR ;OR > NCR BGT CRDF10 DEC R3 ASL R3 INC CRBKUP(R3) .ENDC ; ; .IFZ NCR-1 INC CRBKUP .ENDC ; ; CRDF10: RTS PC .ENDC ; CRDON: .IFZ NCR-1 CLR CRBKUP RTS PC .E EXIT .PAGE ;********************************************************************** ;* ** ;* L P S I O ** ;* ** ;* THIS SUBROUTINE PERFORMS THE ACTUAL OUTPUT FUNCTION TO ** ;* START THE LINE PRINTER. AFTERWARDS, THE TIMER MODULE ** ;* IS ADJUSTED FOR A ONE SECOND TIMEO Ê <%! ,c ѐhˋÜ`E $  P   L0֟wZ ɋr pDZ[******************************* ; CRMSGE: MOV 2(SP),R4 ;GET DATA BUFFER ADDRESS FROM STACK .IFG NCR-1 ADD R3,R4 ;GET ADDRESS OF BUFFER FOR THIS C/R MOV (R4),R4 .ENDC MOV R5,-(SP) ;SAVE R5 .IFZ NCR-1 MOV #CRLIST,R5 .ENDC .IFG NCR-1 MOV CRIOLS(R3),R5 ;GET THE I/O LIST ADDRESS .ENDC ; ; MOV @#PSR,-(SP) ;SAVE NDC .PAGE ; ; ; I N I T I A L I Z A T I O N ; .CSECT .CRINT CRINIT: .IFZ NCR-1 ;FIRST, LET'S SET UP 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 UT. IF THE MODULE ** ;* ISN'T QUEUED, IT WILL BE WHEN LPSIO GETS DONE WITH IT. ** ;* REQUIREMENTS ON ENTRY: ** ;* ** ;* R4 = L/P WORD COUNT ** ;* R3 = L/P INDEX ** ;* R0 = LIST ADDRESS ** ;* IF THE OPERATOR HAS SO NOT M Tq 0 :mm?,@ @3 <M0 8H   8&H, el4  ->  4$>,  4M> e 4>"&.:1> e >$(J0`1^>e3 4 M ,e>4$(0>PSR .IFZ $1145 ;THEN, INHIBIT INTERRUPTS MOV #340,@#PSR ;11/20 CODE .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE .ENDC TST DATA(R5) ;SEE IF LIST IS AVAILABLE BNE CMSX00 ;BRANCH IF NO MOV R4,DATA(R5) ;YES - GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R5,-(SP) ;STORE LIST ADDRESS JSR PC,TTYOUT ;CVECTOR ADDRESS MOV R1,(R3)+ ;STORE ADDR(CRINT) IN VECTOR MOV R4,(R3)+ ;SET PRIORITY LEVEL TO ZERO ADD #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,CRLASTIFIED, THE L/P OUTPUT WILL BE ** ;* DIRECTED TO THE TELETYPE VIA TTYOUT. IN THIS CASE, THE ** ;* TIMER WILL NOT BE STARTED. ** ;* ** ;********************************************************************** ; ; LPSIO: .IFNZ LPBACK TST LPTTY(R3) ;SEE IF TTY IS TO BE USED BNE LPOB00 ;BRANCH IF YES .ENDC MO!  *! ! +!  >*J,@l el @  $. M * b;  &b(2, %(*b; b$rh=.W %B %%%rh(rh,D   `  ALL TTYOUT TO PRINT MESSAGE MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) CLZ RTS PC ;RETURN TO CALLER ; CMSX00: MOV (SP)+,@#PSR ;LIST BUSY MOV (SP)+,R5 MOV (SP)+,(SP) SEZ ;SET ERROR INDICATOR (BUSY LIST) RTS PC ;RETURN TO CALLER ; CRTTY: CLR DATA(R1) ;TTY I/O COMPLETE SUBROUTINE RTS PC ;SET .ENDC .IFG NCR-1 MOV #NCR,R0 MOV #CRFRST,R1 MOV #CRLAST,R2 ; CRNA20: MOV R1,(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 .CSEV R4,LPWORD(R3) NEG R4 ;L/P NEEDS NEGATIVE WORD COUNT ; LPO000: .IFZ NLP-1 ;THIS CODE IS FOR ONLY L/P IN SYSTEM MOV R4,@#CNT.1 ;STORE LINE PRINTER WORD COUNT TST LPMODE ;SEE WHICH MODE WE'RE IN BEQ LPOA00 ;BRANCH IF CARRIAGE CONTROL MOV #AUTOLF,@#LFRG.1 ;OTHERWISE, ISSUE AUTO LINE FEED BR LPOA10 ; LPOA00: CLR @#LFRG.1 ;SET TO CARR J2h  C<U3B NM<"B,,; <f< CEA< <: &<,5<  w>w*4<x0f" 5 f z "*9aT01 3 3 s 5 $*Z,*3 4     s83  O LIST NOT BUSY AND EXIT .PAGE ;********************************************************************** ;* ** ;* C R S I O ** ;* ** ;* CARD READER START I/O SUBROUTINE. CRSIO SETS UP ALL ** ;* COUNTERS, INITIATES A C/R READ REQUEST, AND STARTS ** ;* UP A TIMER (100 CT .ENDC ;ENDC FOR THE BEGINNING .IFNZ NCR STATEMENT .END IAGE CONTROL MODE LPOA10: MOV #LPBUF,@#LPDT.1 ;STORE MEMORY BUFFER ADDRESS MOV #SB!IE!ID,@#CMD.1 ;START'ER UP .ENDC ; ; .IFG NLP-1 ;AND NOW FOR THE CODE FOR > 1 L/P IN SYSTEM MOV R4,@LPWDCT(R3) ;STORE WORD COUNT TST LPMODE(R3) ;SEE WHICH MODE WE'RE IN BEQ LPOA00 ;BRANCH IF CARRIAGE CONTROL MOV #AUTOLF,@LPFEED(R3) ;OTHERWISE, ISSUE AUTO LINE FEED 4  8"& .Nf< t A< 8h": t"<(80t""p &0 "" 0$:mm*9p::,      "}0wJ3  w$ <7 6(7  MS DELAY) TO MAKE SURE WE DON'T HANG ** ;* IF AN INTERRUPT ISN'T RECEIVED. CRDQTM, A SECOND ** ;* ENTRY, WILL DEQUEUE (STOP) THIS TIMER REQUEST BY USING ** ;* SUBROUTINE DQTIME. USAGE IS: ** ;* ** ;* R1 = ADDR(LIST) ** ;* MOV #CRINDX,R3 ;SET R3 = C/R INDEX ** ;* JSR  ;* OF LINE PRINTER .IFG NLP-1 ;* MOV LPIOLS(R3),R5 ;* I/O LIST .ENDC ;* MOV @#PSR,-(SP) ;SAVE CURRENT CPU LEVEL .IFZ $1145 MOV #340,@#PSR ;11/20 CODE TO INHIBIT INTERRUPTS .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE FOR THE SAME THING .ENDC TST DATA(R5) ;SEE IF THE LIST IS AVAILABLE BN 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 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 PC,CRSIO ** ;* ** ;* REGISTERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* ** ;********************************************************************** ; ; CRSIO: CLR COUNT(R3) ;SET COUNT = 0 CLR IGNORE(R3) MOV SYSTEM(R1),CRTASK(R3) ;STORE TASK NUMBER E LPSX00 ;BRANCH IF BUSY MOV R4,DATA(R5) ;IT'S AVAILABLE, SO GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS BACK TO WHERE THEY WERE MOV R5,-(SP) ;PUSH LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) ;PUT STACK IN ORDER CLZ ;SET NO-ERROR CONDITION RTS PC ; ; LPSX00: MOV (SP) ; 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 DIVERTS THE LINE PRINTER OUTPUT TO THE SYSTEM ; TELETYPE. UNLESS, OF COURSE, THIS OPTION WASN'T GENERATED ; INTO THE SYSTEM. IN WHICH CASE, WHAT ARE YOU EVEN DOING ; HERE? ; ; .IFNZ LPBACKV #14,CNTRL JSR PC,EXIT CNTRL: .WORD 14 ; LIST1: .WORD 1 .BYTE 2,2 .WORD 0,0,0,0,BUFFER ; LIST2: .WORD 1 .BYTE 3,2 .WORD 0,0,0,0,BUFFER ; BUFFER: .WORD 80.,0 .=.+80. .END  .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 OF INPUT MOV (R0),R2 BGE CRSA10 ;NWORD < 0 ======> BINARY INC R1 ;SET R1 = 1 (BINARY) +,@#PSR ;ENABLE INTERRUPTS MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) ;PUT STACK IN ORDER SEZ ;SET ERROR CONDITION RTS PC ;EXIT TO CALLER .PAGE ;********************************************************************** ;* ** ;* L P O N / L P O F F ** ;*  ; ; LPOB00: MOV R5,-(SP) ;SAVE R5 MOV LPBUFR(R3),R4 ;FIRST, SAVE LIST IN LPBUF MOV #7,R5 ; LPOB10: MOV (R0)+,(R4)+ .IFZ $1145 DEC R5 BGT LPOB10 .ENDC .IFNZ $1145 SOB R5,LPOB10 .ENDC SUB #14.,R0 MOV R3,R4 ;THEN SET UP LIST FOR TTY USE .IFZ $1145 ASL R4 ASL R4 ASL .MZ;@; M@}@.M@:mm@: @:<}@9mQ@.m@Tq@v@@9a@4f@.LC @(~MXhTMp&h0MWh6>MZhMh 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 MOV CRMDAD(R3),R1 ;GET ADDRESS OF TIMER MODULE .ENDC MOV R1,-(SP) ; MOV #$1SEC,-(SP) ;SET UP FO ** ;* THESE SUBROUTINES ARE CALLED BY OPERATOR INPUT AND ARE ** ;* USED TO SWITCH THE L/P OUTPUT TO THE TELETYPE (LPOFF) ** ;* OR REINSTATE OUTPUT TO THE L/P (LPON). THE LINKAGE IS : ** ;* ** ;* JSR PC,LPON (OR LPOFF) ** ;* ** ;* WHERE R3 CONTAINS TH R4 .ENDC .IFNZ $1145 ASH R4,3 .ENDC ADD #LPDONE,R4 MOV R4,$EXIT(R0) ;STORE I/O COMPLETE ADDRESS MOV #3*256.,DEVICE(R0) ;SET DEVICE = 0, TYPE = 3 CLRB LEVEL(R0) ;PRIORITY 0 MOV #1,(R0) ;MAKE LIST THREADABLE MOV R0,-(SP) JSR PC,TTYOUT ;AND GO DO IT MOV (SP)+,R5 ;RESTORE R5 MOV LPBUFR(R3),R0              E,$gu,PPPP    { 1R 1 SECOND DELAY JSR PC,IOQTME ;REV UP THE OLE TIMER MOV #CRTIME,8.(R1) ;AND STORE TIMEOUT ADDRESS TST (SP)+ ; ; CRSA20: MOV R2,MXCNT(R3) ;STORE MAXIMUM NUMBER WORDS (CHARACTERS) ;NOW, WE CAN FINALLY START THE I/O MOV #ENABLE!START,@CRS(R3) ; RTS PC ;RETURN TO HE WHO CALLS ;* ;* ;* THIS SECTION RE-DIRECTS THE C/R INPUT TO THE SYSTEM TELETYPE. ;*E LINE PRINTER NUMBER (1, 2, 3, ..., NLP)** ;* ** ;* R3 IS DESTROYED ON RETURN (IF NLP > 1). ** ;* ** ;********************************************************************** ; ; LPOFF: .IFNZ LPBACK .IFG NLP-1 TST R3 ;L/P NO. CAN'T BE <= 0 BLE LPDF10 CMP R3,#NLP  RTS PC ; ; ; THIS SECTION IS ENTERED BY TTYOUT WHEN THE MESSAGE HAS BEEN ; COMPLETELY PROCESSED. ; R1 = ADDRESS LIST ; ; LPDONE: MOV #0,R3 ;ENTRY FOR L/P INDEX 0 JMP LPDA00 ; MOV #2,R3 ;ENTRY FOR L/P INDEX 2 JMP LPDA00 ; MOV #4,R3 ;ENTRY FOR L/P INDEX 4 JMP LPDA00 ; MOV #6,R3 ;ENTRY FOR L/P INDEX 6 ; .=NLP*8.+LPDONE ; ; ;  , +. ), L/P 1 PARITY ERROR L/P 1 NOT READY  L/P 1 ABORTED &.%&  .,&f&f n 7,*0  XN  X.X  x *: 2  THE TELETYPE USER MAY REINSTATE THE C/R INPUT BY TYPING THE ;* CHARACTER 'BELL', FOLLOWED BY A ;* ;* NOTE: THE SYSTEM OPERATOR CAN ALSO SWITCH INPUT BY THE ;* COMMANDS: ;* CR,K SWITCH TO C/R : K ;* TY,K SWITCH C/R : K TO TTY ;* ;* WHERE K = 1 FOR C/R : 1, ETC. ;* ;* ; .IFNZ TTYSW ; CRSB00: .IFNZ BIN TST CRMODE(R3) ;CAN'T SWITCH IF IT'S BINARY  ;OR = BGT LPDF10 DEC R3 ASL R3 INC LPTTY(R3) .ENDC ; ; .IFZ NLP-1 INC LPTTY .ENDC ; ; LPDF10: RTS PC .ENDC ; LPON: .IFZ NLP-1 CLR LPTTY RTS PC .ENDC .PAGE ;********************************************************************** ;* **  LPDA00: MOV #14.,R5 ;RESTORE ORIGINAL LIST MOV LPBUFR(R3),R0 ;LPBUF+ ADDRESS ADD R5,R0 ;PLUS 14 SO'S WE CAN RESTORE BACKWARDS ADD R5,R1 ASR R5 ; LPOB20: MOV -(R0),-(R1) ;GET THE LIST FROM THE L/P BUFFER .IFZ $1145 DEC R5 BGT LPOB20 .ENDC .IFNZ $1145 SOB R5,LPOB20 .ENDC ; ;NOW, SET  $ (;,~0  \LC  :<},& w09mQ }, s33 5 &G,3 s3 3   " "; M,    M"&,2 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,$EXIT(R0) ;NOT BUSY. SET I/O COMPLETE ADDR MOV DATA(R1),DATA(R0) ;MOVE ADDR(DATA) INTO TTY LIST MOV R0,-(SP) ;* 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 LIST. ** ;* ** ;********************************************************************** ; ; LPQERR: CLR -(SP) MOVB ERRTSK(R0),(SP) ;GET ERROR TASK NUMBER TST (SP) BEQ LPQAUP REGISTERS AS: MOV R1,R0 ; R0 = ADDR LIST MOV LPDATA(R3),R1 ; R1 = ADDR DATA MOV (SP)+,R5 ; R5 = RETURN TO TTYOUT MOV LPRIOR(R3),R2 ; R2 = PRIORITY INDEX JMP LPIA10 ;THEN GO SEE WHAT ELSE IS TO BE DONE .ENDC .PAGE ;********************************************************************** ;* L P C L R ** ;*    w M"; M.V M2e2 ,$( ;0|&  :<}Tq*b,& f  n 4f,  )   ,s33 3 s/& 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-1 ;FIRST, WE NEED THE C/R INDEX CLR R3 ;FOR ONE C/R, IT'S SIMPLE! .ENDC .IFG NCR-1 ;FOR00 ;BRANCH IF AN ERROR TASK IS NOT SPECIFIED CLR -(SP) CLR -(SP) CLR -(SP) JSR PC,QUEUE ;QUEUE THE ERROR TASK ; LPQA00: TST (SP)+ ;POP OFF ERROR PARAMETER AND EXIT RTS PC .PAGE ;********************************************************************** ;* ** ;* LINE PRINTER INITIALIZATION ROUTINE. THIS ROUTINE: .fZ #}@2@MX@.MZ@;}G@@ ` @(V +@hb(b.b@t0-7  THIS SUBROUTINE CLEARS A LINE PRINTER ERROR BY CLEARING ** ;* THE MEMORY ADDRESS REGISTER, LPDT.K (K = L/P NUMBER) ** ;* ** ;* R3 = L/P INDEV ** ;* JSR PC,LPCLR ** ;* ** ;********************************************************************* 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 BLT CRSB70 TST (R4)+ BR CRSB60 ; CRSB70: MOV R4,R3 .ENDC .IFNZ $1145 DI  ** ;* ** ;* 1. STORES INTERRUPT VECTOR VALUES ** ;* 2. RESETS AND CLEARS THE LINE PRINTER(S). ** ;* ** ;* LPINIT SHOULD BE CALLED AT SYSTEM INITIALIZATION TIME. ** ;* ** ;*************************************************** 2 ` ;}G ;}G&(25, Pn -NXHMX",TTP  @ \T MZz,7 7    #}&PVz * ; ; LPCLR: .IFZ NLP-1 CLR @#LPDT.1 ;CLEAR MEMORY ADDRESS FOR ONLY ONE L/P .ENDC .IFG NLP-1 CLR @LPADDR(R3) ;DITTO, BUT FOR MORE THATN ONE L/P .ENDC RTS PC .PAGE ;********************************************************************** ;* L P L E V L ** ;* ** ;* THIS V #7,R3 .ENDC .ENDC ; CRSB80: MOV #CRTTY,$EXIT(R1) ;SET TTY LIST BACK TO ORIGINAL FORM MOV CRDATA(R3),R4 ;GET DATA ADDRRESS AND CHECK FOR THE CMPB #BELL,4(R4) ;RETURN TO C/R CHARACTER BEQ CRSC00 ;AND BRANCH IF WE FOUND IT TST ERROR(R1) ;THEN CHECK FOR AN ERROR BEQ CRSB90 ;BRANCH IF NONE MOV CRFRST(R3),R0 ;OOPS - SET ERROR FLAG MOV #7,E ******************* ; ; LPINIT: .IFZ NLP-1 CLR R3 MOV #LPINT0,@#LPVC.1 ;STORE ADDR OF INTERRUPT ROUTINE MOV #340,@#LPVC.1+2 ;SET TO 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 ;  SUBROUTINE CALCULATES THE INDEX REQUIRED TO ACCESS ** ;* LPFRST AND LPLAST FOR THE SPECIFIED LINE PRINTER AND PRIORITY** ;* LEVEL. LINKAGE IS: ** ;* ;R2 = PRIORITY (1,2,...,NLPRTY) ** ;* ;R3 = L/P INDEX ** ;* JSR PC,LPLEVL ** ;* ;RETURN WITH R2 = PRIORITY INDEX ** ;* RROR(R0) ; CRSB90: MOV (SP)+,R5 ;SET FOR FOR TTYIN RETURN BY JMP (R5) 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. ; ; CRSC00: CLR CRBKUP(R3) ;CLEAR C/R BACKUP FLAG INC REPEAT(R3) ;SET 'READ ANOTHER CARD' FLAG MOV (SP)+,R5 ;SET R5 FOR TTYIN RETURN BY JMP (R5) LPNA00: MOV LPVECT(R3),R5 MOV R1,(R5)+ MOV R2,(R5)+ ADD R4,R1 JSR PC,LPRSET JSR PC,LPCLR TST (R3)+ .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)+ PC .ENDC ;ENDC FOR THE BEGINNING .IFNZ NCR STATEMENT .END CRINIT  ** ;********************************************************************** ; ; LPLEVL: .IFZ NLP+NLPRTY-2 CLR R2 .ENDC .IFNZ NLP+NLPRTY-2 MOV R5,-(SP) ;SAVE R5 'CAUSE WE USE IT DEC R2 ASL R2 MOV #NLPRTY,R5 ;SET MAXIMUM NUMBER PRIORITY LEVELS ;BASIC EQUATION IS:  JMP CRIC00 ;AND GO START ANOTHER CARD .ENDC .PAGE ;********************************************************************** ;* ** ;* C R D O N / C R D O F F ** ;* ** ;* THESE SUBROUTINES ARE CALLED BY OPERATOR INPUT AND ARE ** ;* USED TO SWITCH THE C/R INPUT TO THE TE ;IN THE PRIORITY QUEUES CMP R0,R2 BLO LPNA10 RTS PC .ENDC .END  ; ; PRIORITY INDEX = NLPRTY*R3 + 2*(R2 - 1) ; ;WHERE - R3 = L/P INDEX ; R2 = PRIORITY ; .IFZ $1145 ; LPLA00: DEC R5 ;THIS IS THE WAY THE 11/20 DOES BLT LPLA20 ; NLPRTY*R3 ADD R3,R2 BR LPLA00 ; LPLA10: .ENDC LETYPE (CRDOFF) ** ;* OR REINSTATE INPUT FROM THE C/R (CRDON). THE LINKAGE IS: ** ;* ** ;* JSR PC,CRDON (OR CRDOFF) ** ;* ** ;* WHERE R3 CONTAINS THE CARD READER NUMBER (1, 2, 3, ..., NCR) ;* ** ;* R3 IS DESTROYED ON RETURN.  ;GET DATA 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)  .IFNZ $1145 ;AND THIS IS HOW THE 11/45 DOES IT MUL R3,R5 ;WASN'T THAT QUICK? .ENDC ADD R5,R2 ;THEN ADD IN 2*(R2 - 1) ; LPLA20: MOV (SP)+,R5 ;RESTORE YOU-KNOW-WHO .ENDC RTS PC .PAGE ;********************************************************************** ;* ** ;* L P M S G E  ** ;* ** ;********************************************************************** ; ; CRDOFF: .IFNZ TTYSW .IFG NCR-1 TST R3 ;C/R NO. CAN'T BE <= 0 BLE CRDF10 CMP R3,#NCR ;OR > NCR BGT CRDF10 DEC R3 ASL R3 INC CRBKUP(R3) .ENDC ; ; .IFZ NCR-1  ;SAVE 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 R ** ;* ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO THE SYSTEM ** ;* TELETYPE. LPMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS: ** ;* ** ;* ;SET R3 = L/P INDEX ** ;* MOV #DATA,-(SP) ;PUSH  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 UP THE INTERRUPT VECTORS MOV #CRINT1,@#CRVECT ;STORE C/R INTERRUPT ADDRESS MOV #340,@#CRVECT+2 .ENDC .IFG NCR-1 !5,-(SP) ;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 R#DATA BUFFER ADDRESS ** ;* JSR PC,LPMSGE ** ;* BNE ;BRANCH IF LIST WASN'T AVAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. ** ;* ** ;********************************************************************** ; ; LPMSGE: MOV $ 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 #8.,R1 .IFZ $1145 ; DEC R2 BNE CRNA10 .ENDC ; .IFNZ $1145 SOB R2,CRNA10 .ENDC %TS PC ;EXIT TO CALLER .PAGE ;********************************************************************** ;* ** ;* LINE PRINTER INITIALIZATION ROUTINE. THIS ROUTINE: ** ;* ** ;* 1. STORES INTERRUPT VECTOR VALUES ** ;* 2. RESETS AND CLEARS THE LINE PRINTER(S). ** ;* ' 2(SP),R4 ;GET DATA 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 ;* MO( ; .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,(R2)+ ;SET CRLAST = ADDR(CRFRST) CLR (R1)+ ;SET CRFRST = 0 .IFZ $1145 DEC R0 ;DECREMENT COUNTER BNE CRNA20 ) ** ;* 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 TO INHIBIT INTERRUPTS ON ENTRY J+V @#PSR,-(SP) ;SAVE 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 ;AND TRY, TRY AGAIN .ENDC .IFNZ $1145 SOB R0,CRNA20 .ENDC .ENDC RTS PC .ENDC ;ENDC FOR THE BEGINNING .IFNZ NCR STATEMENT .END -SR PC,LPRSET ;RESET THE L/P JSR PC,LPCLR ;AND CLEAR THE L/P RTS PC .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)+ .IFZ $1145 / MOV R5,-(SP) ;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 C DEC R0 BGT LPNA00 .ENDC .IFNZ $1145 SOB R0,LPNA00 .ENDC RTS PC ; 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 .END ND.E C ND.E CTSE.C PC S RT 10NALP O BL 3ONDITION RTS PC ;EXIT TO CALLER ; TYDONE: CLR DATA(R1) ;SET I/O LIST AVAILABLE RTS PC .PAGE ;********************************************************************** ;* ** ;* L P O N / L P O F F ** ;* ** ;* THESE SUBROUTINES ARE CALLED BY OPERAT 2 ,RR0 P CM S UEUE QTYRIIOPRE THN ;I + 0)(R R CL )+R1,(R0 V MO : 10NALP ; 2 ,RR1 V MO R1T,ASPL#L V MO R0T,RSPF#L V MO C ND.E C ND.E 0 A0PN,LR0 B SO 5 14$1 Z FN.I 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,(R17OR INPUT AND ARE ** ;* USED TO SWITCH THE L/P OUTPUT TO THE TELETYPE (LPOFF) ** ;* OR REINSTATE OUTPUT TO THE L/P (LPON). THE LINKAGE IS : ** ;* ** ;* JSR PC,LPON (OR LPOFF) ** ;* ** ;* WHERE R3 CONTAINS THE LINE PRINTER NUMBER (1, 2, 3, ..., NLP)** ;* V MO 5 ,R3)(RCTVELP V MO : 00NALP ; R4.,#8 V MO 2 ,R40#3 V MO R10,NTPI#L V MO 0 ,RLP#N V MO R3 R CL 1 P-NL FG.I ; ; C ND.E /P LHE TARLE CND;A LRPC,LPC R JS /P LHE TETES;R T SEPR,LPC R JS Y TRENN OTSUPRRTEINT BIHIINO TET;S 2 1+C.PV#L,@40#3 V MO NETIOU RPTRUERNT IOFR DD ARETO;S .1VCLP@#0,NTPI#L V MO R3 R CL 1 ; ** ;* R3 IS DESTROYED ON RETURN (IF NLP > 1). ** ;* ** ;********************************************************************** ; ; 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 P-NL FZ.I : ITINLP NTPI.L CTSE.C ; ; * ********************************************************************;* * * ;* * * E.IM TONTIZALIIAITINM TEYS SATD LEAL CBED ULHO SITINLP ;* * * ;* * * . S)R(TEINPRE IN LHE TRSEACLD ANS ETES R2. ;* * * S UEAL VORCTVET UPRRTEINS RETO S1. ;* * ? INC LPTTY(R3) .ENDC ; ; .IFZ NLP-1 INC LPTTY .ENDC ; ; LPDF10: RTS PC .ENDC ; LPON: .IFZ NLP-1 CLR LPTTY RTS PC .ENDC .PAGE ;********************************************************************** ;* ** ;* L P Q E R R ** ;* TH * ;* * * : NETIOU RISTH E.INUTRON IOATIZALTINI IERNTRI PNELI ;* * * ;* * ********************************************************************;* E AG.P PC S RT T XI END AERETAMAR PORRR EFF OOP;P + P)(S T TS : 00QALP ; K AS TORRR EHE TUEUE;Q UEUE,QPC R JS ) SP-( R CL ) SP-( R CL IS LITTLE SUBROUTINE QUEUES THE ERROR TASK FOR EXECUTION. ** ;* ON ENTRY, R0 MUST CONTAIN THE ADDRESS OF THE I/O 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)