!****************
!* 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