!************ !* RK07S * !*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 RKF(%INTEGER RKCS1, RKWC, RKBA, RKDA, RKCS2, RKDS, RKER, %C RKAS, RKDC, RKDB, MR1, EP1, EP2, MR2, MR3) %CONSTRECORD (RKF) %NAME RK = K'117440' %CONSTINTEGERNAME PS = K'117776' %CONSTINTEGER RLTOP = 64000 %OWNINTEGER RL BOT = K'77' %CONSTINTEGER RL INT = -3; ! ???? %CONSTINTEGER SELECT DRIVE = 1, PACK ACKNOWLEDGE = 3, DRIVE CLEAR = 5, %C UNLOAD = 7, START SPINDLE = K'11', RECALIBRATE = K'13', %C OFFSET = K'15', SEEK = K'17', %C READ DATA = K'21', WRITE DATA = K'23', %C READ HEADER = K'25', WRITE HEADER = K'27', WRITE CHECK = K'31' %CONSTINTEGER READY = K'200', INTERRUPT = K'100', CDT = K'2000', %C CERR = K'100000' %CONSTINTEGERARRAY LOOK UP(0:1) = READ DATA, WRITE DATA !! READ (0) AND WRITE (1) COMMANDS FOR THE RK07 %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) %RESULT = 0 %END P2 == PX MID = GETID ! LINKIN(3); ! MAIN DISC SERVICE LINKIN(8); LINKIN(14); ! UNITS 2 & 3 LINKIN(RL INT); ! INT SERVICE MAPHWR(4) PS = PS&K'177400'; ! UNTIL SUPERVISOR CHANGED ! ACKNOWLEDGE THE PACK RK_RKCS2 = 0; ! PHYSICAL DRIVE ZERO RK_RKCS1 = PACK ACKNOWLEDGE!CDT; ! ISSUE THE COMMAND %WHILE RK_RKCS1&READY = 0 %CYCLE; %REPEAT %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 = 14 %THEN DRIVE = 1; ! UNIT 3 -> TOP OF DISC PAR = MAP ABS(P_A2, 512, ID) %IF PAR = 0 %THEN FAULT = 1 %ELSESTART PAR = PAR+(P_A2&K'17777') >> 2 !! 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&X'8FFF' < RLBOT %THEN FAULT = 4 %C %ELSESTART COMM =- (P_A1 >> 1) %IF COMM = 0 %THEN COMM =- 256 SECTOR = BLOCK TRACK = 0 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 ! RESET IT -> AGN %FINISH PX_SERVICE = 7; PX_REPLY = MID PX_A1 = RK_RKCS1; PX_A3 = RK_RKCS2 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