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