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