/MAINDEC-X8-DHRK*-*-L "DEC/X8" RKS8ES /RKS8E DISK SYSTEM MODULE FOR DEC/X8 /COPYRIGHT 1972, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. /THIS MODULE OPERATIONAL ON PDP-8,8/I,8/L,8/E,8/M AND PDP-12 WITH AN RKS8E DISK CONTROL. /PRG: /BUILDER INSTRUCTIOUS: /1.PRIORITY: NOT CRITICAL, BUT SHOULD BE ASSIGNED NEAR LEVEL 0 /TO PROVIDE MAXIMUM DATA BREAK INTERACTION. /2.JOB SLOT: 4 PAGES REQUIRED, SLOT JX1 OR JX2. /INITIALIZER INSTRUCTIONS: /CODE DEFINED RESPONSE PRESET /A: LOWEST DISK TO USE 0-7 0 /B: HIGHEST DISKTO USE 0-7 0 /C: TYPE OF DATA 0=RANDOM; 1 NNNN=CONSTANT RANDOM /D: ADDRESSING 0=RANDOM; 1 NNNN NNNN=CONSTANT* RANDOM / *NOTE: THE MAX ADDRESS ACCEPTED BY THIS / MODULE IS 010DDD 4536 WHERE (DDD) IS / THE DISK NUMBER. /E: LENGTH OF TRANSFER 0=RANDOM; 1 NNNN=CONSTANT RANDOM / WHERE NNNN MAY BE1 TO 1000. /F: BUFFER ASSIGNMENT 0=RANDOM; 1 NNNN=CONSTANT RANDOM /SPECIAL USER MODIFICATIONS VIA RELATIVE "^O" FACILITY. /1."REPORT" MAY BECHANGED FROM 3777 TO XXXX WHERE ANY / CLEAR BITS INHIBIT ANERROR REPORT FOR THAT CONDITION. /2."PARITY" MAY BE CHANGED FROM3767 TO 3777 TO INHIBIT / DATA CHECKINGAFTER A CRC ERROR. /REPORT SYMBOL DEFINITIONS: /1.REFER TO MODULE TABLE IN THIS LISTING FOR DESCRIPTION / OF CNTR, SA:-SG:, AND DA:-DC: /2."CODE" DEFINITIONS: /CODE DEFINED /0002 READ /0004 WRITE /001X FALSE DATA ERROR (BAD CHECKSUM BUT / DATA LOOKED GOOD ON WORD BY WORD CHECK.) /0012 THIS TYPE OF ERROR MAY BE REPORTED AFTER / A CRC ERROR AND INDICATES THE FOLLOWING: / 1. THE CRC ERROR STOPPED THE TRANSFER PRIOR TO / COMPLETION AND THEREBY CAUSED A SOFTWARE / SUMCHECK ERROR; 2. THE DATA THAT WAS READ IN / WAS GOOD. /RKS8E STANDARDS /DEVICE CODE: 74, 75 /RKS8E IOT DEFINITIONS DSKP=6741 /PC+1->PC IF TD OR ER DCLR=6742 /AC=0000 /0->AC; 0->SR /AC=0001 /0->AC; 0->CONTROL /AC=0002 /0->AC; RECALIBRATE SELECTED DRIVE DLAG=6743 /AC->DAR; GO; 0->AC DLCA=6744 /AC->CA; 0->AC DRST=6745 /SR->AC DLDC=6746 /AC->CM; 0->AC DMAN=6747 /AC BIT /FUNCTION /0 /ENTER MAINTENANCE /1 /ENABLE SHIFT TO LOWER BUFFER /2 /NOT USED IN THIS MODULE /3 /SHIFT CMTO LOWER BUFFER /4 /SHIFT SUR/SEC TO LOWER BUFFER /5 /NOT USED IN THIS MODULE /6 /NOT USED IN THIS MODULE /7 /0->AC; LOWER BUFFER TO AC /8-11 /NOT USED IN THIS MODLULE DCWC=6752 DLWC=6753 DRWC=6755 /MODULE TABLE *200 JOB, 0 /JOB NUMBER TEXT1, TEXT "RKS8ES" /DEVICE NAME TEXT "DHRK*-*" /MODULE DESIGNATOR HOMEDF, 0 /DF=IF HLT/CDF JMP I HOMEDF INTACK, CIF 00 /ACKNOWLEDGE INTERRUPT. JMS I IHRETP -1 /PRIORITY KILL, -1 /COMMAND TO KILL JOB. KILLED, -1 /MODULE SETS TO -1 WHEN JOB KILLED. CNTR, 0 /NUMBER OF EXERCISER LOOP PASSES. ERROR, 0 /ERROR CALL. DCA .+11 LAS AND Z K4 SZA DCA KILL JMS HOMEDF IOF CIF 00 JMS I ERRP 0 JMP I ERROR CODE, 0 /ERROR CODE. -7 /STATUS WORD TALLY ERRSA, 0 /STATUS REGISTER ERRSB, 0 /BUFFER DESIGNATOR ERRSC, 0 /INITIAL SOFTWAREWORDCOUNT ERRSD, 0 /FINAL SOFTWARE WORDCOUNT ERRSE, 0 /INITIAL CA ERRSF, 0 /INITIAL CMAND TRK0 ERRSG, 0 /INITIAL DAR (TRK/SUR/SEC) -3 /DATA ERROR ENTRY TALLY. ERRDA, 0 /BUFFER ADDRESS ERRDB, 0 /GOOD DATA ERRDC, 0 /BAD DATA /END OF MODULE TABLE /INTERRUPT SERVICE - IMMEDIATE ONLY INT, 0 /MONITOR JMS HERE ISZ RENTRY /EXPECTED INTERRUPT? JMP INT1 /NO DC74A, DRST /READ STATUS JMS HOMEDF /NO. DF=IF DCA ERRSA /SAVE STATUS DC75B, DRWC /READ THEWORD COUNT DCA ERRSD /SAVEIT INERRSD DC74B, DCLR /CLEAR STATUS TAD (DEFSRV /SET DEFERREDSERVICE JMP INTACK /ACKNOWLEDGE INTERRUPT INT1, RDF /UNEXPECTED INTERRUPT. TAD Z KCIFDF DCA .+2 DCA RENTRY HLT JMP I INT /EXIT TO MONITOR CHAIN RENTRY, 0 SECDAR=ERRDA AGAIN=ERRDC /ROUTINE TO SET UP RKS8E TO READ OR WRITE DATA /CALL MUST BE: /1. SET UP ERRSB,ERRSC,ERRSE,AT LEAST BITS 5,9-11 OF ERRSF,ERRSG /2. DF=IF /3. AC=2 FOR READ; AC=4 FOR WRITE /4. JMS I (GO /5. CM FOR READ OR WRITE DATA WITH INT ENA /6. ERROR RETURNHERE /7. GOOD RETURNHERE GO, 0 DCA CODE /SAVE ERROR CODE INCASE TAD KILL /KILLCHECK SNA JMP .+4 DCA KILLED JMS I (RELEAS SERVEX TAD ERRSF /KEEP ONLY DISK AND TRK0 IN INIT CM AND K107 DCA ERRSF TAD ERRSC /MAKE FINAL WC=INIT WC DCA ERRSD TAD ERRSF /ADD TRK0 AND DISK TAD I GO /ADD READ OR WRITE DATA+ENA ISZ GO /MOVE TO BAD EXIT DCA ERRSF TAD ERRSB /ADD FIELD BITS AND Z K70 TAD ERRSF DCA ERRSF /SAVE GOOD INIT CM CLA CMA /ALLOW ONE INTERRUPT IOF DCA RENTRY TAD ERRSC /LOAD WC DC75A, DLWC TAD ERRSE /LOAD CA DC74F, DLCA TAD ERRSF /LOAD CMAND CLEAR STATUS DC74G, DLDC TAD ERRSG /LOADDAR AND GO. DC74H, DLAG SERVEX /OUT GORET, JMP I GO /OUT DATCON, 0 TAD ERRDB JMP I DATCON /END OF PAGE *. *400 /RANDOM NUMBER GENERATOR RANDOM, 0 ISZ RAN1 NOP TAD RAN2 TAD K1111A CLL RAL SNL IAC DCA RAN2 TAD RAN1 TAD RAN2 JMP I RANDOM SAVRAN, 0 /PRESET CDF 00 TAD I Z K0 DCA RAN2 JMS I (HOMEDF TAD RAN1 DCA SAV1 TAD RAN2 DCA SAV2 JMP I SAVRAN RESRAN, 0 /RESTORE TAD SAV1 DCA RAN1 TAD SAV2 DCA RAN2 JMP I RESRAN RAN1, 0 RAN2, 0 SAV1, 0 SAV2, 0 K1111A, 1111 DATCHK, 0 /CHECK DATA. TAD I (ERRSD /GET FINAL WC. JMS I (SUMCHK /SUMCHECK. CIA TAD I (SUMSAV /GOOD? SNA CLA JMP I DATCHK /YES. OUT. JMS RESRAN /NO. RESTORE DATA GENERATOR. TAD I (ERRSD /PRESET TO CHECK DATA. JMS DATSET DCA .+5 /SAVE CDF TO BUFFER FIELD. TAD I (DATGEV /MOVE DATA GENERATOR POINTER TO THIS DCA DATSET /PAGE JMS I DATSET /GENERATE 1 WORD. DCA I (ERRDB /SAVE IN GOOD. HLT/CDF /DF TO BUFFER FIELD. AUA, TAD I AUTO /GET WORD IN BUFFER. JMS I (HOMEDF /DF=IF DCA I (ERRDC /SAVE IN BAD. AUB, TAD AUTO /GET ADDR AND SAVE. DCA I (ERRDA TAD I (ERRDC /GOOD=BAD? CIA TAD I (ERRDB SZA JMS I (ERROR /NO. DATA ERROR (AC NOT 0) ISZ I (BUFTAL /DONE? JMP .-16 /NO. TAD I (CODE /YES. SET CODE=001X TAD Z K10 DCA I (CODE JMS I (ERROR /CLOSE ERROR ROUTINE. JMP I DATCHK /OUT. DATSET, 0 /SET UP FOR DATA GENERATE OR CHECK. CIA /COMPUTE LENGTH TO FILL OR CHECK. TAD I (ERRSC SNA JMP I DATCHK DCA I (BUFTAL /SAVEIT. CLA CMA TAD I (ERRSE /PUT CA IN AUTO INDEX. AUC, DCA AUTO TAD I (ERRSB /COMPUTE CDF TOBUFFER FIELD. AND Z K70 TAD Z KCDF JMP I DATSET /EXIT WITH IT IN AC. /DEFERRED SERVICE ENTRY DEFSRV, CLA TAD I (ERRSA /ERROR REPORT? AND REPORT SZA CLA JMS I (ERROR /YES. STATUS ERROR REPORT. CLL CMA RAR /CHECK FOR ERROR RECOVERY JMP I (GOTER /DO IT. REPORT, 3777 RELEAS, 0 /RELEASE BUFFER TAD I (ERRSB /DESIGINAC IOF /MONITOR CALL CIF 00 RLBUFF JMP I RELEAS /EXIT WITH ION *. *600 /RUNNER RUN, DCA I (ERRSB /CLEAR BUFFER DESIG DCA I (CNTR /0-> PASS COUNTER /START OFEXERCISER LOOP EXER, LAS /CHANGE DISKADDRESS? RAR SZL CLA JMP LGTGEN /NO EXERA, JMS I ADRGEV /YES. GET DSKAND TRK AND Z K7 DCA I (ERRSF TAD I (ERRSF />OR=LOW? TAD LODSK SPA CLA JMP EXERA /NO. REGENERATE TAD I (ERRSF /YES. CNTR K7000A, 7000 /NOP JMP EXER /LOOP DKRK, TAD I (ERRSA AND PARITY SNA CLA JMS I (DATCHK /CRC ERROR. CHECK DATA. TAD I (ERRSA /CRC ERROR? AND K3767A SNA CLA ISZ PARTAL /YES. 3 REREADS? JMP DSKRD /NO. 1 MORE. JMP DSKOUT /YES. OUT BUFTAL, 0 SUMSAV, 0 PARTAL, 0 PARITY, 3767 K777, 0777 K107, 0107 K3767A, 3767 LODSK, 0 /LOW DISK SELECT =(TYPED INVALUE) HIDSK, 0 /HIGH DISK SELECT =(TYPED INVALUE) M4537A, -4537 K600A, 600 SUMCHK, 0 /SUM CHECK BUFFER JMS I (DATSET DCA .+1 HLT/CDF CLL AUF, TAD I AUTO SZL IAC ISZ BUFTAL JMP .-5 JMS I (HOMEDF JMP I SUMCHK GOTER, AND I (ERRSA /ERROR? SNA CLA ISZ I (GO /NO. MAKE GOODEXIT IAC DC74E, DCLR /CLEAR CONTROL JMP I (GORET ADRCON, 0 JMP LGTGEN /END OF PAGE *. /NOTE: THESE LOC'S ARE SPECIFIED BELOW THE *. SO THAT THE ADDRESSES /INDICATED ARE MODIFIED PROPERLY BY THE DEC-X8 LOADER. LGTGEV, RANDOM /LGTCON BUFGEV, BUFRAN /BUFCON DATGEV, RANDOM /DATCON ADRGEV, RANDOM /ADRCON *1000 /ROUTINE TO ASSIGN AND HOLD A SPECIFIED BUFFER WHICH MUST BE /LEGALLY SPECIFIED IN CONBUF (STANDARD BUFFER DESIGNATOR) BUFCON, 0 TAD ERRSB /GET CURRENTBUFFER WORD. CIA TAD CONBUF SNA CLA /SPECIFIED BUFFER ASSIGNED? JMP I BUFCON /YES. EXIT. JMS BUFRAN /NO. GET NEW BUFFER. JMP BUFCON+1 /CHECK IT CONBUF, 0 /MUST CONTAIN LEGAL BUFFER DESIGNATOR. /ROUTINE TO ASSIGN A BUFFER OBSERVING SR 10. LTRCOD=. BUFRAN, 0 LAS /PUT SR 10 (NOT) IN LINK. RTR CLA CML TAD ERRSB /BUFFER WORD IN AC. SNL SZA JMP .+6 /EXIT IF AC NON ZERO AND LINK SET. SZA CLA JMS RELEAS /RELEASE BUFFER IF AC NON ZERO. IOF /ASSIGNA BUFFER CIF 00 ASBUFF DCA ERRSB /SAVE BUFFER DESIGNATOR. JMP I BUFRAN /EXIT. LGTCON, 0 TAD I (ERRSC JMP I LGTCON /INITIALIZER /"INIT" IS INITIALIZING ADDRESS. INIT, MESAGE TEXT1 INITLP, TAD Z K301 /SET CODE TO "A" DCA LTRCOD JMS INISR1 /GET LOW DISK. DCA LODSK /SAVE IN BITS 4-5 NEGATED JMS INISR1 /SAME FOR HIGH DISK. DCA HIDSK JMS INISR2 /TYPE OF DATA. JMP .+4 /RANDOM DCA I (ERRDB /CONSTANT-SAVE IN GOOD DATA. TAD (DATCON /PRESET POINTERS. SKP TAD (RANDOM DCA I (DATGEV JMS INISR2 /TYPE OF ADDRESSING: JMP .+10 /RANDOM DCA I (ERRSF /CONSTANT-SAVE EMA PART. SPACE2 /2 SPACES FOROCT /GET DMA PART. JMP INITLP DCA I (ERRSG /SAVE IT. TAD (ADRCON /PRESET POINTERS SKP TAD (RANDOM DCA I (ADRGEV JMS INISR2 /LENGTH OF TRANSFER: JMP .+5 /RANDOM CIA /CONSTANT-NEGATE AND SAVE DCA I (ERRSC /AS INITIAL WC. TAD (LGTCON /PRESET POINTERS. SKP TAD (RANDOM DCA I (LGTGEV JMS INISR2 /BUFFER ASSIGNMENT: JMP .+4 /RANDOM DCA CONBUF /CONSTANT-SAVE IN HOLDER. TAD (BUFCON /PRESET POINTERS. SKP TAD (BUFRAN DCA I (BUFGEV INITEX /OUT. INISR1, 0 /SERVICE1. JMS INISR3 /DO SERVICE 3. CIA /NEGATE JMP I INISR1 /OUT. INISR2, 0 /SERVICE 2 JMS INISR3 /DO SERVICE 3. SNA CLA JMP I INISR2 /0=RANDOM OUT ISZ INISR2 /NOT 0 IS CONSTANT. SPACE2 /2 SPACES. FOROCT /GET 4 OCTAL NUMBERS JMP INITLP /ERROR. JMP I INISR2 /OUT INISR3, 0 /SERVICE 3. CRLF /CARRIAGE RET-LINE FEED. TAD LTRCOD /GET LETTER CODE. TYPE /PRINT IT SPACE2 /2 SPACES ONEOCT /GET ONE OCTAL NUMBER. JMP INITLP /ERROR. AND Z K7 /MAKE