!* VERSION FOR UNIT 2 & 3 DEV MACHINE ONLY (SEE ADDRESS) !************ !* TU58S * !*31.OCT.80* !* UNIT 2 * !* VERSION * !************ !* UNIT 4 ADDED CONTROL K'100001'; ! 'SYSTEM' PROGRAM+MUL+TRUSTED BEGIN SYSTEMINTEGERFNSPEC GETID SYSTEMROUTINESPEC LINKIN(INTEGER SER) SYSTEMINTEGERFNSPEC MAP ABS(INTEGER ADR, LEN, REQ ID) PERMINTEGERFNSPEC SVC(INTEGER EP, R0, R1) SYSTEMINTEGERFNSPEC MAP VIRT(INTEGER WHO, HSEG, MYSEG) SYSTEMROUTINESPEC MAPHWR(INTEGER SEGS) RECORDFORMAT PF(BYTEINTEGER SERVICE, REPLY, INTEGER A1, A2, A3) RECORDFORMAT P2F(INTEGER D) RECORDFORMAT TU58F(INTEGER RSR, RDB, TSR, TDB) CONSTRECORD (TU58F) NAME TU58 = K'116160' RECORDFORMAT DESF(INTEGER PT, STATE, MAXLN, P1, MODE, SEG, COU, VEC, C INTEGERARRAY COMM(0:6), IN(0:7)) OWNRECORD (DESF) NAME DES CONSTINTEGERNAME PS = K'117776' CONSTINTEGERNAME CS = K'140016'; ! HOLD THE CRC CONSTINTEGER TU58TOP = 512 OWNINTEGER TU58 BOT = 0 CONSTINTEGER TU58 INT = -8; ! ???? RECORD (PF)P, PX RECORD (P2F) NAME P2 INTEGER PAR, ID, BLOCK, COMM, BL, I, DRIVE INTEGER DAR, COMM2, MID, FAULT, REPLY INTEGER ACT, SECTOR, TRACK, DIFF, SURFACE, N RECORDFORMAT R1F(BYTEINTEGERARRAYNAME A) RECORDFORMAT R2F(INTEGER X) RECORDFORMAT R3F(INTEGERARRAYNAME A) RECORDFORMAT R4F(RECORD (DESF) NAME DES) RECORD (R1F) R1; RECORD (R2F) NAME R2; RECORD (R3F) NAME R3 RECORD (R4F) NAME R4 OWNINTEGERARRAY READC(1:7) = K'5002', 2, 0, 0, 0, 0, 0 OWNINTEGERARRAY WRITEC(1:7) = K'5002', 3, 0, 0, 0, 0, 0 OWNBYTEINTEGERARRAY BUFF(0:13) ROUTINE TX(INTEGER N) WHILE TU58_TSR&K'200' = 0 CYCLE ; REPEAT N = N&X'FF' TU58_TDB = N END INTEGERFN RX INTEGER I, X, Y X = 30000; Y = 50 WHILE TU58_RSR&K'200' = 0 CYCLE X = X-1 IF X = 0 START Y = Y-1; RESULT = -1 IF Y = 0 X = 30000 FINISH REPEAT I = TU58_RDB RESULT = I&X'FF' END ROUTINE SEND COMMAND(INTEGERARRAYNAME COMM) INTEGER I,J,K CONSTINTEGERNAME CS = K'140016'; ! HOLDS CHECKSUM CS = 0 CYCLE I = 1, 1, 6 TX(COMM(I)); TX(COMM(I)>>8) CS = CS+COMM(I) *K'005737'; *K'140016'; ! ADC CS REPEAT TX(CS); TX(CS>>8) END INTEGERFN READ COMMAND(INTEGER N) INTEGER I, J, K BUFF(0) = N CYCLE I = 1, 1, 13 J = RX EXIT IF J<0 BUFF(I) = J REPEAT IF J < 0 THEN PRINTSTRING("TIMEOUT ") IF BUFF(3) = 0 THEN RESULT = 0 CYCLE I = 0, 1, 13 WRITE(BUFF(I), 2) REPEAT NEWLINE RESULT = BUFF(3) END ROUTINE POWER UP INTEGER I TU58_TSR = TU58_TSR!1 TX(0); TX(0) WHILE TU58_TSR&K'200' = 0 CYCLE ; REPEAT TU58_TSR = TU58_TSR&(¬1); ! CLEAR IT AGAIN END ROUTINE INIT !! INITIALISATION TX(4); ! INIT CHAR TX(4) UNTIL RX = K'20' CYCLE ; REPEAT END P2 == PX R2 == R1; R3 == R2; R4 == R3 MID = GETID LINKIN(8); ! MAIN DISC SERVICE LINKIN(14); ! UNIT 3 LINKIN(TU58 INT); ! INT SERVICE MAPHWR(4) PS = PS&K'177400'; ! UNTIL SUPERVISOR CHANGED I = SVC(22, 0, 0); ! FIND ABS ADDR R2_X = I&K'77' DES == R4_DES !! POWER UP SEQUENCE POWER UP INIT PRINTSTRING("TU58 READY ") CYCLE P_SERVICE = 0 POFF(P) FAULT = 0 ID = P_REPLY; REPLY = P_SERVICE IF P_A2 = 0 START TU58 BOT = 0; FAULT = 9 ELSE DRIVE = 0; ! NORMALLY DRIVE 0 IF REPLY = 14 THEN DRIVE = 1; ! UNIT 3 PAR = MAP ABS(P_A2, 512, ID) IF PAR = 0 THEN FAULT = 1 ELSESTART I = SVC(22, 0, 0) BLOCK = P_A3 IF BLOCK < TU58 BOT OR BLOCK > TU58 TOP THEN FAULT = 4 C ELSE START R2_X = K'140000'!(P_A2&K'17777'); ! ADDR IN SEG 6 AGN: DES_COMM(2) = DRIVE DES_COMM(4) = 512 DES_COMM(5) = BLOCK IF P_A1&1 = 0 THEN DES_COMM(1) = 2 ELSE C DES_COMM(1) = 3 DES_MODE = R2_X; ! ADDR IN SEG DES_SEG = PAR DES_COU = 10+1; ! INITIAL LEN DES_P1 = K'5002' DES_STATE = 1 TU58_TDB = 2; ! 1ST BYTE OF COMMAND TU58_TSR = TU58_TSR!K'100' P2_D = (-8)&X'FF'; POFF(P2) I = DES_IN(0)>>8 IF I # 0 AND DES_MODE = 0 START PRINTSTRING("ERROR FLAG:"); WRITE(I, 1); NEWLINE DES_MODE = I FINISH IF DES_MODE # 0 START WRITE(DES_MODE, 1) WRITE(DES_STATE, 1); WRITE(DES_SEG, 1); WRITE(DES_COU, 1); NEWLINE FLTR: PX_SERVICE = 7; PX_REPLY = MID PX_A1 = P_A1; PX_A3 = BLOCK PONOFF(PX) ! ISSUE RESET POWER UP; INIT 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