!**********
!* BDK4S *
!**********
CONTROL K'100001'; ! 'SYSTEM' PROGRAM+MUL+TRUSTED
PERMINTEGERFNSPEC SVC(INTEGER EP, P1, P2)
PERMINTEGERMAPSPEC INTEGER
PERMBYTEINTEGERMAPSPEC BYTEINTEGER
PERMINTEGERFNSPEC ADDR
PERMINTEGERFNSPEC ACC
BEGIN
SYSTEMINTEGERFNSPEC GETID
RECORDFORMAT PF(BYTEINTEGER SERVICE, REPLY, INTEGER A1, A2, A3)
RECORDFORMAT P2F(INTEGER D)
RECORDFORMAT DKF(INTEGER DST, ERR, COMM, WC, ADD, DAR)
CONSTRECORD (DKF) NAME DK = K'177400'
CONSTINTEGER DKTOP = 4871
OWNINTEGER DK BOT = K'77'
CONSTINTEGER UNIT1 = K'020000'
CONSTINTEGER UNIT2 = K'040000'
CONSTINTEGERARRAY LOOK UP(0:1) = K'505', K'503'
!! READ (0) AND WRITE (1) COMMANDS FOR THE RK05
RECORD (PF)P, PX
RECORD (P2F) NAME P2
INTEGER PAR, ID, BLOCK, ADD, COMM, BL
INTEGER DAR, SECTOR, COMM2, MID, FAULT
P2 == PX
MID = GETID
CYCLE
P_SERVICE = 0
POFF(P)
FAULT = 0
ID = P_REPLY
IF P_A2 = 0 START
DK BOT = 0; FAULT = 9
ELSE
PAR = MAP ABS(P_A2, 512, ID)
IF PAR = 0 THEN FAULT = 1 ELSESTART
PAR = PAR+(P_A2&K'17777') >> 6
!! ADD IN BLOCK DISP
COMM2 = LOOK UP(P_A1&1)
IF PAR >= K'2000' START
! NEED TO SET 17&18TH BITS
COMM2 = COMM2!(PAR&K'6000') >> 6
PAR = PAR&K'1777'
FINISH
DAR = 0
BLOCK = P_A3
IF BLOCK&UNIT1 # 0 THEN DAR = UNIT2 AND BLOCK = C
BLOCK&(UNIT1-1)
IF BLOCK < DKBOT OR BLOCK > DKTOP THEN FAULT = 4 C
ELSESTART
COMM =- (P_A1 >> 1)
IF COMM = 0 THEN COMM =- 256
AGN: DK_ADD = PAR << 6+P_A2&K'77'
BL = BLOCK//12
DK_DAR = DAR!(BL << 4)!(BLOCK-BL*12)
DK_WC = COMM
DK_COMM = COMM2
P2_D = (-3)&X'00FF'; ! WAIT FOR DISC INTERRUPT
POFF(P2)
IF DK_COMM < 0 START
PX_SERVICE = 7; PX_REPLY = MID
PX_A1 = DK_ERR
PONOFF(PX)
DK_COMM = 1; ! ISSUE RESET
-> AGN
FINISH
FINISH
FINISH
PAR = MAP ABS(P_A2, 0, ID); ! RELEASE SEG
FINISH
P_A1 = FAULT
P_SERVICE = ID; P_REPLY = 3
PON(P)
REPEAT
ENDOFPROGRAM