!************ !* RL04S * !*07.OCT.80* !************ !* UNIT 4 ADDED CONTROL K'100001'; ! 'SYSTEM' PROGRAM+MUL+TRUSTED BEGIN SYSTEMINTEGERFNSPEC GETID SYSTEMROUTINESPEC LINKIN(INTEGER SER) SYSTEMROUTINESPEC MAPHWR(INTEGER SEGS) RECORDFORMAT PF(BYTEINTEGER SERVICE, REPLY, INTEGER A1, A2, A3) RECORDFORMAT P2F(INTEGER D) RECORDFORMAT RLF(INTEGER CS, BA, DA, MP) CONSTRECORD (RLF) NAME RL = K'114400' CONSTINTEGERNAME PS = K'117776' CONSTINTEGER RLTOP = 10239 OWNINTEGER RL BOT = K'77' CONSTINTEGER UNIT1 = K'020000' CONSTINTEGER RL INT = -3; ! ???? CONSTINTEGERARRAY LOOK UP(0:1) = K'114', K'112' !! READ (0) AND WRITE (1) COMMANDS FOR THE RK05 CONSTINTEGER SEEK = 6 RECORD (PF)P, PX RECORD (P2F) NAME P2 INTEGER PAR, ID, BLOCK, COMM, BL, I, DRIVE, RETRY INTEGER DAR, COMM2, MID, FAULT, REPLY INTEGER ACT, SECTOR, TRACK, DIFF, SURFACE, DES INTEGERFN GET STATUS(INTEGER TYPE) !! GETS STATUS FROM RL01 IF TYPE=1 !! TYPE = K'13' DOES A RESET DRIVE RL_DA = TYPE RL_CS = 4!DRIVE; ! GET STATUS WHILE RL_CS&K'200' = 0 CYCLE ; REPEAT RESULT = RL_MP END P2 == PX MID = GETID LINKIN(3); ! MAIN DISC SERVICE LINKIN(28); ! UNIT 4 SER (MAPPED TO UNIT 1) LINKIN(RL INT); ! INT SERVICE MAPHWR(4) PS = PS&K'177400'; ! UNTIL SUPERVISOR CHANGED I = GET STATUS(K'13') IF RL_CS < 0 START FINISH CYCLE P_SERVICE = 0 POFF(P) FAULT = 0 ID = P_REPLY; REPLY = P_SERVICE IF P_A2 = 0 START RL BOT = 0; FAULT = 9 ELSE DRIVE = 0; ! NORMALLY DRIVE 0 IF REPLY = 28 THEN DRIVE = K'400'; ! UNIT 4 -> DRIVE 1 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 < RLBOT OR BLOCK > RLTOP THEN FAULT = 4 C ELSESTART COMM =- (P_A1 >> 1) IF COMM = 0 THEN COMM =- 256 SECTOR = BLOCK TRACK = 0 CYCLE IF SECTOR < 20 THENEXIT TRACK = TRACK+K'100' SECTOR = SECTOR-20 REPEAT TRACK = TRACK!(SECTOR << 1) RETRY = 10 AGN: WHILE RL_CS&K'200' = 0 CYCLE ; REPEAT RL_CS = K'10'!DRIVE; ! READ HEADERS WHILE RL_CS&K'200' = 0 CYCLE ; REPEAT IF RL_CS < 0 START IF GET STATUS(K'13') < 0 THEN -> FLTR -> AGN FINISH ACT = RL_MP&K'177600' ! DISCARD SURFACE&SECTOR DES = TRACK&K'177600' SURFACE = (TRACK&K'100') >> 2 DIFF = ACT-DES IF DIFF < 0 START DIFF = (-DIFF)!4; ! MOVE TO HIGHER CYLINDER ADDRESSES FINISH DIFF = (DIFF+1)!SURFACE RL_DA = DIFF RL_CS = SEEK!DRIVE WHILE RL_CS&K'200' = 0 CYCLE ; REPEAT IF RL_CS < 0 THEN ->FLTR RL_MP = COMM; ! SET WORD COUNT RL_DA = TRACK; ! SET REQUIRED DISC ADDRESS RL_BA = PAR << 6+P_A2&K'77' RL_CS = COMM2!DRIVE P2_D = (RL INT)&X'00FF' ! WAIT FOR DISC INTERRUPT POFF(P2) IF RL_CS < 0 START FLTR: RETRY = RETRY-1 IF RETRY > 0 START I = GET STATUS(K'13') -> AGN FINISH PX_SERVICE = 7; PX_REPLY = MID PX_A1 = RL_CS; PX_A3 = GET STATUS(1) PONOFF(PX) ! ISSUE RESET I = GET STATUS(K'13') FAULT = 5 AND -> FLT IF PX_A1 # 0 -> AGN FINISH FINISH FINISH FLT: PAR = MAP ABS(P_A2, 0, ID); ! RELEASE SEG FINISH P_A1 = FAULT P_SERVICE = ID; P_REPLY = REPLY PON(P) REPEAT ENDOFPROGRAM