/ TRACK ALTERNATION UTILITY / PROGRAM TO ALTERNATE BAD TRACKS ON WINCHESTER DISKS. / LAST EDIT: 29-APR-1989 23:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / THIS PROGRAM IS AN INTERIM UTILITY TO LOGICALLY ALTERNATE DEFECTS ON / WINCHESTER DISK DRIVES ATTACHED TO OMTI 20 OR 5XXX SERIES SCSI CONTROLLERS. / THE LOGIC CONTAINED WITHIN THIS PROGRAM WILL BE TRANSFERRED TO THE MAIN "DMU" / PROGRAM WHEN APPROPRIATE. / USE AFTER FORMATTING THE DRIVE (WITH THE "DMU" PROGRAM'S FORMATTING FACILITY) / TO ALTERNATE MANUFACTURING DEFECTS WITH REPLACEMENT TRACKS. ALTERNATE TRACKS / SHOULD BE SPECIFIED IN REVERSE PHYSICAL ORDER STARTING FROM THE HIGHEST / IMPLEMENTED PHYSICAL TRACK (THE HIGHEST HEAD ON THE HIGHEST CYLINDER). SHOULD / A CANDIDATE REPLACEMENT TRACK ACTUALLY BE DEFECTIVE, IT SHOULD BE SKIPPED OVER / AS AN ISOLATED TRACK. FUTURE WINCHESTER DISK UTILITIES WILL MARK THESE / OCCASIONAL TRACKS AS DEFECTIVE. / ONCE THE MANUFACTURING DEFECTS LIST HAS BEEN DEALT WITH SUCCESSFULLY, THE / "DMU" PROGRAM CAN AGAIN BE USED TO TEST THE OVERALL RELIABILITY OF THE DRIVE. / IF ADDITIONAL DEFECTS EXIST, THEY SHOULD BE TRANSLATED TO CYLINDER/HEAD FORMAT / AND APPLIED TO THIS UTILITY. FUTURE WINCHESTER DISK UTILITIES WILL / DISTINGUISH THESE ADDITIONAL DEFECTS FROM THE MANUFACTURING DEFECTS BY / DESIGNATING THE FORMER DEFECTS AS "FACTORY" DEFECTS. / PROGRAM USAGE. / THE USER WILL BE PROMPTED FOR PRIMARY CYLINDER AND HEAD VALUES. THE ALTERNATE / CYLINDER AND HEAD VALUES ARE OBTAINED VIA TWO METHODS: / CONSOLE SWITCHES SET TO 0000-7776: / THE USER WILL BE PROMPTED FOR ALTERNATE CTLINDER AND HEAD VALUES EACH TIME. / CONSOLE SWITCHES SET TO 7777: / ALTERNATE CYLINDER AND HEAD VALUES ARE AUTOMATICALLY CALCULATED VIA THE METHOD / OF DECREMENTING THE LAST CHOSEN ALTERNATE HEAD IF AVAILABLE OR THE HIGHEST / HEAD ON THE PREVIOUS CYLINDER IF NECESSARY. THE INITIAL VALUES AUTOMATICALLY / CALCULATED WILL BE THE HIGHEST CYLINDER AND HEAD AVAILABLE ON THE DEVICE. / SUBSEQUENT VALUES WILL BE CHOSEN FROM THE PREVIOUS USAGE EVEN IF OBTAINED WHEN / THE SWITCHES WERE SET TO 0000-7776. THIS ALLOWS FOR A MANUAL STARTING POINT / THEN AUTOMATIC ADDITIONAL CALCULATION WHEN UPDATING THE DEFECTS ON AN EXISTING / FORMATTED DRIVE, OR SKIPPING OVER KNOWN DEFECTS IN THE REPLACEMENT AREA. / LOGICAL ADDRESSES WILL BE CALCULATED AND DISPLAYED FOR THE SPECIFIED TRACKS. / CONFIRMATION MUST BE MADE OF THE ALTERNATION IN LOGICAL ADDRESS FORM. IT IS / THE USER'S RESPONSIBILITY TO MANAGE THE UNIQUENESS OF THE REPLACEMENT LIST AND / AVOIDANCE OF KNOWN DEFECTS IN THE REPLACEMENT AREA. / USAGE EXAMPLE. / TRACK ALTERNATION UTILITY VERSION 10A / DRIVE: 1 / HIGHEST AVAILABLE CYLINDER: 305 / HIGHEST AVAILABLE HEAD: 5 / PRIMARY / CYLINDER: 100 / HEAD: 3 / CYLINDER: 100 HEAD: 3 => 0019899 / ALTERNATE / CYLINDER: 305 / HEAD: 5 / CYLINDER: 305 HEAD: 5 => 0060555 / 0019899 => 0060555? (Y/N) YES / MORE? (Y/N) NO / ASSEMBLY PARAMETERS. XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON REVISIO="B /PROGRAM REVISION SBOOT= 7600 /SYSTEM RESTART ADDRESS VERSION=12 /PROGRAM VERSION / DISK GEOMETRY DEFINITIONS. DECIMAL /MAKE IT EASIER DRIVE= 1 /LOGICAL UNIT NUMBER FOR DRIVE HCLO= 0306 /CYLINDER COUNT - LOW-ORDER HCHI= 0000 /CYLINDER COUNT - HIGH-ORDER HEADS= 6 /NUMBER OF HEADS/CYLINDER SECTORS=33 /COUNT OF SECTORS/TRACK OCTAL /BACK TO NORMAL / MDC8 IOT DEFINITIONS. IFNDEF DEVCODE /USES 670X BY DEFAULT DSEI= DEVCODE^10+6000 /INTERRUPT ENABLE/DISABLE PER AC[11] DSSF= DEVCODE^10+6001 /SKIP ON DONE FLAG DSCF= DEVCODE^10+6002 /CLEAR DONE FLAG DSHI= DEVCODE^10+6003 /LOAD HIGH-ORDER COMMAND ADDRESS DSGO= DEVCODE^10+6004 /LOAD LOW-ORDER COMMAND AND GO / = DEVCODE^10+6005 /UNUSED DSRS= DEVCODE^10+6006 /READ STATUS DSIM= DEVCODE^10+6007 /INTERFACE MAINTENANCE INSTRUCTION AAT= 016 /ASSIGN ALTERNATE TRACK COMMAND IFNDEF CNTID /USES CONTROLLER ZERO BY DEFAULT TABLE= 200 /TABLE-TYPE TRANSFER OF DATA BYTES / CONSOLE IOT DEFINITIONS. / IFNDEF CICODE /USES 640X BY DEFAULT / IFNDEF COCODE /USES 641X BY DEFAULT IFNDEF CICODE /USES 603X BY DEFAULT IFNDEF COCODE /USES 604X BY DEFAULT KCCIOT= CICODE^10+6002 /CLEAR KEYBOARD FLAG, AC KRBIOT= CICODE^10+6006 /READ KEYBOARD BUFFER, CLEAR FLAG KRSIOT= CICODE^10+6004 /READ KEYBOARD BUFFER, DON'T CLEAR FLAG KSFIOT= CICODE^10+6001 /SKIP ON KEYBOARD FLAG TLSIOT= COCODE^10+6006 /LOAD OUTPUT, CLEAR FLAG TSFIOT= COCODE^10+6001 /SKIP ON OUTPUT FLAG / EXTENDED ARITHMETIC DEFINITIONS. XLIST OFF IFNDEF DAD IFNDEF DCM IFNDEF DLD IFNDEF DST IFNDEF DVI XLIST ON CAM= CLA MQL /CLEAR AC, MQ DAD= JMS I [DADD] /DOUBLE-PRECISION ADD DCM= JMS I [DCOM] /DOUBLE-PRECISION COMPLEMENT DLD= JMS I [DLOAD] /DOUBLE-PRECISION LOAD DST= JMS I [DSTORE] /DOUBLE-PRECISION STORE DVI= JMS I [DIVIDE] /DIVIDE / NUMERIC LOAD DEFINITIONS. NL0000= CLA /LOAD AC WITH 0000 NL0006= CLA CLL CML IAC RTL /LOAD AC WITH 0006 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7777= CLA CMA /LOAD AC WITH 7777 PAGE 0 /START AT THE BEGINNING *10 /DEFINE AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER ONE *20 /GET PAST AUTO-INDEX AREA ALTCYLI,ZBLOCK 2 /ALTERNATE CYLINDER ALTHEAD,ZBLOCK 2 /ALTERNATE HEAD AUTOFLA,.-. /AUTO-DECREMENT FLAG CYLNUMB,ZBLOCK 2 /CURRENT CYLINDER DRVNUM, DRIVE /LOGICAL UNIT NUMBER HEADNUM,ZBLOCK 2 /CURRENT HEAD INCHAR, .-. /LATEST INPUT CHARACTER NUMHEAD,-HEADS /NUMBER OF HEADS/CYLINDER (NEGATIVE) NUMSECT,-SECTORS /NUMBER OF SECTORS/TRACK (NEGATIVE) PAGE /GET TO NEXT PAGE START, JMS I (INITIALIZE) /LET'S GET INITIALIZED LOOP, JMS I [SCRIBE] /PRINT OUT THE PRIMSG /PRIMARY MESSAGE / NL0000 /INDICATE USER INPUT JMS CYLHEAD /GET CYLINDER AND HEAD BYTE2 /WHERE TO PUT COMMAND BYTES DLD; PHTEMP /GET PRIMARY LOGICAL ADDRESS DST; PRIMADDRESS /STASH IT JMS I [SCRIBE] /PRINT OUT THE ALTMSG /ALTERNATE MESSAGE LAS /GET USER CHOICE FROM SWITCHES JMS CYLHEAD /GET CYLINDER AND HEAD BYTE7 /WHERE TO PUT THE COMMAND BYTES JMS I [CRLF] /DO A , JMS I [CRLF] /DO A , DLD; PRIMADDRESS /GET PRIMARY ADDRESS CLL /INDICATE LEADING ZEROES DESIRED JMS I [P7DIGITS] /PRINT PRIMARY ADDRESS JMS I [SCRIBE] /PRINT OUT THE BRDMSG /BRIDGING MESSAGE DLD; PHTEMP /GET ALTERNATE LOGICAL ADDRESS CLL /INDICATE LEADING ZEROES DESIRED JMS I [P7DIGITS] /PRINT ALTERNATE ADDRESS JMS I [YORNO] /GET YES/NO RESPONSE JMS I (DOALT) /YES, GO ALTERNATE THE TRACK DLD; CYLNUMBER /GET LATEST CYLINDER DST; ALTCYLINDER /SAVE AS ALTERNATE FOR NEXT TIME DLD; HEADNUMBER /GET LATEST HEAD DST; ALTHEAD /SAVE AS ALTERNATE FOR NEXT TIME JMS I [SCRIBE] /PRINT OUT THE MORMSG /MORE MESSAGE JMS I [YORNO] /GET YES/NO RESPONSE JMP LOOP /YES, GO DO IT AGAIN JMP I [SBOOT] /NO, GOODBYE! CYLHEAD,.-. /GET CYLINDER AND HEAD ROUTINE CMA /INVERT PASSED VALUE DCA AUTOFLAG /SAVE THE FLAG TAD AUTOFLAG /GET IT BACK SZA CLA /SKIP IF SET JMP INPCYLINDER /JUMP IF NOT NL7777 /SET BACKUP FACTOR TAD ALTHEADNUMBER /ADD ON CURRENT HEAD SMA /SKIP IF NONE LEFT ON THIS CYLINDER JMP HEADOK /JUST USE DECREMENTED VALUE DLD; ALTCYLNUMBER /GET CURRENT CYLINDER NUMBER DAD; M1 /BACKUP DST; ALTCYLNUMBER /STORE DECREMENTED VALUE CAM /CLEAN UP DCA ALTHEADNUMBER+1 /ENSURE CLEAR HIGH-ORDER TAD NUMHEADS /GET HEAD COUNT CMA /WANT HIGHEST HEAD HEADOK, DCA ALTHEADNUMBER /SAVE DECREMENTED HEAD NUMBER INPCYLI,JMS I [SCRIBE] /PRINT OUT THE CYLMSG /CYLINDER MESSAGE TAD AUTOFLAG /GET AUTO-MODE FLAG SZA CLA /SKIP IF AUTO MODE JMP GETCYLINDER /JUMP IF MANUAL MODE DLD; ALTCYLNUMBER /GET AUTO-DECREMENTED VALUE STL /INDICATE LEADING ZERO SUPPRESSION JMS I [P7DIGITS] /PRINT ALTERNATE CYLINDER JMS I [CRLF] /DO A , DLD; ALTCYLINDER /GET THE VALUE AGAIN SKP /DON'T ASK USER FOR IT GETCYLI,JMS I [GETNUMBER] /GET RESPONSE DST; CYLNUMBER /STASH IT JMS I [SCRIBE] /PRINT OUT THE HEDMSG /HEAD MESSAGE TAD AUTOFLAG /GET AUTO-MODE FLAG SZA CLA /SKIP IF AUTO MODE JMP GETHEAD /JUMP IF MANUAL MODE DLD; ALTHEADNUMBER /GET AUTO-DECREMENTED VALUE STL /INDICATE LEADING ZERO SUPPRESSION JMS I [P7DIGITS] /PRINT ALTERNATE HEAD JMS I [CRLF] /DO A , DLD; ALTHEADNUMBER /GET THE VALUE AGAIN SKP /DON'T ASK USER FOR IT GETHEAD,JMS I [GETNUMBER] /GET RESPONSE DST; HEADNUMBER /STASH IT / NOW PRINT OUT THE CYLINDER AND HEAD. JMS I [SCRIBE] /PRINT OUT THE CYLMSG /CYLINDER MESSAGE DLD; CYLNUMBER /GET THE CYLINDER NUMBER STL /INDICATE LEADING ZERO SUPPRESSION JMS I [P7DIGITS] /PRINT IT TAD [" &177] /GET A JMS I [P7CH] /PRINT IT JMS I [SCRIBE] /PRINT OUT THE HEDMSG /HEAD MESSAGE DLD; HEADNUMBER /GET THE HEAD NUMBER STL /INDICATE LEADING ZERO SUPPRESSION JMS I [P7DIGITS] /PRINT IT JMS I [SCRIBE] /PRINT OUT THE BRDMSG /BRIDGING MESSAGE TAD I CYLHEAD /GET THE PASSED ARGUMENT DCA CYLARGUMENT /STORE IN-LINE ISZ CYLHEAD /BUMP PAST THE ARGUMENT JMS I (PHYLOGICAL) /CALL THE CONVERSION ROUTINE CYLARGU,.-. /WILL BE POINTER TO STORAGE AREA DLD; PHTEMP /GET THE LOGICAL ADDRESS CLL /INDICATE LEADING ZEROES WANTED JMS I [P7DIGITS] /PRINT IT JMP I CYLHEAD /RETURN PAGE / PHYSICAL => LOGICAL ADDRESS ROUTINE. / CONVERTS CYLINDER/HEAD NOTATION TO LOGICAL ADDRESS OF LOWEST SECTOR ON THE / TRACK. / CALLING SEQUENCE: / VARIOUS PARAMETERS MUST BE SET: / NUMHEAD,-HEADS /NUMBER OF HEADS/CYLINDER (NEGATIVE) / NUMSECT,-SECTORS /NUMBER OF SECTORS/TRACK (NEGATIVE) / CYLNUMB,ZBLOCK 2 /CURRENT CYLINDER / HEADNUM,ZBLOCK 2 /CURRENT HEAD / JMS I (PHYLOGICAL) /CALL ROUTINE / PTR /=> THREE-BYTE STORAGE OF LOGICAL ADDRESS / THE CURRENT LOGICAL ADDRESS IS CALCULATED BY THE FORMULA: / ADDRESS=(((CYLNUMB*NUMHEAD)+HEADNUM)*NUMSECT)+SECTOR / WHERE SECTOR IS THE RELATIVE SECTOR NUMBER ON THE LATEST TRACK. SINCE WE / REQUIRE THE LOWEST LOGICAL ADDRESS ON THE CURRENT TRACK, WE IMPLY SECTOR 00. PHYLOGI,.-. /PHYSICAL => LOGICAL ROUTINE CAM /CLEAN UP TAD I PHYLOGICAL /GET THE STORAGE POINTER DCA PHYPTR /STASH THE POINTER ISZ PHYLOGICAL /BUMP PAST POINTER ARGUMENT TAD NUMHEADS /GET HEADS/CYLINDER VALUE DCA PHYCNT /STASH THE COUNTER PHLUP1, DAD; CYLNUMBER /ADD CURRENT CYLINDER ISZ PHYCNT /ENOUGH TIMES? JMP PHLUP1 /NO, KEEP GOING DAD; HEADNUMBER /ADD CURRENT HEAD DST; PHTEMP /STORE FOR NOW CAM /CLEAN UP TAD NUMSECTORS /GET SECTORS/TRACK VALUE DCA PHYCNT /STASH IT PHLUP2, DAD; PHTEMP /ADD CURRENT TRACK ISZ PHYCNT /ENOUGH TIMES? JMP PHLUP2 /NO, KEEP GOING DST; PHTEMP /STORE HIGH-ORDER (WITH LOW-ORDER) FOR NOW RTR;RTR /MOVE DOWN AND [37] /JUST FIVE BITS DCA I PHYPTR /STASH THE HIGH BYTE ISZ PHYPTR /BUMP TO NEXT TAD PHTEMP+1 /GET HIGH-ORDER AGAIN AND [17] /JUST LOWEST BITS CLL RTL;RTL /MOVE UP DCA PHYCNT /STORE FOR NOW MQA /GET LOW-ORDER RTL;RTL;RAL /MOVE DOWN AND [17] /JUST LOWEST BITS TAD PHYCNT /ADD ON BITS FROM HIGH-ORDER DCA I PHYPTR /STASH THE MIDDLE BYTE ISZ PHYPTR /BUMP TO NEXT MQA /GET LOW-ORDER AGAIN / AND [377] /JUST LOWEST BITS DCA I PHYPTR /STASH THE LOW BYTE JMP I PHYLOGICAL /RETURN PHYCNT, .-. /COUNTER/TEMPORARY PHYPTR, .-. /STORAGE POINTER PHTEMP, ZBLOCK 2 /TEMPORARY / SCSI COMMAND EXECUTION ROUTINE. CEXC, .-. /COMMAND EXECUTION ROUTINE DCA SCP /SAVE COMMAND POINTER TAD I SCP /GET COMMAND HEADER AND (4377) /REMOVE CONTROLLER BITS TAD CNTSEL /ADD ON CURRENT CONTROLLER DCA I SCP /STORE IN COMMAND HEADER TAD [-200] /GET INITIAL TIME-OUT FACTOR JMS CSETUP /SETUP TIME-OUT DSRS /GET STATUS NOW SPA CLA /SKIP IF IDLE JMP CTIMOUT /ELSE GO TIME IT OUT DSHI /LOAD BANK AND FIELD NL7775 /SETUP TIME-OUT FACTOR JMS CSETUP /SET TIME-OUT ROUTINE DSRS /GET STATUS NOW SMA CLA /SKIP IF NOW BUSY JMP CTIMOUT /ELSE GO TIME IT OUT DSCF /CLEAR FLAG NOW TAD SCP /GET COMMAND POINTER DSGO /START IT UP JMS CWAIT /WAIT FOR COMMAND TO TAKE DSIM /FINISH COMMAND JMS CWAIT /WAIT FOR COMMAND TO EXECUTE CEXCXIT,MQL /SHOW STATUS IN MQ LIGHTS JMP I CEXC /RETURN CSETUP, .-. /TIME-OUT SETUP ROUTINE DCA CTIMER /SAVE TIME-OUT COUNTER VALUE JMP I CSETUP /RETURN CTIMOUT,ISZ CFOO /DONE ENOUGH? JMP I CSETUP /NO, KEEP GOING ISZ CTIMER /DONE TOO MANY? JMP I CSETUP /NO, KEEP GOING NL7777 /SET TIME-OUT ERROR VALUE JMP CEXCXIT /RETURN WITH ERROR CWAIT, .-. /WAIT ROUTINE NL5777 /SETUP THE WAIT FACTOR JMS CSETUP /SETUP LONG TIME-OUT DSSF /FLAG UP? JMP CTIMOUT /NO, TIME IT OUT DSCF /YES, CLEAR IT NOW AND I 0 /\ AND I 0 / \ AND I 0 / \ AND I 0 / \WASTE AND I 0 / /SOME TIME AND I 0 / / AND I 0 / / AND I 0 // DSRS /GET STATUS DCA CSTATUS /STASH IT TAD CSTATUS /GET IT BACK CLL RAL /REMOVE BUSY BIT SNA CLA /SKIP IF ANY ERRORS JMP I CWAIT /ELSE RETURN TAD CSTATUS /GET THE ERROR STATUS JMP CEXCXIT /RETURN WITH ERROR / ASSIGN ALTERNATE TRACK ROUTINE. DOALT, .-. /ASSIGN ALTERNATE TRACK ROUTINE CLA /JUST IN CASE TAD DRVNUM /GET DRIVE NUMBER CLL RTL;RTL;RAL /MOVE UP DCA ALTEMP /SAVE IT TAD I (BYTE2) /GET COMMAND BYTE AND [37] /JUST ADDRESSS BITS TAD ALTEMP /ADD ON DRIVE UNIT DCA I (BYTE2) /STORE BACK TAD (AATCOMMAND) /GET COMMAND ADDRESS JMS I [CEXC] /GO EXECUTE IT JMP I DOALT /RETURN ALTEMP, .-. /TEMPORARY CFOO, .-. /TIME-OUT INNER COUNTER CNTSEL, CNTID^400 /CONTROLLER SELECT WORD CSTATUS,.-. /ERROR STATUS CTIMER, .-. /TIME-OUT COUNTER SCP, .-. /SCSI COMMAND POINTER PAGE / MESSAGE PRINTING ROUTINE. SCRIBE, .-. /MESSAGE PRINT ROUTINE CLA /CLEAN UP TAD (140) /SETUP THE DEFAULT DCA SCRCASE /TO LOWER-CASE TAD I SCRIBE /GET THE PASSED ARGUMENT DCA SCRPTR /STASH THE POINTER SCRLOOP,TAD I SCRPTR /GET A PAIR RTR;RTR;RTR /HIGH-ORDER HALF FIRST JMS SCRPRNT /PRINT IT TAD I SCRPTR /GET IT AGAIN JMS SCRPRNT /PRINT LOWER HALF ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLOOP /KEEP GOING SCREND, ISZ SCRIBE /BUMP PAST ARGUMENT JMP I SCRIBE /RETURN TO CALLER SCRPRNT,.-. /TRIM AND PRINT ROUTINE AND [77] /JUST SIX-BIT SNA /END OF MESSAGE? JMP SCREND /YES, RETURN TO MAIN CALLER DCA SCRCHAR /NO, SAVE IT TAD SCRCHAR /GET THE CHARACTER TAD (-"%!200) /COMPARE TO "%" SNA /SKIP IF OTHERWISE JMP SCRCRLF /JUMP IF IT MATCHES TAD [-"^+100+"%] /COMPARE TO "^" SNA CLA /SKIP IF OTHERWISE JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AGAIN AND [40] /JUST QUADRANT BIT SNA CLA /SKIP IF SET TAD SCRCASE /ELSE ADD PREVAILING CASE TAD SCRCHAR /ADD ON THE CHARACTER ITSELF JMS I [P7CH] /PRINT IT JMP I SCRPRNT /RETURN SCRCRLF,JMS I [CRLF] /DO A , JMP I SCRPRNT /RETURN SCRFLIP,TAD SCRCASE /GET CURRENT CASE CIA /INVERT TAD (140+100) /ADD ON SUM OF BOTH VALUES DCA SCRCASE /STORE BACK NOW-INVERTED VALUE JMP I SCRPRNT /RETURN / SEVEN DIGIT DECIMAL PRINT ROUTINE. P7DIGIT,.-. /PRINT DECIMAL SEVEN DIGITS ROUTINE DCA P7DTEMP+1 /SAVE HIGH-ORDER MQA /GET LOW-ORDER DCA P7DTEMP /SAVE IT CML RAR /GET LEADING ZEROES FLAG DCA P7DFLAG /SAVE INIIAL VALUE TAD (P7DBUFFER+7-1) /SETUP THE DCA P7DPTR /OUTPUT POINTER TAD (-7) /SETUP THE DCA P7DCNT /OUTPUT COUNT P7DLUP, TAD P7DTEMP+1 /GET HIGH-ORDER MQL /SETUP AS LOW-ORDER DIVIDEND DVI; [12] /DIVIDE BY TEN SWP /GET QUOTIENT DCA P7DTEMP+1 /SAVE AS NEW HIGH-ORDER TAD P7DTEMP /GET LOW-ORDER SWP /NOW HAVE OLD REMAINDER.LOW-ORDER DVI; [12] /DIVIDE BY TEN DCA I P7DPTR /STORE IN BUFFER MQA /GET LOW-ORDER QUOTIENT DCA P7DTEMP /SAVE AS NEW LOW-ORDER NL7777 /BACKUP THE TAD P7DPTR /OUTPUT POINTER DCA P7DPTR /STORE BACK ISZ P7DCNT /DONE SIX YET? JMP P7DLUP /NO, KEEP GOING TAD (P7DBUFFER-1) /YES, POINT AT DCA XR1 /OUTPUT BUFFER TAD (-7) /SETUP THE DCA P7DCNT /OUTPUT COUNTER P7DOLP, TAD P7DCNT /GET CURRENT COUNT CMA /INVERT FOR TEST SNA CLA /SKIP IF NOT AT LAST DIGIT NL2000 /ELSE ENSURE PRINTOUT OF ZERO TAD P7DFLAG /ADD ON LEADING ZEROES FLAG TAD I XR1 /GET A DIGIT SNA /USE IF SIGNIFICENT JMP P7DSKIP /ELSE SKIP THIS DIGIT TAD ["0&177] /MAKE IT ASCII / AND [177] /MAKE IT ASCII JMS I [P7CH] /PRINT IT NL4000 /SET THE FLAG DCA P7DFLAG /FOR FURTHER PRINTING P7DSKIP,ISZ P7DCNT /DONE YET? JMP P7DOLP /NO, KEEP GOING JMP I P7DIGITS /YES, RETURN / PRIMARY TERMINAL OUTPUT ROUTINE. P7CH, .-. /TERMINAL OUTPUT ROUTINE DCA P7TEMP /SAVE PASSED CHARACTER P7LOOP, TAD P7TEMP /GET THE CHARACTER BACK TSFIOT /FLAG UP? JMP P7TEST /NO, TRY THE KEYBOARD TLSIOT /PRINT THE CHARACTER JMS I [CHKUP] /CHECK INPUT FLAGS AND CLEAN UP JMP I P7CH /RETURN P7TEST, JMS I [CHKUP] /CHECK FOR <^S>, ETC. JMP P7LOOP /GO CHECK OUTPUT DONE FLAG AGAIN P7DBUFF,ZBLOCK 7 /OUTPUT BUFFER P7DCNT, .-. /OUTPUT COUNTER P7DFLAG,.-. /LEADING ZEROES FLAG P7DPTR, .-. /OUTPUT POINTER P7DTEMP,ZBLOCK 2 /PASSED VALUE STORED HERE P7TEMP, .-. /CONSOLE OUTPUT ROUTINE TEMPORARY SCRCASE,.-. /MESSAGE CASE SCRCHAR,.-. /LATEST CHARACTER SCRPTR, .-. /MESSAGE POINTER PAGE / <^C>, ETC. CHECKING INPUT ROUTINE. CTLCTST,.-. /CHECK FOR <^C>, ETC. ROUTINE DCA INCHAR /OBLITERATE OLD CHARACTERS KSFIOT /FLAG UP? JMP I CTLCTST /NO, JUST RETURN KRSIOT /YES, READ IN THE CHARACTER AND [177] /JUST SEVEN-BIT DCA INCHAR /SAVE THE CHARACTER NL7775 /SETUP -3 TAD INCHAR /COMPARE TO <^C> SPA SNA CLA /SKIP IF GREATER THAN <^C> JMP I [SBOOT] /EXIT IF <^C> OR LESS KCCIOT /CLEAR THE FLAG NOW TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN TO CALLER / CHECK FOR SPECIAL CHARACTERS ROUTINE. CHKUP, .-. /<^P>, ETC. CHECKING ROUTINE JMS CTLCTST /TEST FOR <^C>, ETC. SNA /SKIP IF ANYTHING THERE JMP I CHKUP /RETURN IF NOT TAD (-"Q!300) /IS IT <^Q>? SNA /SKIP IF NOT JMP CHKCLR /JUMP IF SO TAD (-"S+"Q) /IS IT <^S>? SZA CLA /SKIP IF SO JMP I CHKUP /RETURN IF NOT JMS CTLCTST /WAIT FOR ANOTHER CHARACTER TAD (-"Q!300) /IS IT <^Q>? SZA CLA /SKIP IF SO JMP .-3 /JUMP IF NOT CHKCLR, DCA INCHAR /OBLITERATE <^Q> JMP I CHKUP /RETURN / CONSOLE INPUT ROUTINE. INPUT, .-. /KEYBOARD INPUT ROUTINE DCA INCHAR /OBLITERATE PREVIOUS CHARACTER INLOOP, JMS I [CHKUP] /CHECK FOR AVAILABLE CHARACTER TAD INCHAR /GET THE LATEST CHARACTER SNA /SKIP IF ANYTHING THERE JMP INLOOP /GO TRY IT AGAIN TAD [-140] /SUBTRACT LOWER-CASE LIMIT SPA /SKIP IF LOWER-CASE TAD [40] /RESTORE IF UPPER-CASE TAD [100] /RESTORE THE CHARACTER DCA INCHAR /SAVE IT TAD INCHAR /GET IT BACK JMP I INPUT /RETURN TO CALLER / YES OR NO ROUTINE. YORNO, .-. /YES OR NO ROUTINE JMS I [SCRIBE] /GIVE THEM YNOMSG /OUR MESSAGE YORAGN, JMS I [INPUT] /GET A CHARACTER TAD (-"Y!200) /COMPARE TO "Y" SNA /SKIP IF OTHERWISE JMP YYES /JUMP IF IT MATCHES TAD (-"N+"Y) /COMPARE TO "N" SNA CLA /SKIP IF OTHERWISE JMP YNO /JUMP IF IT MATCHES JMS I [BEEP] /BEEP AT THEM ON NO MATCH JMP YORAGN /TRY AGAIN YYES, JMS I [SCRIBE] /TELL THEM YESMSG /YES! JMP I YORNO /TAKE FIRST RETURN YNO, JMS I [SCRIBE] /TELL THEM NOMSG /NO! ISZ YORNO /BUMP TO SECOND RETURN JMP I YORNO /RETURN TO CALLER EITHER WAY BEEP, .-. /BEEP ROUTINE NL0006 /SET -1 IAC /NOW HAVE JMS I [P7CH] /PRINT IT JMP I BEEP /RETURN INITIAL,.-. /INITIALIZE ROUTINE KCCIOT /CLEAR CONSOLE INPUT FLAG CAM /CLEAN UP TLSIOT /SET CONSOLE OUTPUT FLAG TAD [CLA!400] /PREVENT DCA I (START) /INITIALIZATION AGAIN JMS I [SCRIBE] /PRINT OUT THE BLBMSG /OPENING HEADER MESSAGE TAD DRVNUM /GET DRIVE NUMBER TAD ["0&177] /MAKE IT ASCII JMS I [P7CH] /PRINT IT JMS I [SCRIBE] /PRINT OUT THE HCYMSG /HIGHEST CYLINDER MESSAGE DLD; HICYLINDER /GET THE MAXIMUM CYLINDER COUNT DAD; M1 /MAKE IT THE LARGEST ONE DST; ALTCYLNUMBER /STASH IT FOR LATER STL /INDICATE LEADING ZERO SUPPRESSION JMS I [P7DIGITS] /PRINT THE HIGHEST AVAILABLE CYLINDER JMS I [SCRIBE] /PRINT OUT THE HHDMSG /HIGHEST HEAD MESSAGE TAD NUMHEADS /GET MAXIMUM HEAD COUNT STL CMA /WANT POSITIVE LARGEST ONE MQL /TO LOW-ORDER JMS I [P7DIGITS] /PRINT THE HIGHEST AVAILABLE HEAD TAD NUMHEADS /GET MAXIMUM HEAD COUNT CIA /WANT POSITIVE HEAD NUMBER (ONE TOO MANY) MQL /TO LOW-ORDER DST; ALTHEADNUMBER /STASH IT FOR LATER CAM /CLEAN UP JMP I INITIALIZE /RETURN CRLF, .-. /, ROUTINE CLA /JUST IN CASE TAD ["M&37] /GET A JMS I [P7CH] /PRINT IT TAD ["J&37] /GET A JMS I [P7CH] /PRINT IT JMP I CRLF /RETURN PAGE / GET SEVEN DIGIT DECIMAL INPUT ROUTINE. GETNUMB,.-. /GET SEVEN DIGIT NUMBER CAM /CLEAN UP DST; NUMBER /CLEAR THE BUFFER TAD (-7) /SETUP THE DCA DIGCNT /DIGIT COUNT GDIGLP, JMS I [INPUT] /GET A CHARACTER TAD (-":!200) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD (":-"0) /ADD ON RANGE SNL /SKIP IF OK JMP NUMBAD /JUMP IF NOT MQL /SETUP LATEST IN LOW-ORDER TAD (-12) /SETUP THE DCA SHCNTR /SHIFT COUNTER DAD; NUMBER /ADD ON ACCUMULATION ISZ SHCNTR /DONE TEN YET? JMP .-3 /NO, KEEP GOING DST; NUMBER /YES, STORE NEW ACCUMULATION CAM /CLEAN UP TAD INCHAR /GET THE CHARACTER JMS I [P7CH] /PRINT IT ISZ DIGCNT /DONE ALL DIGITS? JMP GDIGLP /NO, KEEP GOING GETNXIT,JMS I [CRLF] /DO A , DLD; NUMBER /GET THE VALUE JMP I GETNUMBER /RETURN NUMBAD, TAD (-"M!300+"0-200)/COMPARE LATEST TO SNA CLA /SKIP IF OTHER JMP GETNXIT /OK IF TERMINATOR JMS I [BEEP] /COMPLAIN JMP GDIGLP /KEEP GOING DIGCNT, .-. /DIGIT COUNTER SHCNTR, .-. /SHIFT COUNTER / DOUBLE-PRECISION SIMULATOR ROUTINES. / DOUBLE-PRECISION ADD. DADD, .-. /ADD ROUTINE DCA DCOM /SAVE HIGH-ORDER TAD I DADD /GET ARGUMENT DCA DLOAD /STASH IT MQA /GET LOW-ORDER CLL /INITIALIZE CARRY TAD I DLOAD /ADD ON LOW-ORDER ARGUMENT MQL /PUT INTO MQ ISZ DADD /BUMP PAST ARGUMENT ISZ DLOAD /BUMP TO HIGH-ORDER RAL /GET CARRY TAD DCOM /RESTORE AC TAD I DLOAD /ADD ON HIGH-ORDER ARGUMENT JMP I DADD /RETURN / DOUBLE-PRECISION STORE. DSTORE, .-. /STORE ROUTINE DCA DCOM /SAVE AC TAD I DSTORE /GET ARGUMENT DCA DLOAD /STASH IT MQA /GET LOW-ORDER DCA I DLOAD /STORE IT ISZ DSTORE /BUMP PAST ARGUMENT ISZ DLOAD /BUMP TO HIGH-ORDER TAD DCOM /RESTORE AC DCA I DLOAD /STORE IT TAD DCOM /RESTORE AC AGAIN JMP I DSTORE /RETURN / DOUBLE-PRECISION LOAD. DLOAD, .-. /LOAD ROUTINE CAM /CLEAN UP TAD DLOAD /GET OUR CALLER DCA DADD /MAKE IT THEIRS JMP DADD+1 /CONTINUE THERE / DOUBLE-PRECISION COMPLEMENT. DCOM, .-. /COMPLEMENT ROUTINE SWP /GET LOW-ORDER FIRST CLL CIA /INVERT IT SWP /PUT IT BACK CMA /INVERT HIGH-ORDER SZL /CARRY? IAC /YES, SO INCREMENT JMP I DCOM /RETURN / DIVIDE. DIVIDE, .-. /DIVIDE ROUTINE DCA DIVAC /SAVE PASSED AC TAD I DIVIDE /GET ARGUMENT POINTER DCA MDIVSOR /STASH IT ISZ DIVIDE /BUMP PAST ARGUMENT TAD I MDIVSOR /GET DIVISOR CIA /WANT NEGATIVE FORM DCA MDIVSOR /STORE IT MQA /GET LOW-ORDER DCA DIVMQ /STORE IT TAD (-14) /SETUP THE DCA DSHIFT /SHIFT COUNTER DIVLUP, TAD DIVMQ /GET LOW-ORDER CLL RAL /MOVE UP DCA DIVMQ /STORE BACK TAD DIVAC /GET HIGH-ORDER RAL /MOVE UP DCA DIVAC /STORE BACK TAD DIVAC /GET IT BACK TAD MDIVSOR /COMPARE TO DIVISOR SZL /CARRY? DCA DIVAC /YES, STORE BACK SZL CLA /CARRY? ISZ DIVMQ /YES, BUMP QUOTIENT ISZ DSHIFT /DONE ALL YET? JMP DIVLUP /NO, GO BACK TAD DIVMQ /GET LOW-ORDER MQL /RESTORE IT TAD DIVAC /GET REMAINDER JMP I DIVIDE /RETURN / STORAGE DEFINITIONS FOR DIVIDE ROUTINE. DIVAC= DADD /DIVIDE AC DIVMQ= DLOAD /DIVIDE MQ MDIVSOR=DCOM /DIVISOR DSHIFT= DSTORE /SHIFT COUNTER / DOUBLE-PRECISION VALUES. HICYLIN,HCLO; HCHI /MAXIMUM CYLINDER COUNT M1, 7777; 7777 /CONSTANT 77777777 NUMBER, ZBLOCK 2 /INPUT NUMBER VALUE PRIMADD,ZBLOCK 2 /PRIMARY LOGICAL ADDRESS PAGE / ASSIGN ALTERNATE TRACK COMMAND. AATCOMM,CNTID^400+TABLE+12 /COMMAND HEADER BYTE1, AAT /ASSIGN ALTERNATE TRACK COMMAND BYTE2, .-. /HIGH-ORDER LOGICAL ADDRESS+LUN BYTE3, .-. /MIDDLE LOGICAL ADDRESS BYTE4, .-. /LOW-ORDER LOGICAL ADDRESS BYTE5, 000 /INTERLEAVE FACTOR BYTE6, 000 /CONTROL BYTE BYTE7, .-. /ALTERNATE TRACK ADDRESS - HIGH-ORDER BYTE8, .-. /ALTERNATE TRACK ADDRESS - MIDDLE BYTE9, .-. /ALTERNATE TRACK ADDRESS - LOW-ORDER BYTE10, 000 /TERMINATOR / TEXT MESSAGES. ALTMSG, TEXT "%%^A^LTERNATE%^" BLBMSG, TEXT "%%^T^RACK ^A^LTERNATION ^U^TILITY ^V^ERSION " VERSION%12^66+VERSION+6060 /VERSION NUMBER "^^100+REVISION-300 /, REVISION LETTER TEXT "%%D^RIVE: ^" BRDMSG, TEXT " => ^" CYLMSG, TEXT "^C^YLINDER: ^" HCYMSG, TEXT "%%^H^IGHEST ^A^VAILABLE ^C^YLINDER: ^" HEDMSG, TEXT "^H^EAD: ^" HHDMSG, TEXT "%%^H^IGHEST ^A^VAILABLE ^H^EAD: ^" MORMSG, TEXT "%%^M^ORE " NOMSG, TEXT "^N^O^" PRIMSG, TEXT "%%^P^RIMARY%^" YESMSG, TEXT "^Y^ES" YNOMSG, TEXT "? (^Y/N) " $ /THAT'S ALL FOLK!