/1 / / / / / / / / / /COPYRIGHT (C) 1978,1979 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /8 RL01 DISK HANDLER FOR RTS-8 V3 /EDIT HISTORY: /JR 24-SEP-78 CREATION /JR 13-OCT-78 FIX SEEK BUG /JR 3-NOV-78 PUT IN RAW MODE /JR 3-NOV-78 PUT IN KT MODS /JR 3-NOV-78 ADDED RK8E INTERLOCK, PUT BREAK BUF IN RTFLD /SCR 3-NOV-78 RTFLD TO RTS8 /JR 6-NOV-78 FIX KT BIT TWIDDLE, OPTIMIZE FSECT, FIX BBL BANK /JR 7-NOV-78 WRONG REF TO TSWFLG /SCR 19-NOV-78 KT FIX, TAKE OUT PAL CODE /JR 20-NOV-78 FORGOT TO HANDLE POWER FAIL CASE /JR 10-JAN-79 FIX INTERRUPT HANG ON VOLUME UNLOAD/LOAD XLIST 0 /LIST TASK VERS= 7. .TITLE RL01 DISK HANDLER FOR RTS-8 V3 INIWT= 0 .RSECT RL01T .TASK RL01 IFNDEF RLDEV /DEVICE CODE OF RL01 CONTROLLER .SBTTL GENERAL INFORMATION /MESSAGE FORMAT: /RLMESG,ZBLOCK 3 / MODE+ABC+UNIT / RW+PAGES+FIELD / BUFADD / BLOCK/SECTOR / STATUS / TRACK /MODE= 0 MAPPED OS/8 ADDRESSING / 1000 UNMAPPED DIRECT SECTOR ADDRESSING / 400 BYTE MODE TRANSFER, ONLY IN DIRECT SECTOR MODE /ABC= 00 OS/8 UNIT A / 10 OS/8 UNIT B / 20 OS/8 UNIT C /UNIT= 0-3 PHYSICAL DRIVE /BLOCK/SECTOR LOGICAL OS/8 BLOCK IN MAPPED MODE / 6 BIT SECTOR NUMBER IN UNMAPPED MODE /TRACK UNUSED IN MAPPED MODE / CYLINDER*2+SURFACE IN UNMAPPED MODE /GENERAL INFORMATION /THERE ARE 40 SECTORS PER TRACK /THERE ARE 2 SURFACES AND 256 CYLINDERS PER DISK /IN 12 BIT MODE EACH SECTOR CONTAINS 128 12 BIT WORDS /IN 8 BIT MODE EACH SECTOR CONTAINS 256 8 BIT BYTES /THE STANDARD RTS-8, OS/8 INTERLEAVE LAYOUT: /SECTOR BLOCK-DEVICE SECTOR BLOCK-DEVICE /0 0-C 24 1-A /1 6-A 25 13-A /2 0-C 26 1-A /3 6-A 27 13-A /4 1-C 30 2-A /5 7-A 31 14-A /6 1-C 32 2-A /7 7-A 33 14-A /10 2-C 34 3-A /11 10-A 35 15-A /12 2-C 36 3-A /13 10-A 37 15-A /14 3-C * 40 4-A /15 11-A 41 16-A /16 3-C * 42 4-A /17 11-A 43 16-A /20 0-A 44 5-A /21 12-A 45 17-A /22 0-A 46 5-A /23 12-A 47 17-A /ALGORITHMS FOR CONVERTING BLOCK NUMBER TO TRACK AND SECTOR: /FOR DEVICE A AND B, BLOCK =TTT TTT TTS SSS /TRACK BITS SPECIFY TRACK 0-377 FOR DEVICE A /TRACK BITS SPECIFY TRACKS 400-777 FOR DEVICE B /SECTOR BITS MAP PER ABOVE TABLE WITHIN TRACK /FOR DEVICE C, BLOCK = 0TT TTT TTT TSS /TRACK BITS+1 SPECIFY TRACKS 1-776 /SECTOR BITS MAP PER ABOVE TABLE WITHIN TRACK /* NOTE THAT TRACK 0, SECTOR 14 CONTAINS THE OS/8 BBL FOR DEVICES A AND B /AND SECTOR 16 CONTAINS THE BBL FOR DEVICE C /RL01 IOT DEFINES RLDC= 6000+RLDEV /CLEAR DEVICE RLSD= 6001+RLDEV /SKIP ON DONE AND CLEAR IT RLMA= 6002+RLDEV /LOAD MEMORY ADDRESS REGISTER RLCA= 6003+RLDEV /LOAD CONTROL REGISTER "A" (SEEK DIFFERENCE REGISTER) RLCB= 6004+RLDEV /LOAD CONTROL REGISTER "B" RLSA= 6005+RLDEV /LOAD SECTOR ADDRESS FROM AC0-5 RLWC= 6007+RLDEV /LOAD NEGATIVE WORD COUNT RRER= 6010+RLDEV /READ ERROR REGISTER TO AC RRWC= 6011+RLDEV /READ WORD COUNT TO AC RRCA= 6012+RLDEV /READ CONTROL REGISTER "A" RRCB= 6013+RLDEV /READ CONTROL REGISTER "B" RRSA= 6014+RLDEV /READ SECTOR ADDRESS TO AC0-5 RRSI= 6015+RLDEV /READ SILO BYTE TO AC4-11 RLSE= 6017+RLDEV /SKIP IF ANY ERROR /CONTROL REGISTER "B" FUNCTION DEFINITIONS RLMN= 0 /MAINTENANCE FUNCTION RLRS= 1 /INTERFACE RESET RLST= 2 /READ STATUS RLSK= 3 /SEEK USING DIFFERENCE WORD RLRH= 4 /READ HEADER RLWR= 5 /WRITE DATA RLRD= 6 /READ DATA RLRN= 7 /READ DATA WITHOUT CHECKING HEADER BYTE= 1000 /BYTE MODE TRANSFER ENABLE INTEN= 400 /INTERRUPT ENABLE ID= 123 /MAGIC CONSTANT PRESENT IN FIRST WORD OF BBL /USED TO CHECK VALIDITY OF BBL RAWBIT= 1000 /SET IN MODE WORD OF MESSAGE IF DIRECT SECTOR MODE BYTBIT= 400 /SET IF BYTE MODE IN DIRECT SECTOR MODE /CONTROL REGISTER "A" FORMAT /BIT 0 SET TO MOVE HEADS TO HIGHER CYLINDER ADDR /BIT 1 SET TO SELECT LOWER HEAD (SURFACE BIT) /BITS 2-3 SPARE /BITS 4-11 8 BIT CYLINDER ADDRESS DIFFERENCE WORD (ABS VALUE) /CONTROL REGISTER "B" FORMAT /BIT 0 SPARE /BIT 1 SET TO SELECT MAINTENANCE MODE /BIT 2 SET FOR 8 BIT MODE, CLEAR FOR 12 BIT MODE /BIT 3 SET TO ENABLE INTERRUPTS /BITS 4-5 DRIVE SELECT BITS /BITS 6-8 EMA BITS /BITS 9-11 FUNCTION BITS (DEFINED ABOVE) /SECTOR ADDR FORMAT /BITS 0-5 6 BIT SECTOR ADDR IN RANGE [0,47] (OCTAL) /BITS 6-11 UNUSED /DISK STATUS BYTE #1 (READ VIA RLST FUNCTION) /BIT 4 SPARE /BIT 5 HEAD SELECT DEFINED IN REGISTER "A" /BIT 6 * SET IF COVER IS OPEN /BIT 7 SET IF HEADS ARE OUT /BIT 8 SET IF BRUSHES ARE HOME /BITS 9-11 DRIVE STATE BITS /DISK STATUS BYTE #2 (READ VIA RLST FUNCTION) /BIT 4 * WRITE DATA ERROR /BIT 5 * HEAD CURRENT ERROR /BIT 6 WRITE PROTECT SWITCH SET /BIT 7 * SEEK TIME-OUT ERROR /BIT 8 * SPIN UP TIME-OUT ERROR /BIT 9 * WRITE GATE ERROR /BIT 10 * VOLUME CHECK; NEW VOLUME REQUIRES REREAD OF BBL /BIT 11 * DRIVE SELECT ERROR; DUPLICATE DRIVE SELECT NUMBERS INSERTED / * INDICATES THAT DRIVE ERROR BIT IN ERROR REGISTER WILL BE SET /DRIVE ERROR REGISTER FORMAT /BIT 0 ** CRC ERROR /BIT 1 ** OPERATION INCOMPLETE /BIT 10 ** DRIVE ERROR /BIT 11 SET IF DRIVE IS READY / ** INDICATES COMPOSITE ERROR CAUSING RLSE TO SKIP /HEADER BYTES READ AFTER RLRH FUNCTION (MUST BE IN BYTE MODE) /WORD 1 CH SSS SSS C=LSB CYL ADDR / H=HEAD (SURFACE) SELECT / S=SECTOR ADDR /WORD 2 0C CCC CCC C=MSB OF CYLINDER ADDR /WORDS 3-4 ZERO /WORDS 5-6 16 BIT HEADER CRC .SBTTL TASK LEVEL I/O SETUP /TASK LEVEL ROUTINE TO RECEIVE A MESSAGE AND /INITIATE RL01 I/O IFZERO KT8A < START, CAL SKPINS /FIRST INSERT OUR SKIP CHAIN ENTRY INTRPT > LOOP, CAL /NOW PULL IN A MESSAGE RECEIV MADDR, IFZERO KT8A <0> IFNZRO KT8A DCA MSGCDF /STORE CDF TO MESSAGE INLINE KTBGO, STA /SETUP TEMPORARY POINTER TO MESSAGE TAD MADDR DCA MSGPTR JMS GET /GET UNIT/MODE WORD DCA UNIT TAD UNIT JMS I (SETDRV /OFF PAGE TO SETUP TYPE OF TRANSFER /ALSO DOES RK8E INTERLOCK IF NECESSARY JMS GET /PICK UP R/W, PAGE COUNT, FIELD WORD JMS I (SETFUD /JMP OFF PAGE TO SETUP A FEW ARGUMENTS RDF /GET CURRENT FIELD TAD (RLRD /ASSUME WE MUST SETUP A BBL READ DCA I (FN / TAD UNIT /NOW SETUP APPROPRIATE BAD BLOCK LIST / AND (3 / CLL RAL /2 WORDS PER DRIVE / TAD (DRVTAB /ADD TO BASE OF PHYSICAL DRIVE TABLE / DCA I (CURTRK /FIRST WORD IS CURRENT TRACK ON THIS DRIVE /ABOVE JOB DONE BY "SETDRV" TAD I (CURTRK IAC /NEXT WORD POINTS TO TRIO OF BAD BLOCK LISTS DCA GET /FOR LOGICAL UNITS A,B, AND C TAD I GET DCA I (BBLID /SAVE POINTER TO THEM TAD UNIT /SETUP TRACK OFFSET IF UNIT B BSW RTL SPA CLA /SKP IF NOT UNIT B TAD (400 DCA I (OFFSET /STORE THE TRACK OFFSET SZL CLA /SKP IF NOT UNIT C TAD (20 /UNIT C HAS 21 WORD BBL TAD (-41 /UNITS A+B HAVE 41 WORD BBL DCA I (WC /SET WORD COUNT APPROPRIATELY SZL /SKP IF NOT UNIT C TAD (2 /USE SECTOR 16 IF UNIT C TAD (14 /USE SECTOR 14 IF UNIT A OR B DCA I (SECTOR DCA I (TRACK /ASSUME TRACK 0 SZL /SKP IF NOT UNIT C TAD (41 /OFFSET TO UNIT C BBL IN MEMORY TAD I (BBLID /PLUS BASE ADDR FROM DRIVE TABLE DCA I (MA /SET MEMORY ADDR SNL /SKP IF UNIT C TAD (CVTAB-CVTC /USE UNIT A+B CONVERSION TAD (CVTC /USE UNIT C LOGICAL BLOCK TO PHYSICAL SECTOR CONVERSION DCA I (MAPPED /SET ROUTINE POINTER TAD I (OFFSET /TEST IF UNIT B SZA CLA /SKP IF NO TAD (20 /OFFSET INTO A+B BBL IF YES TAD I (MA /POINTED TO BY MA IAC /SKIP PAST BBL ID CHECK CODE DCA I (MAPPTR /INITIALIZE WORKING BBL POINTER DCA I (PAGCT /KLUDGE: ZERO OUT PAGE COUNT FOR BBL READ RAWGO, ISZ I PDONEFG /SET DONE FLAG BUSY NOW TAD (BEGIN /SET IO WAIT RETURN TO DRIVE STATUS CHECK ROUTINE DCA I (IO DCA I (ERRSKP /DISABLE ERROR CHECKING ON DRIVE STATUS READ CIF .FLD /INHIBIT INTERRUPTS AHEAD RLSA /CLEAR SECTOR ADDR REGISTER RLCA /CLEAR COMMAND REGISTER A TAD (RLST+BYTE /NOW INITIATE A READ STATUS TAD I (DRIVE /ADD IN PHYSICAL UNIT AND INTERRUPT ENABLE BIT RLCB CLA IFNZRO KT8A < JMS I (FNDBRK /GO FIND OUR BREAK MAP ENTRY IF FIRST TIME THRU > CAL /NOW WAIT FOR COMPLETION WAITE /INTERRUPT FROM READ STATUS WILL PROPAGATE TRANSFER PDONEFG,DONEFG TAD I PDONEFG /SEE IF EF REALLY POSTED SZA CLA /SKP IF YES JMP KTBGO /RETRY FROM BEGINNING IF NO, MUST HAVE BEEN POWER FAIL TAD MSGCDF /COPY CDF TO USER MESSAGE INLINE DCA .+1 HLT ISZ MSGPTR /POINT AT STATUS WORD TAD IOSTAT /COPY I/O STATUS IN DCA I MSGPTR CDF .FLD /RESET DF TAD MSGCDF /SET DF FOR POST DCA EFFLD AC7775 /BACK UP TO EF IN MESSAGE HEADER TAD MADDR CAL /POST THE MESSAGE POST EFFLD, HLT IFNDEF RK8E < JMP LOOP /GO LISTEN FOR ANOTHER REQUEST > IFDEF RK8E < JMP I (RKENAB /UNLOCK RK8E WHEN THROUGH > GET, 0 MSGCDF, CDF .FLD ISZ MSGPTR /PREINCREMENT THE POINTER TAD I MSGPTR /GET A MESSAGE WORD CDF .FLD /RESET DF JMP I GET MSGPTR, 0 UNIT, 0 IOSTAT, 0 PAGE /NON FITTING ROUTINE TO SETUP A FEW ARGS FOR I/O SETFUD, 0 /RW/PAGE COUNT WORD PASSED IN AC DCA IOPGCT /SAVE IT TAD IOPGCT AND (70 /ISOLATE FIELD BITS DCA IOFN /STORE THEM IN IO FUNCTION WORD IFNZRO KT8A < JMS I (MAPSET /SET BREAK MAP UP IF KT8A PRESENT > TAD IOPGCT RAL /NOW FORM READ/WRITE FUNCTION CLA CML RAL /LINK NOW ON IF READ TAD (RLWR /DEPENDS ON FACT THAT RLRD=RLWR+1 TAD IOFN /COMBINE WITH FIELD BITS DCA IOFN TAD IOPGCT /NOW FORM PAGE COUNTER CLL RAL AND (7600 DCA IOPGCT /SAVE IT JMS I (GET /GET BUFFER ADDR DCA IOMA JMS I (GET /GET OS/8 BLOCK NUMBER DCA BLOCK JMP I SETFUD /RETURN .SBTTL I/O STARTUP /START OF INTERRUPT PROCESSING /READ DRIVE STATUS, AND IF CLEAN SETUP FIRST BLOCK TRANSFER /ELSE READ BBL FIRST BEGIN, TAD (RLSE /FIRST ENABLE ERROR CHECKING ON I/O COMPLETION AGAIN DCA I (ERRSKP RRSI /READ FIRST STATUS BYTE AND (40 /TEST IF COVER OPEN SZA CLA /SKP IF NO JMP INVBBL /MAKE BBL INVALID IF YES RRSI /READ SECOND STATUS BYTE AND (377-40 /TEST ALL BUT WRITE LOCK STATUS SNA CLA /SKP IF ANY SET JMP CHKBBL /ELSE JUST CHECK IF BBL IN CORE IS VALID INVBBL, DCA I BBLID /ZERO ID CHECK CODE FOR UNITS A+B TO INVALIDATE BBL TAD BBLID /OFFSET TO UNIT C BBL TAD (41 DCA BBLID DCA I BBLID /ZERO THE ID OUT CHKBBL, JMS I (RAWCHK /CHECK IF RAW MODE FIRST TAD I (MA /USE MA PASSED FOR BBL IN QUESTION DCA BBLID /TO LOCATE CHECK CODE WORD TAD I BBLID /TEST VALIDITY TAD (-ID /MAGIC CONSTANT SZA /SKP IF COOL JMS I (TRANS /ELSE READ THE NEW BBL IN NOW OKBBL, TAD IOMA /NOW SETUP TRANSFER ROUTINE FOR ACTUAL USER I/O DCA I (MA TAD (7600 DCA I (WC TAD IOFN DCA I (FN TAD IOPGCT DCA I (PAGCT .SBTTL BLOCK TRANSFER LOOP /MAP THE CURRENT LOGICAL BLOCK TO PHYSICAL MAPLUP, TAD I MAPPTR /LOOK AT NEXT BBL ENTRY SNA /SKP IF NOT EOL JMP I MAPPED /ELSE JMP TO TRANSLATE TO TRACK AND SECTOR STL CIA TAD BLOCK /COMPARE UNSIGNED TO LOGICAL BLOCK SZL CLA /SKP IF BLOCK LT BBL ENTRY JMP I MAPPED ISZ MAPPTR /BUMP TO NEXT BBL ENTRY NXTBLK, ISZ BLOCK /BUMP BLOCK AROUND BAD BLOCK JMP MAPLUP /TRY AGAIN JMP I (ERROR /TAKE HARD ERROR EXIT IF OVERFLOW PAST 12 BITS MAPPED, ERROR /GETS SET TO LOGICAL-PHYSICAL TRANSLATE ROUTINE MAPPTR, 0 /GETS SET TO PROPER BAD BLOCK TABLE CVTAB, TAD BLOCK /CONVERT LOGICAL TO PHYSICAL FOR UNITS A+B AND (17 /GET SECTOR BITS CLL RTL /DOUBLE TWICE FOR INTERLEAVE AND 2 BLOCKS PER SECTOR TAD (-27 /DO INTERLEAVE MOD 40. SECTORS/TRACK SPA TAD (47 DCA I (SECTOR /STORE THE SECTOR TAD BLOCK /NOW GET TRACK BITS RTR /SHIFT 4 BITS RIGHT RTR AND (377 /MASK 8 HIGH BITS TAD OFFSET /ADD UNIT B OFFSET IF NEEDED JMP I (DOTRAN /NOW DO THE BLOCK TRANSFER CVTC, TAD BLOCK /CONVERT LOGICAL TO PHYSICAL FOR UNIT C AND (3 /LOW 2 BITS SELECT SECTOR CLL RTL /DOUBLE TWICE FOR INTERLEAVE AND 2 SECTORS PER BLOCK DCA I (SECTOR TAD BLOCK /GET PHYSICAL BLOCK (LINK IS CLEAR) TAD (4010 /RANGE CHECK BLOCK NUMBER SZL CLA /SKP IF BLOCK LT LIMIT JMP I (ERROR /TAKE HARD ERROR EXIT IF NO TAD BLOCK RTR AND (777 IAC /UNIT C STARTS AT TRACK 1 JMP I (DOTRAN /NOW DO THE TRANSFER, PASSING TRACK IN AC BLOCK, 0 /CURRENT OS/8 BLOCK NUMBER OFFSET, 0 /SAVED OFFSET FOR UNIT B BBLID, 0 /POINTER TO FIRST ID WORD IN BBL TRIO IOMA, 0 /SAVED COPY OF USER BUFFER ADDR IOFN, 0 /SAVED COPY OF USER I/O FUNCTION AND BUFFER FIELD IOPGCT, 0 /SAVED COPY OF USER PAGE COUNT PAGE /TRANSFER A BLOCK AS A PAIR OF SECTORS AND BUMP ADDRESSES DOTRAN, DCA TRACK /STORE TRACK PASSED IN AC FROM BAD BLOCK MAPPER JMS TRANS /NOW DO THE TRANSFER ISZ SECTOR /BUMP THE SECTOR ISZ SECTOR /TWICE FOR 2:1 INTERLEAVE JMS TRANS JMP I (NXTBLK /MAP AND DO NEXT BLOCK /ROUTINE TO SEEK AND TRANSFER A SINGLE SECTOR TRANS, 0 SNA CLA /KLUDGE: NONZERO AC MEANS INVALIDATE CURRENT TRACK JMP NOTBBL /JMP IF NOT A BBL READ AC2000 DCA I CURTRK /INVALIDATE TRACK BY STORING OUT OF RANGE VALUE IFNZRO KT8A < TAD BBLBNK /LOAD KT8A BANK FOR BBL SKP > NOTBBL, IFNZRO KT8A < TAD USRBNK /LOAD KT8A BANK WITH USER BUFFER LBM > AC7775 /NOW SET RETRY COUNT TO THREE TIMES DCA RETRYCT TAD TRACK /CONVERT TRACK TO CYLINDER AND SURFACE CLL RAR DCA CYL RTR /SURFACE BIT IN AC 1 DCA SURF JMS TRKCMP /COMPARE TRACKS AND TRANSFER AT ONCE IF MATCHING RETRY, RLDC /RETURN IF NO MATCH, CLEAR INTERFACE SEEK, IAC /DO CONTROLLER RESET PRIOR TO SEEKING JMS IO TAD (BYTE+RLRH /NOW DO HEADER READ IN 8 BIT MODE JMS IO RRSI /READ FIRST SILO BYTE BSW AND (3 /GET LOW 2 TRACK BITS FROM HEADER WE ENCOUNTERED DCA I CURTRK /SAVE IN DRIVE TABLE RRSI /READ NEXT BYTE AND (377 /CLEAR ANY CRAP IN HIGH BITS CLL RTL /ADD TO LOW TRACK BITS TAD I CURTRK DCA I CURTRK JMS TRKCMP /NOW TRY TO DO TRANSFER AGAIN TAD I CURTRK /EXTRACT CURRENT CYLINDER FROM CURRENT TRACK CLL RAR CIA TAD CYL /COMPUTE DIFFERENCE TO SEEK BY CLL RAL /SAVE SIGN BIT IN LINK SZL /TAKE ABS(DIFFERENCE) CIA CML RAR /AC0=1 IF SEEK TO HIGHER ADDR, AC1-11=ABS DIFFERENCE TAD SURF /ADD SURFACE CALCULATED ABOVE RLCA /LOAD CYL DIFFERENCE REGISTER AC0002 /LOOP BACK AND DO SEEK JMP SEEK IFNZRO KT8A < BBLBNK, 0 /GETS BBL BANK FOR KT USRBNK, 0 /GETS USER BANK FOR KT > /ROUTINE TO COMPARE CURRENT TRACK TO DESIRED TRACK /DO SECTOR TRANSFER IF MATCH TRKCMP, 0 TAD I CURTRK /COMPARE CYLINDER AND SURFACE FOR MATCH CLL CIA /THIS IS BECAUSE YOU MUST SEEK EVEN IF ONLY TAD TRACK /CHANGING SURFACES SZA CLA /SKP TO TRANSFER IF MATCH JMP I TRKCMP /ELSE RETURN TAD SECTOR BSW /LOAD SECTOR REGISTER RLSA TAD WC /LOAD NEGATIVE WORD COUNT RLWC TAD SURF /LOAD SURFACE BIT AND CYLINDER ADDR TAD CYL RLCA TAD MA /LOAD MEMORY ADDR RLMA TAD FN /PASS READ/WRITE FUNCTION TO I/O WAIT ROUTINE JMS IO /WAIT FOR TRANSFER TO COMPLETE TAD MA /NOW BUMP BUFFER ADDR UP A PAGE TAD (200 DCA MA TAD PAGCT /DECREMENT PAGE COUNT TAD O7600 SNA /SKP IF MORE TO TRANSFER JMP DONE /ELSE WAKE UP TASK FOR COMPLETION DCA PAGCT JMP I TRANS /RETURN .SBTTL I/O WAIT ROUTINE /I/O WAIT ROUTINE /ACTS AS COROUTINE WITH RTS/8 INTERRUPT SKIP CHAIN /ENTRY AC = RL8A FUNCTION IO, IOEXIT TAD DRIVE /ADD PHYSICAL UNIT AND INTERRUPT ENABLE BITS RLCB /LOAD CONTROL REGISTER "B" O7600, 7600 IOEXIT, CIF RTS8 POSTDS /DISMISS CURRENT INTERRUPT INTRPT, 0;0 /SKIP CHAIN LINKAGE RLSD /SKP IF IT'S OURS JMP I INTRPT CIF CDF .FLD /RESET FIELDS ERRSKP, NOP /SKP/NOP SWITCH FOR INHIBITING ERROR CHECKING JMP I IO /RETURN TO CALLER ISZ RETRYC /BUMP RETRY COUNT IF ERROR JMP RETRY /TRY AGAIN ERROR, IAC /FLAG A HARD ERROR DONE, DCA I (IOSTAT /STORE COMPLETION STATUS TAD (IOEXIT /IGNORE FURTHER INTERRUPTS FROM THIS DEVICE DCA IO TAD DRIVE /NOW DISABLE FURTHER INTERRUPTS /JR1+ AND (7777-INTEN IAC /DO A RESET TO GET THE INTERRUPT DISABLE IN RLCB CLA / /JR1- DCA ERRSKP /NOP OUT ERROR CHECKING TOO TAD (DONEFG /POST TASK LEVEL EVENT FLAG JMP IOEXIT /EXIT INTERRUPT LEVEL NOW DONEFG, 0 CURTRK, 0 /POINTS TO CURRENT TRACK FOR CURRENTLY SELECTED DRIVE TRACK, 0 /TRACK = CYL*2+SURF CYL, 0 /8 BIT CYLINDER ADDR SURF, 0 /SURFACE SELECT IN BIT 1 SECTOR, 0 /6 BIT SECTOR ADDR IN RANGE [0,47] OCTAL RETRYCT,0 /TRANSFER RETRY COUNT MA, 0 /MEMORY ADDR FOR TRANSFER FN, 0 /READ/WRITE FUNCTION AND EMA BITS WC, 0 /NEGATIVE WORD COUNT FOR TRANSFER PAGCT, 0 /PAGE COUNTER IN BITS 0-4 DRIVE, 0 /PHYSICAL DRIVE SELECT AND INTERRUPT ENABLE BIT PAGE /PART OF RAW MODE MODS, SET DRIVE AND MODE UP .FSECT RL01F FIELD RL01T SETDRV, 0 AND (3 /ISOLATE PHYSICAL UNIT BSW /MOVE TO AC4-5 TAD (INTEN /SET INTERRUPT ENABLE DCA I (DRIVE /STORE IN INTERRUPT ROUTINE TAD I (UNIT /NOW SETUP APPROPRIATE BAD BLOCK LIST AND (3 CLL RAL /2 WORDS PER DRIVE TAD (DRVTAB /ADD TO BASE OF PHYSICAL DRIVE TABLE DCA I (CURTRK /FIRST WORD IS CURRENT TRACK ON THIS DRIVE IFDEF RK8E < TAD (RK8E /MIGHT AS WELL DO RK8E INTERLOCK HERE CAL BLKARG /BLOCK RK TASK ON USER WAIT USERWT > TAD I (UNIT /NOW SEE IF DIRECT SECTOR MODE AND (RAWBIT SNA CLA /SKP IF YES JMP I SETDRV /ELSE CONTINUE NORMAL MAPPED PROCESSING JMS I (GET /GET FIELD, SECTOR COUNT, AND READ/WRITE JMS I (SETFUD /BLOCK NOW CONTAINS TRACK TO USE AC0002 /BUMP PAST STATUS TO GET SECTOR TAD I (MSGPTR DCA SADDR TAD I (MSGCDF DCA .+1 HLT TAD I SADDR /PICK UP THE SECTOR CDF .FLD DCA I (SECTOR /STORE IN INTERRUPT LEVEL ROUTINE TAD I (BLOCK DCA I (TRACK /COPY OVER TRACK TO PROPER PLACE NOW JMP I (RAWGO /CONTINUE PROCESSING SADDR, 0 IFDEF RK8E < RKENAB, TAD (RK8E /JUST BEFORE LOOPING TO RECEIVE, RE ENABLE RK8E CAL UNBARG USERWT JMP I (LOOP /NOW DO ANOTHER RECEIVE > RAWCHK, 0 TAD I (UNIT /SEE IF RAW MODE AND (RAWBIT SNA CLA /SKP IF YES JMP I RAWCHK /ELSE JUST CONTINUE TAD I (IOMA /COPY BUFFER ADDR OVER NOW DCA I (MA TAD I (UNIT AND (BYTBIT /TEST IF BYTE MODE REQUIRING 400 WORDS/SECTOR SZA CLA TAD (7600 TAD (7600 /USE -200 IF 12 BIT MODE, -400 IF BYTE MODE DCA I (WC TAD I (IOFN DCA I (FN /COPY OVER READ/WRITE FUNCTION TAD I (IOPGCT /NOW THE SECTOR COUNT DCA I (PAGCT RAWLUP, JMS I (TRANS /DO A SECTOR NOW ISZ I (SECTOR /BUMP UP TO NEXT ONE TAD I (SECTOR /TEST IF OFF TRACK TAD (-50 SZA CLA /SKP IF YES JMP RAWLUP /ELSE JUST LOOP DCA I (SECTOR /CLEAR SECTOR ISZ I (TRACK /GOTO NEXT TRACK JMP RAWLUP /CONTINUE JMP I (ERROR /ERROR IF EVER SKIPS! /// PAGE IFNZRO KT8A < .SBTTL KT8A BREAK MAP INITIALIZATION .EXTERN KTTAB,KTBUF,TSWFLG LBM= 6170 /LOAD BREAK MAP ENTRY RLB= 6172 /READ LAST BREAK THAT OCCURRED .FSECT RL01K FIELD RL01T START, CAL /FIRST INSERT OUR SKIP CHAIN ENTRY SKPINS INTRPT CAL /THEN PULL IN THE FIRST MESSAGE RECEIV SAVADR, 0 /SAVE THE ADDRESS DCA SAVCDF /AND THE FIELD SAVCDF, HLT TAD I SAVADR /GET THE UNIT HE REQUESTED CDF .FLD AND (3 TAD (RAWBIT /DO A DIRECT ACCESS TO AVOID READING BAD BLOCK MAP DCA KTMESG /STORE IN DUMMY MESSAGE JMP I (KTBGO /REJOIN MAINLINE CODE /ONCE ONLY TO FIND BREAK MAP ENTRY FOR RL01 FNDBRK, 0 TAD ONCFLG /SEE IF FIRST TIME THRU SMA CLA /SKP IF YES JMP I FNDBRK /ELSE CONTINUE ON CDF RTS8 /LOCK ACCESS TO BREAK FLAG TABLE DCA I (TSWFLG /BY INHIBITING TASK SWITCHING FINDLP, CDF .FLD TAD I (DONEFG /TEST IF EF POSTED YET SNA CLA /SKP IF NO JMP I (KTBGO /TRY AGAIN IF YES, WE DIDN'T GET OUR BREAK YET RLB /READ LAST BREAK DCA BREAKR /SAVE IT TAD BREAKR /NOW TEST IF UNIQUE, IMPLYING ITS OURS CLL RTR TAD (KTTAB DCA KTPTR CDF RTS8 /TABLE IS IN RTS8 FIELD TAD I KTPTR SMA CLA /SKP IF NEW BREAK JMP FINDLP /ELSE SPIN THRU LOOP AGAIN DCA I KTPTR /ZERO OUT THE FLAG CDF .FLD CAL /NOW WAIT FOR EF, ALSO RESCHED IF NECESSARY WAITE DONEFG TAD SAVADR /COPY OVER THE REAL REQUEST NOW DCA I (MADDR TAD SAVCDF DCA I (MSGCDF DCA ONCFLG /CLEAR THE ONCE-ONLY FLAG NOW JMP I (KTBGO /NOW GO HANDLE REAL USER REQUEST KTPTR, 0 /SETUP BREAK MAP FOR USER'S BUFFER MAPSET, 0 TAD ONCFLG /TEST IF HAVE A BREAK MAP ADDR YET SZA CLA /SKP IF YES, HANDLE USER REQUEST JMP I MAPSET /ELSE RETURN, EXEC INIT'ED IT TO ZERO FOR US TAD I (IOPGCT /GET FIELD BITS RTR /DIDDLE KT BITS RAR SPA CLA IAC RAL TAD BREAKR /ADD TO OUR KT MAP ADDR DCA I (USRBNK /SAVE USERS BANK INFO TAD DOTFLD TAD BREAKR DCA I (BBLBNK /NOW SAVE OUR BANK INCASE BBL READ NEEDED JMP I MAPSET /NOW RETURN DOTFLD, <.FLD&100%40>+<.FLD&4%4> ONCFLG, -1 /ONCE ONLY FLAG FOR DOING BREAK MAP INIT BREAKR, 0 /GETS OUR 4 BIT ADDRESS IN BITS 6-9 KTMESG, 0 /MODE+UNIT 100+ /ONE SECTOR TO RTFLD /NOTE THAT HIGH 2 BITS ARE ALREADY IN BREAK MAP KTBUF /TO THIS BUFFER 0 /SECTOR 0 0 /STATUS 0 /ON TRACK 0 > .SBTTL DRIVE CONTROL TABLES .DSECT RL01DT FIELD RL01T DRVTAB, 2000 /CURRENT TRACK (INITIALLY OUT OF RANGE) BBL0 /BAD BLOCK LISTS FOR DRIVE 0 2000 /SAME FOR REST OF DRIVES... BBL1 2000 BBL2 2000 BBL3 BBL0, 0 /ID FOR UNIT A+B BBL'S ZBLOCK 20 /BBL FOR UNIT A ZBLOCK 20 /BBL FOR UNIT B 0 /ID FOR UNIT C BBL ZBLOCK 20 /BBL FOR UNIT C BBL1, 0 ZBLOCK 20 ZBLOCK 20 0 ZBLOCK 20 BBL2, 0 ZBLOCK 20 ZBLOCK 20 0 ZBLOCK 20 BBL3, 0 ZBLOCK 20 ZBLOCK 20 0 ZBLOCK 20 PAGE