perm filename SAISIM.FAI[X,AIL] blob
sn#085174 filedate 1974-02-01 generic text, type T, neo UTF8
COMPIL(SIM,<SIMIO,CSERR,LPRYER>,<GOGTAB>
,<SIMIO, CSERR, LPRYER -- SUPPORT ROUTINES>)
↑↑SIMIO: PUSHJ P,.+1 ;SAVE PC OF XCT
PUSH P,C ;SAVE C
MOVE C,-1(P) ;ASSUME SKIP RETURN
LDB C,[POINT 4,-1(C),12] ;INDEX OF XCT
JUMPE C,USTST ;WANT STATUS BITS ONLY
CAIL C,13 ;NOW SPLIT HIGH AND LOW INDICES
JRST ALTIO ;SKIP RETURN CHECK ONLY
EXPO <
CAIN C,IOIN ;
JRST ISIOU ;
CAIE C,IOOUT ;IN OR OUT ?
JRST NOTIOU ;NOPE
ISIOU: SKIPG @USBTST(C) ;CHECK FOR NO BUFFERS (& MORE AT CMU)
JRST USFUNY ;NO BUFFERS, ETC.
>;EXPO
NOTIOU:MOVE C,IOINST(C) ;GET INSTRUCTION
DPB CHNL,[POINT 4,C,12] ;CHANNEL NUMBER
XCT C ;DO OPERATION
JRST USOUT ;ALL KOSHER, NO EOF OR ERR
USTST: MOVE C,[GETSTS C] ;WHA-
DPB CHNL,[POINT 4,C,12] ; T HAPPEN-
XCT C ; ED?
MOVEM C,FSTATS(USER)
CMU <
USERF:
>;CMU
TRZ C,10000 ;IOACT BIT, USER LOOKUP CHECK BIT
HRLZM C,@ENDFL(CDB) ;GIVE USER THE BITS
TDNN C,ERRTST(CDB) ;ANY HE CAN'T HANDLE?
JUMPA CHNL,USSKIP ;NOPE, JUST SKIP-RETURN
ERR <I-O DEVICE ERROR ON CHANNEL >,7 ;JUMPA TO PROVIDE CHANNEL AC
USSKIP: AOS -1(P) ;SKIP-RETURN
USOUT: POP P,C ;RESTORE C
POPJ P, ;DONE
ALTIO: MOVE C,IOINST(C) ;GET INSTR
DPB CHNL,[POINT 4,C,12]
XCT C ;DO IT
JRST USOUT ;NO SKIP
JRST USSKIP ;SKIP
EXPO <
USFUNY:
CMU < SKIPE @USBTST(C) ;FUNNY DEVICE?
JRST REALTM ; YES.
>;CMU
JUMP CHNL, ;FOR THE ERR MSG
ERR <NO BUFFERS ASSIGNED FOR I-O CHAN >,7
JRST USSKIP
CMU,< COMMENT ⊗ THIS NONSENSE IS A SPECIAL MODE FOR
THE CMU SPEECH DEVICES. ESSENTIALLY, IT DOES EVERTHING
AS NORMAL, EXCEPT THAT IT PICKS UP THE TIMING ERR AND
RUN-OUT-OF BUFFERS BIT OF THE
I/O STATUS FROM THE STATUS WORD IN THE BUFFER HEADER,
INSTEAD OF USING THE BIT FROM THE GETSTS. ⊗
TIMERR←←100000 ;TIMING ERR BIT FOR SPEECH DEVICES
ROBERR←←200000 ;RUN-OUT-OF-BUFFER ERR
REALTM: PUSH P,D ;NEED ANOTHER AC
CAIE C,IOIN ;INPUTTING?
JRST REALOT ; NO
MOVSI C,(<IN>)
DPB CHNL,[POINT 4,C,12] ;CHAN #
XCT C ;DO THE INPUT
JRST REALOK ;NO ERR, SO FAR
MOVE C,[GETSTS C]
DPB CHNL,[POINT 4,C,12] ;LOOKS FAMILIAR
XCT C
TRZA C,TIMERR!ROBERR ;TURN OFF THE ONES FROM THE GETSTS
REALOK: MOVEI C,0
HRRZ D,IBPNT(CDB) ;ADDRESS OF THE NEW BUFFER
IOR C,-1(D) ;THE BITS FROM THE BUFFER
REALRT: POP P,D ;RESTORE THE AC
TRNN C,760000 ;ERR OR EOF?
JRST USOUT ; NO
JRST USERF ; YES, GO LOOK AT IT
REALOT: MOVE C,[GETSTS C]
DPB CHNL,[POINT 4,C,12]
XCT C
TRNN C,ROBERR ;STOPPED FOR A ROB?
JRST REAL5 ; NO
HRRI D,(C) ;GET THE BITS
TRZ D,760000 ;TURN OFF THE ERRS
HRLI D,(<SETSTS>)
DPB CHNL,[POINT 4,D,12]
XCT D
REAL5: MOVSI D,(<OUT>)
DPB CHNL,[POINT 4,D,12]
XCT D
JRST REALRT
JRST REALRT ;IGNORE NOW, CATCH THE NEXT TIME THRU
>;CMU
USBTST←.-1
XWD CDB,IBUF ;1
777777
XWD CDB,OBUF ;3
>;EXPO
IOINST←.-1 ;IOSTATUS ←← 0 GET STATUS
IN ;IOIN ←← 1 BUFFERED INPUT
IN D ;IODIN ←← 2 DUMP MODE INPUT
OUT ;IOOUT ←← 3 BUFFERED OUTPUT
OUT D ;IODOUT ←← 4 DUMP MODE OUTPUT
CLOSE (D) ;IOCLOSE ←← 5 CLOSE I,O, OR BOTH
RELEASE (D) ;IORELEASE←← 6
INBUF (A) ;IOINBUF ←← 7
OUTBUF (A) ;IOOUTBUF ←←10
USETI (A) ;IOSETI ←←11
USETO (A) ;IOSETO ←←12
SETSTS (A) ; SET IO STATUS
OPEN DMODE(CDB) ;IOOPEN ←←14
LOOKUP FNAME(USER);IOLOOKUP←←15
ENTER FNAME(USER);IOENTER ←←16
RENAME FNAME(USER);IORENAME←←17
HERE(CSERR) MOVE USER,GOGTAB
POP P,UUO1(USER) ;STANDARD PLACE
ERR <CASE INDEX OVERFLOW, VALUE IS >,13
JRST @UUO1(USER) ;RETURN OK
HERE (LPRYER) ERR <DATUM OF ARRAY NOT THERE>,1
POPJ P,
ENDCOM(SAV)