!********** !* bdk7s * !*22.jun.82* !************ %control 1 %begin %recordformat pf((%byteinteger service, reply %or %integer d), %c %integer a1, a2, a3) %recordformat dkf(%integer dst, err, comm, wc, add, dar) %constrecord (dkf) %name dk == k'117400' %constinteger dktop = 4871 %owninteger dk bot = k'77' %constinteger unit1 = k'020000' %constinteger unit2 = k'040000' %constintegerarray look up(0:1) = k'505', k'503' !! read (0) and write (1) commands for the rk05 %record (pf)p, px %integer par, id, block, add, comm, bl, i %integer dar, sector, comm2, mid, fault %cycle i = 0, 1, 1 p_service = 4; p_reply = 3 p_a1 = 10!i<<8 p_a2 = 256; p_a3 = 4599 pon(p) p_a1 = 11!i<<8 p_a2 = 104; p_a3 = 64 pon(p) %repeat mid = getid map hwr(4); ! map the hardware regs to seg 4 %cycle p_service = 0 poff(p) fault = 0 id = p_reply %if p_a2 = 0 %start dk bot = 0; fault = 9 %else 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&unit1 # 0 %then dar = unit1 %and block = %c block&(unit1-1) ! nb appleton tower requires a different han %if block < dkbot %or block > dktop %then fault = 4 %c %elsestart comm =- (p_a1 >> 1) %if comm = 0 %then comm =- 256 agn: dk_add = par << 6+p_a2&k'77' bl = block//12 dk_dar = dar!(bl << 4)!(block-bl*12) dk_wc = comm dk_comm = comm2 px_d = (-3)&x'00ff'; ! wait for disc interrupt poff(px) %if dk_comm < 0 %start px_service = 7; px_reply = mid px_a1 = dk_err ponoff(px) dk_comm = 1; ! issue reset fault = 5 %and -> flt %if px_a1 # 0; ! abort not free -> agn %finish %finish %finish par = map abs(p_a2, 0, id); ! release seg %finish flt: p_a1 = fault p_service = id; p_reply = 3 pon(p) %repeat %endofprogram