!**************** !* LKDL2S/LKDL2Y * !* DATE: 18.FEB.80 * !* HANDLES DIRT&DISC * !* REQUESTS BY SENDING * !* THEM DOWN A DL11 * !*********************** CONTROL K'101011'; ! 'SYSTEM' PROGRAM (FAST ! ROUTINE ENTRY/EXIT) PERMINTEGERFNSPEC SVC(INTEGER EP, P1, P2) SYSTEMROUTINESPEC LINKIN(INTEGER SEG) SYSTEMROUTINESPEC MAPHWR(INTEGER SEG) SYSTEMINTEGERFNSPEC GETID BEGIN SYSTEMROUTINESPEC ALARM(INTEGER TICKS) RECORDFORMAT PF(BYTEINTEGER SER, REPLY, INTEGER A, B, C) RECORDFORMAT P2F(INTEGER D) RECORDFORMAT P3F(BYTEINTEGERARRAY A(0:7)) RECORDFORMAT PRF(INTEGER RSR, RDB, TSR, TDB) RECORDFORMAT DESF(INTEGER PT, BYTEINTEGER STATE, S1, C INTEGER MAX LEN, P1, FLAG, SEG, SA, VEC) RECORDFORMAT DES2F(RECORD (DESF) RX, TX) RECORDFORMAT R1F(INTEGER N) RECORDFORMAT R2F(RECORD (DES2F) NAME DES) CONSTRECORD (PRF) NAME PR = K'117550' ! IN SEG 4 (REALLY A PUNCH!!) CONSTBYTEINTEGERNAME ID = K'160030' CONSTINTEGERNAME PS = K'117776' CONSTINTEGER RL SER = 3 CONSTINTEGER READ R = 0 CONSTINTEGER WRITE R = 1 CONSTINTEGER DIR SER = 4 CONSTINTEGER EOT = 4 RECORD (PF)P, P4 RECORD (P2F) NAME P2 RECORD (P3F) P3 RECORD (PF) NAME P3X RECORD (DES2F) NAME DES RECORD (R1F) R1; RECORD (R2F) NAME R2 CONSTINTEGER MYSEG = 5, MYSEGA = K'120000' INTEGER I, MID, SEG, REPLY, LEN, N, PT, PA2, J, FLAG INTEGER CALL, TOUT, RFLAG, PA, PAR, MYPAR RECORDFORMAT BUFF(BYTEINTEGERNAME B) RECORDFORMAT BUXF(INTEGER PT) RECORD (BUFF)BUF RECORD (BUXF) NAME BUX OWNBYTEINTEGERARRAY MYBUFF(0:512) ROUTINESPEC DELAY(INTEGER COUNT) ROUTINE PRINT PARAMS(RECORD (PF) NAME P) WRITE(P_SER, 1); WRITE(P_REPLY, 1) WRITE(P_A, 5); WRITE(P_B, 1); WRITE(P_C, 1) NEWLINE END ROUTINE PUT 8 BYTE READ ON INTEGER CAD R2_DES == P3 CAD = R1_N CAD = CAD&K'17777'!K'140000'; ! IN SEG 6 DES_RX_MAX LEN = 8 DES_RX_SEG = MYPAR DES_RX_PT = CAD R FLAG = 1 PR_RSR = PR_RSR!K'100'; ! PUT INT ON END ROUTINE PUT 8 BYTES INTEGER CAD R2_DES == P CAD = R1_N&K'17777'!K'140000' DES_TX_SEG = MYPAR DES_TX_PT = CAD DES_TX_SA = 8 DES_TX_STATE = 1 PR_TDB = 8 PR_TSR = PR_TSR!K'100'; ! TRANSMIT LENGTH&PUT INTS ON END ROUTINE DELAY(INTEGER COUNT) INTEGER I I = SVC(18, 0, 0); ! DROP PRIORITY TO FORCE DELAY CYCLE I = 1, 1, COUNT; REPEAT I = SVC(18, 3, 0); ! PUT IT BACK AGAIN END I = SVC(18, 3, 0); ! PUT PRIORITY=3 MID = GETID MAP HWR(4) I = PR_RDB; ! ENSURE JUNK IS CLEAR LINKIN(-31); LINKIN(-32); ! RECEIVE & TRANSMIT INTERRUPTS BUX == BUF; P2 == P; P3X == P3 BUF_B == MYBUFF(0) SEG = 0; PT=0 I = SVC(22, 3, 0); ! MAP TO DL DESCRIPROR AREA R2 == R1 R1_N = I&K'77'!K'060000'; ! JUST THE PAGE DISPLACEMENT IN SEG 3 DES == R2_DES DES_RX_VEC = K'176510'; ! PUNCH/READER IN NON-DISC MACH DES_TX_VEC = K'176510' MYPAR = MAP ABS(K'140000', 256, MID); ! GET OWN BUFFER MAPPING PUT 8 BYTE READ ON PS = PS&K'177400'; ! ENSURE PRIO IS 0 ALARM(50) CYCLE P_SER = 0; POFF(P) IF P_REPLY = 0 THEN -> RECEIVE ! %IF RFLAG # 0 %THEN J = -5 %AND -> FLT ! TEST ABOVE NO GOOD, BUT MUST HAVE IT IN SOME FORM FOR SAFETY IF CALL = 0 START PRINTSTRING("LINK: BAD SER") WRITE(P_SER, 1); WRITE(P_REPLY, 1); NEWLINE CYCLE ; REPEAT CONTINUE FINISH SELECT OUTPUT(1) PRINTSTRING("PON RECD ") PRINT PARAMS(P) SELECT OUTPUT(0) FLAG = 1 P_SER = REPLY; ! RE-INSTATE PROPER CALLER PUT 8 BYTES; ! SEND THE REQUEST IF CALL = RL SER AND PA = READ R START ; ! RL01 READ REQUEST LEN = 511 P4_SER = -32; P4_REPLY = 0; POFF(P4); ! WAIT FOR DONE DELAY(500) DES_TX_SEG = MYPAR DES_TX_PT = BUX_PT&K'17777'!K'140000'; ! IN SEG 6 DES_TX_SA = LEN+1 DES_TX_STATE = 1; ! ALLOW IT INTS IF LEN = 26 THEN I = 25 ELSE I = 255 PR_TDB = I PR_TSR = PR_TSR!K'100' FLAG = 2 FINISH PUT 8 BYTE READ ON; ! NOW ALLOW THE READ AGAIN P4_SER = -32; P4_REPLY = 0; POFF(P4); ! WAIT FOR DONE CALL = 0 CONTINUE RECEIVE: IF P_SER = MID START ; ! CLOCK INT ALARM(50); ! ON AGAIN IF TOUT # 0 START TOUT = TOUT-1 IF TOUT = 0 THEN J = -1 AND -> FLT FINISH CONTINUE FINISH ! NOW RECEIVE INTS IF DES_RX_FLAG # 0 START J = DES_RX_FLAG -> FLT FINISH IF RFLAG = 0 THEN J = -2 AND -> FLT IF RFLAG = 1 START ; ! RL01 READ, SO BLOCK COMING RFLAG = 0 SELECT OUTPUT(1) PRINTSTRING("DL11 IN:"); PRINT PARAMS(P3) SELECT OUTPUT(0) CALL = P3X_SER; REPLY = P3X_REPLY; PA = P3X_A; PA2 = P3X_B IF CALL = RL SER AND PA = READ R THEN P3X_B = BUX_PT IF (CALL = RL SER AND PA = WRITE R) C OR CALL = DIR SER START P3X_B = BUX_PT; ! BLOCK IS IN THIS AREA IF CALL = DIR SER THEN LEN = 26 ELSE LEN = 512 DES_RX_MAX LEN = LEN DES_RX_SEG = MYPAR DES_RX_PT = BUX_PT&K'17777'!K'140000' RFLAG = 2; ! FLAG BIG BLOCK COMING PR_RSR = PR_RSR!K'100'; ! INTS ON CONTINUE ; ! WAIT FOR IT FINISH P3X_REPLY = MID PON(P3); ! PON USERS MESSAGE UP TOUT = 0 CONTINUE FINISH ! RFLAG = 2, BIG BLOCK ARRIVED P3X_REPLY = MID PON(P3) TOUT = 0; ! TURN TIMER OFF AGAIN CONTINUE FLT: SELECT OUTPUT(1) PRINTSTRING("FAULT ") WRITE(J, 1) WRITE(RFLAG, 1); NEWLINE SELECT OUTPUT(0) P_SER = 7; P_REPLY = MID P_A = J PON(P) DELAY(10000) UNLESS J = -1 PUT 8 BYTE READ ON REPEAT ENDOFPROGRAM