/ MENU-8 SYSTEM / LAST EDIT: 20-NOV-89 13:00:00 CJL / THE MENU-8 UTILITY SYSTEM FOR THE PDP-8/E AND MDC8. / THIS IS THE COMPLETE SOURCE OF THE RUNNING MENU UTILITY SYSTEM FOR THE PDP-8 / INCLUDING ALL VARIATIONS AND THE MENU UTILITY VOLUME. THE MENU I/O ROUTINES / AND PRIMARY CONTROL PROGRAM ARE ALSO GENERATED FROM THIS FILE. / THINGS TO DO: / MAKE DDT AND GT GENERATION BE CONDITIONAL INSTEAD OF FORCED. / GREATLY ENHANCE MENUVOLUME CONTENTS. / MUST BE ASSEMBLED WITH '/J' (PAL8 '/F') SWITCH SET. XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / DEFINITIONS. / CONSOLE DEFINITIONS. TTY= 03 /SYSTEM CONSOLE DEVICE CODE KCCIOT= TTY^10+6002 /CLEAR KEYBOARD FLAG KRBIOT= TTY^10+6006 /READ KEYBOARD BUFFER, CLEAR FLAG KRSIOT= TTY^10+6004 /READ KEYBOARD BUFFER KSFIOT= TTY^10+6001 /SKIP ON KEYBOARD FLAG TFLIOT= TTY^10+6000 /SET TELEPRINTER FLAG TLSIOT= TTY+1^10+6006 /LOAD TELEPRINTER SEQUENCE TSFIOT= TTY+1^10+6001 /SKIP ON TELEPRINTER FLAG / 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 / SAT DEFINITIONS. ALT= 0100 /DEFECT ALTERNATE BTVOL= 4000 /STARTUP VOLUME COS= 04 /COS-310 OWNER ID DATA= 1000 /DATA MNU= 37 /MENU-8 OWNER ID NOBOOT= 0400 /NON-BOOTABLE NOREL= 0200 /NON-RELOCATABLE NX= 0040 /NON-EXISTENT PQ1= 02 /P?S/8 #1 OWNER ID PQ2= 03 /P?S/8 #2 OWNER ID OS1= 00 /OS/8 #1 OWNER ID OS2= 01 /OS/8 #2 OWNER ID RES= 06 /RESERVED OWNER ID RO= 2000 /READ-ONLY UNUSED= 36 /UNUSED ID WPS= 05 /WPS-8 OWNER ID / VOLUME TABLE DEFINITIONS. BTVOL= 4000 /STARTUP VOLUME DATA= 1000 /DATA MENUBT= 0100 /MENU-8 ONLY BOOT MOVED= 0040 /MOVED NON-RELOCATABLE VOLUME NOBOOT= 0400 /NON-BOOTABLE NOREL= 0200 /NON-RELOCATABLE RO= 2000 /READ-ONLY / GEOMETRY DEFINITIONS. AUSIZE= 16 /ALLOCATION UNITS ARE 2^14 WORDS EACH DEFBASE=3425 /FIRST REPLACEMENT TRACK IS 1813 HEADS= 6 /6 HEADS/CYLINDER REPCNT= 27 /23 REPLACED TRACKS ALLOWED IN DDT TRACKS= 462 /306 CYLINDERS/DISK TSIZE= 41 /33 SECTORS/TRACK / MENU UTILITY VOLUME DEFINITIONS. MNGFLD= 20 /MENU UTILITY VOLUME GENERATION FIELD MENHI= 0016 /MENU UTILITY VOLUME - HIGH-ORDER MENLO= 4440 /MENU UTILITY VOLUME - LOW-ORDER / 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 / OTHER DEFINITIONS. DDTADR= 7000 /DISK DEFECT TABLE ADDRESS DMA= 4000 /DMA INDICATOR EXTEND= 6000 /EXTENDED HANDLER ROUTINE ADDRESS GENADR= 7400 /SYSTEM GENERATION ADDRESS GENFLD= 0010 /SYSTEM GENERATION FIELD GENUNIT=00 /SYSTEM GENERATION UNIT GTADDR= 7400 /GEOMETRY TABLE ADDRESS NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0003= CLA CLL CML IAC RAL /LOAD AC WITH 0003 NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7777= CLA CMA /LOAD AC WITH 7777 PRGFLD= 0000 /SYSTEM EXECUTION FIELD REVISI= "A&77 /REVISION OF PROGRAM SATADR= 4400 /STORAGE ALLOCATION TABLE ADDRESS SBOOT= 7600 /SYSTEM LOAD ADDRESS STRTADR=0200 /PRIMARY CONTROL PROGRAM STARTING ADDRESS SYSGEN= 0200 /SYSTEM GENERATION STARTING ADDRESS IN GENFLD VERSION=1 /VERSION OF PROGRAM VTADDR= 5400 /VOLUME TABLE ADDRESS WRITE= 4000 /SYSIO WRITE BIT / PAGE ZERO OF MENU-8 PRIMARY CONTROL PROGRAM. *0 /START AT THE BEGINNING TEMP, .-. /TEMPORARY IFNZRO .-1 AS, AUSIZE /SIZE OF AN ALLOCATION UNIT IS 2^AUSIZE TEMP2, .-. /TEMPORARY *10 /DEFINE AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER 1 XR2, .-. /AUTO-INDEX NUMBER 2 ECHOSW, 0 /ECHO SWITCH INCHAR, .-. /KEYBOARD INPUT CHARACTER P7TEMP, .-. /PRINTING TEMPORARY TSTCNT, -7 /STARTUP MEMORY TEST COUNT; ALSO FORCED MENU SWITCH *20 /GET PAST AUTO-INDEX AREA GETBASE,.-. /GET HALF-WORD BASE GETNDX, .-. /GET HALF-WORD INDEX GTSTATU,.-. /VALIDITY STATUS OF GT MEMFLAG,.-. /MEMORY FLAGS FROM VT ENTRY PHYSIZE,.-. /PHYSICAL MEMORY SIZE SATSTAT,.-. /VALIDITY STATUS OF SAT SVAU, .-. /LOWEST START VOLUME AU ADDRESS SVAUCNT,.-. /START VOLUME AU COUNT SVID, .-. /LOWEST START VOLUME ID WORD VOLFLAG,.-. /VOLUME FLAGS FROM VT ENTRY VTSTATU,.-. /VALIDITY STATUS OF VT WRNFLG, 0 /ISSUE WARNING FLAG PAGE / CONTROL PROGRAM STARTS HERE. STRTADR,CLA CLL /CLEANUP / MEMORY SIZING ROUTINE. TRYNXT, CDF PRGFLD /RESET FOR PDP-8/L, ETC. CDFNXT, CDF 10 /TRY TEST FIELD TAD I (TEST) /GET TEST CONTENTS DCA SAVLOC /SAVE FOR NOW TAD (7000) /GET TEST VALUE DCA I (TEST) /STORE IT TENTATIVELY TAD I (TEST) /GET IT BACK TAD (-7000) /COMPARE TO EXPECTED VALUE SNA /SKIP IF ALREADY FAILED TAD TEST /ELSE GET POTENTIAL VICTIM LOCATION SZA CLA /SKIP IF NOT TOUCHED JMP HARDEND /JUMP IF WE ZAPPED OUR LOCATION TAD SAVLOC /GET OLD CONTENTS DCA I (TEST) /RESTORE IT TAD CDFNXT /GET CDF CURRENT TEST FIELD TAD (10) /UPDATE TO NEXT FIELD DCA CDFNXT /STORE UPDATED INSTRUCTION ISZ TSTCNT /TESTED ENOUGH FIELDS? JMP TRYNXT /NO, KEEP GOING HARDEND,CDF PRGFLD /RESTORE OUR FIELD TAD TSTCNT /GET FIELD COUNT TAD (7) /MAKE IT POSITIVE DCA PHYSIZE /STORE AS PHYSICAL MEMORY SIZE / TERMINAL TIME-OUT TEST HERE. TTYTST, TSFIOT /FLAG UP? JMP TTIMTST /NO, GO TIME IT OUT TFLIOT /RESET FLAG (FOR LIKES OF 6120) KEYTST, KSFIOT /FLAG UP? JMP KTIMTST /NO, GO TIME IT OUT KRBIOT /YES, READ IT IN AND (177) /JUST SEVEN BITS TAD (-"M!300) /COMPARE TO SNA CLA /SKIP IF OTHER CHARACTER NL7777 /INDICATE FORCED START INITDON,DCA TSTCNT /SAVE FOR NOW / OUTPUT OPENING BANNER. OPENING,JMS I [SCRIBE] /PRINT OUT BANMSG /OPENING MESSAGE / CHECK FOR CLOCK HARDWARE HERE. ZBLOCK 40 /RESERVED FOR CLOCK HARDWARE CODE / PRINT OUT DATE AND TIME IF CLOCK AVAILABLE. JMP I (MEMSTUFF) /CONTINUE THERE / COMES HERE TO TIME OUT THE TERMINAL FLAG. TTIMTST,ISZ TRYNXT /TRIED ENOUGH? JMP TTYTST /NO, TRY AGAIN ISZ TTIMOUT /TRIED TOO MANY TIMES? JMP TTYTST /NO, TRY AGAIN TLSIOT /YES, SET THE FLAG NOW JMP KEYTST /CONTINUE THERE / COMES HERE TIME OUT THE KEYBOARD FLAG. KTIMTST,ISZ TRYNXT /TRIED ENOUGH? JMP KEYTST /NO, TRY AGAIN ISZ KTIMOUT /TRIED TOO MANY TIMES? JMP KEYTST /NO, TRY AGAIN / THE FLAG WON'T COME UP IN TIME, SO FORGET IT. JMP INITDONE /CONTINUE THERE KTIMOUT,-10 /KEYBOARD TIME-OUT COUNTER SAVLOC, .-. /MEMORY SAVE LOCATION TEST, 0000 /TEST LOCATION TTIMOUT,-10 /TERMINAL TIME-OUT COUNTER / AVAILABLE MEMORY MESSAGE. AVLMSG, TEXT "%^A^VAILABLE ^M^AIN ^M^EMORY: " / OPENING BANNER MESSAGE. BANMSG, TEXT "%^M^ENU-8 ^V" /OPENING TEXT VERSION%12^66+VERSION+6060 / / "^^100+REVISION;0 /REVISION PAGE MEMSTUF,JMS I [CRLF] /DO A , JMS I [SCRIBE] /PRINT OUT THE AVLMSG /AVAILABLE MAIN MEMORY MESSAGE JMS I [MEMPRT] /PRINT OUT MAIN MEMORY SIZE JMS I [CRLF] /DO A , JMS I [SCRIBE] /PRINT OUT THE VALMSG /TABLE VALIDATION MESSAGE JMS I (VALGT) /VALIDATE GT SNA CLA /SKIP IF BAD JMP GTOK /JUMP IF GOOD JMS I [SCRIBE] /TELL THEM GBADMSG /GT IS BAD JMP GTCOMMON /CONTINUE THERE / COMES HERE IF GEOMETRY TABLE IS OK. GTOK, JMS I [SCRIBE] /TELL THEM THAT GOKMSG /GT IS GOOD GTCOMMO,JMS I (VALSAT) /VALIDATE SAT SNA CLA /SKIP IF BAD JMP SATOK /JUMP IF GOOD JMS I [SCRIBE] /TELL THEM SBADMSG /SAT IS BAD JMP SATCOMMON /CONTINUE THERE / COMES HERE IF STORAGE ALLOCATION TABLE IS OK. SATOK, JMS I [SCRIBE] /TELL THEM THAT SOKMSG /SAT IS GOOD SATCOMM,JMS I (VALVT) /VALIDATE VOLUME TABLE SNA CLA /SKIP IF BAD JMP VTOK /JUMP IF GOOD JMS I [SCRIBE] /TELL THEM VBADMSG /VT IS BAD JMP VTCOMMON /CONTINUE THERE / COMES HERE IF VOLUME TABLE IS OK. VTOK, JMS I [SCRIBE] /TELL THEM VOKMSG /VT IS GOOD VTCOMMO,JMS I [SCRIBE] /ISSUE THE TPSMSG /PHYSICAL STORAGE MESSAGE / CALCULATE DEVICE PHYSICAL BLOCK COUNT. TAD I (HD) /GET HEAD COUNT CIA /WANT NEGATIVE FORM DCA TEMP /STASH THE COUNTER CAM /CLEAN UP PC1LUP, DAD; TR /ADD ON PHYSICAL CYLINDER COUNT ISZ TEMP /DONE ENOUGH? JMP PC1LUP /NO, KEEP GOING DST; DTEMP /STORE PHYSICAL TRACK COUNT CAM /CLEAN UP TAD I (TF) /GET TRACK FACTOR CIA /WANT NEGATIVE FORM DCA TEMP /STORE AS COUNTER PC2LUP, DAD; DTEMP /GET PHYSICAL TRACK COUNT ISZ TEMP /DONE ENOUGH? JMP PC2LUP /NO, KEEP GOING DST; PBLOCKS /STORE PHYSICAL BLOCK COUNT JMS I [PSECTORS] /PRINT IT OUT JMS I [SCRIBE] /PRINT OUT THE TASMSG /ALLOCATED STORAGE MESSAGE / CALCULATE DEVICE ALLOCATED BLOCK COUNT. TAD [SATADR-SATFIN] /SETUP THE DCA TEMP /TABLE COUNT DCA INCHAR /CLEAR AU COUNTER TAD [SATADR-1] /SETUP THE DCA XR1 /TABLE POINTER SATLUP, TAD I XR1 /GET AN AU VALUE DCA P7TEMP /SAVE IT TAD P7TEMP /GET IT BACK AND [40] /JUST NX FLAG SZA CLA /SKIP IF EXISTENT JMP SATBOT /JUMP IF NON-EXISTENT TAD P7TEMP /GET IT AGAIN AND (100) /JUST ALT FLAG SNA CLA /SKIP IF SET JMP SATSET /JUMP IF NOT TAD P7TEMP /GET IT AGAIN AND [37] /JUST ID BITS TAD [-MNU] /COMPARE TO MENUVOLUME VALUE SNA CLA /SKIP IF OTHER THAN MENUVOLUME (THIS IS LEGAL) SATSET, ISZ INCHAR /INDICATE AU IN STORAGE COUNT SATBOT, ISZ TEMP /DONE ENOUGH? JMP SATLUP /NO, KEEP GOING / CALCULATE TOTAL SECTORS=AUS*(AUSIZE-7). TAD INCHAR /GET ENTRY COUNT JMS I [AUBLKS] /CONVERT TO BLOCK COUNT DST; ABLOCKS /STORE ALLOCATED BLOCK COUNT JMS I [PSECTORS] /PRINT IT OUT JMS I [SCRIBE] /PRINT OUT THE TVSMSG /AVAILABLE STORAGE MESSAGE / CALCULATE DEVICE AVAILABLE BLOCK COUNT. TAD I (TF) /GET TRACK FACTOR CIA /WANT NEGATIVE FORM DCA TEMP /STASH THE COUNTER CAM /CLEAN UP AVCLUP, DAD; DRBA /GET AVAILABLE TRACK COUNT ISZ TEMP /ENOUGH TIMES? JMP AVCLUP /NO, KEEP GOING DST; VBLOCKS /YES, STORE AVAILABLE BLOCK COUNT JMS I [PSECTORS] /PRINT IT OUT JMP I (PHTEST) /CONTINUE THERE PAGE / IF PHYSICAL SIZE < AVAILABLE SIZE THEN COMPLAIN. PHTEST, DLD; VBLOCKS /GET AVAILABLE SIZE DCM /NEGATE FOR TESTING DAD; PBLOCKS /COMPARE TO PHYSICAL SIZE SPA /SKIP IF NO PROBLEMS JMP DSPCOMPLAIN /JUMP IF PROBLEMS MQA /OR LOW-ORDER WITH HIGH-ORDER SZA CLA /SKIP IF PHYSICAL = AVAILABLE JMP POK /JUMP IF PHYSICAL > AVAILABLE JMS I [SCRIBE] /TELL THEM NDMSG /WE HAVE NO DEFECTS JMP POK /CONTINUE THERE / COMES HERE IF DEVICE AVAILABLE SIZE > PHYSICAL SIZE. DSPCOMP,JMS I [SCRIBE] /TELL THEM ABOUT DSPMSG /SIZE PROBLEM ISZ WRNFLG /SET WARNING FLAG / IF AVAILABLE SIZE > ALLOCATED SIZE THEN COMPLAIN. POK, DLD; VBLOCKS /GET AVAILABLE SIZE DCM /NEGATE FOR TEST DAD; ABLOCKS /COMPARE TO ALLOCATED SIZE SMA CLA /SKIP IF AVAILABLE > ALLOCATED JMP ALOK /JUMP IF AVAILABLE <= ALLOCATED JMS I [SCRIBE] /COMPLAIN ABOUT DAPMSG /DEVICE ALLOCATION PROBLEM ISZ WRNFLG /SET WARNING FLAG ALOK, NL4000 /INDICATE START VOLUME MODE JMS I [SRCHSAT] /TRY TO FIND A START VOLUME SPA /SKIP IF ONE OR LESS JMP DUPST /JUMP IF TOO MANY SZA CLA /SKIP IF NONE JMP STOK /JUMP IF EXACTLY ONE NL7777 /INDICATE DCA TSTCNT /MENU VOLUME MUST BE USED JMS I [SCRIBE] /COMPLAIN ABOUT NSMSG /NO START VOLUME JMP STOK /CONTINUE THERE / COMES HERE IF TOO MANY START VOLUMES. DUPST, NL7777 /INDICATE DCA TSTCNT /MENU VOLUME MUST BE USED JMS I [SCRIBE] /COMPLAIN ABOUT DSMSG /TOO MANY START VOLUMES ISZ WRNFLG /SET WARNING FLAG STOK, JMS I (CHKSTRT) /CHECK IF STARTUP VOLUME ENTRY IS VALID SNA CLA /SKIP IF NOT JMP STVOK /JUMP IF SO NL7777 /INDICATE DCA TSTCNT /MENU VOLUME MUST BE USED JMS I [SCRIBE] /COMPLAIN ABOUT ISVEMSG /INVALID START VOLUME ENTRY ISZ WRNFLG /SET WARNING FLAG / COMES HERE IF START VOLUME ENTRY IS OK. STVOK, ISZ TSTCNT /ARE WE FORCED TO ATTEMPT THE MENU VOLUME? JMP LOADREGULAR /NO, JUST USE INTENDED VOLUME TAD [MNU] /INDICATE EXPLICIT SEARCH MODE JMS I [SRCHSAT] /ATTEMPT TO FIND MENU VOLUME SPA SNA CLA /SKIP IF POSSIBLE JMP STMBAD /JUMP IF NOT JMS I (CHKSTRT) /CHECK IF MENU VOLUME ENTRY IS VALID SNA CLA /SKIP IF NOT JMP JUSTLOAD /JUMP IF SO STMBAD, JMS I [SCRIBE] /TELL THEM MMMSG /WE CANT LOCATE MENU VOLUME SHALT, JMS I [SCRIBE] /TELL THEM SHMSG /SYSTEM IS HALTED HLT /STOP! JMP .-1 /JUST IN CASE THEY HIT CONTINUE / COMES HERE FOR NORMAL VOLUME LOADING. LOADREG,TAD WRNFLG /GET WARNING FLAG SNA CLA /SKIP IF SET JMP JUSTLOAD /JUMP IF NOT JMS I [SCRIBE] /ISSUE THE WRNMSG /WARNING MESSAGE JMS I [INPUT] /WAIT FOR A CHARACTER CLA /THROW IT AWAY JUSTLOA,TAD SVAU /GET AU OF STARTING BLOCK JMS I [AUBLKS] /CONVERT TO BLOCKS DAD; D40 /ADD ON ABSOLUTE OFFSET DST; LOADBLK /STORE IN BOOT LOADER CAM /CLEAN UP / CHECK IF MAIN MEMORY IS ADEQUATE TO LOAD THE VOLUME. TAD MEMFLAGS /GET VOLUME MEMORY FLAGS AND (1770) /JUST FIELD BITS CLL RTR;RAR /%10 CIA /INVERT FOR TEST TAD PHYSIZE /COMPARE TO MEMORY SIZE SMA CLA /SKIP IF PROBLEMATIC JMP MEMOK /JUMP IF NO MEMORY PROBLEM JMS I [SCRIBE] /TELL THEM IMMSG /OF INADEQUATE MEMORY JMP SHALT /CONTINUE THERE / COMES HERE IF MEMORY OK. / NOTE: EVENTUALLY WE NEED SPECIAL MENU-8 BOOT PROCEDURES HANDLED HERE WHEN WE / KNOW WHAT EXACTLY THAT MEANS. MEMOK, TAD I (SBTUNIT) /GET BOOTSTRAP UNIT DCA I (SLUNIT) /SETUP VOLUME LOADER JMP I (SYSLOAD) /CONTINUE THERE PAGE / SAT START VOLUME SEARCH ROUTINE. SRCHSAT,.-. /SEARCH THE SAT ROUTINE DCA SMODE /SAVE PASSED MODE TAD [SATADR-SATFIN] /SETUP THE DCA TEMP /SEARCH COUNT DCA SVAUCNT /CLEAR START VOLUME AU COUNT TAD [SATADR-1] /SETUP THE DCA XR1 /SEARCH POINTER SSATLUP,TAD I XR1 /GET AN ENTRY DCA P7TEMP /SAVE IT TAD SMODE /GET OPERATING MODE SPA CLA /SKIP IF MENU MODE JMP NORSRCH /JUMP IF NORMAL SEARCH TAD P7TEMP /GET THE ENTRY CIA /INVERT FOR TEST TAD SMODE /COMPARE TO DESIRED ID AND [ALT+NX+37] /JUST ID BITS (PREVENTING ALT AND NX) SZA CLA /SKIP IF IT MATCHES JMP SSATEST /JUMP IF NOT / THIS AU ENTRY IS FOR THE DESIRED VOLUME; CHECK AS BELOW. JMP ENTCOMMON /CONTINUE THERE / COMES HERE IF IN NORMAL SEARCH MODE. NORSRCH,TAD P7TEMP /GET IT BACK SMA CLA /SKIP IF A START VOLUME AU JMP SSATEST /JUMP IF NOT / THIS ENTRY IS A START VOLUME AU ENTRY. IF SVAUCNT = 0 THEN THIS IS THE FIRST / START VOLUME ENTRY; ELSE IF SVAUCNT IS + THEN THIS ENTRY MUST HAVE THE SAME / VALUE AS THE FIRST ENTRY FOUND EARLIER. IF SVAUCNT IS - THEN THERE ARE / DUPLICATE START VOLUME ENTRIES AS THE SEQUENCE FOR THE START VOLUME HAS / ALREADY CLOSED. ENTCOMM,TAD SVAUCNT /GET CURRENT COUNT SPA /SKIP IF ACTIVE JMP DUPSTRT /ALREADY CLOSED, COMPLAIN OF MULTIPLE ENTRIES SZA CLA /SKIP IF THIS IS THE FIRST START VOLUME AU ENTRY JMP BUMPAUCNT /JUMP IF ADDITIONAL ENTRY ONLY TAD XR1 /GET THE POINTER TAD [-SATADR] /MAKE IT RELATIVE DCA SVAU /SAVE AU ADDRESS TAD P7TEMP /GET THIS ENTRY DCA SVID /SAVE AS PROTOTYPE AU ENTRY BUMPAUC,TAD P7TEMP /GET LATEST AU ENTRY CIA /INVERT FOR TESTING TAD SVID /COMPARE TO PROTOTYPE VALUE SZA CLA /SKIP IF IT MATCHES JMP DUPSTRT /ELSE COMPLAIN OF MULTIPLE START VOLUME ID ISZ SVAUCNT /COUNT THIS AU ENTRY SSATEND,ISZ TEMP /DONE WHOLE TABLE? JMP SSATLUP /NO, KEEP GOING / WE'RE DONE; RETURN WITH AU COUNT IN AC. NL3777 /SETUP MASK AND SVAUCNT /GET THE COUNT WITHOUT CLOSE BIT SKP /DON'T INDICATE ERROR DUPSTRT,NL4000 /INDICATE MULTIPLE ID ERROR DCA SVAUCNT /STORE THE AU COUNT VALUE TAD SVAUCNT /GET IT BACK JMP I SRCHSAT /RETURN / COMES HERE IF LATEST AU ENTRY IS NOT A START VOLUME ENTRY. SSATEST,TAD SVAUCNT /GET THE AU COUNT VALUE SNA /SKIP IF ANY JMP SSATEND /JUST KEEP GOING SMA CLA /SKIP IF ALREADY CLOSED NL4000 /ELSE SET CLOSE BIT TAD SVAUCNT /UPDATE THE COUNT DCA SVAUCNT /STORE THE NEW VALUE JMP SSATEND /CONTINUE THERE SMODE, .-. /SEARCH MODE / NAME VALIDATION ROUTINE. CHKNAME,.-. /NAME CHECK ROUTINE TAD I GETBASE /CHECK FIRST PAIR SNA CLA /SKIP IF SOMETHING JMP I CHKNAME /TAKE BAD RETURN IF NULL NAME TAD [-10] /SETUP THE DCA TEMP /NAME COUNT DCA GETNDX /CLEAR INDEX CHKNLP, JMS I [GETHALF] /GET A CHARACTER ISZ GETNDX /BUMP TO NEXT SNA CLA /SKIP IF NOT JMP CHKNEND /JUMP IF ISZ TEMP /DONE ALL? JMP CHKNLP /NO, KEEP GOING CHKNXIT,ISZ CHKNAME /BUMP TO GOOD RETURN JMP I CHKNAME /RETURN TO CALLER / COMES HERE TO CHECK FOR TRAILING CHARACTER. CHKENLP,JMS I [GETHALF] /GET A CHARACTER SZA CLA /SKIP IF JMP I CHKNAME /TAKE BAD RETURN IF NOT CHKNEND,ISZ TEMP /DONE ALL? JMP CHKENLP /NO, KEEP GOING / ISZ CHKNAME /BUMP TO GOOD RETURN / JMP I CHKNAME /RETURN TO CALLER JMP CHKNXIT /CONTINUE THERE / START VOLUME ENTRY VALIDATION ROUTINE. / SET SVID TO PROTOTYPE OF DESIRED ID (FROM SAT AU ENTRY). / SET SVAUCNT TO AU COUNT (FROM SAT). / RETURNS AC=7777 IF ENTRY IS PROBLEMATIC. / RETURNS AC=0 IF ENTRY IS OK WITH GETBASE POINTING AT BEGINNING OF VT ENTRY. / SETS MEMFLAGS AND VOLFLAGS IF OK. / NOTE: BTVOL BITS ARE NOT CHECKED FOR IN THE ID AND VOLFLAGS WORDS SINCE THE / ENTRY COULD BE FOR THE MENU VOLUME WHICH WAS FORCED RATHER THAN THE DESIGNATED / START VOLUME. CHKSTRT,.-. /CHECK START VOLUME ENTRY ROUTINE TAD SVID /GET ID VALUE AND (DATA+NOBOOT+ALT+NX) /JUST PROBLEM BITS SZA CLA /SKIP IF NO PROBLEM BITS SET JMP BADSTRT /JUMP IF ANY PROBLEM BITS TAD SVID /GET ID AGAIN AND [37] /JUST ID BITS CLL RTL;RAL /*10 TAD [VTADDR] /ADD ON TABLE BASE DCA GETBASE /STASH THE POINTER JMS I [CHKNAME] /CHECK IF NAME PORTION IS VALID JMP BADSTRT /NAME WAS BAD TAD GETBASE /GET THE POINTER TAD [5-1] /POINT TO SIZE WORD DCA XR1 /STASH THE POINTER TAD I XR1 /GET VT AU COUNT CIA /INVERT FOR TEST TAD SVAUCNT /COMPARE TO SAT-DERIVED COUNT SZA CLA /SKIP IF THEY MATCH JMP BADSTRT /SIZE IS BAD TAD I XR1 /GET THE MEMORY FLAGS DCA MEMFLAGS /STASH THEM TAD I XR1 /GET VOLUME FLAGS DCA VOLFLAGS /STASH THEM TAD VOLFLAGS /GET THEM BACK AND (DATA+NOBOOT+MOVED) /JUST PROBLEMATIC BITS SZA CLA /SKIP IF NO PROBLEM BITS BADSTRT,NL7777 /INDICATE PROBLEM JMP I CHKSTRT /RETURN EITHER WAY / CONVERT AUS => BLOCKS ROUTINE. / SINCE THE AUSIZE FACTOR IS EXPRESSED AS 2^AUSIZE, USE AUSIZE-7 TO CALCULATE / BLOCKS, NOT WORDS. AUBLKS, .-. /CONVERT AUS TO BLOCKS ROUTINE MQL /PASSED VALUE TO LOW-ORDER TAD AS /GET AUSIZE (AS IN 2^AS) TAD [-7] /MAKE IT BLOCKSIZE CIA /WANT NEGATIVE FORM DCA TEMP /STASH THE COUNTER SHFTLUP,SWP /WANT LOW-ORDER FIRST CLL RAL /MOVE UP SWP /NOW GET HIGH-ORDER RAL /MOVE UP ISZ TEMP /DONE ENOUGH? JMP SHFTLUP /NO, KEEP GOING JMP I AUBLKS /YES, RETURN PAGE / SAT VALIDATION ROUTINE. VALSAT, .-. /VALIDATE THE SAT / THE SAT MUST CONSIST OF SEQUENTIAL ENTRIES OF THE NORMAL VARIETY FOLLOWED BY / OPTIONAL ALTERNATE ENTRIES FOLLOWED BY OPTIONAL NON-EXISTENT ENTRIES. DCA SATSTATUS /START WITH CLEAR STATUS TAD [SATADR-SATFIN] /SETUP THE DCA TEMP /SEARCH COUNT TAD [SATADR-1] /SETUP THE DCA XR1 /SEARCH POINTER DCA REGCNT /CLEAR REGULAR ENTRY COUNT DCA ALTCNT /CLEAR DEFECT ALTERNATE ENTRY COUNT DCA NXCNT /CLEAR NON-EXISTENT ENTRY COUNT VALSLP, TAD I XR1 /GET AN ENTRY DCA P7TEMP /STASH IT TAD P7TEMP /GET IT BACK AND [ALT+NX] /JUST IMPORTANT BITS SNA /SKIP IF EITHER SET JMP REGENTRY /JUMP IF NEITHER SET AND [NX] /JUST NX BIT SNA CLA /SKIP IF NX ENTRY JMP ALTENTRY /JUMP IF ALT ENTRY / ENTRY IS A NON-EXISTENT ENTRY. PREVENT ANY FURTHER REGULAR OR DEFECT / ALTERNATE ENTRIES; THERE MUST HAVE BEEN SOME REGULAR ENTRIES. ISZ NXCNT /BUMP NON-EXISTENT ENTRY COUNT NL3777 /CLOSE THE DCA ALTCNT /ALTERNATE COUNT / COMES HERE IF A DEFECT ALTERNATE ENTRY. PREVENT ANY FURTHER REGULAR ENTRIES; / THERE MUST HAVE BEEN SOME REGULAR ENTRIES. ALTENTR,ISZ ALTCNT /BUMP DEFECT ALTERNATE ENTRY COUNT TAD REGCNT /GET REGULAR COUNT NOW SNA CLA /SKIP IF ANY ISZ SATSTATUS /INDICATE BAD STATUS NL4000 /CLOSE THE DCA REGCNT /REGULAR COUNT TAD P7TEMP /GET THE ENTRY AND (BTVOL+DATA) /JUST IMPROPER BITS SZA CLA /SKIP IF CLEAR ISZ SATSTATUS /INDICATE BAD STATUS JMP ALNXCOMMON /CONTINUE THERE / COMES HERE IF A REGULAR ENTRY. REGENTR,TAD REGCNT /GET REGULAR COUNT SPA CLA /SKIP IF NOT CLOSED ISZ SATSTATUS /INDICATE BAD STATUS ISZ REGCNT /BUMP REGULAR ENTRY COUNT ALNXCOM,TAD P7TEMP /GET THE ENTRY SMA CLA /SKIP IF START VOLUME ENTRY JMP ENTROK /JUMP IF NOT START VOLUME ENTRY TAD P7TEMP /GET THE ENTRY AND (DATA+NOBOOT+ALT+NX) /JUST PROBLEM BITS SZA CLA /SKIP IF NONE SET ISZ SATSTATUS /INDICATE BAD STATUS ENTROK, ISZ TEMP /DONE ALL YET? JMP VALSLP /NO, KEEP GOING / WE HAVE A CLEAN STATUS SO FAR IF THE ENTRIES ARE PROPERLY ORDERED. TAD [-40] /SETUP THE DCA TEMP2 /ENTRY COUNT TAD (SATLST-1) /SETUP THE DCA XR2 /ENTRY POINTER VTSLP, TAD TEMP2 /GET COUNTER TAD [40] /TURN INTO ID JMS I [SRCHSAT] /SEARCH FOR AUS WITH THIS ID SMA CLA /SKIP IF A PROBLEM ENTRY JMP VTSOK /JUMP IF OK NL0002 /SET 40-36 TAD TEMP2 /COMPARE TO ID FOR UNUSED SPACE SZA CLA /SKIP IF UNUSED ID ISZ SATSTATUS /INDICATE BAD STATUS VTSOK, TAD SVAUCNT /GET AU COUNT DCA I XR2 /STORE IN COUNT TABLE ISZ TEMP2 /DONE ALL YET? JMP VTSLP /NO, KEEP GOING TAD SATSTATUS /GET IT BACK SZA /SKIP IF OK ISZ WRNFLG /SET WARNING FLAG JMP I VALSAT /RETURN / VT VALIDATION ROUTINE. VALVT, .-. /VALIDATE THE VT DCA VTSTATUS /START WITH CLEAR STATUS TAD (SATLST-1) /SETUP THE DCA XR2 /AU COUNT LIST POINTER TAD [-40] /SETUP THE DCA TEMP2 /ENTRY COUNT VTCLUP, TAD TEMP2 /GET THE COUNTER TAD [40] /MAKE IT RELATIVE ENTRY CLL RTL;RAL /*10 TAD [VTADDR] /POINT TO PROPER ENTRY DCA GETBASE /STASH THE POINTER TAD I XR2 /GET THE AU COUNT DCA SVAUCNT /STASH IT / CHECK FOR SPECIAL UNUSED ENTRY. NL0002 /SET 40-36 (ID VALUE FOR UNUSED) TAD TEMP2 /COMPARE TO LATEST VALUE SNA CLA /SKIP IF OTHER JMP VTCEND /JUMP IF IT MATCHES TAD I GETBASE /GET VOLUME NAME FIRST PAIR SNA CLA /SKIP IF SOMETHING THERE JMP NONAME /JUMP IF NOT / THERE APPEARS TO BE A VOLUME NAME. IT MUST BE VALID AND PART OF A VALID / VOLUME ENTRY. JMS I [CHKNAME] /CHECK FOR VALID NAME ISZ VTSTATUS /WASN'T VALID, INDICATE BAD STATUS TAD SVAUCNT /GET AU COUNT FROM SAT SNA CLA /SKIP IF ANY ISZ VTSTATUS /INDICATE NULL COUNT AS BAD JMP VTCKCOMMON /CONTINUE THERE / COMES HERE IF NO VOLUME NAME FOR THIS ENTRY. NONAME, TAD SVAUCNT /GET THE AU COUNT FOR THIS ENTRY SZA CLA /SKIP IF NONE FOR THIS ONE ISZ VTSTATUS /INDICATE NON-ZERO COUNT AS BAD VTCKCOM,TAD GETBASE /GET POINTER TAD [5-1] /BUMP PAST NAME FIELD DCA XR1 /STASH THE POINTER TAD SVAUCNT /GET AU COUNT FOR THIS ENTRY CIA /INVERT FOR TEST TAD I XR1 /COMPARE TO VT ENTRY OF SAME SZA CLA /SKIP IF THEY MATCH ISZ VTSTATUS /INDICATE BAD STATUS ON MISMATCH TAD I XR1 /GET MEMORY FLAGS AND (6007) /JUST RESERVED BITS SZA CLA /SKIP IF OFF ISZ VTSTATUS /INDICATE BAD MEMORY FLAGS STATUS VTCEND, ISZ TEMP2 /DONE ALL YET? JMP VTCLUP /NO, KEEP GOING TAD VTSTATUS /GET IT BACK SZA /SKIP IF OK ISZ WRNFLG /SET WARNING FLAG JMP I VALVT /RETURN ALTCNT, .-. /ALTERNATE ENTRY COUNT NXCNT, .-. /NON-EXISTENT ENTRY COUNT REGCNT, .-. /REGULAR ENTRY COUNT PAGE / MAIN MEMORY PRINT ROUTINE. MEMPRT, .-. /MEMORY PRINT ROUTINE TAD PHYSIZE /GET THE PHYSICAL SIZE IAC /MAKE IT FIELD COUNT CLL RTL /MAKE IT K'S MQL /TO LOW-ORDER DVI; [12] /DIVIDE BY TEN SWP /WANT QUOTIENT FIRST SZA /SKIP IF NOT SIGNIFICANT JMS I [DIGPRT] /PRINT LEADING DIGIT MQA /GET REMAINDER JMS I [DIGPRT] /PRINT TRAILING DIGIT JMS I [SCRIBE] /PRINT OUT KWMSG /K WORDS MESSAGE JMP I MEMPRT /RETURN / SECTOR COUNT PRINT ROUTINE. PSECTOR,.-. /PRINT SECTOR COUNT JMS I [P8DIGITS] /PRINT THE PASSED VALUE JMS I [SCRIBE] /PRINT OUT THE SECSMSG /SECTORS MESSAGE JMP I PSECTORS /RETURN GETHALF,.-. /GET HALF-WORD ROUTINE TAD GETNDX /GET HALF-WORD INDEX CLL RAR /SHIFT WHICH HALF BIT INTO LINK TAD GETBASE /ADD BASE TO INDEX/2 DCA PSECTOR /SAVE POINTER TAD I PSECTOR /GET BOTH HALVES SZL /SKIP IF EVEN HALF WANTED JMP .+4 /ELSE LEAVE IT ALONE RTR;RTR;RTR /GET EVEN HALF AND [77] /JUST SIX BITS JMP I GETHALF /RETURN / GT VALIDATION ROUTINE. VALGT, .-. /VALIDATE THE GT TAD (GTADDR-1) /SETUP THE DCA XR1 /VALIDATION POINTER TAD [-200] /SETUP THE DCA TEMP /VALIDATION COUNT VALGLP, TAD I XR1 /GET A VALUE ISZ TEMP /DONE YET? JMP VALGLP /NO, KEEP GOING DCA GTSTATUS /YES, STORE STATUS TAD GTSTATUS /GET IT BACK SZA /SKIP IF OK ISZ WRNFLG /SET WARNING FLAG JMP I VALGT /RETURN / EIGHT DIGIT DECIMAL PRINT ROUTINE. P8DIGIT,.-. /PRINT DECIMAL EIGHT DIGITS ROUTINE DCA P8TMP+1 /SAVE HIGH-ORDER MQA /GET LOW-ORDER DCA P8TMP /SAVE IT TAD (P8BUF+10-1) /SETUP THE DCA P8PTR /OUTPUT POINTER TAD [-10] /SETUP THE DCA P8CNT /OUTPUT COUNT P8DLUP, TAD P8TMP+1 /GET HIGH-ORDER MQL /SETUP AS LOW-ORDER DIVIDEND DVI; [12] /DIVIDE BY TEN SWP /GET QUOTIENT DCA P8TMP+1 /SAVE AS NEW HIGH-ORDER TAD P8TMP /GET LOW-ORDER SWP /NOW HAVE OLD REMAINDER.LOW-ORDER DVI; [12] /DIVIDE BY TEN DCA I P8PTR /STORE IN BUFFER MQA /GET LOW-ORDER QUOTIENT DCA P8TMP /SAVE AS NEW LOW-ORDER NL7777 /BACKUP THE TAD P8PTR /OUTPUT POINTER DCA P8PTR /STORE BACK ISZ P8CNT /DONE SIX YET? JMP P8DLUP /NO, KEEP GOING TAD (P8BUF-1) /YES, POINT AT DCA XR1 /OUTPUT BUFFER TAD [-10+1] /SETUP THE DCA P8CNT /OUTPUT COUNTER DCA P8FLAG /CLEAR LEADING ZERO FLAG P8OTLP, TAD I XR1 /GET A DIGIT TAD P8FLAG /ADD ON FLAG SNA /SKIP IF SIGNIFICANT DIGIT JMP P8SKIP /JUMP IF NOT JMS I [DIGPRT] /PRINT IT NL4000 /SET THE P8SKIP, DCA P8FLAG /DIGIT FLAG ISZ P8CNT /DONE YET? JMP P8OTLP /NO, KEEP GOING TAD I XR1 /GET LAST DIGIT JMS I [DIGPRT] /PRINT IT JMP I P8DIGITS /YES, RETURN P8BUF, ZBLOCK 10 /OUTPUT BUFFER P8CNT, .-. /OUTPUT COUNTER P8FLAG, .-. /LEADING ZERO FLAG P8PTR, .-. /OUTPUT POINTER P8TMP, ZBLOCK 2 /PASSED VALUE STORED HERE PAGE / TEXT MESSAGES. BRDMSG, TEXT ": " DAPMSG, TEXT "%^ERROR - D^EVICE ^A^LLOCATION ^P^ROBLEM%" DSMSG, TEXT "%^ERROR - M^ULTIPLE ^S^TART ^V^OLUMES%^" DSPMSG, TEXT "%^ERROR - D^EVICE ^S^IZING ^P^ROBLEM%" GBADMSG,TEXT "%^ERROR - GT C^ORRUPTED%^" GOKMSG, TEXT "%^G^EOMETRY ^T^ABLE: ^OK%" IMMSG, TEXT "%^ERROR - I^NSUFFICIENT ^M^EMORY TO ^L^OAD ^V^OLUME%^" IOERMSG,TEXT "%^ERROR - C^AN'T ^L^OAD ^V^OLUME. ^P^RESS ANY ^K^EY TO ^R^ETRY ^" ISVEMSG,TEXT "%^ERROR - I^NVALID ^S^TART ^V^OLUME ^E^NTRY%^" KWMSG, TEXT "^K W^ORDS" LVMSG, TEXT "%^L^OADING ^V^OLUME ^" MMMSG, TEXT "%^ERROR - C^ANNOT ^L^OCATE ^M^ENU ^U^TILITY ^V^OLUME%" NDMSG, TEXT "%^D^EVICE HAS ^N^O ^D^EFECTS%" NSMSG, TEXT "%^ERROR - N^O ^S^TART ^V^OLUME%" SBADMSG,TEXT "%^ERROR - SAT C^ORRUPTED%" SECSMSG,TEXT " ^S^ECTORS%" SHMSG, TEXT "%^S^YSTEM ^H^ALTED%" SOKMSG, TEXT "%^S^TORAGE ^A^LLOCATION ^T^ABLE: ^OK%" TASMSG, TEXT "%^T^OTAL ^A^LLOCATED ^S^TORAGE: " TPSMSG, TEXT "%^T^OTAL ^P^HYSICAL ^S^TORAGE: " TVSMSG, TEXT "%^T^OTAL ^A^VAILABLE ^S^TORAGE: " VALMSG, TEXT "%^V^ALIDATING ^T^ABLES...%^" VBADMSG,TEXT "%^ERROR - VT C^ORRUPTED%^" VOKMSG, TEXT "%^V^OLUME ^T^ABLE: ^OK%" WRNMSG, TEXT "%^WARNING: C^ORRUPTED ^D^ATA. ^P^RESS ANY ^K^EY TO ^P^ROCEED." / DOUBLE-PRECISION VALUES. ABLOCKS,ZBLOCK 2 /ALLOCATED BLOCK COUNT DTEMP, ZBLOCK 2 /TEMPORARY D40, 40; 0 /CONSTANT 00000040 PBLOCKS,ZBLOCK 2 /PHYSICAL BLOCK COUNT VBLOCKS,ZBLOCK 2 /AVAILABLE BLOCK COUNT / SAT AU COUNT LIST. SATLST, ZBLOCK 40 /SAT AU COUNTS STORED HERE PAGE /FOR GOOD ALIGNMENT OF SAVE AREA / PAGE ZERO SAVE AREA. PZSAVE, ZBLOCK 200 /PAGE ZERO SAVED HERE / TERMINAL OUTPUT ROUTINE. P7CH, .-. /SEVEN-BIT PRINT ROUTINE DCA P7TEMP /SAVE PASSED VALUE P7AGN, JMS CHKUP /CHECK FOR <^C>, ETC. TAD ECHOSW /GET ECHO SWITCH SPA CLA /SKIP IF ECHO ON JMP P7OFF /ELSE FORGET IT TAD P7TEMP /GET THE VALUE TSFIOT /OUTPUT FLAG UP? JMP P7AGN /NO, CHECK KEYBOARD AND TRY AGAIN TLSIOT /YES, OUTPUT THE CHARACTER P7OFF, JMS CHKUP /CHECK FOR <^C>, ETC. JMP I P7CH /RETURN / INDEPENDENT OUTPUT ROUTINE. P7OUT, .-. /DEDICATED OUTPUT ROUTINE TSFIOT /OUTPUT FLAG UP? JMP .-1 /NO, WAIT FOR IT TLSIOT /YES, OUTPUT THE CHARACTER CLA /CLEAN UP JMP I P7OUT /RETURN / CONTROL CHARACTER CHECK ROUTINE. CHKUP, .-. /CHECK FOR <^C>, ETC. ROUTINE JMS CTLCTST /CHECK FOR <^C>, ETC. TAD (-"O!300) /COMPARE TO <^O> SNA /SKIP IF DIFFERENT JMP DOUO /JUMP IF IT MATCHES TAD (-"S+"O) /COMPARE TO <^S> SZA CLA /SKIP IF IT MATCHES JMP I CHKUP /RETURN IF NOT JMS CTLCTST /CHECK FOR <^C>, ETC. TAD (-"Q!300) /COMPARE TO <^Q> SZA CLA /SKIP IF IT MATCHES JMP .-3 /JUMP IF NOT JMP I CHKUP /RETURN IF SO / COMES HERE TO HANDLE <^O>. DOUO, TAD ("^&177) /GET AN "^" JMS P7OUT /PRINT IT TAD ("O&177) /GET AN "O" JMS P7OUT /PRINT IT UPOENAB,NOP/NL4000 /SET INVERSION BIT TAD ECHOSW /INVERT ECHO STATUS DCA ECHOSW /STORE IT BACK JMP I CHKUP /RETURN / LOW-LEVEL INPUT CHARACTER CHECK ROUTINE CTLCTST,.-. /TEST FOR <^C>, ETC. CLA /CLEAN UP KSFIOT /KEYBOARD FLAG UP? JMP I CTLCTST /NO, JUST RETURN KRBIOT /YES, READ IN THE CHARACTER AND [177] /JUST SEVEN-BIT DCA INCHAR /SAVE IT TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN / , ROUTINE. 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 / CONSOLE INPUT ROUTINE. INPUT, .-. /KEYBOARD INPUT ROUTINE DCA INCHAR /OBLITERATE PREVIOUS CHARACTER INLOOP, JMS CHKUP /CHECK FOR AVAILABLE CHARACTER TAD INCHAR /GET THE LATEST CHARACTER SNA /SKIP IF ANYTHING THERE JMP INLOOP /GO TRY IT AGAIN JMP I INPUT /RETURN TO CALLER / MESSAGE PRINTING ROUTINE. SCRIBE, .-. /MESSAGE PRINT ROUTINE CLA /JUST IN CASE TAD I SCRIBE /GET MESSAGE POINTER DCA SCRPTR /STASH IT ISZ SCRIBE /BUMP PAST ARGUMENT TAD [140] /INITIALIZE TO LOWER-CASE DCA SCRCASE /**** UPPER-CASE ONLY **** CLA SCRLUP, TAD I SCRPTR /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT TAD I SCRPTR /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /KEEP GOING / MESSAGE CHARACTER PRINT ROUTINE. SCRPRNT,.-. /CHARACTER PRINT ROUTINE AND [77] /JUST SIX-BIT SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER DCA SCRCHAR /NO, SAVE FOR NOW TAD SCRCHAR /GET IT BACK TAD (-"%!200) /IS IT "%"? SNA /SKIP IF NOT JMP SCRCRLF /JUMP IF IT MATCHES TAD [-"^+100+"%] /IS IT "^" SNA CLA /SKIP IF NOT JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AND [40] /DOES CASE MATTER? SNA CLA /SKIP IF NOT TAD SCRCASE /ELSE GET PREVAILING CASE TAD SCRCHAR /GET THE CHARACTER JMS I [P7CH] /PRINT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,JMS I [CRLF] /DO A , JMP I SCRPRNT /RETURN SCRFLIP,TAD SCRCASE /GET CURRENT CASE CIA /INVERT IT TAD (140+100) /ADD SUM OF POSSIBLE VALUES CASZP2, DCA SCRCASE /**** UPPER-CASE ONLY **** CLA JMP I SCRPRNT /RETURN / DIGIT PRINT ROUTINE. DIGPRT, .-. /PRINT A DIGIT ROUTINE TAD ("0&177) /MAKE IT ASCII JMS I [P7CH] /PRINT IT JMP I DIGPRT /RETURN SCRCASE,100 /ALPHABETIC CASE SCRCHAR,.-. /LATEST OUTPUT CHARACTER SCRPTR, .-. /MESSAGE POINTER PAGE / DOUBLE-PRECISION SIMULATOR ROUTINES. / DOUBLE-PRECISION ADD. DADD, .-. /ADD ROUTINE DCA DCOM /SAVE HIGH-ORDER RDF /GET CURRENT DATA FIELD TAD [CDF] /TURN INTO CDF INSTRUCTION DCA DADCDF /STORE IN-LINE CDF PRGFLD /BACK TO OUR FIELD TAD I DADD /GET ARGUMENT DCA DLOAD /STASH IT DADCDF, .-. /RESTORE PREVAILING FIELD 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 RDF /GET CURRENT DATA FIELD TAD [CDF] /TURN INTO CDF INSTRUCTION DCA DSTCDF /STORE IN-LINE CDF PRGFLD /BACK TO OUR FIELD TAD I DSTORE /GET ARGUMENT DCA DLOAD /STASH IT DSTCDF, .-. /RESTORE PREVAILING FIELD 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 / DIVIDE. DIVIDE, .-. /DIVIDE ROUTINE DCA DIVAC /SAVE PASSED AC RDF /GET PREVAILING FIELD TAD [CDF] /TURN INTO CDF INSTRUCTION DCA DIVCDF /SET IT UP CDF PRGFLD /GOTO OUR FIELD TAD I DIVIDE /GET ARGUMENT POINTER DCA MDIVSOR /STASH IT ISZ DIVIDE /BUMP PAST ARGUMENT DIVCDF, .-. /RESTORE PREVAILING FIELD 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 / 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 / STORAGE DEFINITIONS FOR DIVIDE ROUTINE. DIVAC= DADD /DIVIDE AC DIVMQ= DLOAD /DIVIDE MQ MDIVSOR=DCOM /DIVISOR DSHIFT= DSTORE /SHIFT COUNTER / VOLUME NAME PRINT ROUTINE. NAMPRT, .-. /NAME PRINT ROUTINE DCA GETNDX /CLEAR INPUT INDEX TAD (-12) /SETUP THE DCA TEMP /MAXIMUM NAME COUNT NAMLUP, JMS I [GETHALF] /GET A CHARACTER SNA /SKIP IF NOT JMP I NAMPRT /RETURN IF AT END OF NAME TAD [" &177] /INVERT THE CHARACTER AND [77] /JUST SIX-BIT TAD [" &177] /MAKE IT ASCII JMS I [P7CH] /PRINT IT ISZ GETNDX /BUMP TO NEXT ISZ TEMP /DONE ALL? JMP NAMLUP /NO, KEEP GOING JMP I NAMPRT /YES, RETURN / PAGE MOVING ROUTINE. PAGMOVE,.-. /MOVE A PAGE ROUTINE TAD I PAGMOVE /GET "FROM" ARGUMENT DCA PAG1 /STASH IT ISZ PAGMOVE /BUMP TO NEXT TAD I PAGMOVE /GET "TO" ARGUMENT DCA PAG2 /STASH IT ISZ PAGMOVE /BUMP PAST ARGUMENTS TAD (-200)/*NOT []* /SETUP THE DCA PAG3 /MOVE COUNT PAGLUP, TAD I PAG1 /GET A WORD DCA I PAG2 /PUT A WORD ISZ PAG1 /BUMP "FROM" POINTER ISZ PAG2 /BUMP "TO" POINTER ISZ PAG3 /DONE ENOUGH? JMP PAGLUP /NO, KEEP GOING JMP I PAGMOVE /YES, RETURN PAG1, .-. /"FROM" POINTER PAG2, .-. /"TO" POINTER PAG3, .-. /MOVE COUNTER PAGE / BOOTSTRAP LOADING ROUTINE. / NOTE: WATCH LITERAL USAGE HERE! SYSLOAD,JMS I [SCRIBE] /GIVE THEM THE LVMSG /VOLUME LOADING MESSAGE JMS I (NAMPRT) /PRINT THE VOLUME NAME JMS I [SCRIBE] /PRINT THE BRDMSG /BRIDGING MESSAGE JMS I (PAGMOVE) /MOVE PAGE ZERO 0000 /FROM PAGE ZERO PZSAVE /TO SAVE AREA NL7775 /SETUP THE DCA RETCNT /RETRY COUNT SLOAD, JMS I (SYSIO) /CALL I/O ROUTINES SWASTE, 0000 /LOAD INTO 0000000 2^100+PRGFLD /LOAD TWO PAGES SLUNIT, .-. /WILL BE BOOTSTRAP UNIT LOADBLK,ZBLOCK 2 /BLOCK ARGUMENT JMP IOERROR /ERROR! OUTLUP, TAD I MSGPTR /GET A CHARACTER SNA /END OF MESSAGE? JMP ENDMSG /JUMP IF AT END OF MESSAGE JMS I (P7OUT) /PRINT THE CHARACTER ISZ MSGPTR /BUMP TO NEXT JMP OUTLUP /KEEP GOING ENDMSG, NL7775 /SETUP THE DCA RETCNT /TIME WASTER ISZ SWASTE /WASTE JMP .-1 /SOME TIME ISZ RETCNT /WASTED ENOUGH? JMP .-2 /NO, WASTE MORE TIME JMP BJMP25&177 /YES, GO START IT UP / COMES HERE ON I/O ERRORS. IOERROR,ISZ RETCNT /TOO MANY ERRORS? JMP SLOAD /NO, TRY AGAIN JMS I (PAGMOVE) /RESTORE PAGE ZERO PZSAVE /FROM HERE 0000 /TO HERE JMS I [SCRIBE] /TELL THEM IOERMSG /ABOUT I/O PROBLEM JMS I [INPUT] /GET ANY INPUT JMS I [CRLF] /DO A , JMP SYSLOAD /TRY IT ALL AGAIN MSGPTR, MESSAGE /MESSAGE POINTER RETCNT, .-. /RETRY COUNTER MESSAGE,"O&177 /FINAL MESSAGE; O "K&177 /K "M&37 / "J&37 / "M%37 / "J&37 / 0 /THIS ENDS THE LIST PAGE / STORAGE ALLOCATION TABLE. *SATADR /DEFINE TABLE ORIGIN / THIS TABLE CONSISTS OF 512 ENTRIES FOR THE CONTROL OF THE REAL AND IMAGINARY / STORAGE CONTAINED WITHIN A (MYTHICAL) DISK OF A SIZE EQUAL TO THE ACTUAL SIZE / OF THE REAL DISK ROUNDED UP TO THE NEXT POWER OF TWO. THE CORRECT WEIGHT OF / EACH ENTRY IS DETERMINED IN THE GEOMETRY TABLE, AND MUST BE CONSISTANT WITH / THIS OBJECTIVE. / THE CURRENT TABLE IS SPECIFICALLY DEFINED FOR A 15 MBYTE CMI DISK CONSISTING / OF 306 CYLINDERS, 6 HEADS, AND 33 SECTORS/TRACK EACH CONSISTING OF 256 BYTES. / THIS DEMANDS AN ALLOCATION SIZE OF 128 BLOCKS PER ENTRY, OR 32 KBYTES (16 / KWORDS) PER ENTRY FOR A TOTAL OF 16 MBYTES (8 MWORDS). / THE LAST 4 TRACKS ARE SET ASIDE FOR THE USE OF THE MENU-8 UM VOLUME AND UP TO / 23 ALTERNATES. / THE TABLE IS LOADED AS ALL ZEROES, AND WILL BE REDEFINED CORRECTLY AT SYSTEM / GENERATION TIME. SATADR, ZBLOCK 4^200 /DEFINE STORAGE ALLOCATION TABLE AREA SATFIN= . /END OF SAT AREA NOPUNCH /FOOL THE ASSEMBLER / HIGHLIGHTS OF THE SAT TABLE. *SATADR /START AT FIRST DEVICE OS1B, OS1+BTVOL+NOREL /OS/8 #1 WNA0: 000032-000159 0000-0077 OS1+BTVOL+NOREL /OS/8 #1 WNA0: 000160-000287 0100-0177 OS1+BTVOL+NOREL /OS/8 #1 WNA0: 000288-000415 0200-0277 OS1+BTVOL+NOREL /OS/8 #1 WNA0: 000416-000543 0300-0377 *SATADR+100-4 /GET NEAR END OF FIRST DEVICE OS1+BTVOL+NOREL /OS/8 #1 WNA0: 007712-007839 7400-7477 OS1+BTVOL+NOREL /OS/8 #1 WNA0: 007840-007967 7500-7577 OS1+BTVOL+NOREL /OS/8 #1 WNA0: 007968-008095 7600-7677 OS1+BTVOL+NOREL /OS/8 #1 WNA0: 008096-008223 7700-7777 OS1+BTVOL+NOREL /OS/8 #1 WNA1: 008224-008351 0000-0077 OS1+BTVOL+NOREL /OS/8 #1 WNA1: 008352-008479 0100-0177 OS1+BTVOL+NOREL /OS/8 #1 WNA1: 008480-008607 0200-0277 OS1+BTVOL+NOREL /OS/8 #1 WNA1: 008608-008735 0300-0377 *SATADR+200-4 /GET NEAR END OF SECOND DEVICE OS1+BTVOL+NOREL /OS/8 #1 WNA1: 015904-016031 7400-7477 OS1+BTVOL+NOREL /OS/8 #1 WNA1: 016032-016159 7500-7577 OS1+BTVOL+NOREL /OS/8 #1 WNA1: 016160-016287 7600-7677 OS1+BTVOL+NOREL /OS/8 #1 WNA1: 016288-016415 7700-7777 OS1+BTVOL+NOREL /OS/8 #1 WNA2: 016416-016543 0000-0077 OS1+BTVOL+NOREL /OS/8 #1 WNA2: 016544-016671 0100-0177 OS1+BTVOL+NOREL /OS/8 #1 WNA2: 016672-016799 0200-0277 OS1+BTVOL+NOREL /OS/8 #1 WNA2: 016800-016927 0300-0377 *SATADR+300-4 /GET NEAR END OF THIRD DEVICE OS1+BTVOL+NOREL /OS/8 #1 WNA2: 024096-024223 7400-7477 OS1+BTVOL+NOREL /OS/8 #1 WNA2: 024224-024351 7500-7577 OS1+BTVOL+NOREL /OS/8 #1 WNA2: 024352-024479 7600-7677 OS1+BTVOL+NOREL /OS/8 #1 WNA2: 024480-024607 7700-7777 OS1+BTVOL+NOREL /OS/8 #1 WNA3: 024608-024735 0000-0077 OS1+BTVOL+NOREL /OS/8 #1 WNA3: 024736-024863 0100-0177 OS1+BTVOL+NOREL /OS/8 #1 WNA3: 024864-024991 0200-0277 OS1+BTVOL+NOREL /OS/8 #1 WNA3: 024992-025119 0300-0377 *SATADR+400-4 /GET NEAR END OF FOURTH DEVICE OS1+BTVOL+NOREL /OS/8 #1 WNA3: 032288-032415 7400-7477 OS1+BTVOL+NOREL /OS/8 #1 WNA3: 032416-032543 7500-7577 OS1+BTVOL+NOREL /OS/8 #1 WNA3: 032544-032671 7600-7677 OS1+BTVOL+NOREL /OS/8 #1 WNA3: 032672-032799 7700-7777 OS1E= . /END OF OS/8 #1 ENTRIES PQ1B, PQ1 /P?S/8 #1 WAB0: 032800-032927 0000-0177 PQ1 /P?S/8 #1 WAB0: 032928-033055 0200-0377 PQ1 /P?S/8 #1 WAB0: 033056-033183 0400-0577 PQ1 /P?S/8 #1 WAB0: 033184-033311 0600-0777 *SATADR+440-4 /GET NEAR END OF FIRST DEVICE PQ1 /P?S/8 #1 WAB0: 036384-036511 7000-7177 PQ1 /P?S/8 #1 WAB0: 036512-036639 7200-7377 PQ1 /P?S/8 #1 WAB0: 036640-036767 7400-7577 PQ1 /P?S/8 #1 WAB0: 036768-036895 7600-7777 PQ1 /P?S/8 #1 WAB1: 036896-037023 0000-0177 PQ1 /P?S/8 #1 WAB1: 037024-037151 0200-0377 PQ1 /P?S/8 #1 WAB1: 037152-037279 0400-0577 PQ1 /P?S/8 #1 WAB1: 037280-037407 0600-0777 *SATADR+500-4 /GET NEAR END OF SECOND DEVICE PQ1 /P?S/8 #1 WAB1: 040480-040607 7000-7177 PQ1 /P?S/8 #1 WAB1: 040608-040735 7200-7377 PQ1 /P?S/8 #1 WAB1: 040736-040863 7400-7577 PQ1 /P?S/8 #1 WAB1: 040864-040991 7600-7777 PQ1 /P?S/8 #1 WAB2: 040992-041119 0000-0177 PQ1 /P?S/8 #1 WAB2: 041120-041247 0200-0377 PQ1 /P?S/8 #1 WAB2: 041248-041375 0400-0577 PQ1 /P?S/8 #1 WAB2: 041376-041503 0600-0777 *SATADR+540-4 /GET NEAR END OF THIRD DEVICE PQ1 /P?S/8 #1 WAB2: 044576-044703 7000-7177 PQ1 /P?S/8 #1 WAB2: 044704-044831 7200-7377 PQ1 /P?S/8 #1 WAB2: 044832-044959 7400-7577 PQ1 /P?S/8 #1 WAB2: 044960-045087 7600-7777 PQ1 /P?S/8 #1 WAB3: 045088-045215 0000-0177 PQ1 /P?S/8 #1 WAB3: 045216-045343 0200-0377 PQ1 /P?S/8 #1 WAB3: 045344-045471 0400-0577 PQ1 /P?S/8 #1 WAB3: 045472-045599 0600-0777 *SATADR+600-4 /GET NEAR END OF FOURTH DEVICE PQ1 /P?S/8 #1 WAB3: 048672-048799 7000-7177 PQ1 /P?S/8 #1 WAB3: 048800-048927 7200-7377 PQ1 /P?S/8 #1 WAB3: 048928-049055 7400-7577 PQ1 /P?S/8 #1 WAB3: 049056-049183 7600-7777 PQ1 /P?S/8 #1 WAB4: 049184-049311 0000-0177 PQ1 /P?S/8 #1 WAB4: 049312-049439 0200-0377 PQ1 /P?S/8 #1 WAB4: 049440-049567 0400-0577 PQ1 /P?S/8 #1 WAB4: 049568-049695 0600-0777 *SATADR+640-4 /GET NEAR END OF FIFTH DEVICE PQ1 /P?S/8 #1 WAB4: 052768-052895 7000-7177 PQ1 /P?S/8 #1 WAB4: 052896-053023 7200-7377 PQ1 /P?S/8 #1 WAB4: 053024-053151 7400-7577 PQ1 /P?S/8 #1 WAB4: 053152-053279 7600-7777 PQ1 /P?S/8 #1 WAB5: 053280-053407 0000-0177 PQ1 /P?S/8 #1 WAB5: 053408-053535 0200-0377 PQ1 /P?S/8 #1 WAB5: 053536-053663 0400-0577 PQ1 /P?S/8 #1 WAB5: 053664-053791 0600-0777 *SATADR+700-4 /GET NEAR END OF SIXTH DEVICE PQ1 /P?S/8 #1 WAB5: 056864-056991 7000-7177 PQ1 /P?S/8 #1 WAB5: 056992-057119 7200-7377 PQ1 /P?S/8 #1 WAB5: 057120-057247 7400-7577 PQ1 /P?S/8 #1 WAB5: 057248-057375 7600-7777 PQ1 /P?S/8 #1 WAB6: 057376-057503 0000-0177 PQ1 /P?S/8 #1 WAB6: 057504-057631 0200-0377 PQ1 /P?S/8 #1 WAB6: 057632-057759 0400-0577 PQ1 /P?S/8 #1 WAB6: 057760-057887 0600-0777 PQ1 /P?S/8 #1 WAB6: 057888-058015 1000-1177 PQ1 /P?S/8 #1 WAB6: 058016-058143 1200-1377 PQ1 /P?S/8 #1 WAB6: 058144-058271 1400-1577 PQ1 /P?S/8 #1 WAB6: 058272-058399 1600-1777 PQ1 /P?S/8 #1 WAB6: 058400-058527 2000-2177 PQ1 /P?S/8 #1 WAB6: 058528-058655 2200-2377 PQ1 /P?S/8 #1 WAB6: 058656-058783 2400-2577 PQ1 /P?S/8 #1 WAB6: 058784-058911 2600-2777 PQ1 /P?S/8 #1 WAB6: 058912-059039 3000-3177 PQ1 /P?S/8 #1 WAB6: 059040-059167 3200-3377 PQ1 /P?S/8 #1 WAB6: 059168-059295 3400-3577 PQ1 /P?S/8 #1 WAB6: 059296-059423 3600-3777 PQ1 /P?S/8 #1 WAB6: 059424-059551 4000-4177 PQ1 /P?S/8 #1 WAB6: 059552-059679 4200-4377 PQ1E= . /END OF P?S/8 #1 ENTRIES MNU+RO /MENU-8 059680-059807 0000-0177 ALT+MNU+RO /MENU-8 059808-059828 0200-0224 /ALTERNATE 059829-059935 (059829- ALT #1) ALTB, ALT /ALTERNATE 059936-060063 ALT /ALTERNATE 060064-060191 ALT /ALTERNATE 060192-060319 ALT /ALTERNATE 060320-060447 ALT /ALTERNATE 060448-060575 (060555- ALT #23) ALT /ALTERNATE 060576-060587 /NON-EXISTENT 060588-060703 ALTE= . /END OF ALTERNATE ENTRIES NXB, NX /NON-EXISTENT 060704-060831 NX /NON-EXISTENT 060832-060959 NX /NON-EXISTENT 060960-061087 NX /NON-EXISTENT 061088-061215 NX /NON-EXISTENT 061216-061343 NX /NON-EXISTENT 061344-061471 NX /NON-EXISTENT 061472-061599 NX /NON-EXISTENT 061600-061727 NX /NON-EXISTENT 061728-061855 NX /NON-EXISTENT 061856-061983 NX /NON-EXISTENT 061984-062111 NX /NON-EXISTENT 062112-062239 NX /NON-EXISTENT 062240-062367 NX /NON-EXISTENT 062368-062495 NX /NON-EXISTENT 062496-062623 NX /NON-EXISTENT 062624-062751 NX /NON-EXISTENT 062752-062879 NX /NON-EXISTENT 062880-063007 NX /NON-EXISTENT 063008-063135 NX /NON-EXISTENT 063136-063263 NX /NON-EXISTENT 063264-063391 NX /NON-EXISTENT 063392-063519 NX /NON-EXISTENT 063520-063647 NX /NON-EXISTENT 063648-063775 NX /NON-EXISTENT 063776-063903 NX /NON-EXISTENT 063904-064031 NX /NON-EXISTENT 064032-064159 NX /NON-EXISTENT 064160-064287 NX /NON-EXISTENT 064288-064415 NX /NON-EXISTENT 064416-064543 NX /NON-EXISTENT 064544-064671 NX /NON-EXISTENT 064672-064799 NX /NON-EXISTENT 064800-064927 NX /NON-EXISTENT 064928-065055 NX /NON-EXISTENT 065056-065183 NX /NON-EXISTENT 065184-065311 NX /NON-EXISTENT 065312-065439 NX /NON-EXISTENT 065440-065567 NXE= . /END OF NON-EXISTENT ENTRIES ENPUNCH /UN-FOOL THE ASSEMBLER / VOLUME TABLE. *VTADDR /SET TABLE ADDRESS VTADDR, TEXT "OS8VOLUME1" /VOLUME NAME OS1E-OS1B /VOLUME SIZE 0010 /FIELDS 0-1 ARE REQUIRED BTVOL+NOREL /VOLUME FLAGS ZBLOCK 10 /ENTRY FOR OS/8 #2 TEXT "PQSVOLUME1" /VOLUME NAME PQ1E-PQ1B /VOLUME SIZE 0000 /FIELD ZERO IS GOOD ENOUGH 0000 /VOLUME FLAGS ZBLOCK 10 /ENTRY FOR P?S/8 #2 ZBLOCK 10 /ENTRY FOR COS-310 ZBLOCK 10 /ENTRY FOR WPS-8 ZBLOCK 10 /ENTRY FOR RESERVED OS (06) ZBLOCK 10 /RESERVED ENTRY (07) ZBLOCK 10 /RESERVED ENTRY (10) ZBLOCK 10 /RESERVED ENTRY (11) ZBLOCK 10 /RESERVED ENTRY (12) ZBLOCK 10 /RESERVED ENTRY (13) ZBLOCK 10 /RESERVED ENTRY (14) ZBLOCK 10 /RESERVED ENTRY (15) ZBLOCK 10 /RESERVED ENTRY (16) ZBLOCK 10 /RESERVED ENTRY (17) ZBLOCK 10 /RESERVED ENTRY (20) ZBLOCK 10 /RESERVED ENTRY (21) ZBLOCK 10 /RESERVED ENTRY (22) ZBLOCK 10 /RESERVED ENTRY (23) ZBLOCK 10 /RESERVED ENTRY (24) ZBLOCK 10 /RESERVED ENTRY (25) ZBLOCK 10 /RESERVED ENTRY (26) ZBLOCK 10 /RESERVED ENTRY (27) ZBLOCK 10 /RESERVED ENTRY (30) ZBLOCK 10 /RESERVED ENTRY (31) ZBLOCK 10 /RESERVED ENTRY (32) ZBLOCK 10 /RESERVED ENTRY (33) ZBLOCK 10 /RESERVED ENTRY (34) ZBLOCK 10 /RESERVED ENTRY (35) ZBLOCK 10 /RESERVED ENTRY (36) TEXT "MENUVOLUME" /VOLUME NAME 1 /VOLUME SIZE 0000 /FIELD ZERO IS GOOD ENOUGH RO+MENUBT /VOLUME FLAGS / AUXILIARY DEVICE HANDLER CODE. / THE FOLLOWING FOUR PAGES ARE RESERVED FOR THE ADH CODE WHICH AUGMENTS THE / SYSTEM LOADER ROUTINES. IT WILL BE RESIDENT AFTER THE SYSTEM LOADER READS IN / THE ENTIRE PRIMARY CONTROL PROGRAM. *EXTEND /DEFINE ADH STARTING ADDRESS / COMES HERE TO ESTABLISH WHICH EXTENDED UNIT IS BEING ADDRESSED WITH THE AC / CONTAINING THE EXTENDED UNIT BITS. EXTEND, DCA EXTEMP /SAVE EXTENDED UNIT BITS RDF /GET CALLING FIELD TAD (CDF) /FORM CDF CALLING FIELD DCA CDFCALLER /SAVE IN-LINE FOR LATER CDF PRGFLD /GOTO OUR FIELD TAD I [SYSIO] /GET CALLER'S ADDRESS DCA EXSYSIO /STASH IT CDFCALL,.-. /WILL BE CDF CALLING FIELD / BEFORE HANDLING EXTENDED DEVICES, CHECK FOR ILLEGAL UNITS IN OTHERWISE / STANDARD CALLS. TAD EXTEMP /GET EXTENDED UNIT BITS AND (7700) /JUST ACTUAL EXTENDED BITS SNA CLA /SKIP IF ANY SET JMP BADUNIT /JUMP IF NORMAL CALL, BUT PROBLEM UNIT / CUSTOMIZE ADH CODE HERE FOR EXTENDED DEVICE SUPPORT. THE STANDARD VERSION / TAKES THE ERROR RETURN SINCE NO EXTENDED DEVICES ARE SUPPORTED. JMP BADUNIT /JUST COMPLAIN THERE / COMES HERE TO COMPLAIN ABOUT BAD UNITS. BADUNIT,CDF PRGFLD /GOTO OUR FIELD ISZ I [SYSIO] /BUMP TO LOW-ORDER BLOCK ISZ I [SYSIO] /BUMP TO HIGH-ORDER BLOCK ISZ I [SYSIO] /BUMP TO ERROR RETURN TAD CDFCALLER /GET CDF CALLING FIELD DCA .+1 /STORE IN-LINE .-. /WILL BE CDF CALLING FIELD JMP I (SRETURN) /TAKE ERROR RETURN THERE EXSYSIO,.-. /CALLING ADDRESS STORED HERE EXTEMP, .-. /EXTENDED UNIT BITS STORED HERE PAGE ZBLOCK 4^200+EXTEND-. /DEFINE REST OF ADH AREA EXTFIN= . /END OF ADH AREA / DISK DEFECT TABLE. *DDTADR /SET TABLE ORIGIN ZBLOCK 2^200+DDTADR-. /TABLE SPACE DDTEND= . /END OF DISK DEFECT TABLE / GEOMETRY TABLE. *GTADDR /SET TABLE ORIGIN DRBA, DEFBASE;0 /BASE TRACK ADDRESS OF DEFECT ALTERNATE AREA HD, HEADS /NUMBER OF HEADS/CYLINDER RC, REPCNT;0 /COUNT OF VALID ENTRIES IN DDT TF, TSIZE /TSIZE SECTORS/TRACK TR, TRACKS;0 /NUMBER OF CYLINDERS/DISK ZBLOCK GTADDR+177-. /CLEAR REST OF TABLE GTSUM, .-. /WILL BE CHECKSUM OF ALL OTHER GT WORDS GTEND= . /END OF GEOMETRY TABLE FIELD PRGFLD%10 /DUMP PAGE ZERO LITERALS NOW / MENU UTILITY VOLUME. FIELD MNGFLD%10 /SET GENERATION FIELD *0000 /START AT THE BEGINNING MENLOAD=. /MENU UTILITY VOLUME LOADS HERE NOPUNCH /FOOL THE ASSEMBLER FIELD PRGFLD%10 /INDICATE EXECUTION FIELD *MENLOAD /INDICATE EXECUTION ADDRESS ENPUNCH /UN-FOOL THE ASSEMBLER MENLOAD,ZBLOCK 25-. /EMPTRY SPACE BJ25, TAD I MPTR /GET A WORD JMS I (P7OUT) /PRINT IT TAD I MPTR /GET IT AGAIN ISZ MPTR /BUMP TO NEXT SZA CLA /SKIP IF AT END JMP BJ25 /ELSE KEEP GOING HLT JMP I (SBOOT) /CONTINUE THERE MPTR, .+1 /MESSAGE POINTER "M&37;"J&37;"M&37;"J&37 "M;"E+40;"N+40;"U+40;" ;"U;"T+40;"I+40;"L+40;"I+40;"T+40;"Y+40 " ;"N;"O+40;"T+40 " ;"I;"M+40;"P+40;"L+40;"E+40;"M+40;"E+40;"N+40;"T+40;"E+40;"D+40 " ;"Y;"E+40;"T+40;"! "M&37;"J&37;"M&37;"J&37;0 FIELD MNGFLD%10 /DUMP LITERALS NOW / SYSTEM LOADER AND PRIMARY I/O ROUTINES. / THIS IS THE CONTENTS OF ABSOLUTE BLOCK ZERO. IT IS LOADED IN BY THE PRIMARY / BOOTSTRAP VIA EITHER A PROGRAM WHICH WAITS AT 24 (JMP 24) OR LOADS THIS CODE / AND THEN JUMPS TO 25 AFTER THE I/O IS COMPLETE. FIELD GENFLD%10 /SET GENERATION FIELD *GENADR /SET GENERATION ADDRESS NOPUNCH /FOOL THE ASSEMBLER FIELD PRGFLD%10 /INDICATE EXECUTION FIELD *SBOOT /INDICATE EXECUTION ADDRESS ENPUNCH /UN-FOOL THE ASSEMBLER SBOOT, JMS SYSIO /CALL I/O ROUTINES TO RELOAD CONTROL PROGRAM 0000 /TRANSFER ADDRESS S3700, 37^100 /READ 37 PAGES INTO FIELD 0 SBTUNIT,00^100+.-. /I/O UNIT; ID AND UNIT BITS WILL BE FILLED IN 0001 /LOW-ORDER BLOCK 0000 /HIGH-ORDER BLOCK JMP SBOOT /TRY AGAIN ON ERROR JMP I STARTIT /GO START IT UP STARTIT,STRTADR /STARTING ADDRESS OF CONTROL PROGRAM / THE FOLLOWING WORDS ARE EXECUTED ON PAGE ZERO AT COLD BOOT TIME. / THE FOLLOWING LOCATION MUST BE AN AUTO-INDEX REGISTER WHEN THE CODE IS LOADED / INTO PAGE ZERO. IFNZRO .&170-10 BFROM, 0000-1 /=> WHERE CODE IS AT COLD BOOT TIME (AUTO-XR) BSTART, DCA BJMP24&177 /STORE OVER HIGHEST AVAILABLE LOCATION DSRS /GET STATUS NOW SPA /SKIP IF NOT BUSY JMP .-2&177 /ELSE WAIT FOR IT S7440, SZA /BETTER BE CLEAR; ALSO CONSTANT 7440 HLT /ELSE BARF JMP TABLE&177 /CONTINUE THERE SEXTEND,EXTEND /POINTER TO EXTENDED HANDLING ROUTINES S4006, 4006 /CONSTANT 4006 S7704, 7704 /CONSTANT 7704 ZBLOCK 7624-. /EMPTY SPACE / THE CODE IS STARTED HERE IF WE ARE LOADED BY DMA OVERLAY. IFNZRO .&177-24 BJMP24, JMP BSTART&177 /CONTINUE THERE / THE CODE IS STARTED HERE AFTER DMA IS COMPLETE IF NON-OVERLAY METHOD USED. IFNZRO .&177-25 BJMP25, DCA BJMP24&177 /STORE BOOTSTRAP UNIT BITS JMP TABLE&177 /CONTINUE THERE / I/O WAIT ROUTINE. SWAIT, 1400 /WAIT ROUTINE; INITIALIZED FOR COLD BOOTSTRAP DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SNA CLA /SKIP IF ANY ERRORS JMP I SWAIT /RETURN IF OK / I/O FAILURE. JMP SRETURN /TAKE ERROR RETURN THERE ZBLOCK 7640-. /EMPTY SPACE / THE I/O ROUTINES ARE ENTERED HERE. IFNZRO 7640-. SYSIO, SBOOT /I/O ENTRY POINT; INITIALIZED FOR COLD BOOT S7760, SMA SZA SNL CLA /THIS CLEARS THE AC; ALSO CONSTANT 7760 S70, 70 /CONSTANT 0070; THIS CAN BE SKIPPED RDF /GET CALLING FIELD TAD SCIF/(CIF) /TURN INTO CIF CALLING FIELD DCA SRETURN /STORE IN-LINE TAD I SYSIO /GET TRANSFER ADDRESS DCA TRADDRESS /STORE IN COMMAND ISZ SYSIO /BUMP TO NEXT NL4000 /SET READ/WRITE MASK AND I SYSIO /GET THE BIT CLL IAC RTL;RAL /10 IF READING, 12 IF WRITING DCA RWCOM /STORE IN COMMAND TAD I SYSIO /GET FUNCTION WORD AND S3700/(3700) /JUST PAGE BITS SNA /SKIP IF ANY NL4000 /ELSE USE MAXIMUM BSW /MOVE DOWN DCA SCTCNT /STORE IN COMMAND TAD I SYSIO /GET FUNCTION WORD AND S70/(70) /ISOLATE FIELD BITS CLL RTR;RAR /MOVE DOWN DCA TRFLD /STORE (BANK AND) FIELD IN COMMAND ISZ SYSIO /BUMP TO NEXT TAD I SYSIO /GET UNIT WORD AND S7704/(7704) /JUST EXTENDED BITS SZA /SKIP IF ALL CLEAR JMP I SEXTEND/(EXTEND) /JUMP IF EXTENDED CALL TAD I SYSIO /GET UNIT WORD AND S70/(70) /JUST ID BITS BSW;RAR /MOVE UP TAD S4006/(DMA!6) /GET SKELETON VALUE DCA TABLE /STORE IN TABLE NL0003 /SET UNIT MASK AND I SYSIO /GET UNIT BITS BSW;RAR /MOVE UP DCA SECTHI /STORE FOR NOW ISZ SYSIO /BUMP TO NEXT TAD I SYSIO /GET LOW-ORDER BLOCK DCA SECTLO /STORE IN COMMAND TAD SECTLO /GET IT BACK AND S7440/(7400) /JUST HIGH-ORDER BITS BSW;RTR DCA SECTMD /STORE FOR NOW ISZ SYSIO /BUMP TO NEXT TAD I SYSIO /GET HIGH-ORDER BLOCK BSW /MOVE UP AND S3700/(1700) /JUST LOW-ORDER BITS CLL RTR /MOVE UP TAD SECTMD /GET OTHER BITS DCA SECTMD /STORE IN COMMAND TAD I SYSIO /GET HIGH-ORDER BLOCK CLL RTL /MOVE UP AND S3700/(3700) /JUST GROUP BITS BSW /MOVE DOWN TAD SECTHI /GET UNIT BITS DCA SECTHI /STORE IN COMMAND ISZ SYSIO /BUMP TO ERROR RETURN DSRS /GET STATUS NOW SPA CLA /SKIP IF IDLE JMP .-2 /ELSE WAIT FOR IT DSHI /SEND HIGH-ORDER COMMAND ADDRESS DSRS /GET STATUS SMA CLA /SKIP IF NOW BUSY JMP .-2 /ELSE WAIT FOR IT DSCF /CLEAR FLAG NOW TAD S7760/(TABLE) /POINT TO OUR COMMAND DSGO /GO START IT UP JMS SWAIT /WAIT FOR COMMAND TO TAKE DSIM /FINISH THE COMMAND JMS SWAIT /WAIT FOR COMMAND TO COMPLETE ISZ SYSIO /BUMP TO GOOD RETURN SRETURN,.-. /WILL BE CIF RETURN FIELD INSTRUCTION JMP I SYSIO /RETURN TO CALLER SCIF, CIF 00 /CONSTANT 6202 / COMES HERE TO CONTINUE COLD BOOT INITIALIZATION AFTER DMA IS COMPLETED VIA / EITHER METHOD (EXECUTED ON PAGE ZERO). TABLE, 7600 /CLEAN UP; ALSO MOVE POINTER AND COUNTER TAD BJMP24&177 /GET PASSED UNIT BITS AND SWAIT&177/[1400] /JUST DRIVE BITS BSW;CLL RTR /MOVE DOWN DCA SBTUNIT&177 /STORE FOR NOW CONTRL, 0000 /THIS WORD MUST BE ZERO TAD BJMP24&177 /GET PASSED UNIT BITS AND S70&177/[70] /ISOLATE ID BITS TAD SBTUNIT&177 /ADD ON DRIVE BITS DCA SBTUNIT&177 /STORE AS COMPOSITE UNIT / THE I/O ROUTINE MUST NOW BE MOVED TO 7600 FOR FURTHER USE. BMVLUP, TAD I BFROM&177 /GET A WORD DCA I SYSIO&177 /PUT A WORD ISZ SYSIO&177 /DONE YET? JMP BMVLUP&177 /NO, KEEP GOING / THE I/O HANDLER IS NOW RELOCATED TO 7600. JMP I TABLE&177/(SBOOT) /GO START IT UP NOPUNCH /FOOL THE ASSEMBLER *TABLE /OVER COMMAND TABLE / COMMAND TABLE. IFNZRO 7760-. TABLE, .-.^400!DMA!6 /ID, DMA INDICATOR, TABLE LENGTH RWCOM, .-.&377 /010 IF READING, 012 IF WRITING SECTHI, .-.&140+.-.&377 /UNIT, HIGH-ORDER SECTOR ADDRESS SECTMD, .-.&377 /MIDDLE SECTOR ADDRESS SECTLO, .-.&377 /LOW-ORDER SECTOR ADDRESS SCTCNT, .-.&377 /SECTOR COUNT (1-40) CONTRL, 000&377 /CONTROL WORD TRFLD, .-.&377 /TRANSFER BANK AND FIELD TRADDR, .-. /TRANSFER ADDRESS ENPUNCH /UN-FOOL THE ASSEMBLER FIELD GENFLD%10 /SET GENERATION FIELD *SYSGEN /SET GENERATION ADDRESS SYSGEN, CLA /CLEAN UP TAD ("G&37) /GET A TLSIOT /RING IT HLT /WAIT FOR AWHILE CLA /CLEAN UP / MOVE THE SYSTEM LOADER TO ITS OPERATING ADDRESS. GMVLUP, CDF GENFLD /SET OUR FIELD TAD I SYS1 /GET A WORD CDF PRGFLD /SET MAIN PROGRAM FIELD DCA I SYS2 /PUT A WORD ISZ SYS1 /BUMP TO NEXT ISZ SYS2 /DONE ENOUGH? JMP GMVLUP /NO, KEEP GOING / WRITE THE SYSTEM LOADER IMAGE TO THE ABSOLUTE BOOTSTRAP BLOCK. CDF GENFLD /INDICATE OUR FIELD CIF PRGFLD /CALLING MAIN FIELD JMS I (SYSIO) /CALL I/O ROUTINES GENADR /TRANSFER ADDRESS 1^100+GENFLD+WRITE /WRITE ONE PAGE GENUNIT /UNIT 0; 0 /BLOCK HLT /BARF! / WRITE THE MENU UTILITY VOLUME IMAGE TO THE APPROPRIATE BLOCK. CIF PRGFLD /CALLING MAIN FIELD JMS I (SYSIO) /CALL I/O ROUTINES MENLOAD /MENU LOADING ADDRESS 0^100+MNGFLD+WRITE /WRITE ENTIRE FIELD GENUNIT /UNIT MENLO; MENHI /BLOCK HLT /BARF! / INITIALIZE ENTRY ROUTINE FOR SAT TABLE. TAD (SATADR-1) /SETUP THE DCA XR1 /TABLE POINTER / MAKE OS/8 #1 ENTRIES INTO THE SAT TABLE. JMS MAKENTRY /CALL TABLE ROUTINE OS1+BTVOL+NOREL /VALUE OS1E-OS1B /COUNT / MAKE P?S/8 #1 ENTRIES INTO THE SAT TABLE. JMS MAKENTRY /CALL TABLE ROUTINE PQ1 /VALUE PQ1E-PQ1B /COUNT / MAKE MENU-8 ENTRIES INTO THE SAT TABLE. JMS MAKENTRY /CALL TABLE ROUTINE MNU+RO /VALUE 1 /COUNT JMS MAKENTRY /CALL TABLE ROUTINE ALT+MNU+RO /VALUE 1 /COUNT / MAKE DEFECT ALTERNATE ENTRIES INTO THE SAT TABLE. JMS MAKENTRY /CALL TABLE ROUTINE ALT /VALUE ALTE-ALTB /COUNT / MAKE NON-EXISTENT ENTRIES INTO THE SAT TABLE. JMS MAKENTRY /CALL TABLE ROUTINE NX /VALUE NXE-NXB /COUNT / SET GT CHECKSUM. TAD (GTADDR-1) /SETUP THE DCA XR1 /POINTER CDF PRGFLD /GOTO THEIR FIELD GTLOOP, TAD I XR1 /GET A WORD ISZ GTCNT /DONE YET? JMP GTLOOP /NO, KEEP GOING CIA /YES, INVERT IT DCA I XR1 /STORE IN LAST WORD CDF GENFLD /BACK TO OUR FIELD / WRITE OUT THE PRIMARY CONTROL PROGRAM. CIF PRGFLD /CALLING MAIN FIELD JMS I (SYSIO) /CALL I/O ROUTINES 0000 /TRANSFER ADDRESS 37^100+PRGFLD+WRITE /WRITE 37 PAGES GENUNIT /UNIT 1; 0 /BLOCK HLT /BARF! NL7777 /INDICATE SUCCESS HLT /WE'RE DONE! / SETUP BOOTSTRAP UNIT IN CASE WE'RE TRYING IT NOW. CLA /CLEAN UP TAD (GENUNIT) /GET GENERATION UNIT CIF CDF PRGFLD /GOING TO SYSTEM FIELD DCA I (SBTUNIT) /STORE AS UNIT ARGUMENT JMP I (SBOOT) /GO START IT UP / TABLE ENTRY ROUTINE. MAKENTR,.-. /MAKE AN ENTRY ROUTINE CLA /CLEAN UP JUST IN CASE CDF GENFLD /GOTO OUR FIELD TAD I MAKENTRY /GET VALUE DCA SYS1 /STASH IT ISZ MAKENTRY /BUMP TO NEXT TAD I MAKENTRY /GET COUNT CIA /INVERT FOR COUNTING DCA SYS2 /STASH THE COUNTER ISZ MAKENTRY /BUMP PAST ARGUMENTS CDF PRGFLD /GOTO TABLE FIELD PUTLUP, TAD SYS1 /GET THE VALUE DCA I XR1 /STORE IT ISZ SYS2 /DONE ENOUGH? JMP PUTLUP /NO, KEEP GOING CDF GENFLD /BACK TO OUR FIELD JMP I MAKENTRY /RETURN GTCNT, -177 /GT CHECKSUM COUNT SYS1, GENADR /WHERE SYSTEM LOADER IS NOW SYS2, SBOOT /WHERE SYSTEM LOADER EXECUTES LATER PAGE $ /THAT'S ALL FOLK!