-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@ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆÈÌÌ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDADD-B C•àUÀ7vᛕàSÀÿs(›©: 4dì '›¤œQÀë+¼›’M²ZTÀ7+‡Òý›ìJnþ›¤œ^ë·Ç›Û}Ú}PÀÀë›ër�VŽíËCÓ›”Mœ4dóÌ›ï ›Û}Ú}^ ›$DÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwW]UUÝ�™™™ÉÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8ŽÀ:ÿ à`àÀÿQ$àÈ‹þ€È �@ Ñ BàC ý†à  ` éYÿ\—rX\ t ì€W3=†‚:LïsrP˜ÑSUoU| CyW. ôyX N`YÀI 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 ;I‹UEST 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 ;N�ES 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) .EŽNDEX 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 (1‘NDC .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 THE”35) .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 10�VE ;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 ERROŸOW 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/R 0 ;NOT USED (174) .BYTE 100 ;NOT USED (175) .BYTE 100 ;NOT USED (176) .BYTE 100 ;NOT USED (177) .BYTE 116 ;+ (PLUS) .BYTE 301 ;A .BYTE 302 ;B .BYTE 303 ;C .BYTE 304 ;D .BYTE 305 ;E .BYTE 306 ;F .BYTE 307 ;G .BYTE 310 ¡ (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) .BYT¥CONDITION CODE MOV 12.(SP),R0 ;RESTORE R0 MOV 14.(SP),12.(SP) ;MOVE OLD PC UP ONE NOTCH IN STACK MOV (SP)+,12.(SP) ;MOVE CC JUST ONE NOTCH BELOW PC MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 ;STACK NOW LOOKS LIKE: PSR (CC) MOV (SP)+,R2 ; 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; häb“h�çb; hçb“h¯”÷æ, 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,<=>?ðaâãäåæçèiàklmnoé!"#$%&'()*+,-./},@`ÑÒÓÔÕÖרYZ[\]^_ÙС¢£,d¤¥¦§¨ ª«¬­®¯©ábcdefgh êëìíîïPÁÂÃÄÅÆÇÝ,ˆÈIJKLMNOÉ À�‚ƒ„…†‡ˆ€Š‹°,¬Œ�Ž�‰ABCDEFGHÊËÌÍÎÏj‘’“”•–—˜�š›œ�žŸ+,ЙQRSTUVWXÚÛÜÝÞßp±²³´µ¶·¸°º»¼½¾¿¹qrsG,ô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ÁÂÿ,„ÄÅÆÇÈ@@K�´L;É@@@@@@@@@ @@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. MOÍAS 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 ~¾0ÜN ; 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-1áCLR IGNORE(R3) TST REPEAT(R3) ;SHOULD WE READ ANOTHER CARD? BEQ CRCLOS ;BRANCH IF IT ISN'T ; CRIC10: MOV CRFRST(R3),R1 ;GET I/O LIST ADDRESS JSR PC,CRSIO ;OTHERWISE, START THE I/O CLR REPEAT(R3) ; CARD' FLAG JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ;* ;* THIS SECTION CLOSES OUT A REAâTIVE,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~~4ä23 .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~^6è322,123 ; P Q R S 160-163 R .BYTE 324,125,126,327 ; T U V W 164-167 .BYTE 330,131,132,NON ; X Y Z 170-173 .BYTE NON,NON,NON,NON ; 174-177 ; ; ; .IFNZ INEBC ; ; EBCLP: .BYTE 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 ; 054í256.+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 .IFNòT 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,NOõZ 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.÷XpF¦÷€B¦ßußà÷èo¢¥~vZ÷àž¥÷´‘¾¥÷ລÁ€÷6kž¥wœ¥÷öh˜¥w–¥� ÷6k8¦w6¦÷öh2¦w0¦÷È¥÷ Ä¥÷ À ÷ „%÷ ä%÷ v6÷ &Áñ•ïx1ŠxÁ ñnpw_]~îZtÂÃRÒÒÒ Ãe� W #ó      wR$Qä_:[D[R[`[n[pþrþtþ 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*[ñÈ ó,*[([&Ÿþÿñ¥÷ ²¤…„ƒ‚�€¤‡æþÿ€ ¶ ¶ …„ƒ‚�& ætwˆŸþÿ3.[»~V\ñ‹óÆb6[óÆe6[_BbËæd[÷ 6ó´"[Å:[õ†_fæ<÷ 4 Ö ¶‰ ó ,[æt[÷ Mó 2[_~bpþ.Àpþ÷ dþMwÀ5€ûB~Î\À5@À5ó3$[À:[ðN_&æ÷ Ô Ö ßE@pþM3 2[ó 4[Á([÷ Ü3 4[MæþÿÀ þÁ.[Éþýó Z[‰ ßàþÿ·ðý÷([êýŸþÿÄ:~F]èýÈð¥ð¥@ ƒ ÿŸ†¦æ&fÈ …„ƒ‚Ä && ÷ J!Ö Â ßEApþ3 @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Á.[ÁeÁl"[ÂV[  -Ä`[Ä Ä Ä Ä ³ V[MÄ`[ ÑÄ Ñóe"[ó &[ó1�îÄ`[Ä Ä Ä Ä ÑÄ ‘óe"[U~6^ó &[àÀ1ÚÉ^`[óe"[3 V[ó &[M³ "[×,"[Ä`[! ³ 8[*! ! +! ó &[¸Âb[Âl6[Á.[ÁeÁl"[¡’ó &[ªÁ([ñ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Ö ‡_Æeû5^[ ó "[ï…Á([v~ž_ñwlý…wXý_ŒbÅD[æþÿßàþÿõ 5 Ÿþÿf÷ î…_–bŸþÿ…_œb1 ‡3 "[3 2[s 0[3 V[ó 8[À.[ �  sZ[3 Ì~`$[ó,[Á:[fæ÷ œñN_Ö ³&[ûA^[‡ó Z[ßÀD["Úðb`p &÷ ö‡ ñä_Ä.[ô¥ ñ À([ð…wˆü3 ÿ~Ž`8[³ 4[…wbü&aô(À0Šxð•Î~aïx×-¸÷®À ðš`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)K‡æTa÷ Zúß xÿù_`b6÷ væTa÷ z_nb"ë÷ Rpa¤bÄaPØ~~aÄÿß~öaß ê_Á([_n\ó Z[ó &[_Ì]_X^ßHpaŠVa_:a3~nbßPpaß•Va_&aß5@pþM_]„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:;<=>?ðaâãäåæçèiàklmnoé!"#$%&'()*+,-./`ÑÒÓÔÕÖרYZ[\]^_ÙС¢£¤¥¦§¨ ª«¬­®¯©ábcdefgB~>eh êëìíîïPÁÂÃÄÅÆÇÈIJKLMNOÉ À�‚ƒ„…†‡ˆ€Š‹Œ�Ž�‰ABCDEFGHÊËÌÍÎÏj‘’“”•–—˜�š›œ�žŸ™QRSTUVWXÚÛÜÝÞßp±²³´µ¶·¸°º»¼½¾¿ê~¶e¹qrstuvwx0úûüýþÿCûE!^[_Š_n|ù@@@@@@@@@@@@@@@ðaâãäåæçè@@kMl±@é@@@@@@@@@@@@@@@ ÑÒÓÔÕÖר@@[\µ^jÙ@@@@@@@@@@@@@@@Z@@@@@@@~.f@@@@@@@@@@@@@@@@@@@@@@@@NÁÂÃÄÅÆÇÈ@@K�´L;É@@@@@@@@@ @@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@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@æþÿßàþÿþ% f…µ…ŸþÿŽ6 ‡Ÿþÿwt"öeþðf6 ‡pÿ€àtÿ„àrÿ‚àvÿ†à~g4g@gLgXgdgpg3|gŽo3|gŽo0}g6n0}g6n3~gÒo3~gÒoÿÿW~–g¢g¤g¦g¨gªg¬g®g°gw x÷ ¶ ÷ b÷ ìñ‹�g.·•˜¬w ^އœ&& && ÷ ¼Ö ,Ÿ~hˆ ëœ ôŠ{x¬âw "ö�Ò—& ÷ ¢w<±Š�g5šgñ‹gX ;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·•®—÷ 2Åw ä÷ "ÈÄ÷ Ì÷ Vñ‹ƒgµ±Šƒg5žgñ‹g®€1ŠgãQ~†hw ´À g  güÁw~þÀ4gHÀe  |gúÀgŠ ²güÀgÂÿÿ�� �güŠ …güÀ—gP� šgüÀ²gÁ¢gPÑ W ²gûw V‡‰Á�—ÁE¬~þhðÿEÅ ÷ ºñ‹‘gD,gô•·•â–ñ•…gDœ�gÄ |4i1Š‘gw*Pidjtj€jŽj¨jºjÈjÖjêjòjkkk±Š‡gW¬‡gH@š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_j1Šg÷ ®¢g %¢gÄå¢g·•Ε±Šg5šg 1Š�g%¢g·•´•5žg÷ 4w 1ŠƒgñŠg·•œ•÷±Š^~fj‡gf,g÷ xÖ ïñ•�g1Їgôý• gñ•�gâñ‹•gý• gñ•�gØ1Š•gý•Ugñ•�g±Š‡gÌý•^gñ•�gö}œ‹ggñ•�gﱊ‡gý•R~Þj gñ• �gå1Š�gwjþý• g1Їgñ• �g§ý• gñ• �g 1Їg@žgwrþñ‹—gw&ÿý•gñŠ—gwÿ‰Á�”ÁEðÿEÅ D(gô•@žg d~VkÊ €f,gæ÷ Ö DŸg+ÄÅ€¡|¡ n¡ *¡-ƒÃeƒl¡.ñ‹‰gB¦ÎEÀ–,I²  ‘Ê €Ê5@Ä =‘gC(gó•~ÎkÊ5`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îý•^gñ•�g2 ïò äò Ê Þ�à ñ‹‰g ±Š‰gÄ•\ñ•�gñ’‹gÐÄ’Î1Љg²  ‘1‘‹gÄ•\ñ•�gÁñ‹�gÀ±Š|~Fl�gf,g÷ ˜Ö ¸½Š g½=‘gñ• �gf(g÷ |Ö ²Ä•=‘gñ•�gò€÷ :È 6·•n“œ8w ”í5Á W<0Z4ñ5€0Z<Aœ0Zp� ¬,Ø~¾l¬(œ— &0Š Ãê  ÄÜ0‘ ´Š{xCà Ń`0 ‡ˆ ·•“ð‡ð‡ð‡ð‡ð‡ñ5@0ZìA:Z°÷ �~6m>÷ †<²g4²g·•¶’‡&÷ &÷ n¢gü¢g4¢gÀe¢g4²g·•Œ’€‡fÁ Á �`D`Ä �‡‚ñ•…gñ‹—gCD0gô•ð1Š“gñ‹dT 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 gg1Š�g@«~®mšg 4 �¡ ñ• �g=‘gf,gæýÕ@g÷ �Ö J@žg 3 1Š�g1Љgñ•�gDŸgÄAË5@Ä =‘ gf(gæÝñ•—gñ• �g¿~&ný•gf0gæðÏw Ã�?ù³Š‘gÅÅ AŸg7Š/ùóŠ…g~ó‹g@šg@žgð÷®ø÷¬ø7 ªøœÄ ô5@0Zs:Z ò5€0Zlò50Zhô5\~žn 0Z„êôU 0Z=Šg=Š g�œ0Zp� w`ø÷ ¶B   Âe²gÅ Å @Àe¢gÅe²gÄ÷ Ú:JÒ  Ä ÷·•‘÷ Àñ‹g!ñœggñœ�g�gñœ~oƒgƒg EÅ µšgšgµžgžg·•Ì�æ÷ Nþƒó•ÿÿg3Š�g3Šƒg ·•°�õ}�gf,gæ÷ Ö 3Šh 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 ;********************************************************************** ;* k‘gw à‡ó‹“gﳊ“g÷ ê×-œ÷æg÷ œ‡È~Žow ¬Á�æ÷EÅ =Š g±Š•g7ŠÖ÷@žgðý•^gñ•�gw Ї¦ö�6�÷Õà.�‡f&Á�¤÷Á � ±Š—g„�‡æ &€¶6À ˜À  (‚ò~p6p€ ù‡pÀz˜|Ú~¦|ö}ð|n‰è‰Z�œ�ÂgVhp¨t6t¸u¢u(v&æ¦f&MÖ €�‚ƒ„…‰æ& æ & ÷ X Ö wøqæ~~p ÿÿEN´rDS¸rQU·~öp¾rXXÄrTM®sDTàsREÒqEX÷6röæþq÷ ¦ö÷€ê÷ râæl 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 oþq÷ &÷÷ Ò÷%Ò7 zÿ÷Êvÿ÷Ærÿæ¼p÷ à�Ö ÀÂp$È ü€w: æ³~nq(r÷ Nö÷’÷ rŠ7 Žæþq÷ Êö÷ vëÅrDÄå�Ä ÃìpS# Ó Ë û÷HrVæþq÷ ö×Ë ÓÕ Û Å Ñ÷Vr:ñW¥,Ä ! ‚÷ ––~æqÅ 7!@èÄ ôE 0Z‡ ‡@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 ** ;* ** ;*************************sy¬r÷à�ô¥x4Šx·ôŒ‡÷àìŒô‹x­x ·ÚŒ÷dràþæþq÷ �ô ‡ô•x·¾Œ‡&& & & ÷ rM~NsÖ ñè&÷ – ‡ HH:MM:SS MM/DD/YY islsos}szsws�Ä÷ æþÅ &ÅeÀ õI ưÿ‡·ªÿW¥, !ôÀ÷ ÆÿE~Æs÷ zÖ ì‡À‘Á€sÂdsw*·xÿW¥, !ÛÀ÷ ”ÿ÷ ‚æÀ‘Á†sÂrsÅÈ æ^s÷ �DÔ�DÿÔ�AÿÅ õÅ ·Þýæþq÷ Žó‡æ w ü�ä~>t¶ Ñ‹À D”Ä¥ À ùD”Äå0�¡ ‚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 ; wžtÄ �Õ•+Á•  â€d Á0B`•�È ôÄe0 ‘¶ w ^û–%‡Õ•- äÒ‹åÿÿ·ôÿ·îÿ·èÿ·êÿ· Þÿ÷  ÷ Œæ¨~.u÷ ¢æÆÿæÄÿÅfuľÿüÿ·¸ÿÆxf&æ¦f&ê÷ ö÷à’Š÷ Œÿ�€�‚ƒ„…÷ 4÷ rÿÆvÿ÷ Ü í÷ êwÒ æXŠÿ~¦uæ÷ 7 w¾ ÷øÿ‡Àuÿÿ¤vÔu) ERROR XXXXX SXXXXX SXXXXX SXXXXX SXXXXX Þuåuìuóuúu·øÿŽw ú�~v¦Åêÿ w ú…æʉ÷àÄ‰Í €ÿw|ÿ· zÿ·®‰w öùއ� ø7 ®ÿÅ\ÿ'wVÿ÷ÀuPÿ·ˆ‰Ävf&÷ &þÌ 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ÿÅå ÍæÜ~–vÆu÷ &ñ÷ nÿׇ· fÿæR‰÷àL‰Ö÷ÿÿ ÿ·@‰‡ÿÿÿÿ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¢~Þy€MXCNT(R3) JMP (R5) ;EXIT TO RESTOR .ENDC .PAGE ;********************************************************************** ;* ;* ;* A L P H A N U M E R I C M O D E ;* ;* THIS SECTION CONVERTS THE CURRENT COLUMN CHARACTER TO THE ;* SPECIFIED FORMAT AND STORES IT IN THE DATA BUFFER. IT ALSO ;* CHECKS COLUMN 1 OF EACH CARD FOR CONTROL INFORMATION (FORMAT ;* OF CARDS, ETC.). ;* .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ß�þÿ���ïxW Á•¡e?†r� ß•àþÿÊ 2Á ¹Üv±Ó~F{Üvô•x4Š{x2 ² Ö ß�þÿw äô÷ Lúö ¶Æe‡öþÿ¶Æeæ÷ DwÞŽ Ž Ž Ž Ž Ž Ž 6 ¶Øæ&f¦÷ D„€J~¾{ƒ•À Ìé禶¶„ 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 ÚúŸ•þÿæ¦f�vÂÀú ‚w²� 6 ²€6 „Ü×þÿß•àþÿÆšú&ò¼å~6| 7 ¶ÊÁ ô•x¡e‡ô•xß�þÿ&÷  ƒ‡ô•x€œ À Ä <þvw0wÜv0wþvß�þÿ‡Ÿ•þÿŽŽŽ‡æ—þÿ& ÷ &ÿwÎß•àþÿÀ4~®|ú ÜÈ1Šx7 ú7 *7 êø0 ÆöùW e‡±ŠxŠþÿf÷ ƒŠþÿw„w Jó €Ý`7 Æù]‚æ—þÿß•àþÿœxÁ y}¸}¸}*}@}p}p}¸}¸}J~&}¸}p}Ÿ“þÿ&÷ ÂÖ @ß•àþÿ(Á€ù1 7 xù7 ¢7 bø�ÁeÆlùfffffffff e ‡ð•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 WASNŠV (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Ä}Ð}Ü}öÕ€ÿÿ6Šÿÿw @òæ—þÿ €f€Á‘7 °øÜ~~_‚À w€ ß•àþÿœxÂå  O . ,ÂåIð•xŸ“þÿBœ  ƒþv>C ÄÃû8ß•àþÿW"2ò þv rþv òþvÜv²`ÜvL2×~Ž~ÜvÉÀ � e†1 ð•xŸ“þÿ&&÷ J�€ ß•àþÿ0ŠxŸ•þÿvw zñ‡… … … õw `ñ×þÿ&  „Ý=7¡Ö÷:‚ß•àþÿ­x5ô•x~¡e ‡ß�þÿæ�&÷ 耂ƒ• #Ä w„ Ê �œ Á ¹Üv±Üv´Šxß�þÿ¶w ñö އö—þÿæ÷ tüwŽ Ž Œ ;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 öÿ÷ ~~D÷d÷ 0öaÄ<÷Ä  Ã÷ ÚÿíÂ`ò þv!÷—!.* áß•àþÿ÷ ¶ÿÛ�þvwþörþv²ÜvòeþvÜv EÜW­xŠþÿÙw‘ÒöµŠx‚ ·�#~öÊö·ÎöÉñ @œÀEÿÀ @`ÀewÔ& fw ÆF€ 6 vœ �‚ƒ„…þ7 nö7 lö7 jö7 ÿÀföÀ 0 þvðþvÜv7~n€0`ÜvÀåöÀtÁè1 wð•x0Š{x0Šïx0Šÿx1 yá À ðÀÁè}ÙÀ ü‡ÂÀ ÁÆv ƒ W"tÁqð€w¹w¹ �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×~Ö�N‚T~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 會 ˆæ& & & ˆÖ õd„2 ~.„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 æ�… ˆæ& ˆÖ ÷T†2 «~†D† TASK # 9 æ6† ˆææˆÖ öü†2 lœC H E K ** ;* ** ;* THIS SUBROUTINE CHECKS THOSE PARTS OF THE LIST AND DATA ** ;* BUFFER WHICH ARE COMMON TO BOTH THE ORIGINAL CHECK (WHEN ** ;* QUEUEING) AND THE RECHECK (PRIOR TO INITIATING I/O). ** ;* ANYTHING THAT COULD CAUSE CREAD TO HONK UP THE REAL-TIME ;* SYSTEM. LINKAGE IS: ** ;* �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 ¼~v‡7  € ·  ˆú ˆ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 USED¡E. 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 ** ;* £l‡÷þÿv÷Eàÿp·j·%~fˆd· ^÷ TîþæFî÷ rô²ˆ—"¾ˆ—"& ¦’$Ò�$îÊ�0Ò Ò(Ê ÷ díwÂöZZßæˆßà,~Þˆ÷~‡ß‰·n·!ÖíƒÆÐíw @ç· ZÀ g& gü‡·Nþßæˆß@fÿÆ:Àg¨ gü‚÷(.÷ *æb‰÷ âì×'xÿÿÿwòÐw ôæó~V‰Æ[æŒv÷à†v&×-¾‹‚€È ÷e?ð �6 °È €¶Èeø¬ÿÿôîð�þì¶ö˜|Ò~Ή÷•K¶üÿ÷ŠCû& Æå Û¦öv÷àvw 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 ·  ÁeÀ‹BA  ûJ³à‹É6 ¤~FŠw æ0œŒŒ€ ð‹Œ"$·ŠÀô‰À*÷å"ȬÿÿôœÁEðÿW íÁ 9à‹1à‹ æ7`u ðŠŒÔÀ À À `ÁÀ‹`÷àDu7�fÔ~¾ŠBA<W¬ÿùñŠöCEqœJ°à‹É…7uœó‹æœ& ‹€÷ Òó & Â5@Î& ÷ ¤ïÖ ÂŒ€Ó ÂŒ€ûÜÓ$ÂŒ€û Ð~6‹A¼÷“ä÷ â±ÁÀ‹`BA«W,ÿú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 GOªUFFER ** ;* ** ;* ON RETURN, R4 CONTAINS: ** ;* ** ;* 0 = VALID REQUEST ** ;* 2 = ILLEGAL LIST OR DATA ADDRESS ** ;* 4 = ILLEGAL RETURN TYPE ** ;* 5 = ILLEGAL I/«dd~&Œ7Š"÷ Ä@÷¼÷ ¶:· °7fÁxêñ‹Ëv)÷-lêt�‰À`êð•x7”s÷ ’s÷àŠs÷•Ô& æfu¦Á Bþv¹Üv±Üv±þv9 Üv‚°~žŒ��æê÷ Dð& æt÷Š„7Š˜&fÀ:�Е<ˆŠ¢<9·Š€ŠˆŠ¢<2ŠˆŠ¢-Šˆ "ÁPP�P�ˆŠ÷•)÷mäÿȵ· Úÿ~�·Š Á@�@”‰Šp¢-� É•¡Š÷ø�À÷µ÷e²�€·Š÷µ‰–%!À˜G7–r&÷ ^·£Í< ·­¿7·­´2÷à×~Ž�nrÆe"߬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 O­T'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) ;STORE®O 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 LPKE¯2 È7VrB €f÷ ÷ DÑ &÷ –Ö Â‹ ¦�& &  €NÑ & ÷ àìÖ Â º€yܶÆe÷àr÷•ÿÿEwdç÷àí~ŽöqÀöò÷åîÈð5ô7Úq&÷ ¢ð5ðE÷ —-?ö�ð—- ö�ã·­Ú¶ Î Î�ÑÁ‚·£É  ·­ì~~Ž»·­°Ñ BÆe�‚¦÷ (Ž-ô ¶-ï¶- êÆeÆe ˆšæ ¦ƒÅöEÀÿà à ÃÃEàÿöÅ… … … ¹~öŽÅEàÿv‡…Ã�;Õ`Ã�1Õ`Ã�*Í`Í%<Íå<µ þÿå%ÍåŽ Ã�Ü-�Î ÎàÎÎ Î Î ö¶ ¶ ŽUŽU°‡¦öžp&÷à”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È Èe÷et?p6 È €¦ö\pw –à€÷àLpÈ%È%ÿÿÅÁþ�BA  ûJÉ6 w làÁ�Å f~æ�ïøðUòø�þ��þ��Gÿ&€ö°o <†—-‡è~^�€÷à–o7�Ðÿ·�Ëÿ÷Âÿ6 ðw ¼ß€Àeàlo üÿ× 0‚÷•�ÿ÷mHüÁ5·Š}ÿ· :ü³ -�‡Âœ-�æÀ.� à ”Daû„`ì~Ö�>�÷à o‹÷ø�ÿÓµ÷eÿ“�K�6 w JßÖ ¡±æðn÷àênÆå 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è~N‘DúÁ% Á ýÀÞ‹Á1à‹à Á Á úÀŒÁ1˜ŒÁ ü÷•ÿÿžú÷•ÿÿ¹þ7Š•ú7 bþ÷ø�^þ÷�dþ7 Pþ÷’þ7 �þ÷Žþ‡æàæÀ‘wžøæàæ6~Ƒ̑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 ;ILL»9~.“À~¦“òœîœòœþœ.*DZ.*Àv"[ÆbÆfÿÿÿÿÿÿ.Ÿ.Ÿ.Ÿ.Ÿ.Ÿ.ŸØ~”.Ÿ.Ÿ.Ÿ÷®k¢ÿ÷¸k¦k÷–ÿ÷•ÿÿx 7Šr wÆ÷�k„ÿw È7tÆä“ÄãžÃóžw ¦ 7^w ìw >~–”Ä�\ÿŒŒŒ7‘Zk7Š0 ÷•ÿÿ, ÷àZk÷"›Rkw¼RROR 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 L¾EGAL 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 „ &DCƒcà ÷Ú w 2w ΄·ŠÜ w ð  –~•'  7ŠÈ Ä´ „ ‚ ¦&w ¶„‚À•\w ¶wXw ºw ö�Ä øfw |÷•t €w „7Š€ wtwhw ŒÄŸ  Ä%-Ÿû‚ÀEøÿÄ ÄeS~†•ä“‚ whÄåŸ÷À6 Áßž÷ æÀ=w F·Š6 À�/ w :À�( w 2À�! w *À w "w *  7� w 7�þw 7Šø7�óÀÒžÁßž÷ JÄÔN~þ•Âwð7ŠØ  wèw (‚b‚ ‚ ·®wúw ‚øw �A�Á � � B`ï÷ r÷%„€…Ö w|÷‹„û 7Štwr÷•ÿÿjwh·Šgú~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 INIÁIST .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 Ôpwh÷‹P ÄEøÿÄ Ã t”Pà õôÿÿ”Iw Û×-ÉÂ% w ’ ÿÿÀ=w ÀòÁê7Ä í” ~î–À=w øÀÀe0w ìÀ,w äÂ%ÀÀ@w ~k÷‹¾ÄØüÂeÀ=÷–w ´@w Xwºüw’·Š¬w¢À=w – w ü ÿÿ{~f—Àdw *AÀe0w vÀ,w næH÷BÀFw ·6-À ÷.27ì”,€ â÷÷‹( ÀBüÄ:üÃ8üw Ö÷üðÀ?w 7 î<~Þ—w ò7Šø7Šó7Š     w À%0 ‚À%7‡ÀEøÿÄ Ä Ä `‚ ð 1 Ÿ� W Ö†ø÷‹Ì ÷‹©Äm¼7ŠºÁ yD˜|˜Š˜”˜è˜j•’šø˜–ô˜ÄTIALLY ** ;* 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 Çú~V˜N™r–™š š`™Þš$–,–V–Š–—H—¬—Ê—P—”•Ú”¾”ƒ·ŠZ7ŠU´÷<D ÷2 7.7(÷% Ä„ î‡ÀÀŸw Ô÷%‹À•~Θ=w ÀŸöw À• w wúþ÷ ÈwêþwÞþ·ŠÞ÷ Ðù÷ ²÷ Ð÷ÄÀ7ŠÄ÷m¶¶÷²²w ¬æ¦÷ Àžw ®·”Ö%À/w ¨s~F™¯À\ú÷ zÔ÷ \÷íppÜÀ.ŸÄ à … L‡Å Äe”  ! ”B†Ô ù! ”=‚L® !6‚4”4 $”¤ À.Ÿ!ž‚4”ô6”4 $”’~¾™Ô ô÷%À w à ÅíôÅ Å @w ´@€ ‡À%€ÿ À%÷ Òw š· ÊwÜýwÈý�  à ù÷È ** ;* ** ;********************************************************************** ; 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 I˲ÂÜùÄÖùD · Ôù¼‚€Á &C@A~6šƒEPA&f¦æw „€w ’À/w –€w :ƒ‚�„w ÐÒ Û åƒ`ƒ ƒ Å ßÀEÿ�¯À € € €` Õ÷‹H·à µ÷•8… °‡Å wFù÷•­~®šàLew ¢7Š÷U4ù÷‹÷E(ùw T76æùæù÷‹ü‘À�òÀ‹� ‹à p$”÷•àew V×­ÔÖ÷‹ÊÓ÷•àèd·Š¿÷UÔø×·Ìø�~&›·Êø÷•ª7¸÷‹¡¾w @÷‹´ø€Å�¬øÅ�¨ø¯ŒŒŒŒw‘¢dÅ’ø÷‹t�å w†øÄt!”Ä Ä úw ¼w JÄôžÃõžw ž@÷eZø%Ä•/~ž›t”7‘2ô $”ªô$”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 úwîû·â·ü÷Æð“f&æ¦fæÌæ €Ö ·Â�‚ƒP~œ„…ÆÒ÷æ°€Ä4”6”üü”Ä Ä ÷…÷�0c™÷�.c”7Š$c7Š$c÷‹ cý€…w r÷‹cý€÷5c÷‹cý€÷�gúb÷�bøb…÷‹V  <6””„ 8~Žœ„ !ø…ÃÄþÿ÷%&Ãå„ À&Äe N @ Ä üÀe0w &à óÀ• Ö Á”Àÿÿ …÷‹‚bý€7�~b…÷‹rbý€À�nbÀE(~�€ÿÀ¥÷‹Ð  w Ðÿí÷‹¾À¥ ç…Ä ã‡•w ¶ÿú×­4b• À•^w ¤ÿÀ•Uw œÿÆä“w€ú… ÷ÿÿn÷ÿÿj  ‚7,”X‚ÁRìO~~�”Á-P‚Ð ðÀD…w@€ 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~ö�77Ðw ZÿÀ Àe0w àþÀ,w Øþæ²÷¬À°w pþ· ÷ÊœÀÆ…ÀÀ÷ºŒÓÄýÿ C”Ã¥ Ã¥$ × A‡Ãå ÃåÃå Ãå ø~nžÂ   ¦  ‚eÂ`„ ä�‡ÅýÿÂÆž ‡€âƒ ûË× Ãe ÃeÃe Ãe Ñ�Ò … è€Ð ‡@(ÒeÒe ÿ@€ s~æžODT-11R V002ABE"[ÒeÒe *;/\ $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Ç÷ êÿÍ À‹â„ †¿Ä LÀŸ÷0ÖŸê÷õwZÿÁÂê‰ É‹þ€rœŸ· îÿõpÿ–DZ[Ø******************************* ; 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,òÁ ÁeÁlÂ4  -Ä>Ä � 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 ;CÝ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 ; .ENDC ; ; NOW, LET'S CLEAR THE QUEUES OUT ; .IFZ NCR-1 CLR CRFRST MOV #CRFRST,CRLASTÞIFIED, 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Á ÁeÁl¡’ó ªÁñô@  $ï.Ô³ 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 .CSEâV 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À<ÀU3æB÷ Nó´M<"B,ß,’ñ¬; <fæ<÷ Ö ‡CûEA<µ¬ <©: &<ó,¶û5< ó ì…Áñw>ý…w*ý4<x0Ú„fÅ"æþÿßàþÿõ 5 Ÿþÿf÷ z "*9€aT0…ޤ‡Ÿþÿ…Ž´‡1 ‡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"& ·.NÁfæ<÷ ñtÖ ³ûA<‡ó 8h"©: t"<(8Ç0tßÀ""Úðžp &æ0÷ Ö ÷ Ì""ž 0$œ:mm*9€p::,œ‡ ñÄ ô¥ ñ ÀðÞ  "}0À…wJü3 ³ …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 ó.’M²Z¯”̵;@; €M@€}@Æ.“€M@œ:mm@©: @«:<}@9mQŠ@º.�m„@Tq€@þv@@9€a@ƒ…4f@þ.L©C @(~‰MüXhT�Mp&h0�M€Wh6>’M²Zh”Mè€h¾¯”°÷æô 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,¤ªªªªª$ª—Ȫgª²u,²P–P–P–P  –– –Ù Ö–{–¼‰ ¼1øR 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 ó Ÿþÿð¥ð \L©C  «:<}Î,¢öþÿ…„ƒ‚�€& ÷ w0¸Î9mQŠ €}û,ƈ ŸþÿÄ®Ÿþÿó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÷ ÖMæþÿÂßàþÿ2„Äe2 ,$( ;0|ÈŸþÿÄôŠ&÷ ¬ æ«:<}Tq€*b,¤& ÷ Ö fæû ƒ…ÂÂ÷ n ƒ…4fÑ,ÈÄò Ò Ä ú)€ ÷ ¦ð È Á,ì·s3³3 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: .Ùf Z¯” #}@É2Ú@‰MüX@¢.’M²Z@;}¸G@’è€@ €` @(V ú+@œhb¯”º÷æŽô(Žbî.bß@tÿÀ0Šð•À-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&(É2Ú5,ˆ÷ ‡÷Pnææ÷ ×-Næô÷XH‰MüXæ"ô‚,¬TÀTÁP”ÀåÁ û÷� @÷ ÷\T ’M²Zz,ÐÞ7 7Š÷ ÷ ¹  #}&ÉôP•Vzó * ; ; 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,(R1Òý7OR 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)