! FILE 'FEP_DQS12E' !************** !* DQS11E * !*DA:01.APR.80* !************** CONTROL K'100001'; ! 'SYSTEM' PROGRAM AND ! TRUSTED PROG RECORDFORMAT PARF(INTEGER TYPE, ADDRESS, LEN) EXTERNALROUTINE DQS11E(RECORD (PARF) NAME P) SYSTEMROUTINESPEC MAPHWR(INTEGER SEG) SYSTEMINTEGERFNSPEC GETID SYSTEMROUTINESPEC LINKIN(INTEGER SER) SYSTEMINTEGERFNSPEC MAP ABS(INTEGER ADR, LEN, REQ ID) RECORDFORMAT PF(BYTEINTEGER SER, REPLY, INTEGER A1, A2, A3) RECORDFORMAT DQS11F(INTEGER MCSR, TCSR, RSR, RCR, TWCR, TCAR, C RWCR, RCAR) OWNRECORD (DQS11F) NAME DQS = 1; ! SET UP BY PROT ON INITIALISE RECORDFORMAT PAR2F(INTEGER TYPE, RECORD (DQS11F) NAME ADDRESS,LEN) RECORD (PAR2F) NAME P2 CONSTINTEGER INITIALISE = 0 CONSTINTEGER LINE INPUT = 1 CONSTINTEGER LINE OUTPUT = 2 CONSTINTEGER INPUT HERE = 3 CONSTINTEGER OUTPUT DONE = 4 CONSTINTEGER MODEM STATUS = 5 CONSTINTEGER TXGO = K'111' CONSTINTEGER RXGO = K'111' OWNINTEGER TX REPLY, RX REPLY ROUTINESPEC OCTAL(INTEGER N) SWITCH TYPESW(INITIALISE:MODEM STATUS) OWNINTEGER TYPE, F, CAD, OSEG, I, EXT BITS OWNINTEGER PAR, MID, PAD OWNINTEGERARRAY RADDR(0:7) -> TYPE SW(P_TYPE) TYPE SW(INITIALISE): MID = GET ID MAPHWR(3) P2 == P DQS == P2_ADDRESS DQS_MCSR = K'40003'; ! DON'T TRANSFER THE CRC DQS_RCR = K'10'; ! ENABLE RECEIVER DQS_TCSR = K'10'; ! ENABLE TRANSMITTER CYCLE I = 1, 1, 7; ! FIND ABSOLUTE ADDRESSES RADDR(I) = MAP ABS(I<<13, 256, MID); ! MY ADDRESSES F = MAP ABS(I<<13, 0, MID); ! AND OFF AGAIN REPEAT RX REPLY = 0; TX REPLY = 0 RETURN TYPE SW(OUTPUT DONE): ! TRANSMITTER TYPE = LINE OUTPUT IF DQS_TCSR < 0 OR TXREPLY = 0 START !! TRANSMITTER ERROR PRINTSTRING('TX ERROR ') P_LEN = 1 ELSE P_LEN = 0 FINISH P_TYPE = LINE OUTPUT TXREPLY = 0 RETURN TYPE SW(INPUT HERE): !! RECEIVER INTERRUPT IF DQS_RSR&K'34067' # 0 OR RX REPLY = 0 START F = -2; ! FRAME ERROR IF DQS_RSR&K'20' # 0 THEN F = -3; ! SILO FULL FLT: DQS_RCR = 0; ! CLEAR DOWN DQS_RCR = K'10'; ! AND UP AGAIN ELSE IF DQS_RSR&K'1000' # 0 THEN F = -1 AND -> FLT ! WC OVERFLOW F = DQS_RCAR-CAD-2 ! NUMBER OF BYTES TRANS IF DQS_RSR&K'074000' # 0 THEN F = F-1 IF F> 252 START PRINTSTRING("DQS NASTY:") OCTAL(DQS_RCAR); SPACE; OCTAL(CAD); SPACE; OCTAL(F);NEWLINE FINISH FINISH P_TYPE = LINE INPUT P_ADDRESS = PAD; ! PASS BLOCK ADDRESS BACK P_LEN = F RX REPLY = 0 RETURN TYPE SW(LINE INPUT): !! USER CALL !! READ REQUEST IF RX REPLY # 0 THEN -> ABORT RXREPLY = MID PAD = P_ADDRESS ! PAR = MAP ABS(PAD, P_LEN, RXREPLY) PAR = RADDR(PAD>>13) IF PAR = 0 THEN -> ABORT PAR = PAR+(PAD&K'17700')>>6; ! ENSURE ACTUAL BLOCK EXT BITS = (PAR&K'176000')>>6 CAD = PAR << 6+PAD&K'77' DQS_RCAR = CAD DQS_RWCR =- (P_LEN >> 1) DQS_RCR = RXGO!EXT BITS RETURN TYPE SW(LINE OUTPUT): !! OUTPUT REQUEST IF TX REPLY # 0 THEN -> ABORT TX REPLY = MID OSEG = P_ADDRESS ! PAR = MAP ABS(OSEG, P_LEN, TX REPLY) PAR = RADDR(OSEG>>13) IF PAR = 0 THEN -> ABORT PAR = PAR+(OSEG&K'17700')>>6; ! ENSURE ACTUAL BLOCK EXT BITS = (PAR&K'176000')>>6 DQS_TCAR = PAR << 6+P_ADDRESS&K'77' F = 0 DQS_TWCR =- ((P_LEN+1) >> 1) IF P_LEN&1 # 0 START F = K'040000'; ! 8 IN REMAINING BIT FIELD FINISH DQS_TCSR = TX GO!F!EXT BITS RETURN TYPE SW(MODEM STATUS): P_TYPE = 0; ! FOR NOW RETURN ABORT: PRINTSTRING('DQS FAIL ') CYCLE ; REPEAT ROUTINE OCTAL(INTEGER N) INTEGER I PRINTSYMBOL((N >> I)&7+'0') FOR I = 15, -3, 0 END END ENDOFFILE