/STAND-ALONE BACKUP/RESTORE UTILITY XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / LAST EDIT: 08-MAR-1985 10:00:00 CJL / STAND-ALONE BACKUP/RESTORE UTILITY FOR MDC8 DISKS. / COPIES WINCHESTER DISKS (UNITS 0 OR 1) TO FLEXIBLE DISKS / (UNITS 2 OR 3) OR VICE-VERSA. / REQUIRES MDC802 FIRMWARE REVISION. / REQUIRES PDP-8/I PROCESSOR (OR BETTER) WITH MQ. / (C) 1983, 1984, 1985 CHARLES LASNER ASSOCIATES. / ASSEMBLY INSTRUCTIONS: / CHANGE "DEVCODE" TO PROPER DEVICE CODE AS NECESSARY (DEFAULT IS 70). / MUST BE ASSEMBLED WITH '/J' (OS/8 PAL8 '/F') SWITCH SET. / ASSEMBLY DEFINITIONS, ETC. / ASSEMBLY LISTING PARAMETER. / IFNDEF LSTMES /DON'T LIST TEXT MESSAGES IFNDEF LSTMES /LIST TEXT MESSAGES / PRINTING PARAMETER. / IFNDEF PDEBUG /DON'T ALLOW PRINTER DEBUGGING IFNDEF PDEBUG /ALLOW PRINTER DEBUGGING OUTPUT FROM LAS / FORM-FEED PARAMETER. / IFNDEF NOFORM /DON'T ALLOW ON SCREEN MENU MESSAGES IFNDEF NOFORM /ALLOW ON SCREEN MENU MESSAGES / 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 / 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 KRSIOT= CICODE^10+6004 /READ KEYBOARD FLAG, 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 / LINE PRINTER IOT DEFINITIONS. / IFNDEF LICODE /USES 665X BY DEFAULT / IFNDEF LOCODE /USES 666X BY DEFAULT / IFNDEF LICODE /USES 640X BY DEFAULT / IFNDEF LOCODE /USES 641X BY DEFAULT IFNDEF LICODE /USES 643X BY DEFAULT IFNDEF LOCODE /USES 647X BY DEFAULT LKCCIOT=LICODE^10+6002 /CLEAR INPUT FLAG, AC LKRBIOT=LICODE^10+6006 /LOAD KEYBOARD BUFFER, CLEAR FLAG LKSFIOT=LICODE^10+6001 /SKIP ON INPUT FLAG LLSIOT= LOCODE^10+6006 /LOAD OUTPUT, CLEAR FLAG LSFIOT= LOCODE^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 / DEVICE SIZE AND AREA DEFINITIONS. AALENHI=0006 /ARCHIVING AREA LENGTH - HIGH-ORDER AALENLO=1750 /ARCHIVING AREA LENGTH - LOW-ORDER AALOWHI=0010 /ARCHIVING AREA LOWEST BLOCK - HIGH-ORDER AALOWLO=0000 /ARCHIVING AREA LOWEST BLOCK - LOW-ORDER DALENHI=0004 /DAILY ACTIVITY AREA LENGTH - HIGH-ORDER DALENLO=0000 /DAILY ACTIVITY AREA LENGTH - LOW-ORDER DALOWHI=0004 /DAILY ACTIVITY AREA LOWEST BLOCK - HIGH-ORDER DALOWLO=0000 /DAILY ACTIVITY AREA LOWEST BLOCK - LOW-ORDER FLEXHI= 0001 /FLEXIBLE DISK SIZE - HIGH-ORDER FLEXLO= 0624/1014 /FLEXIBLE DISK SIZE - LOW-ORDER FLXTRKS=0115 /NUMBER OF TRACKS ON FLEXIBLE DISK (ONE SIDE) FTSIZE= 0017 /NUMBER OF SECTORS ON FLEXIBLE DISK (ONE TRACK) LBLENHI=0002 /LIBRARY AREA LENGTH - HIGH-ORDER LBLENLO=0000 /LIBRARY AREA LENGTH - LOW-ORDER LBLOWHI=0002 /LIBRARY AREA LOWEST BLOCK - HIGH-ORDER LBLOWLO=0000 /LIBRARY AREA LOWEST BLOCK - LOW-ORDER MAXSEQ= 0015 /13 IS HIGHEST FLEXIBLE DISK NUMBER MAXVAL= 17^2^2 /LARGEST RECORD COUNT FOR I/O CALLS SYLENHI=0002 /SYSTEM AREA LENGTH - HIGH-ORDER SYLENLO=0000 /SYSTEM AREA LENGTH - LOW-ORDER SYLOWHI=0000 /SYSTEM AREA LOWEST BLOCK - HIGH-ORDER SYLOWLO=0000 /SYSTEM AREA LOWEST BLOCK - LOW-ORDER WNLENHI=0016 /WINCHESTER LOGICAL LENGTH - HIGH-ORDER WNLENLO=1750 /WINCHESTER LOGICAL LENGTH - LOW-ORDER WNLOWHI=0000 /WINCHESTER LOGICAL LOWEST BLOCK - HIGH-ORDER WNLOWLO=0000 /WINCHESTER LOGICAL LOWEST BLOCK - LOW-ORDER / FIELD DEFINITIONS. DATFLD= 0030 /DATA FIELD MSGFLD= 0010 /MESSAGE FIELD PRGFLD= 0000 /PROGRAM FIELD VERFLD= 0050 /VERIFY FIELD / OTHER DEFINITIONS. DMA= 4000 /DMA INDICATOR NL0000= CLA /LOAD AC WITH 0000 NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0003= CLA CLL CML IAC RAL /LOAD AC WITH 0003 NL0004= CLA CLL IAC RTL /LOAD AC WITH 0004 NL0006= CLA CLL CML IAC RTL /LOAD AC WITH 0006 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 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 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 VERSION=12 /VERSION NUMBER REVISIO="E /REVISION LETTER SBOOT= 7600 /SYSTEM BOOTSTRAP ADDRESS WRITE= 4000 /I/O HANDLER WRITE BIT / FIELD PRGFLD%10 /WHERE WE START LOADING *0 /START AT THE BEGINNING *10 /GET TO AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER ONE XR2, .-. /AUTO-INDEX NUMBER TWO *20 /GET PAST AUTO-INDEX AREA BCSW, .-. /BAD COMPARE SWITCH BRSW, .-. /BACKUP/RESTORE SWITCH IN BIT[0] CMECNT, .-. /COMPARE ERROR COUNTER CMPCNT, .-. /COMPARE COUNTER DATSW, .-. /TODAY'S DATE ACQUIRED SWITCH ERUNIT, .-. /ERROR REPORTING UNIT FBLK, ZBLOCK 2 /FORMAT BLOCK FLPUNIT,.-. /FLEXIBLE DISK UNIT GNSW, .-. /GETNUM SWITCH INCHAR, .-. /INPUT BUFFER INCNT, .-. /INPUT RETRY COUNTER INECNT, .-. /INPUT ERROR COUNTER INUNIT, .-. /LOGICAL INPUT UNIT IOSW, .-. /I/O ERROR SWITCH MAXIO, MAXVAL /MAXIMUM I/O RECORD COUNT OLCHAR, .-. /OLD NUMERICAL CHARACTER OTECNT, .-. /OUTPUT ERROR COUNTER OTUNIT, .-. /LOGICAL OUTPUT UNIT OUTCNT, .-. /OUTPUT RETRY COUNTER RMODSW, .-. /RESTORE MODE (NORMAL/VERIFY-ONLY) SWITCH SEQUENC,.-. /SEQUENCE NUMBER FOR BACKUP MEDIA TBCNT, .-. /TRACK BUMP COUNTER TEMP, .-. /TEMPORARY TRACK, .-. /DISPLAY TRACK TYPE, .-. /OPERATION TYPE UPDATE, ZBLOCK 2 /UPDATE VALUE FOR BLOCK COPYING UPREST, .-. /RESTART ADDRESS FROM <^P> UPURET, .-. /<^U> RESTART ADDRESS VALTYPE,.-. /VALIDATION TYPE VCSW, .-. /COMMAND VERIFICATION SWITCH VERCNT, .-. /VERIFY RETRY COUNTER VERSW, .-. /VERIFY SWITCH VMODSW, .-. /VERIFY MODE (WRITE-ONLY/WRITE WITH VERIFY) SWITCH VOSW, .-. /VERIFY-ONLY SWITCH WINUNIT,.-. /MAIN DEVICE UNIT PAGE START, TAD MAP MQL JMS I [IOHAND] MAP 1^100+1+WRITE MAP HLT ISZ MAP SKP ISZ MAP+1 JMP START MAP, ZBLOCK 200 PAGE RESTART,TAD (RESTART) /SETUP OUR DCA UPREST /<^P> ADDRESS JMS NUFORM /DO A JMS I [MESSAGE] /ANNOUNCE OURSELVES SCREN1 /WITH FIRST BLURB RESTAGN,TAD (RESTART) /RESET THE <^P> ADDRESS DCA UPREST /IN CASE OF QUICK RETURN JMS I (GETCOMMAND) /GET OUR COMMAND FRST-1 /FIRST LETTER LIST-1 FRST-SCND /LENGTH OF LIST FINLST-1 /TEXT/DISPATCH LIST-1 / VARY PARAMETERS COMMAND COMES HERE. VARPAR, TAD (VARPAR) /SETUP OUR DCA UPREST /<^P> ADDRESS JMS NUFORM /DO A JMS I [MESSAGE] /ANNOUNCE OURSELVES SCREN2 /WITH FIRST BLURB VARAGN, JMS I (GETCOMMAND) /GET OUR COMMAND VFRST-1 /FIRST LETTER LIST-1 VFRST-VSCND /LENGTH OF LIST VFINLST-1 /TEXT/DISPATCH LIST-1 / SET FLEXIBLE DISK DRIVE ZERO. F2, NL0002 /SET TWO SKP /DON'T DO NEXT / SET FLEXIBLE DISK DRIVE ONE. F3, NL0003 /SET THREE DCA FLPUNIT /STORE FLEXIBLE DISK DRIVE UNIT JMP VARAGN /KEEP GOING / SET WINCHESTER DISK DRIVE ONE. W1, NL0001 /SET ONE / SET WINCHESTER DISK DRIVE ZERO. W0, DCA WINUNIT /STORE WINCHESTER UNIT JMP VARAGN /KEEP GOING / SET WRITE WITH VERIFY. WV, NL0001 /SET THE SWITCH / SET WRITE WITHOUT VERIFY. WO, DCA VMODSW /SAVE VERIFY MODE SWITCH SKP /CLEAR VERIFY-ONLY SWITCH WITH EITHER COMMAND / SET VERIFY-ONLY RESTORE MODE. VO, NL0001 /SET VERIFY-ONLY VALUE DCA RMODSW /SAVE RESTORE MODE SWITCH VALUE JMP VARAGN /KEEP GOING / NUMERICAL MESSAGE TABLE. NUMTBL, FIRST /FIRST MESSAGE SECOND /SECOND MESSAGE THIRD /THIRD MESSAGE FOURTH /FOURTH MESSAGE FIFTH /FIFTH MESSASE SIXTH /SIXTH MESSAGE SEVENTH /SEVENTH MESSAGE EIGHTH /EIGHTH MESSAGE NINTH /NINTH MESSAGE TENTH /TENTH MESSAGE ELEVENTH /ELEVENTH MESSAGE TWELFTH /TWELFTH MESSAGE THIRTEENTH /THIRTEENTH MESSAGE / FOURTEENTH /FOURTEENTH MESSAGE / BIT SEQUENCE TABLE. BITABLE,4000 /ENTIRE DISK VALUE 2000 /SYSTEM AREA VALUE 1000 /LIBRARY AREA VALUE 0400 /DAILY ACTIVITY AREA VALUE 0200 /ARCHIVING AREA VALUE NUFORM, .-. / ROUTINE TAD (14) /GET A XLIST OFF IFZERO NOFORM < XLIST ON JMS I [P7CH] /PRINT IT XLIST OFF > IFNZRO NOFORM < XLIST ON CLA /THROW IT AWAY XLIST OFF > XLIST ON JMP I NUFORM /RETURN / DATE/TIME BUFFERS. / N.B. TIME ZONE CHARACTERS ARE ALSO KNOWN AS ID CHARACTERS! / TODAY'S DATE/TIME BUFFER. TDBUFF, "1&177 /UPPER MONTH DIGIT "2&177 /LOWER MONTH DIGIT "3&177 /UPPER DAYS DIGIT "1&177 /LOWER DAYS DIGIT "1&177 /UPPER DECADE DIGIT "9&177 /LOWER DECADE DIGIT "8&177 /UPPER YEARS DIGIT "0&177 /LOWER YEARS DIGIT TTMBUFF,"2&177 /UPPER HOURS DIGIT "3&177 /LOWER HOURS DIGIT "5&177 /UPPER MINUTES DIGIT "9&177 /LOWER MINUTES DIGIT "E&177 /FIRST TIME ZONE CHARACTER "S&177 /SECOND TIME ZONE CHARACTER "T&177 /THIRD TIME ZONE CHARACTER / BACKUP DATE/TIME BUFFER. ADBUFFE,"1&177 /UPPER MONTH DIGIT "2&177 /LOWER MONTH DIGIT "3&177 /UPPER DAYS DIGIT "1&177 /LOWER DAYS DIGIT "1&177 /UPPER DECADE DIGIT "9&177 /LOWER DECADE DIGIT "8&177 /UPPER YEARS DIGIT "0&177 /LOWER YEARS DIGIT ATMBUFF,"2&177 /UPPER HOURS DIGIT "3&177 /LOWER HOURS DIGIT "5&177 /UPPER MINUTES DIGIT "9&177 /LOWER MINUTES DIGIT "E&177 /FIRST TIME ZONE CHARACTER "S&177 /SECOND TIME ZONE CHARACTER "T&177 /THIRD TIME ZONE CHARACTER / UNIT MESSAGE LIST. UNITABL,ZEROMSG /ZERO ONEMSG /ONE TWOMSG /TWO THREMSG /THREE PAGE / PARAMETER LISTS FOR FIRST SCREEN. FRST, -"B!200 /BACKUP SYSTEM AREA -"R+"B /RESTORE SYSTEM AREA -"B+"R /BACKUP LIBRARY AREA -"R+"B /RESTORE LIBRARY AREA -"B+"R /BACKUP DAILY ACTIVITY AREA -"R+"B /RESTORE DAILY ACTIVITY AREA -"B+"R /BACKUP ARCHIVING AREA -"R+"B /RESTORE ARCHIVING AREA -"B+"R /BACKUP ENTIRE DISK -"R+"B /RESTORE ENTIRE DISK -"V+"R /VARY PARAMETERS -"E+"V /EXIT SCND, -"S!200 /BACKUP SYSTEM AREA -"S!200 /RESTORE SYSTEM AREA -"L!200 /BACKUP LIBRARY AREA -"L!200 /RESTORE LIBRARY AREA -"D!200 /BACKUP DAILY ACTIVITY AREA -"D!200 /RESTORE DAILY ACTIVITY AREA -"A!200 /BACKUP ARCHIVING AREA -"A!200 /RESTORE ARCHIVING AREA -"E!200 /BACKUP ENTIRE DISK -"E!200 /RESTORE ENTIRE DISK -"A!200 /VARY PARAMETERS -"X!200 /EXIT FINLST, BSMSG /BACKUP SYSTEM AREA BSYS /A(BACKUP SYSTEM AREA) RSMSG /RESTORE SYSTEM AREA RESYS /A(RESTORE SYSTEM AREA) BLMSG /BACKUP LIBRARY AREA BLIB /A(BACKUP LIBRARY AREA RLMSG /RESTORE LIBRARY AREA RELIB /A(RESTORE LIBRARY AREA) BDMSG /BACKUP DAILY ACTIVITY AREA BDAILY /A(BACKUP DAILY ACTIVITY AREA RDMSG /RESTORE DAILY ACTIVITY AREA REDAILY /A(RESTORE DAILY ACTIVITY AREA) BAMSG /BACKUP ARCHIVING AREA BARCH /A(BACKUP ARCHIVING AREA) RAMSG /RESTORE ARCHIVING AREA REARCH /A(RESTORE ARCHIVING AREA) BEMSG /BACKUP ENTIRE DISK BACKALL /A(BACKUP ENTIRE DISK) RSAMSG /RESTORE ENTIRE DISK RESTALL /A(RESTORE ENTIRE DISK) VPMSG /VARY PARAMETERS VARPAR /A(VARY PARAMETERS) EXMSG /EXIT PUTBAK/SBOOT /A(EXIT) / PARAMETER LISTS FOR SECOND SCREEN. VFRST, -"F!200 /BACKUP DEVICE IS FLEXIBLE DISK DRIVE ZERO -"F+"F /BACKUP DEVICE IS FLEXIBLE DISK DRIVE ONE -"W+"F /RESTORE DEVICE IS WINCHESTER DISK DRIVE ZERO -"W+"W /RESTORE DEVICE IS WINCHESTER DISK DRIVE ONE -"V+"W /RESTORE IS VERIFY-ONLY -"W+"V /BACKUP/RESTORE IS WRITE-ONLY -"W+"W /BACKUP/RESTORE IS WRITE WITH VERIFY -"M+"W /RETURN TO MAIN MENU -"E+"M /EXIT VSCND, -"0!200 /BACKUP DEVICE IS FLEXIBLE DISK DRIVE ZERO -"1!200 /BACKUP DEVICE IS FLEXIBLE DISK DRIVE ONE -"0!200 /RESTORE DEVICE IS WINCHESTER DISK DRIVE ZERO -"1!200 /RESTORE DEVICE IS WINCHESTER DISK DRIVE ONE -"O!200 /RESTORE IS VERIFY-ONLY -"O!200 /BACKUP/RESTORE IS WRITE-ONLY -"V!200 /BACKUP/RESTORE IS WRITE WITH VERIFY -"E!200 /RETURN TO MAIN MENU -"X!200 /EXIT VFINLST,BK2MSG /BACKUP DEVICE IS FLEXIBLE DISK DRIVE ZERO F2 /A(BACKUP DEVICE IS FLEXIBLE DISK DRIVE ZERO) BK3MSG /BACKUP DEVICE IS FLEXIBLE DISK DRIVE ONE F3 /A(BACKUP DEVICE IS FLEXIBLE DISK DRIVE ONE) RS0MSG /RESTORE DEVICE IS WINCHESTER DISK DRIVE ZERO W0 /A(RESTORE DEVICE IS WINCHESTER DISK DRIVE ZERO) RS1MSG /RESTORE DEVICE IS WINCHESTER DISK DRIVE ONE W1 /A(RESTORE DEVICE IS WINCHESTER DISK DRIVE ONE) VOMSG /RESTORE IS VERIFY-ONLY VO /A(RESTORE IS VERIFY-ONLY) WOMSG /BACKUP/RESTORE IS WRITE-ONLY WO /A(BACKUP/RESTORE IS WRITE-ONLY) WVMSG /BACKUP/RESTORE IS WRITE WITH VERIFY WV /A(BACKUP/RESTORE IS WRITE WITH VERIFY) MENUMSG /RETURN TO MAIN MENU RESTART /A(RETURN TO MAIN MENU) EXMSG /EXIT PUTBAK/SBOOT /A(EXIT) / TYPE VALIDATION TABLE. VALBASE,VALBAD /00000 - ILLEGAL ARCHDSK /00001 - ARCHIVING DISK DAILDSK /00010 - DAILY ACTIVITY DISK VALBAD /00011 - ILLEGAL LIBDSK /00100 - LIBRARY DISK VALBAD /00101 - ILLEGAL VALBAD /00110 - ILLEGAL VALBAD /00111 - ILLEGAL SYSDSK /01000 - SYSTEM DISK VALBAD /01001 - ILLEGAL VALBAD /01010 - ILLEGAL VALBAD /01011 - ILLEGAL VALBAD /01100 - ILLEGAL VALBAD /01101 - ILLEGAL VALBAD /01110 - ILLEGAL VALBAD /01111 - ILLEGAL ENTDSK /10000 - ENTIRE DISK VALBAD /10001 - ILLEGAL VALBAD /10010 - ILLEGAL VALBAD /10011 - ILLEGAL VALBAD /10100 - ILLEGAL VALBAD /10101 - ILLEGAL VALBAD /10110 - ILLEGAL VALBAD /10111 - ILLEGAL VALBAD /11000 - ILLEGAL VALBAD /11001 - ILLEGAL VALBAD /11010 - ILLEGAL VALBAD /11011 - ILLEGAL VALBAD /11100 - ILLEGAL VALBAD /11101 - ILLEGAL VALBAD /11110 - ILLEGAL VALBAD /11111 - ILLEGAL PAGE TERMRES,.-. /TERMINAL AND I/O RESET ROUTINE CAF /CLEAN UP EVERYBODY TLSIOT /SET TTY: FLAG LLSIOT /SET LPT: FLAG TAD [-200] /SETUP THE DCA TERFOO /TIME-OUT JMS TRWAIT /WAIT FOR NOT BUSY ISZ TERFOO /WAITED ENOUGH? JMP .-2 /NO, WAIT SOME MORE JMS TRWAIT /NOW WAIT FOR REAL JMP I TERMRESET /RETURN TRWAIT, .-. /WAIT ROUTINE TRWATLP,ISZ TERFU /WASTE JMP TRWATLP /SOME TIME DSRS /BUSY? SPA CLA /SKIP IF NOT JMP TRWATLP /ELSE WAIT SOME MORE JMP I TRWAIT /RETURN TERFOO, .-. /COUNTER TERFU, .-. /COUNTER / DISK BACKUP ROUTINE ENTRY POINTS. / SET INBLK TO LOWEST BLOCK TO BACKUP. / SET UPPERLIMIT TO -(COPY LENGTH). / ENTIRE DISK BACKUP ENTRY POINT. BACKALL,DLD; WNLOW /GET LOWEST WINCHESTER LOGICAL BLOCK DST; INBLK /USE AS INPUT BLOCK DAD; WNLENGTH /ADD ON (WINCHESTER LOGICAL LENGTH) DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0000 /INDICATE ENTIRE DISK OPERATION TYPE BCOMMON,DCA TYPE /SAVE OPERATION TYPE DCA SEQUENCE /CLEAR SEQUENCE NUMBER DCA BRSW /SET BACKUP MODE TAD WINUNIT /GET WINCHESTER UNIT DCA INUNIT /USE AS INPUT UNIT TAD FLPUNIT /GET FLEXIBLE DISK DRIVE UNIT DCA OTUNIT /USE FOR OUTPUT DCA VOSW /BACKUP ALWAYS WRITES TAD VMODSW /GET VERIFY MODE DCA VERSW /SETUP AS NECESSARY DLD; INBLK /GET INPUT BLOCK DST; CNTRLBLK /SETUP CONTROL BLOCK DLD; D2000 /GET LARGE POSITIVE NUMBER DST; OUTBLK /SETUP OUTPUT BLOCK TO REQUIRE A NEW FLEXIBLE DISK CAM /CLEAN UP DCA IOSW /START CLEAN JMP I (IORESET) /CONTINUE THERE / SYSTEM AREA BACKUP ENTRY POINT. BSYS, DLD; SYLOW /GET LOWEST SYSTEM AREA BLOCK DST; INBLK /SETUP INPUT BLOCK DAD; SYLENGTH /ADD ON SYSTEM AREA LENGTH DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0001 /INDICATE SYSTEM OPERATION TYPE JMP BCOMMON /CONTINUE THERE / LIBRARY AREA BACKUP ENTRY POINT. BLIB, DLD; LBLOW /GET LOWEST LIBRARY AREA BLOCK DST; INBLK /SETUP INPUT BLOCK DAD; LBLENGTH /ADD ON LIBRARY AREA LENGTH DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0002 /INDICATE LIBRARY OPERATION TYPE JMP BCOMMON /CONTINUE THERE / DAILY ACTIVITY AREA BACKUP ENTRY POINT. BDAILY, DLD; DALOW /GET LOWEST DAILY ACTIVITY AREA BLOCK DST; INBLK /SETUP INPUT BLOCK DAD; DALENGTH /ADD ON DAILY ACTIVITY AREA LENGTH DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0003 /INDICATE DAILY OPERATION TYPE JMP BCOMMON /CONTINUE THERE / ARCHIVING AREA BACKUP ENTRY POINT. BARCH, DLD; AALOW /GET LOWEST ARCHIVING AREA BLOCK DST; INBLK /SETUP INPUT BLOCK DAD; AALENGTH /ADD ON ARCHIVING AREA LENGTH DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0004 /INDICATE ARCHIVING OPERATION TYPE JMP BCOMMON /CONTINUE THERE PAGE / DISK RESTORE ROUTINE ENTRY POINTS. / SET OUTBLK TO LOWEST BLOCK TO RESTORE. / SET UPPERLIMIT TO -(COPY LENGTH). / ENTIRE DISK RESTORE ENTRY POINT. RESTALL,DLD; WNLOW /GET LOWEST WINCHESTER LOGICAL BLOCK DST; OUTBLK /SETUP OUTPUT BLOCK DAD; WNLENGTH /ADD ON (WINCHESTER LOGICAL LENGTH) DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0000 /INDICATE ENTIRE DISK OPERATION TYPE RESTCOM,DCA TYPE /SAVE OPERATION TYPE DCA SEQUENCE /CLEAR SEQUENCE NUMBER NL4000 /INDICATE DCA BRSW /RESTORE MODE TAD FLPUNIT /GET FLEXIBLE DISK DRIVE UNIT DCA INUNIT /USE FOR INPUT TAD WINUNIT /GET WINCHESTER UNIT DCA OTUNIT /USE FOR OUTPUT TAD RMODSW /GET CURRENT RESTORE MODE DCA VOSW /SETUP TO RESTORE OR VERIFY NL7777 /INDICATE LACK OF DCA BCSW /COMPARE ERRORS TAD RMODSW /GET RESTORE MODE TAD VMODSW /OR IN VERIFY MODE DCA VERSW /SET VERIFY SWITCH AS NECESSARY DLD; OUTBLK /GET OUTPUT BLOCK DST; CNTRLBLK /SETUP CONTROL BLOCK DLD; D2000 /GET LARGE POSITIVE NUMBER DST; INBLK /SETUP INPUT TO REQUIRE A NEW FLEXIBLE DISK CAM /CLEAN UP DCA IOSW /START CLEAN JMP I (IORESET) /CONTINUE THERE / SYSTEM AREA RESTORE ENTRY POINT. RESYS, DLD; SYLOW /GET LOWEST SYSTEM BLOCK DST; OUTBLK /SETUP OUTPUT BLOCK DAD; SYLENGTH /ADD ON SYSTEM AREA LENGTH DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0001 /INDICATE SYSTEM OPERATION TYPE JMP RESTCOMMON /CONTINUE THERE / LIBRARY AREA RESTORE ENTRY POINT. RELIB, DLD; LBLOW /GET LOWEST LIBRARY AREA BLOCK DST; OUTBLK /SETUP OUTPUT BLOCK DAD; LBLENGTH /ADD ON LIBRARY AREA LENGTH DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0002 /INDICATE LIBRARY OPERATION TYPE JMP RESTCOMMON /CONTINUE THERE / DAILY ACTIVITY AREA RESTORE ENTRY POINT. REDAILY,DLD; DALOW /GET LOWEST DAILY ACTIVITY AREA BLOCK DST; OUTBLK /SETUP OUTPUT BLOCK DAD; DALENGTH /ADD ON DAILY ACTIVITY AREA LENGTH DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0003 /INDICATE DAILY OPERATION TYPE JMP RESTCOMMON /CONTINUE THERE / ARCHIVING AREA RESTORE ENTRY POINT. REARCH, DLD; AALOW /GET LOWEST ARCHIVING AREA BLOCK DST; OUTBLK /SETUP OUTPUT BLOCK DAD; AALENGTH /ADD ON ARCHIVING AREA LENGTH DCM /NEGATE DST; UPPERLIMIT /USE AS UPPER LIMIT NL0004 /INDICATE ARCHIVING OPERATION TYPE JMP RESTCOMMON /CONTINUE THERE / COMES HERE WHEN LATEST COPYING OPERATION IS COMPLETED. IODONE, CLA /CLEAN UP TAD BRSW /GET BACKUP/RESTORE SWITCH SPA CLA /SKIP IF BACKING UP TAD (RDMESS-BDMESS) /ELSE USE RESTORING MESSAGE TAD (BDMESSAGE) /GET BACKING UP MESSAGE DCA MESSADRESS /STORE IN-LINE TAD VOSW /GET VERIFY-ONLY SWITCH SNA CLA /SKIP IF SET JMP IODONPR /ELSE JUST PRINT IT TAD (CDMESSAGE) /GET COMPARE MESSAGE DCA MESSADRESS /STORE IN-LINE IODONPR,JMS I [MESSAGE] /CALL MESSAGE PRINTER MESSADR,.-. /WILL BE EITHER BDMESSAGE, RDMESSAGE, OR CDMESSAGE TAD TYPE /GET OPERATION TYPE JMS I (TYPRNT) /PRINT IT JMS I [MESSAGE] /CALL MESSAGE PRINTER COMPMSG /TO PRINT COMPLETION MESSAGE TAD VOSW /GET VERIFY-ONLY MODE SWITCH SNA CLA /SKIP IF SET JMP I [RESTAGN] /RESTART IF NOT ISZ BCSW /ANY COMPARE ERRORS? SKP /SKIP IF SO JMP I [RESTAGN] /JUMP IF NOT JMS I [MESSAGE] /TELL THEM BDCMSG /COMPARE HAS HOLES IN IT JMP I [RESTAGN] /RESTART PAGE / MAIN I/O LOOP. IOLOOP, DLD; CNTRLBLK /GET CONTROL BLOCK DAD; UPPERLIMIT /COMPARE TO UPPER LIMIT SMA /SKIP IF NOT DONE YET JMP I (IODONE) /JUMP IF NOW DONE DAD; UPDATE /ADD CURRENT UPDATE FACTOR SPA /SKIP IF WE CAN'T DO THIS MUCH JMP IOK /JUMP IF WE CAN DCM /INVERT IT DAD; UPDATE /SUBTRACT FROM FORMER UPDATE VALUE DST; UPDATE /SAVE AS NEW UPDATE VALUE IOK, CAM /CLEAN UP TAD BRSW /GET BACKUP/RESTORE SWITCH SMA CLA /SKIP IF FLEXIBLE DISK INPUT JMP INOK /JUMP IF NOT DLD; INBLK /GET INPUT BLOCK DAD; BLIMIT /COMPARE TO UPPER LIMIT SMA /SKIP IF NOT DONE YET JMP I (INDONE) /JUMP IF LATEST INPUT GONE DAD; UPDATE /ADD ON CURRENT UPDATE FACTOR SPA /SKIP IF WE CAN'T DO THIS MUCH JMP INOK /JUMP IF WE CAN DCM /INVERT IT DAD; UPDATE /SUBTRACT FROM FORMER UPDATE VALUE DST; UPDATE /SAVE AS NEW UPDATE VALUE INOK, CAM /CLEAN UP TAD BRSW /GET BACKUP/RESTORE SWITCH SPA CLA /SKIP IF FLEXIBLE DISK OUTPUT JMP OUTOK /JUMP IF NOT DLD; OUTBLK /GET OUTPUT BLOCK DAD; BLIMIT /COMPARE TO UPPER LIMIT SMA /SKIP IF NOT DONE YET JMP I (OTDONE) /JUMP IF LATEST OUTPUT GONE DAD; UPDATE /ADD ON CURRENT UPDATE FACTOR SPA /SKIP IF WE CAN'T DO THIS MUCH JMP OUTOK /JUMP IF WE CAN DCM /INVERT IT DAD; UPDATE /SUBTRACT FROM FORMER UPDATE VALUE DST; UPDATE /SAVE AS NEW UPDATE VALUE OUTOK, CAM /CLEAN UP TAD I (CNTRLBLK) /GET LOW-ORDER CONTROL BLOCK AND [77] /JUST LOW-ORDER HALF MQL /DISPLAY THEM LAS /GET CONSOLE CONTROL SWITCH SPA CLA /SKIP IF HIGH-ORDER OFF JMP DOMIDDLE /JUMP IF HIGH-ORDER ON TAD I (CNTRLBLK+1) /GET HIGH-ORDER CONTROL BLOCK RTL;RTL;RTL /MOVE UP LOW-ORDER HALF SKP /DON'T USE OTHER HALF DOMIDDL,TAD I (CNTRLBLK) /GET LOW-ORDER HALF AND (7700) /GET HIGH-ORDER HALF OF SELECTED VALUE MQA /OR IN LOW-ORDER HALF MQL /DISPLAY COMPOSITE NL7775 /SETUP THE DCA INECNT /INPUT ERROR COUNTER INPAGN, JMS I [CHKUP] /CHECK FOR <^P>, ETC. TAD UPDATE /GET UPDATE FACTOR RTL;RTL;RTL /MOVE OVER AND [3700] /JUST PAGE BITS TAD (DATFLD) /ADD ON FIELD BITS TAD INUNIT /ADD ON INPUT UNIT BITS DCA INFUN /STORE IN-LINE JMS I [IOSPEC] /CALL I/O HANDLER 0000 /TRANSFER ADDRESS INFUN, .-.^100+DATFLD+.-. /PAGE COUNT AND UNIT BITS WILL BE FILLED IN INBLK /INPUT BLOCK POINTER JMP I (INERROR) /BARF! INPAST, NL4000 /SET WRITE BIT TAD INFUN /ADD ON INPUT FUNCTION AND (7770) /RETAIN WRITE, PAGE, FIELD BITS TAD OTUNIT /ADD ON OUTPUT UNIT BITS DCA OUTFUN /STORE IN-LINE NL7775 /SETUP THE DCA CMECNT /COMPARE ERROR COUNTER VERAGN, NL7775 /SETUP THE DCA OTECNT /OUTPUT ERROR COUNTER OUTAGN, JMS I [CHKUP] /CHECK FOR <^P>, ETC. TAD VOSW /GET VERIFY-ONLY SWITCH SZA CLA /SKIP IF NOT SET JMP OTPASS /JUMP IF SET JMS I [IOSPEC] /CALL HANDLER 0000 /TRANSFER ADDRESS OUTFUN, .-.^100+DATFLD+.-.+WRITE/PAGE COUNT, UNIT BITS WILL BE FILLED IN OUTBLK /OUTPUT BLOCK POINTER JMP I (OTERROR) /BARF! OTPASS, JMS I [CHKUP] /CHECK FOR <^P>, ETC. TAD OUTFUN /GET OUTPUT FUNCTION TAD (VERFLD-DATFLD-WRITE) /ADJUST TO VERIFY READ JMP I (OTMORE) /CONTINUE THERE PAGE OTMORE, DCA VERFUN /STORE IN-LINE TAD VERSW /DO WE VERIFY? SNA CLA /SKIP IF SO JMP OTPAST /JUMP IF NOT JMS I [IOSPEC] /CALL I/O HANDLER 0000 /TRANSFER ADDRESS VERFUN, .-.^100+VERFLD+.-. /PAGE COUNT, UNIT BITS WILL BE FILLED IN OUTBLK /VERIFY BLOCK POINTER JMP I (CMERROR) /BARF! TAD UPDATE /GET UPDATE FACTOR TAD (-40) /COMPARE TO MAXIMUM IN ONE FIELD SPA SNA CLA /SKIP IF GREATER TAD UPDATE /ELSE USE UPDATE ITSELF SNA /DID WE USE UPDATE? TAD [40] /NO, USE MAXIMUM IN ONE FIELD INSTEAD CLL RTR;RTR;RTR /MOVE OVER CIA /INVERT FOR COUNTING DCA TEMP /STASH THE COUNTER NL7777 /SETUP DCA XR1 /THE NL7777 /COMPARE DCA XR2 /POINTERS CMPLUP, CDF DATFLD /GOTO INPUT FIELD TAD I XR1 /GET A WORD CIA /INVERT IT CDF VERFLD /GOTO VERIFY FIELD TAD I XR2 /COMPARE TO COPY SZA CLA /SKIP IF OK JMP I (CMERROR) /ELSE COMPLAIN ISZ TEMP /DONE ALL YET? JMP CMPLUP /NO, KEEP GOING TAD UPDATE /GET UPDATE FACTOR TAD (-40) /COMPARE TO MAXIMUM IN ONE FIELD SPA SNA /SKIP IF GREATER JMP OTPAST /JUMP IF NOT CLL RTR;RTR;RTR /MOVE OVER CIA /INVERT FOR COUNTING DCA TEMP /STASH THE COUNTER CM2LUP, CDF DATFLD+10 /GOTO INPUT FIELD TAD I XR1 /GET A WORD CIA /INVERT IT CDF VERFLD+10 /GOTO VERIFY FIELD TAD I XR2 /COMPARE TO COPY SZA CLA /SKIP IF OK JMP I (CMERROR) /ELSE COMPLAIN ISZ TEMP /DONE ALL YET? JMP CM2LUP /NO, KEEP GOING OTPAST, CDF PRGFLD /YES, BACK TO OUR FIELD DLD; INBLK /GET INPUT BLOCK DAD; UPDATE /UPDATE IT DST; INBLK /STORE IT BACK DLD; OUTBLK /GET OUTPUT BLOCK DAD; UPDATE /UPDATE IT DST; OUTBLK /STORE IT BACK DLD; CNTRLBLK /GET CONTROL BLOCK DAD; UPDATE /UPDATE IT DST; CNTRLBLK /STORE IT BACK CAM /CLEAN UP TAD IOSW /GET I/O ERROR SWITCH SZA /SKIP IF NORMAL ISZ IOSW /ELSE BUMP IT SZA CLA /SKIP IF NORMAL ISZ IOSW /ELSE BUMP IT JMP I (IOLOOP) /JUMP IF NOT TIME TO CHANGE IORESET,TAD MAXIO /ELSE GET RESET VALUE DCA UPDATE /RESET TO NORMAL UPDATE JMP I (IOLOOP) /KEEP GOING PAGE / COMES HERE WHEN LATEST FLEXIBLE DISK INPUT IS EXHAUSTED. INDONE, CLA /CLEAN UP JMS I (FLPRINIT) /SETUP NEXT FLEXIBLE DISK DLD; CNTRLBLK /GET CURRENT CONTROL/OUTPUT BLOCK DST; SAVEBLK /SAVE IT NL0002/NL0001 /SETUP LOWEST FLEXIBLE DISK BLOCK MQL /TO LOW-ORDER DST; INBLK /STORE NEW INITIAL INPUT BLOCK OTDCOMM,TAD IOSW /GET CURRENT I/O ERROR SWITCH SNA CLA /SKIP IF ANY ERRORS IN PROGRESS JMP I (IORESET) /ELSE RESET I/O CALL TO MAXIMUM JMP I (IOLOOP) /JUST KEEP GOING / COMES HERE WHEN LATEST OUTPUT FLEXIBLE DISK IS FULL. OTDONE, CLA /CLEAN UP JMS I (FLPWINIT) /SETUP NEXT FLEXIBLE DISK DLD; CNTRLBLK /GET CURRENT CONTROL/INPUT BLOCK DST; SAVEBLK /SAVE IT NL0002/NL0001 /SETUP LOWEST FLEXIBLE DISK BLOCK MQL /TO LOW-ORDER DST; OUTBLK /STORE NEW INITIAL OUTPUT BLOCK JMP OTDCOMMON /CONTINUE THERE / COMES HERE TO RESTART LATEST FLEXIBLE DISK OUTPUT. DMPREST,JMS FLXBACK /RESET SEQUENCE NUMBER DLD; SAVEBLK /GET SAVED CONTROL/INPUT BLOCK DST; INBLK /RESTORE INPUT BLOCK DST; CNTRLBLK /RESTORE CONTROL BLOCK CAM /CLEAN UP JMP OTDONE /CONTINUE THERE / COMES HERE TO RESTART LATEST FLEXIBLE DISK INPUT. RESREST,JMS FLXBACK /RESET SEQUENCE NUMBER DLD; SAVEBLK /GET SAVE CONTROL/OUTPUT BLOCK DST; OUTBLK /RESTORE OUTPUT BLOCK DST; CNTRLBLK /RESTORE CONTROL BLOCK CAM /CLEAN UP JMP INDONE /CONTINUE THERE FLXBACK,.-. /SEQUENCE NUMBER RESET ROUTINE NL7777 /BACKUP TAD SEQUENCE /ADD ON SEQUENCE NUMBER CLL RAL /MOVE UP STL RAR /FORCE THE BIT ON DCA SEQUENCE /STORE NEW VALUE JMP I FLXBACK /RETURN PAGE / INPUT ERRORS COME HERE. INERROR,CLA /CLEAN UP ISZ INECNT /TOO MANY ERRORS? JMP I (INPAGN) /NO, TRY AGAIN JMS IOCHK /CHECK FOR SINGLE-BLOCK MODE JMS I [MESSAGE] /COMPLAIN OF IBDMSG /INPUT ERROR TAD INUNIT /GET INPUT UNIT DCA ERUNIT /SETUP ERROR UNIT TAD (INBLK) /POINT AT INPUT BLOCK JMS I (ERREPORT) /PRINT OUT OUR BLOCK JMS I [ASKRETRY] /RETRY? JMP I (IOLOOP) /YES TAD VOSW /GET VERIFY-ONLY SWITCH SZA CLA /SKIP IF NORMAL MODE JMP VNODUMMY /JUMP IF VERIFY-ONLY MODE JMS I [MESSAGE] /ASK THEM WDRMSG /TO CREATE A DUMMY JMS I [YORNO] /GET RESPONSE JMP WDMRECORD /YES, DO DUMMY RECORD HANDLING VNODUMM,TAD BRSW /GET BACKUP/RESTORE SWITCH SNA CLA /SKIP IF RESTORING JMP FAILURE /ELSE FORGET IT JMS I [MESSAGE] /ASK THEM ABMSG /FOR ALTERNATE RESTORE MEDIA JMS I [YORNO] /GET RESPONSE JMP I (RESRESTORE) /YES, RESTART LATEST RESTORE DEVICE TAD VOSW /GET VERIFY-ONLY SWITCH SNA CLA /SKIP IF VERIFY-ONLY MODE JMP FAILURE /JUMP IF NORMAL MODE JMS I [MESSAGE] /ASK THEM SKPMSG /TO SKIP PAST THE PROBLEM JMS I [YORNO] /GET THE RESPONSE JMP INIGNORE /YES, IGNORE THE PROBLEM FAILURE,JMS I [MESSAGE] /TELL THEM FAILMSG /THEY LOSE JMP I [RESTAGN] /RESTART WDMRECO,NL7777 /POINT AT DCA XR1 /OUTPUT AREA TAD (-20) /SETUP THE DCA INECNT /REPETITION COUNT DUMLUP, TAD (-20) /SETUP THE DCA TEMP /MOVE COUNT TAD (DUMMSG-1) /POINT AT DCA XR2 /DUMMY MESSAGE DMLOOP, CDF MSGFLD /GOTO TEXT FIELD TAD I XR2 /GET A WORD CDF DATFLD /GOTO BUFFER FIELD DCA I XR1 /PUT A WORD ISZ TEMP /DONE ALL YET? JMP DMLOOP /NO, KEEP GOING ISZ INECNT /DONE ALL GROUPS? JMP DUMLUP /NO, KEEP GOING CDF PRGFLD /YES, BACK TO OUR FIELD JMP I (INPAST) /KEEP GOING / OUTPUT ERRORS COME HERE. OTERROR,CLA /CLEAN UP ISZ OTECNT /TOO MAY ERRORS? JMP I (OUTAGN) /NO, KEEP GOING JMS IOCHK /CHECK FOR SINGLE-BLOCK MODE JMS I [MESSAGE] /COMPLAIN OF OBDMSG /OUTPUT ERROR JMS OECOMMON /DO COMMON STUFF JMP I (VERAGN) /TRY TO OUTPUT AGAIN AS DIRECTED JMP I (OTPAST) /SKIP PAST THE PROBLEM AS DIRECTED / COMPARE ERRORS COME HERE. CMERROR,DCA TEMP /SAVE PASSED INDICATOR CDF PRGFLD /BACK TO OUR FIELD ISZ CMECNT /TOO MANY ERRORS? JMP I (VERAGN) /NO, TRY OUTPUTTING AGAIN JMS IOCHK /CHECK FOR SINGLE-BLOCK MODE TAD TEMP /GET INDICATOR SNA CLA /SKIP IF INPUT ERROR TAD (VBDMSG-VIBDMSG)/ELSE ADJUST TO SAY COMPARE ERROR TAD (VIBDMSG) /GET INPUT ERROR MESSAGE ADDRESS DCA CMEMSG /STORE IN-LINE JMS I [MESSAGE] /TELL THEM CMEMSG, .-. /INPUT OR COMPARE COMPLAINT MESSAGE JMS OECOMMON /DO COMMON STUFF JMP I (INPAST) /RETRY AS DIRECTED INIGNOR,DCA BCSW /INDICATE BAD COMPARE JMP I (OTPAST) /SKIP PAST PROBLEM AS DIRECTED / COMMON OUTPUT/VERIFY ERROR HANDLING ROUTINE. OECOMMO,.-. /COMMON ERROR ROUTINE TAD OTUNIT /GET OUTPUT UNIT DCA ERUNIT /MAKE IT ERROR REPORTING UNIT TAD (OUTBLK) /POINT AT OUTPUT BLOCK JMS I (ERREPORT) /GO COMPLAIN ABOUT IT JMS I [ASKRETRY] /SHOULD WE RETRY? JMP I OECOMMON /YES, TAKE IMMEDIATE RETURN TAD BRSW /GET BACKUP/RESTORE SWITCH SZA CLA /SKIP IF BACKING UP JMP OERESTORE /JUMP IF RESTORING JMS I [MESSAGE] /ASK THEM ABMSG /IF THEY WISH TO CHANGE MEDIA JMS I [YORNO] /GET RESPONSE JMP I (DMPRESTORE) /YES, RESTART FROM BEGINNING OF LATEST MEDIA JMS I (TRYFORMAT) /TRY TO FORMAT THE DISK JMP I (DMPRESTORE) /RESTART FROM ITS BEGINNING OERESTO,JMS I [MESSAGE] /ASK THEM SKPMSG /TO SKIP PAST THE ERROR JMS I [YORNO] /GET RESPONSE SKP /YES, DON'T GIVE UP JMP I [FAILURE] /NO, FORGET IT ISZ OECOMMON /BUMP TO SKIP RETURN JMP I OECOMMON /TAKE IT IOCHK, .-. /I/O MODE CHECK ROUTINE TAD IOSW /GET I/O ERROR SWITCH SZA CLA /SKIP IF NORMAL MODE JMP I IOCHK /RETURN IF ALREADY SET TAD MAXIO /GET NORMAL LENGTH CIA /INVERT IT DCA IOSW /SET THE SWITCH NL0002/NL0001 /SETUP THE DCA UPDATE /MINIMUM UPDATE JMP I (IOLOOP) /RESTART THE I/O PAGE / NUMERIC VALIDATION ROUTINE. VALNUM, .-. /VALIDATE NUMERIC VALUE TAD (-":!200) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD [":-"0] /ADD ON RANGE SZL CLA /SKIP IF BAD ISZ VALNUM /BUMP RETURN IF GOOD JMP I VALNUM /RETURN EITHER WAY / ALPHABETIC VALIDATION ROUTINE. VALALPH,.-. /VALIDATE ALPHABETIC ROUTINE TAD (-"[!200) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD ["[-"A] /ADD ON RANGE SZL CLA /SKIP IF BAD ISZ VALALPHA /BUMP RETURN IF GOOD JMP I VALALPHA /RETURN EITHER WAY / SEQUENCE NUMBER VALIDATION ROUTINE. VALSEQ, .-. /VALIDATE SEQUENCE NUMBER ROUTINE DCA VALNUM /SAVE THE VALUE TAD VALNUM /GET IT BACK RTL;RTL;RTL /MOVE TYPE BITS DOWN AND [37] /JUST TYPE BITS TAD (VALBASE) /ADD ON TABLE BASE DCA VALALPHA /STASH THE POINTER TAD I VALALPHA /GET THE ADDRESS DCA VALALPHA /STASH IT JMP I VALALPHA /GO THERE ENTDSK, DCA VALTYPE /SAVE DISK USAGE TYPE TAD (-MAXSEQ) /SETUP MAXIMUM SEQUENCE NUMBER OTHEREN,DCA VALALPHA /FOR CHECKING TAD VALNUM /GET VALUE AND [177] /JUST SEQUENCE NUMBER BITS TAD VALALPHA /COMPARE TO MAXIMUM SPA SNA CLA /SKIP IF BAD ISZ VALSEQ /ELSE BUMP TO GOOD RETURN VALBAD, JMP I VALSEQ /RETURN EITHER WAY DAILDSK,IAC /SET THREE LIBDSK, IAC /SET TWO SYSDSK, IAC /SET ONE DCA VALTYPE /STORE USAGE TYPE NL7776 /SET COMMON MAXIMUM VALUE JMP OTHERENT /CONTINUE THERE ARCHDSK,NL0004 /SETUP DCA VALTYPE /USAGE TYPE TAD [-10] /SETUP MAXIMUM VALUE JMP OTHERENT /CONTINUE THERE TYPRNT, .-. /USAGE TYPE PRINTOUT ROUTINE TAD (TYPLST) /POINT TO PROPER MESSAGE ADDRESS DCA TEMP /STASH THE POINTER TAD I TEMP /GET THE ADDRESS DCA .+2 /STORE IN-LINE JMS I [MESSAGE] /CALL MESSAGE PRINTER .-. /WITH THIS MESSAGE ADDRESS JMP I TYPRNT /RETURN / OPERATION TYPE MESSAGE LIST. TYPLST, EDMSG /ENTIRE DISK MESSAGE SAMSG /SYSTEM AREA MESSAGE LAMSG /LIBRARY AREA MESSAGE DAMSG /DAILY ACTIVITY AREA MESSAGE AAMSG /ARCHIVING AREA MESSAGE PAGE / GET TODAY'S DATE ROUTINE. GTDATE, .-. /GET TODAY'S DATE TAD DATSW /GET DATE SWITCH SZA CLA /SKIP IF FIRST TIME JMP I GTDATE /ELSE RETURN, DATE BUFFER IS VALID TAD GTDATE /GET OUR HEADER DCA GADATE /MAKE IT THEIRS TAD (TDMSG) /SETUP OUR MESSAGE DCA DMSG /FOR PROMPTING TAD [TDBUFFER-1] /POINT TO OUR BUFFER DCA DATPTR /SAVE THE POINTER JMP DATCOMMON /CONTINUE THERE / GET BACKUP DATE ROUTINE. GADATE, .-. /GET BACKUP DATE ROUTINE TAD (ARDTMSG) /SETUP OUR MESSAGE DCA DMSG /FOR PROMPTING TAD [ADBUFFER-1] /POINT TO OUR BUFFER DCA DATPTR /SAVE THE POINTER NL7777 /SET THE DATCOM, DCA GNSW / SWITCH DATAGN, TAD (DATAGN) /SETUP THE DCA UPURET /<^U> ADDRESS TAD DATPTR /GET BUFFER POINTER DCA XR2 /SETUP AUTO-INDEX REGISTER JMS I [MESSAGE] /PRINT OUT DMSG, .-. /APPROPRIATE MESSAGE JMS I [GETVALUE] /GET MONTH VALUE TAD [-14-1] /SUBTRACT LIMIT CLL /CLEAR LINK FOR TEST TAD [14] /ADD ON RANGE SNL /SKIP IF OK JMP DATBAD /JUMP IF NOT / TAD (-14) /BIAS FOR REAL-TIME COUNTING DCA MONCT /SAVE AS MONTH COUNTER FOR LATER TAD OLCHAR /GET FIRST CHARACTER DCA I XR2 /STORE AS UPPER MONTH DIGIT TAD INCHAR /GET SECOND CHARACTER DCA I XR2 /STORE AS LOWER MONTH DIGIT TAD ["/&177] /GET A "/" JMS I [P7CH] /PRINT IT JMS I [GETVALUE] /GET DAY VALUE TAD (-37-1) /SUBTRACT LIMIT CLL /CLEAR LINK FOR TEST TAD (37) /ADD ON RANGE SNL /SKIP IF OK JMP DATBAD /JUMP IF NOT DCA DAYCT /SAVE UNTIL YEAR IS KNOWN ISZ FEBENT /ASSUME THIS IS LEAP YEAR! JMS DATCHK /CHECK FOR VALID DAY TAD OLCHAR /GET FIRST CHARACTER DCA I XR2 /STORE AS UPPER DAYS DIGIT TAD INCHAR /GET SECOND CHARACTER DCA I XR2 /STORE AS LOWER DAYS DIGIT TAD ["/&177] /GET A "/" JMS I [P7CH] /PRINT IT JMS I [GETVALUE] /GET YEAR VALUE DCA GETEMP /SAVE IT TAD GETEMP /GET IT BACK TAD (-120+1) /COMPARE TO (19)80 SPA SNA CLA /SKIP IF IN RANGE JMP DO2000 /ELSE ASSUME 2000-2079 TAD ("1&177) /GET A "1" DCA I XR2 /STORE AS UPPER DECADE DIGIT TAD ("9&177) /GET A "9" JMP DECCOMMON /CONTINUE THERE DO2000, TAD ("2&177) /GET A "2" DCA I XR2 /STORE AS UPPER DECADE DIGIT TAD ["0&177] /GET A "0" DECCOMM,DCA I XR2 /STORE AS LOWER DECADE DIGIT TAD OLCHAR /GET FIRST CHARACTER DCA I XR2 /STORE AS UPPER YEARS DIGIT TAD INCHAR /GET SECOND CHARACTER DCA I XR2 /STORE AS LOWER YEARS DIGIT NL0003 /FORM LEAP YEAR MASK AND GETEMP /JUST LEAP YEAR BITS SNA CLA /SKIP IF NOT LEAP YEAR ISZ FEBENT /ELSE BUMP IT FOR LEAP YEAR JMS DATCHK /CHECK FOR VALID DAY AGAIN TAD DMSG /GET MESSAGE POINTER CIA /INVERT FOR TEST TAD (TDMSG) /COMPARE TO POSSIBLE VALUE SNA CLA /SKIP IF ARBITRARY DATE IS CALLED ISZ DATSW /INDICATE TODAY'S DATE WAS FOUND JMS I [CRLF] /DO A , JMP I GADATE /RETURN DATBAD, JMS I [MESSAGE] /TELL THEM BDTMSG /THEY GOOFED JMP DATAGN /TRY AGAIN DATCHK, .-. /DATE VALIDITY CHECK ROUTINE TAD MONCT /GET MONTH COUNT TAD (JANENT/+14) /UPDATE TO PROPER MONTH DCA GETEMP /STASH THE POINTER TAD I GETEMP /GET THE MONTH COUNT CIA /INVERT FOR TESTING TAD DAYCT /COMPARE TO OUR VALUE DCA GETEMP /SAVE TEST RESULTS FOR LATER TAD [34] /RESET THE FEBRUARY DCA FEBENT /NON-LEAP YEAR VALUE TAD GETEMP /GET TEST RESULTS SMA CLA /SKIP IF OK JMP DATBAD /ELSE RESTART JMP I DATCHK /RETURN DATPTR, .-. /TEMPORARY DAYCT, .-. /TEMPORARY GETEMP, .-. /TEMPORARY MONCT, .-. /TEMPORARY DECIMAL /MAKE IT EASIER / MONTH LENGTH TABLE. JANENT, 31 /31 DAYS IN JANUARY FEBENT, 28 /THIS IS 29 IN LEAPING YEARS 31 /31 DAYS IN MARCH 30 /30 DAYS IN APRIL 31 /31 DAYS IN MAY 30 /30 DAYS IN JUNE 31 /31 DAYS IN JULY 31 /31 DAYS IN AUGUST 30 /30 DAYS IN SEPTEMBER 31 /31 DAYS IN OCTOBER 30 /30 DAYS IN NOVEMBER 31 /31 DAYS IN DECEMBER OCTAL /REVERT TO NORMAL PAGE / GET CURRENT TIME ROUTINE. GTTIME, .-. /GET CURRENT TIME TAD (TTMSG) /GET OUR MESSAGE POINTER DCA TMSG /STORE IN-LINE TAD GTTIME /GET OUR CALLER DCA GATIME /MAKE IT THEIRS TAD (TTMBUFFER-1) /GET OUR BUFFER POINTER JMP TIMCOMMON /CONTINUE THERE / GET BACKUP TIME ROUTINE. GATIME, .-. /GET BACKUP TIME TAD (ATMSG) /GET OUR MESSAGE POINTER DCA TMSG /STORE IN-LINE TAD (ATMBUFFER-1) /GET OUR BUFFER POINTER TIMCOMM,DCA TIMPTR /SAVE THE POINTER TIMAGN, TAD (TIMAGN) /SETUP THE DCA UPURET /<^U> ADDRESS TAD TIMPTR /GET BUFFER POINTER DCA XR2 /SETUP AUTO-INDEX JMS I [MESSAGE] /ASK FOR TMSG, .-. /APPROPRIATE TIME JMS I [GETVALUE] /GET HOURS VALUE TAD [-30] /COMPARE TO MAXIMUM SMA CLA /SKIP IF OK JMP TIMBAD /JUMP IF NOT TAD OLCHAR /GET FIRST CHARACTER DCA I XR2 /STORE AS UPPER HOURS DIGIT TAD INCHAR /GET SECOND CHARACTER DCA I XR2 /STORE AS LOWER HOURS DIGIT TAD [":&177] /GET A ":" JMS I [P7CH] /PRINT IT JMS I [GETVALUE] /GET MINUTES VALUE TAD [-74] /COMPARE TO MAXIMUM SMA CLA /SKIP IF OK JMP TIMBAD /JUMP IF NOT TAD OLCHAR /GET FIRST CHARACTER DCA I XR2 /STORE AS UPPER MINUTES DIGIT TAD INCHAR /GET SECOND CHARACTER DCA I XR2 /STORE AS LOWER MINUTES DIGIT TAD [" &177] /GET A JMS I [P7CH] /PRINT IT JMS GETALPHA /GET THE JMS GETALPHA /TIME ID JMS GETALPHA /FIELD JMS I [CRLF] /DO A , JMP I GATIME /RETURN TIMBAD, JMS I [MESSAGE] /TELL THEM BTMESSAGE /THEY GOOFED JMP TIMAGN /TRY AGAIN TIMPTR, .-. /TEMPORARY GETALPH,.-. /GET ALPHABETIC FIELD ROUTINE SKP CLA /DON'T COMPLAIN YET BADALPH,JMS I [BONG] /BEEP AT THEM JMS I [TTYINC] /GET A CHARACTER TAD (-"[!200) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD ["[-"A] /ADD ON RANGE SNL CLA /SKIP IF OK JMP BADALPHA /JUMP IF BAD TAD INCHAR /GET THE CHARACTER DCA I XR2 /STORE IT TAD INCHAR /GET IT BACK JMS I [P7CH] /PRINT IT JMP I GETALPHA /RETURN YORNO, .-. /YES OR NO ROUTINE YNAGN, JMS I [TTYIN] /GET A CHARACTER TAD (-"Y!200) /COMPARE TO "Y" SNA /SKIP IF SOMETHING ELSE JMP ISYES /JUMP IF IT MATCHES TAD (-"N+"Y) /COMPARE TO "N" SNA CLA /SKIP IF SOMETHING ELSE JMP ISNO /JUMP IF IT MATCHES JMS I [BONG] /BEEP AT THEM JMP YNAGN /TRY AGAIN ISYES, JMS I [MESSAGE] /TELL THEM YESMSG /YES! JMP I YORNO /RETURN ISNO, JMS I [MESSAGE] /TELL THEM NOMSG /NO! ISZ YORNO /BUMP RETURN ADDRESS JMP I YORNO /TAKE SKIP RETURN BONG, .-. /BEEPER ROUTINE NL0006 /SET -1 IAC /NOW HAVE JMS I [P7CH] /RING IT JMP I BONG /RETURN PAGE GETCOMM,.-. /COMMAND ROUTINE TAD I GETCOMMAND /GET FIRST LETTER LIST POINTER DCA XR1TMP /STASH THE POINTER ISZ GETCOMMAND /BUMP TO NEXT TAD I GETCOMMAND /GET COUNT DCA COMCNT /STASH THE COUNT ISZ GETCOMMAND /BUMP TO NEXT COMMAGN,TAD (COMMAGN) /SETUP THE DCA UPURET /<^U> ADDRESS JMS I [MESSAGE] /ASK FOR COMMSG /COMMAND: TAD XR1TMP /SETUP THE DCA XR1 /LIST POINTER TAD COMCNT /SETUP THE DCA TMPCNT /COUNTER JMS I [TTYINC] /GET A CHARACTER TAD I XR1 /COMPARE TO LIST ELEMENT SNA /SKIP IF DIFFERENT FROM LIST JMP FOUND1 /JUMP IF SAME ISZ TMPCNT /LOOKED FOR ALL YET? JMP .-4 /NO, GO BACK COMBARF,JMS I [BONG] /BEEP AT THEM JMS I [CRLF] /DO A , JMP COMMAGN /TRY AGAIN FOUND1, TAD INCHAR /GET LATEST CORRECT CHARACTER JMS I [P7CH] /PRINT IT JMS I [TTYINC] /GET SECOND CHARACTER CLA /DON'T NEED IT RIGHT NOW JMP FOUND2 /CONTINUE THERE TAD I XR1 /COMPARE AGAIN TO FIRST LIST ELEMENT SNA /SKIP IF NOT A MATCH JMP FOUND2 /JUMP IF POTENTIAL MATCH SRCHMOR,ISZ TMPCNT /LOOKED AT ALL YET? JMP .-4 /NO, GO BACK JMP COMBARF /YES, GO COMPLAIN FOUND2, TAD COMCNT /GET (FIRST-SECOND) CIA /NOW HAVE (SECOND-FIRST) TAD XR1 /POINT TO CORRESPONDING ELEMENT IN SECOND LIST DCA TEMP /STASH THE POINTER TAD INCHAR /GET SECOND CHARACTER TAD I TEMP /COMPARE TO SECOND CHARACTER SZA CLA /SKIP IF IT MATCHES JMP SRCHMORE /JUMP IF NOT THIS ONE TAD INCHAR /GET THE CHARACTER JMS I [P7CH] /PRINT IT NOW TAD XR1TMP /GET (FIRST-1) CMA /NOW HAVE (-FIRST) TAD COMCNT /NOW HAVE (-SECOND) TAD TEMP /NOW HAVE RELATIVE VALUE OF MATCH CLL RAL /*2 TAD I GETCOMMAND /POINT AT TEXT MESSAGE POINTER DCA XR1 /STASH THE POINTER TAD I XR1 /GET THE FINISHING MESSAGE POINTER DCA TMPCNT /STASH IT IN-LINE JMS I [MESSAGE] /GO PRINT TMPCNT, .-. /THE REST OF THE COMMAND TAD I XR1 /GET THE DISPATCHING ADDRESS DCA TMPCNT /STASH IT JMP I TMPCNT /GO THERE COMCNT, .-. /TEMPORARY XR1TMP, .-. /TEMPORARY GETVALU,.-. /GET A VALUE ROUTINE JMS GETNUM /GET A DIGIT DCA GETVTMP /SAVE IT TAD INCHAR /GET THE CHARACTER DCA OLCHAR /SAVE FOR OTHERS TAD GETVTMP /*1 CLL RTL /*4 TAD GETVTMP /*5 RAL /*10 DCA GETVTMP /SAVE IT DCA GNSW /CLEAR SWITCH JMS GETNUM /GET NEXT DIGIT TAD GETVTMP /FORM COMPOSITE JMP I GETVALUE /RETURN GETNUM, .-. /GET A NUMERIC ROUTINE SKP CLA /DON'T COMPLAIN YET NUMBAD, JMS I [BONG] /BEEP AT THEM JMS I [TTYINC] /GET A CHARACTER TAD (-72) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD [12] /ADD ON RANGE SNL /SKIP IF VALID JMP NUMTST /JUMP IF NOT DCA GETNTMP /SAVE VALID VALUE TAD INCHAR /GET LATEST CHARACTER DCA XR1TMP /SAVE IT TAD INCHAR /GET IT AGAIN JMS I [P7CH] /GO PRINT IT TAD XR1TMP /GET OLD VALUE DCA INCHAR /RESTORE IT FOR OTHERS TAD GETNTMP /GET OUR VALUE JMP I GETNUM /RETURN NUMTST, CLA /CLEAN UP TAD GNSW /GET SWITCH SNA CLA /SKIP IF SET JMP NUMBAD /JUMP IF NOT TAD INCHAR /GET INPUT CHARACTER TAD (-15) /COMPARE TO SZA CLA /SKIP IF IT MATCHES JMP NUMBAD /ELSE COMPLAIN DCA I XR2 /INVALIDATE VALUE JMS I [CRLF] /DO A , JMP I (RMORE) /CONTINUE THERE GETVTMP,.-. /TEMPORARY GETNTMP,.-. /TEMPORARY PAGE MESSAGE,.-. /MESSAGE PRINTING ROUTINE CLA /CLEAN UP TAD (140) /INITIALIZE TO DCA MSGCASE /LOWER-CASE TAD I MESSAGE /GET THE POINTER ISZ MESSAGE /BUMP AROUND IT DCA MSGPTR /STASH IT MSGLUP, CDF MSGFLD /GOTO MESSAGE FIELD TAD I MSGPTR /GET A PAIR RTR;RTR;RTR /MOVE HIGH-HALF TO LOW-ORDER BITS JMS MSTRIM /TRIM AND PRINT HIGH-ORDER CDF MSGFLD /GOTO MESSAGE FIELD TAD I MSGPTR /GET AGAIN JMS MSTRIM /TRIM AND PRINT LOW-ORDER ISZ MSGPTR /BUMP TO NEXT PAIR JMP MSGLUP /GO BACK FOR MORE MSTRIM, .-. /TRIM AND PRINT ROUTINE CDF PRGFLD /BACK TO OUR FIELD AND [77] /JUST SIX-BIT SNA /END OF TEXT? JMP I MESSAGE /YES, RETURN TO MAIN CALLER DCA MSGTMP /NO, SAVE IT TAD MSGTMP /GET IT BACK TAD (-"%!200) /COMPARE TO "%" SNA /SKIP IF OTHER JMP MSCRLF /JUMP IF IT MATCHES TAD [-"^+100+"%] /COMPARE TO "^" SNA CLA /SKIP IF OTHER JMP CASFLP /JUMP IF IT MATCHES TAD MSGTMP /GET THE CHARACTER AND [40] /JUST QUADRANT BIT SNA CLA /SKIP IF SET TAD MSGCASE /ELSE ADD CURRENT CASE TAD MSGTMP /ANYWAY GET THE CHARACTER ITSELF JMS I [P7CH] /PRINT IT JMP I MSTRIM /RETURN MSCRLF, JMS I [CRLF] /DO A , JMP I MSTRIM /RETURN CASFLP, TAD MSGCASE /GET CURRENT CASE CIA /INVERT TAD (140+100) /ADD SUM OF POSSIBLE VALUES DCA MSGCASE /SAVE IT BACK JMP I MSTRIM /RETURN MSGCASE,.-. /CURRENT CASE MSGPTR, .-. /MESSAGE POINTER MSGTMP, .-. /TEMPORARY PRTLBL, .-. /PRINT LABEL INFORMATION ROUTINE JMS I [MESSAGE] /PRINT THE LUMSG /OPENING MESSAGE TAD VALTYPE /GET DISK TYPE JMS I (TYPRNT) /PRINT IT TAD (")&177) /GET TRAILING ")" JMS I [P7CH] /PRINT IT TAD [" &177] /GET A JMS I [P7CH] /PRINT IT TAD I [LA00] /GET DISK SEQUENCE NUMBER AND [177] /JUST SEQUENCE BITS JMS NUMPRT /PRINT IT JMS I [MESSAGE] /PRINT THE DSKMSG /BRIDGING MESSAGE TAD [LA01-1] /SETUP THE DCA XR1 /TIME/DATE POINTER JMS PRTWO /PRINT MM TAD ["/&177] /GET A "/" JMS I [P7CH] /PRINT IT JMS PRTWO /PRINT DD TAD ["/&177] /GET A "/" JMS I [P7CH] /PRINT IT JMS PRTWO /PRINT DECADE DIGITS JMS PRTWO /PRINT YY TAD [" &177] /GET A JMS I [P7CH] /PRINT IT JMS PRTWO /PRINT HH TAD [":&177] /GET A ":" JMS I [P7CH] /PRINT IT JMS PRTWO /PRINT MM TAD [" &177] /GET A JMS I [P7CH] /PRINT IT JMS PRTWO /PRINT FIRST T AND SECOND T TAD I XR1 /GET THIRD T JMS I [P7CH] /PRINT IT JMS I [CRLF] /DO A , JMP I PRTLBL /RETURN PRTWO, .-. /PRINT TWO CHARACTERS TAD I XR1 /GET FIRST CHARACTER JMS I [P7CH] /PRINT IT TAD I XR1 /GET SECOND CHARACTER JMS I [P7CH] /PRINT IT JMP I PRTWO /RETURN MNTMSG, .-. /MOUNT MESSAGE ROUTINE JMS I [MESSAGE] /GIVE THE MOUNTMESSAGE /MOUNT PORTION NL3777 /SET MASK AND SEQUENCE /GET SEQUENCE NUMBER JMS NUMPRT /PRINT IT JMS I [MESSAGE] /GIVE THE TRAILING MESSAGE DISKMSG /FOR A GOOD LOOK JMS I [TTYIN] /GET ANY RESPONSE JMS I [MESSAGE] /TELL THEM MSGOK /ALL IS OK JMP I MNTMSG /RETURN NUMPRT, .-. /NUMERIC STRING PRINT ROUTINE TAD (NUMTBL-1) /ADD ON TABLE BASE DCA TEMP /STASH THE POINTER TAD I TEMP /GET THE MESSAGE ADDRESS DCA .+2 /STORE IN-LINE JMS I [MESSAGE] /GIVE THE MESSAGE .-. /FOR PROPER NUMBER JMP I NUMPRT /RETURN USIT, .-. /ASK TO USE IT ROUTINE JMS I [MESSAGE] /ASK FOR PERMSG /PERMISSION TO USE JMS I [YORNO] /GET REPLY ISZ USIT /YES, BUMP RETURN ADDRESS JMP I USIT /RETURN EITHER WAY PAGE P7CH, .-. /SEVEN-BIT ASCII PRINT ROUTINE DCA P7TEMP /SAVE PASSED CHARACTER P7LOOP, TAD P7TEMP /GET IT BACK TSFIOT /FLAG UP? JMP P7TEST /NO, TRY THE KEYBOARD TLSIOT /PRINT IT P7ZAP, NOP /FOR ZAPPING PURPOSES JMS CHKUP /CHECK INPUT FLAG AND CLEAN UP JMP I P7CH /RETURN P7TEST, JMS CHKUP /CHECK FOR <^S>, ETC. JMP P7LOOP /CHECK OUTPUT FLAG AGAIN P7PRT, JMS I (P7LPT) /OUTPUT TO LPT: INSTEAD JMP I P7CH /RETURN P7TEMP, .-. /OUTPUT TEMPORARY CRLF, .-. /, ROUTINE TAD (15) /GET A JMS I [P7CH] /PRINT IT TAD [12] /GET A JMS I [P7CH] /PRINT IT JMP I CRLF /RETURN CHKUP, .-. /<^C>, ETC. INPUT 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 IAC /IS IT <^P>? SNA /SKIP IF NOT JMP DOUP /JUMP IF SO TAD (-"S+"P) /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 DOUP, TAD ("P&177) /GET A "P" JMS I [CARPRT] /PRINT "^P" JMP I UPREST /RESTART CTLCTST,.-. /TEST FOR <^C>, ETC. CLA /CLEAN UP DCA INCHAR /OBLITERATE OLD CHARACTERS KSFIOT /**** ZAPPED **** 0000 OTHZAP, JMP I CTLCTST /NO, JUST RETURN KRSIOT /YES, READ IT IN OTHENT, AND (177) /JUST SEVEN-BIT DCA INCHAR /SAVE IT NL7775 /-3 TAD INCHAR /COMPARE TO <^C> SPA SNA CLA /SKIP IF GREATER THAN <^C> JMP I (PUTBAK)/[SBOOT]/BACK TO THE MONITOR KCCIOT /CLEAR THE FLAG NOW TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN OTHER, LKSFIOT /FLAG UP? JMP I CTLCTST /NO, FORGET IT LKRBIOT /YES, GET THE CHARACTER JMP OTHENT /CONTINUE THERE OTHJMP= JMP OTHER /ENABLING INSTRUCTION CARPRT, .-. /<^>CHARACTER PRINT ROUTINE DCA CARTMP /SAVE PASSED CHARACTER TAD ("^&177) /GET AN "^" JMS I [P7CH] /PRINT IT TAD CARTMP /GET PASSED CHARACTER JMS I [P7CH] /PRINT IT JMP I CARPRT /RETURN CARTMP, .-. /TEMPORARY TTYIN, .-. /CHARACTER INPUT ROUTINE DCA INCHAR /OBLITERATE PREVIOUS CHARACTER JMS I [CHKUP] /CHECK FOR <^C>, ETC. TAD INCHAR /GET THE LATEST CHARACTER SNA /SKIP IF ANYTHING THERE JMP .-3 /ELSE WAIT FOR SOMETHING TO APPEAR 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 TTYIN /RETURN WITH LATEST CHARACTER (FOLDED) PAGE FLPRINIT,.-. /INITIAL READ FLEXIBLE DISK ROUTINE TAD SEQUENCE /GET CURRENT SEQUENCE NUMBER SZA CLA /SKIP IF FIRST TIME JMP RMORE /JUMP IF NOT FIRST TIME REINIT, JMS I (GADATE) /GET BACKUP DATE JMS I (GATIME) /GET BACKUP TIME RMORE, JMS I (BMPSEQ) /BUMP TO NEXT SEQUENCE NUMBER AGNMNT, JMS I (MNTMSG) /GIVE MOUNT MESSAGE AND GET REPLY JMS I (LRECINPUT) /READ IN LATEST LABEL RECORD JMS I (VALDATE) /TRY TO VALIDATE LABEL JMP ALIENREAD /BAD NEWS! TAD [ADBUFFER-1] /GET BACKUP BUFFER POINTER JMS I (COMPARE) /CHECK IF IT MATCHES DESIRED VALUE JMP BADATE /FORGET IT! TAD VALTYPE /GET USAGE TYPE CIA /INVERT FOR TESTING TAD TYPE /COMPARE TO DESIRED TYPE SZA CLA /SKIP IF OK JMP BADTYPE /FORGET IT! TAD I [LA00] /GET SEQUENCE NUMBER AND [177] /JUST SEQUENCE BITS CIA /INVERT FOR TESTING TAD SEQUENCE /COMPARE TO DESIRED VALUE SNA CLA /SKIP IF IT DOESN'T MATCH JMP I FLPRINIT /RETURN IF IT DOES JMS I (PRTLBL) /PRINT THE LABEL JMS I [MESSAGE] /TELL THEM OF WRONG BDSEMSG /SEQUENCE NUMBER JMP AGNMNT /TRY AGAIN BADTYPE,JMS I (PRTLBL) /PRINT THE LABEL JMS I [MESSAGE] /COMPLAIN OF WRTYPMESSAGE /WRONG TYPE JMP AGNMNT /TRY AGAIN BADATE, JMS I (PRTLBL) /PRINT THE LABEL TAD GNSW /GET SWITCH SZA CLA /SKIP IF OFF JMP .+3 /JUMP IF ALLOWED JMS I [MESSAGE] /COMPLAIN OF WRDTMSG /INCORRECT DATE NL7777 /SETUP TEST VALUE TAD SEQUENCE /CHECK IF FIRST TIME THROUGH SZA CLA /SKIP IF SO JMP AGNMNT /JUMP IF NOT DCA SEQUENCE /RESET SEQUENCE NUMBER JMP REINIT /START OVER ALIENR, JMS I [MESSAGE] /TELL THEM ALIENMESSAGE /OF UFO PRESENCE JMP AGNMNT /TRY AGAIN FLPWINIT,.-. /FLEXIBLE DISK INITIAL WRITE ROUTINE TAD SEQUENCE /GET CURRENT SEQUNCE NUMBER SZA CLA /SKIP IF FIRST TIME JMP WMORE /JUMP IF NOT FIRST TIME JMS I (GTDATE) /GET TODAY'S DATE JMS I (GTTIME) /GET CURRENT TIME WMORE, JMS I (BMPSEQ) /BUMP TO NEXT SEQUENCE NUMBER MNTAGN, JMS I (MNTMSG) /GIVE MOUNT MESSAGE AND GET REPLY JMS I (LRECINPUT) /READ IN LATEST LABEL RECORD FLPWCAL,JMS I (VALDATE) /VALIDATE LABEL JMP ALIEN /NOT ONE OF OURS TAD VALTYPE /GET DISK TYPE CIA /INVERT FOR TESTING TAD TYPE /COMPARE TO OUR TYPE SZA CLA /SKIP IF IT MATCHES JMP ALLOWIT /JUMP IF NOT TAD [TDBUFFER-1] /POINT TO OUR TIME/DATE VALUES JMS I (COMPARE) /COMPARE READ-IN TO OUR VALUES JMP ALLOWIT /ALLOW IT IF IT DOESN'T MATCH TAD I [LA00] /GET DISK SEQUENCE NUMBER AND [177] /JUST SEQUENCE NUMBER BITS CIA /INVERT FOR TESTING TAD SEQUENCE /COMPARE TO CURRENT VALUE SMA SZA /SKIP IF EQUAL OR HIGHER JMP BADRPT /JUMP IF LOWER ALLOWIT,JMS I (PRTLBL) /PRINT OUT CURRENT LABEL ALIENT, JMS I (USIT) /ASK TO USE IT JMP MNTAGN /NO, SO ASK FOR IT AGAIN TAD TYPE /GET OUR TYPE TAD (BITABLE) /POINT TO PROPER BIT VALUE DCA TEMP /STASH THE POINTER TAD SEQUENCE /GET CURRENT SEQUENCE TAD I TEMP /ADD ON TYPE BIT PATTERN DCA I [LA00] /STORE IN OUTPUT BUFFER TAD [TDBUFFER-1] /GET TIME/DATE POINTER DCA XR1 /STASH THE POINTER TAD [LA01-1] /GET OUTPUT POINTER DCA XR2 /STASH IT TAD (LA01-LA15-1) /SETUP THE DCA CMPCNT /MOVE COUNT MOVLUP, TAD I XR1 /GET A WORD DCA I XR2 /PUT A WORD ISZ CMPCNT /DONE YET? JMP MOVLUP /NO, GO BACK JMS I (LROUTPUT) /OUTPUT A NEW LABEL RECORD JMP I FLPWINIT /RETURN ALIEN, JMS I [MESSAGE] /TELL THEM ALIENMESSAGE /OF UFO (UNIDENTIFIED FLEXIBLE OUTPUT) JMP ALIENT /CONTINUE THERE BADRPT, JMS I (PRTLBL) /PRINT THE LABEL JMS I [MESSAGE] /TELL THEM LDMSG /OF LOWER SEQUENCE DISK PROBLEM JMP MNTAGN /TRY AGAIN PAGE / ROUTINE TO READ IN A LABEL RECORD. LRECINP,.-. /LABEL RECORD INPUT ROUTINE TAD FLPUNIT /GET FLEXIBLE DISK DRIVE UNIT TAD (2^100) /MAKE INTO READ FUNCTION DCA LRECFUN /STORE IN-LINE LRECAGN,NL7775 /SETUP THE DCA INCNT /RETRY COUNT LRAGN, JMS I [CHKUP] /CHECK FOR <^P>, ETC. JMS I [IOHAND] /CALL I/O HANDLER LABUFFER /LABEL BUFFER LRECFUN,2^100+.-. /UNIT BITS WILL BE FILLED IN P0 /LABEL IS ALWAYS RECORD 000000 SKP CLA /SKIP IF ANY ERRORS JMP I LRECINPUT /ELSE RETURN ISZ INCNT /TOO MANY RETRIES? JMP LRAGN /NO, TRY AGAIN JMS I [MESSAGE] /YES, COMPLAIN ABOUT LRBDMSG /BAD LABEL INPUT TAD FLPUNIT /GET FLEXIBLE DISK DRIVE UNIT JMS PRTUNIT /PRINT OUT UNIT JMS I [CRLF] /DO A , JMS ASKRETRY /ASK FOR RETRY JMP LRECAGN /YES, RETRY TAD LRECINPUT /GET OUR HEADER TAD (-FLPWCALL) /COMPARE TO WRITE CALLER SZA CLA /SKIP IF IT MATCHES JMP I [FAILURE] /ELSE FORGET IT JMS I (TRYFORMAT) /TRY TO REFORMAT THE DISK JMP LRECAGN /TRY, TRY AGAIN / ROUTINE TO WRITE AND VERIFY A LABEL RECORD. LROUTPU,.-. /LABEL RECORD OUTPUT ROUTINE TAD FLPUNIT /GET FLEXIBLE DISK DRIVE UNIT TAD (2^100) /ADD ON PAGE BITS DCA LRVFUN /STORE IN-LINE NL4000 /SET WRITE BIT TAD LRVFUN /ADD ON READ FUNCTION DCA LROFUN /STORE IN-LINE LROUTAG,NL7775 /SETUP THE DCA VERCNT /VERIFY RETRY COUNT VLROAGN,NL7775 /SETUP THE DCA OUTCNT /OUTPUT RETRY COUNT OLRAGN, JMS I [CHKUP] /CHECK FOR <^P>, ETC. JMS I [IOHAND] /CALL I/O HANDLER LABUFFER /LABEL BUFFER LROFUN, 2^100+4000+.-. /UNIT BITS WILL BE FILLED IN P0 /RECORD 000000 SKP CLA /SKIP IF ERRORS JMP VLRECORD /JUMP IF OUTPUT IS OK ISZ OUTCNT /TOO MANY WRITE ERRORS? JMP OLRAGN /NO, TRY AGAIN JMS I [MESSAGE] /YES, TELL THEM LWBDMSG /THEY HAVE PROBLEMS VLERREN,TAD FLPUNIT /GET FLEXIBLE DISK DRIVE UNIT JMS PRTUNIT /PRINT IT OUT JMS I [CRLF] /DO A , JMS ASKRETRY /ASK FOR RETRY JMP LROUTAGAIN /YES, RETRY JMS I (TRYFORMAT) /TRY TO FORMAT THE DISK INSTEAD JMP I (MNTAGN) /TRY, TRY AGAIN VLRECOR,JMS I [CHKUP] /CHECK FOR <^P>, ETC. JMS I [IOHAND] /CALL I/O HANDLER LABUF2 /READ-BACK LABEL BUFFER LRVFUN, 2^100+.-. /UNIT BITS FILLED IN P0 /RECORD 000000 SKP CLA /SKIP IF READ ERRORS JMP VERLABEL /JUMP IF READ OK VLBAD, ISZ VERCNT /TOO MANY ERRORS? JMP VLROAGN /NO, TRY AGAIN JMS I [MESSAGE] /YES, COMPLAIN ABOUT LRVERRORMESSAGE /VERIFY ERROR JMP VLERRENTRY /CONTINUE THERE VERLABE,TAD (LABUFFER-1) /SETUP DCA XR1 /THE TAD (LABUF2-1) /COMPARE DCA XR2 /POINTERS TAD (-400) /SETUP THE DCA CMPCNT /COMPARE COUNTER VRLOOP, TAD I XR1 /GET A VALUE CIA /INVERT FOR TESTING TAD I XR2 /COMPARE TO OTHER SZA CLA /SKIP IF OK JMP VLBAD /JUMP IF NOT ISZ CMPCNT /DONE ALL YET? JMP VRLOOP /NO, KEEP GOING JMP I LROUTPUT /YES, RETURN TO CALLER PRTUNIT,.-. /UNIT PRINTING ROUTINE TAD (UNITABLE) /ADD ON TABLE BASE TO PASSED VALUE DCA TEMP /SAVE THE POINTER TAD I TEMP /GET THE MESSAGE ADDRESS DCA .+2 /STORE IN-LINE JMS I [MESSAGE] /CALL MESSAGE PRINTER .-. /WITH PROPER ADDRESS JMP I PRTUNIT /RETURN ASKRETR,.-. /ASK FOR RETRY ROUTINE JMS I [MESSAGE] /ISSUE THE RETMSG /RETRY MESSAGE JMS I [YORNO] /GET REPLY SKP /YES, DON'T BUMP RETURN ISZ ASKRETRY /NO, BUMP RETURN ADDRESS JMP I ASKRETRY /RETURN COMPARE,.-. /COMPARE ROUTINE DCA XR2 /SAVE PASSED POINTER TAD [LA01-1] /SETUP THE DCA XR1 /OTHER POINTER TAD (LA01-LA15-1) /SETUP THE DCA CMPCNT /COMPARE COUNT CMPLOOP,TAD I XR1 /GET A VALUE CIA /INVERT FOR TEST TAD I XR2 /COMPARE TO OTHER VALUE SZA CLA /SKIP IF IT MATCHES JMP I COMPARE /ELSE TAKE BAD RETURN ISZ CMPCNT /DONE ALL YET? JMP CMPLOOP /NO, KEEP GOING ISZ COMPARE /YES, BUMP TO GOOD RETURN JMP I COMPARE /RETURN PAGE / DATE/TIME/SEQUENCE NUMBER VERIFICATION. VALDATE,.-. /VALIDATION ROUTINE TAD I [LA00] /GET SEQUENCE NUMBER FIELD JMS I (VALSEQ) /VALIDATE SEQUENCE NUMBER FIELD JMP I VALDATE /RETURN IF BAD TAD [LA01-1] /SETUP THE DCA XR1 /VALIDATION POINTER TAD (LA01-LA13) /SETUP THE DCA TEMP /VALIDATION COUNT VNLOOP, TAD I XR1 /GET A VALUE JMS I (VALNUMERIC) /CHECK IF VALID NUMERIC JMP I VALDATE /TAKE BAD RETURN IF NOT ISZ TEMP /DONE ALL YET? JMP VNLOOP /NO, KEEP GOING NL7775 /SETUP THE DCA TEMP /CHARACTER COUNT VALOOP, TAD I XR1 /GET A VALUE JMS I (VALALPHA) /CHECK IF VALID ALPHABETIC JMP I VALDATE /TAKE BAD RETURN IF BAD ISZ TEMP /DONE ALL YET? JMP VALOOP /NO, KEEP GOING JMS GET2; LA01 /GET MONTH VALUE TAD [-14-1] /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD [14] /ADD ON RANGE SNL CLA /SKIP IF OK JMP I VALDATE /ELSE TAKE BAD RETURN JMS GET2; LA05 /GET DECADE VALUE TAD (-24) /COMPARE TO 20XX SNA /SKIP IF OTHER JMP VL2000 /JUMP IF IT MATCHES IAC /COMPARE TO 19XX SZA CLA /SKIP IF IT MATCHES JMP I VALDATE /ELSE TAKE BAD RETURN JMS GET2; LA07 /GET YEAR VALUE TAD (-143-1) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD (144-120) /ADD ON RANGE (80-99) SNL CLA /SKIP IF 1980-1999 JMP I VALDATE /ELSE TAKE BAD RETURN JMP VALCOMMON /CONTINUE THERE VL2000, JMS GET2; LA07 /GET YEAR VALUE TAD (-117-1) /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD (120) /ADD ON RANGE (00-79) SNL CLA /SKIP IF 2000-2079 JMP I VALDATE /ELSE TAKE BAD RETURN VALCOMM,JMS GET2; LA07 /GET THE YEAR AND (3) /JUST LEAP YEAR BITS SNA CLA /SKIP IF NOT LEAP YEAR ISZ I (FEBENT) /ELSE MAKE IT LEAP YEAR IN TABLE JMS GET2; LA01 /GET MONTH VALUE TAD (JANENT-1) /ADJUST TO PROPER ELEMENT DCA VALTEMP /STASH THE POINTER TAD I VALTEMP /GET THE VALUE CIA /INVERT FOR TESTING DCA VALTEMP /SAVE IT FOR LATER TAD [34] /RESTORE THE DCA I (FEBENT) /FEBRUARY ENTRY JMS GET2; LA03 /GET THE DAY VALUE SNA /SKIP IF POSSIBLE JMP I VALDATE /ELSE TAKE BAD RETURN TAD VALTEMP /ADD ON LIMIT SMA SZA CLA /SKIP IF VALID JMP I VALDATE /ELSE TAKE BAD RETURN JMS GET2; LA09 /GET HOURS VALUE TAD [-30] /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD (30) /ADD ON RANGE SNL CLA /SKIP IF VALID JMP I VALDATE /ELSE TAKE BAD RETURN JMS GET2; LA11 /GET MINUTES VALUE TAD [-74] /ADD ON LIMIT CLL /CLEAR LINK FOR TEST TAD (74) /ADD ON RANGE SZL CLA /SKIP IF BAD ISZ VALDATE /BUMP RETURN IF GOOD VALUE JMP I VALDATE /RETURN EITHER WAY VALTEMP,.-. /TEMPORARY GET2, .-. /GET VALUE FROM TWO NUMERICS ROUTINE NL7777 /BACKUP TAD I GET2 /GET PASSED ARGUMENT DCA XR1 /STASH THE POINTER ISZ GET2 /BUMP AROUND ARGUMENT TAD I XR1 /GET FIRST VALUE DCA TEMP /SAVE IT TAD TEMP /GET IT BACK CLL RTL /*4 TAD TEMP /*5 RAL /*10 TAD I XR1 /ADD ON SECOND VALUE TAD (-"0+200^12-"0+200) /REMOVE ASCII BITS JMP I GET2 /RETURN BMPSEQ, .-. /BUMP SEQUENCE NUMBER ROUTINE NL3777 /SET MASK AND SEQUENCE /JUST SEQUENCE NUMBER BITS IAC /BUMP TO NEXT DCA SEQUENCE /STORE IT BACK JMP I BMPSEQ /RETURN PAGE / DOUBLE-PRECISION SIMULATOR ROUTINES. 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 DLOAD, .-. /LOAD ROUTINE CAM /CLEAN UP TAD DLOAD /GET OUR CALLER DCA DADD /MAKE IT THEIRS SKP /AND DON'T EXECUTE ADDRESS! 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 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 / 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 / LPT: OUTPUT ROUTINE. P7LPT, .-. /LPT: OUTPUT DCA I (P7TEMP) /SAVE PASSED VALUE P7LTST, JMS I [CHKUP] /CHECK FOR OTHERS AND CLEAR AC TAD I (P7TEMP) /GET CHARACTER BACK LSFIOT /FLAG UP? JMP P7LTST /NO, TRY OTHERS LLSIOT /YES, SEND IT JMS I [CHKUP] /CHECK OTHERS AND CLEAR AC JMP I P7LPT /RETURN IOSPEC, .-. /SPECIAL I/O ENTRY POINT CLA /CLEAN UP TAD IOSPEC /GET OUR CALLER DCA I [IOHAND] /MAKE IT THEIRS NL7777 /SET SPECIAL MODE JMP I (IOHAND+2) /CONTINUE THERE PAGE ERREPOR,.-. /ERROR REPORTING ROUTINE DCA LATBLK /SAVE LATEST BLOCK POINTER JMS I [MESSAGE] /PRINT THE BRIDGING MESSAGE ERONMSG /TO MAKE IT LOOK NICE TAD ERUNIT /GET ERROR UNIT JMS I (PRTUNIT) /PRINT IT JMS I [MESSAGE] /PRINT THE ATBMSG /SECOND BRIDGING MESSAGE DLD; LATBLK, .-. /GET THE BLOCK NUMBER JMS P7DIGITS /PRINT IT JMS I [CRLF] /DO A , JMP I ERREPORT /RETURN TTYINC, .-. /TTY: INPUT ROUTINE WITH <^U> CHECK JMS I [TTYIN] /GET A CHARACTER TAD (-"U!300) /IS IT <^U>? SNA CLA /SKIP IF NOT JMP ISUPU /JUMP IF SO TAD INCHAR /GET IT BACK JMP I TTYINC /RETURN ISUPU, TAD ("U&177) /GET A "U" JMS I [CARPRT] /PRINT "^U" JMS I [CRLF] /DO A , JMP I UPURET /RETURN TO SETUP CANCEL ADDRESS / INITIALIZE ROUTINE. INITIAL,.-. /INITIALIZE ROUTINE CLA /CLEAN UP JMS I (CONFIG) /SETUP THE DRIVE CONFIGURATION AND FLEXIBLE DISK FORMAT KCCIOT /CLEAR CONSOLE FLAG LKRBIOT /CLEAR LPT: INPUT FLAG CAM /CLEAN UP TLSIOT /SET TTY: FLAG LLSIOT /SET LPT: FLAG LAS /GET SWITCHES PDEBUG^SMA CLA /SKIP IF SET JMP LEAVIT /JUST RETURN TAD I (P7PRT) /GET ZAP INSTRUCTION DCA I (P7ZAP) /ZAP IT IN TAD (OTHJMP) /GET ZAP INSTRUCTION DCA I (OTHZAP) /ZAP IT IN LEAVIT, ZBLOCK 30 /FOR FUTURE USE JMP I INITIALIZE /RETURN / SEVEN DIGIT DECIMAL PRINT ROUTINE. P7DIGIT,.-. /PRINT SEVEN DECIMAL DIGITS ROUTINE DST; P7TMP /SAVE PASSED VALUE CAM /CLEAN UP TAD (P7BUF+7-1) /SETUP THE DCA P7PTR /OUTPUT POINTER TAD (-7) /SETUP THE DCA P7CNT /OUTPUT COUNT P7DLUP, TAD P7TMP+1 /GET HIGH-ORDER MQL /SETUP AS LOW-ORDER DIVIDEND DVI; (12) /DIVIDE BY TEN SWP /GET QUOTIENT DCA P7TMP+1 /SAVE AS NEW HIGH-ORDER TAD P7TMP /GET LOW-ORDER SWP /NOW HAVE OLD REMAINDER.LOW-ORDER DVI; (12) /DIVIDE BY TEN DCA I P7PTR /STORE IN BUFFER MQA /GET LOW-ORDER QUOTIENT DCA P7TMP /SAVE AS NEW LOW-ORDER NL7777 /BACKUP THE TAD P7PTR /OUTPUT POINTER DCA P7PTR /STORE BACK ISZ P7CNT /DONE SEVEN YET? JMP P7DLUP /NO, KEEP GOING TAD (P7BUF-1) /YES, POINT AT DCA XR1 /OUTPUT BUFFER TAD (-7) /SETUP THE DCA P7CNT /OUTPUT COUNTER P7OTLP, TAD I XR1 /GET A DIGIT TAD ["0&177] /MAKE IT ASCII JMS I [P7CH] /PRINT IT ISZ P7CNT /DONE YET? JMP P7OTLP /NO, KEEP GOING JMP I P7DIGITS /YES, RETURN P7BUF, ZBLOCK 7 /OUTPUT BUFFER P7CNT, .-. /OUTPUT COUNTER P7PTR, .-. /OUTPUT POINTER P7TMP, ZBLOCK 2 /PASSED VALUE STORED HERE PAGE CONFIG, .-. /DRIVE CONFIGURATION ROUTINE NL7777 /SETUP THE DCA VCSW /COMMAND VERIFICATION SWITCH JMS I (MPENTER) /GET INTO MPUODT NL2000 /SET INDEX COMMAND IAC /ADD ON INDEX VALUE JMS SENDCOMMAND /SETUP SINGLE INDEX JMS SENDCOMMAND /CLEAR HIGH-ORDER ADDRESS BYTE TAD (400) /GET COMMMAND JMS SENDCOMMAND /CLEAR LOW-ORDER ADDRESS BYTE TAD (OLTABLE-1) /SETUP THE DCA XR1 /TABLE POINTER TAD [-10] /SETUP THE DCA TEMP /TABLE COUNTER DCA VCSW /PREVENT VERIFICATION WHEN READING GBLOOP, TAD (2400) /GET COMMAND JMS SENDCOMMAND /READ A BYTE DSRS /GET THE VALUE AND [377] /JUST THE DATA BITS DCA I XR1 /STORE IN TABLE ISZ TEMP /DONE ALL YET? JMP GBLOOP /NO, KEEP GOING TAD (OLTABLE-1) /SETUP DCA XR1 /THE TAD (NUTABLE-1) /MOVE DCA XR2 /POINTERS TAD [-10] /SETUP THE DCA TEMP /MOVE COUNT TAD I XR1 /GET A BYTE DCA I XR2 /PUT A BYTE ISZ TEMP /DONE ALL? JMP .-3 /NO, KEEP GOING TAD NUTABLE+0 /GET W0 ENABLE WORD SNA /SKIP IF SET TAD NUTABLE+2 /ELSE GET W1 ENABLE WORD SNA CLA /SKIP IF EITHER SET JMP CERROR /ELSE COMPLAIN TAD NUTABLE+0 /GET W0 ENABLE WORD SZA CLA /SKIP IF NOT ENABLED JMP W0OK /JUMP IF ENABLED TAD NUTABLE+2 /MUST BE ENABLED THERE DCA NUTABLE+0 /SO ENABLE IT HERE W0OK, TAD NUTABLE+2 /GET W1 ENABLE WORD SZA CLA /SKIP IF NOT ENABLED JMP W1OK /JUMP IF ENABLED TAD NUTABLE+0 /MUST BE ENABLED THERE DCA NUTABLE+2 /SO ENABLE IT HERE W1OK, TAD NUTABLE+4 /GET F0 ENABLE WORD SNA /SKIP IF SET TAD NUTABLE+6 /ELSE GET F1 ENABLE WORD SNA CLA /SKIP IF EITHER SET JMP CERROR /ELSE COMPLAIN TAD NUTABLE+4 /GET F0 ENABLE WORD SZA CLA /SKIP IF NOT ENABLED JMP F0OK /JUMP IF ENABLED TAD NUTABLE+6 /MUST BE ENABLED THERE DCA NUTABLE+4 /SO ENABLE IT HERE F0OK, TAD NUTABLE+6 /GET F1 ENABLE WORD SZA CLA /SKIP IF NOT ENABLED JMP F1OK /JUMP IF ENABLED TAD NUTABLE+4 /MUST BE ENABLED THERE DCA NUTABLE+6 /SO ENABLE IT HERE F1OK, TAD (213) /GET OUR DEFINITION WORD DCA NUTABLE+5 /SET F0 TAD (213) /GET IT AGAIN DCA NUTABLE+7 /SET F1 NL7777 /RESET THE DCA VCSW /COMMAND VERIFICATION SWITCH TAD (400) /GET LOW-ORDER ADDRESS COMMAND JMS SENDCOMMAND /RESET THE ADDRESS TAD (NUTABLE-1) /POINT TO DCA XR1 /NEW TABLE TAD [-10] /SETUP THE DCA TEMP /TABLE COUNT PBLOOP, TAD I XR1 /GET A BYTE TAD (1000) /ADD ON COMMAND JMS SENDCOMMAND /PUT A BYTE ISZ TEMP /DONE ALL YET? JMP PBLOOP /NO, KEEP GOING TAD (3400) /GET MPUODT EXIT COMMAND JMS SENDCOMMAND /LEAVE MPUODT JMS I (RESET) /RESET THE CONFIGURATION JMP I CONFIG /RETURN / COMES HERE IF CONFIGURATION IS SCREWED UP. CERROR, JMS I [MESSAGE] /TELL THEM CFGMSG /CONFIGURATION IS BAD JMP I [SBOOT] /GOODBYE! SENDCOM,.-. /SEND COMMAND ROUTINE DCA SNDTMP /SAVE PASED VALUE DSRS /GET STATUS NOW SMA CLA /SKIP IF BUSY JMP I (SERROR) /ELSE COMPLAIN DSCF /CLEAR FLAG NOW TAD SNDTMP /GET THE VALUE DSIM /SEND IT JMS I (TSETUP) /SETUP THE TIME-OUT DSSF /FLAG UP? JMP I (TIMOUT) /NO, TIME IT OUT TAD VCSW /GET VERIFICATION SWITCH SNA CLA /SKIP IF SET JMP I SENDCOMMAND /ELSE JUST RETURN DSRS /GET RETURNED VALUE CIA /INVERT IT TAD SNDTMP /COMPARE TO ORIGINAL AND [377] /JUST DATA BITS SZA CLA /SKIP IF OK JMP I (SERROR) /ELSE COMPLAIN JMP I SENDCOMMAND /RETURN NUTABLE,ZBLOCK 10 /REPLACEMENT TABLE SNDTMP, .-. /COMMAND TEMPORARY PAGE PUTBAK, JMS MPENTER /ENTER MPUODT MODE NL7777 /RESET THE DCA VCSW /VERIFICATION SWITCH NL2000 /SET INDEX COMMAND IAC /ADD ON INDEX VALUE JMS I (SENDCOMMAND) /SETUP SINGLE INDEX JMS I (SENDCOMMAND) /CLEAR HIGH ADDRESS BYTE TAD (400) /GET COMMAND JMS I (SENDCOMMAND) /CLEAR LOW ADDRESS BYTE TAD (OLTABLE-1) /POINT TO DCA XR1 /BYTE TABLE TAD [-10] /SETUP THE DCA TEMP /DATA COUNTER PULOOP, TAD I XR1 /GET A BYTE TAD (1000) /ADD ON COMMAND JMS I (SENDCOMMAND) /PUT A BYTE ISZ TEMP /DONE YET? JMP PULOOP /NO, KEEP GOING TAD (3400) /GET MPUODT EXIT COMMAND JMS I (SENDCOMMAND) /LEAVE MPUODT JMS RESET /RESET THE CONFIGURATION JMP I [SBOOT] /GOODBYE! MPENTER,.-. /ENTER MPUODT MODE ROUTINE MPAGAIN,CLA /CLEAN UP TAD (-1200) /SETUP THE DCA TTIMER /TIME-OUT COUNTER MPWAIT, DSRS /GET STATUS NOW SPA CLA /SKIP IF NOT BUSY JMP MPTIMIT /JUMP IF BUSY DSCF /CLEAR FLAG NOW NL7777 /GET ENTER VALUE DSIM /ENTER MPUODT MODE JMS TSETUP /SETUP THE TIME-OUT DSSF /FLAG UP? JMP TIMOUT /NO, WAIT FOR IT JMS TSETUP /SETUP THE TIME-OUT DSRS /GET RETURNED STATUS TAD (-4000) /COMPARE TO DESIRED SZA CLA /SKIP IF IT MATCHES JMP TIMOUT /ELSE TIME IT OUT AND I 0 /\ AND I 0 / \ AND I 0 / \WASTE AND I 0 / /SOME TIME AND I 0 / / AND I 0 // JMP I MPENTER /RETURN MPTIMIT,ISZ INCHAR /WASTE JMP MPWAIT /SOME TIME ISZ TTIMER /TOO MUCH TIME? JMP MPWAIT /NO, TRY AGAIN JMS I [TERMRESET] /RESET I/O JMP MPAGAIN /TRY AGAIN RESET, .-. /RESET CONFIGURATION ROUTINE JMS TSETUP /SETUP TIME-OUT DSRS /GET STATUS NOW SPA CLA /STILL BUSY? JMP TIMOUT /YES, TIME IT OUT TAD (-1200) /SETUP THE DCA TTIMER /TIME-OUT COUNTER TAD (200) /GET RESET VALUE DSIM /RESET THE CONTROLLER JMS I (TRWAIT) /WAIT FOR NOT BUSY ISZ TTIMER /WAITED ENOUGH? JMP .-2 /NO, WAIT SOME MORE JMS I (TRWAIT) /NOW WAIT FOR REAL JMP I RESET /RETURN TSETUP, .-. /TIME-OUT SETUP ROUTINE CLA /CLEAN UP TAD [-200] /SETUP THE DCA TTIMER /TIME-OUT COUNTER JMP I TSETUP /RETURN TIMOUT, ISZ INCHAR /WAITED ENOUGH? JMP I TSETUP /NO, TRY AGAIN ISZ TTIMER /TOO MANY TIMES? JMP I TSETUP /NO, TRY AGAIN SERROR, JMS I [MESSAGE] /TELL THEM CERMSG /CONTROLLER IS BAD JMP I [SBOOT] /GOODBYE! OLTABLE,ZBLOCK 10 /ORIGINAL TABLE TTIMER, .-. /TIME-OUT COUNTER PAGE TRYFORM,.-. /TRY TO FORMAT FLEXIBLE DISK ROUTINE JMS I [MESSAGE] /ASK THEM FDSKMSG /TO FORMAT THE DISK JMS I [YORNO] /GET RESPONSE SKP /SKIP IF YES JMP I [FAILURE] /GIVE UP IF NO JMS I [MESSAGE] /TELL THEM FIPMSG /WE ARE FORMATTING THE DISK JMS FORFLX /GO FORMAT THE DRIVE JMP I TRYFORMAT /RETURN FORFLX, .-. /FLEXIBLE DISK FORMAT ROUTINE CAM /CLEAN UP DST; FBLK /CLEAR INITIAL FORMAT BLOCK DCA TRACK /CLEAR DISPLAY TRACK DCA TBCNT /CLEAR DISPLAY TRACK ODD/EVEN COUNTER TAD (-FLXTRKS^2) /SETUP THE DCA TRKCNT /TRACK COUNTER FFRMLP, TAD TRACK /GET DISPLAY TRACK MQL /DISPLAY IT JMS FRMTRK /GO FORMAT THE TRACK SNA CLA /SKIP IF BAD JMP FFRMOK /JUMP IF OK JMS I [MESSAGE] /TELL THEM FBDMSG /FORMAT IS BAD TAD FLPUNIT /GET FLEXIBLE DISK UNIT DCA ERUNIT /PUT INTO ERROR REPORTING UNIT TAD (FBLK) /POINT AT FORMATTING BLOCK JMS I (ERREPORT) /GO COMPLAIN JMS I [ASKRETRY] /RETRY? JMP FFRMLP /YES, TRY AGAIN JMP I [FAILURE] /FORGET IT FFRMOK, TAD (FTSIZE) /GET TRACK SIZE IN SECTORS MQL /TO LOW-ORDER DAD; FBLK /UPDATE BLOCK NUMBER DST; FBLK /STORE BACK JMS I [CHKUP] /CHECK FOR <^C>, ETC. ISZ TBCNT /SHOULD WE BUMP THE DISPLAY? TAD TBCNT /GET DECISION MAKER RAR /DECISION BIT TO LINK SNL CLA /SKIP IF NOT ISZ TRACK /ELSE BUMP TRACK NOW ISZ TRKCNT /DONE YET? JMP FFRMLP /NO, KEEP GOING JMS I [MESSAGE] /YES, TELL THEM FCMPMSG /FORMAT IS DONE JMP I FORFLX /RETURN FRMTRK, .-. /FORMAT TRACK ROUTINE TAD FLPUNIT /GET UNIT CLL RTL;RTL;RAL /MOVE UP DCA FSECHI /STASH IT FOR NOW TAD FBLK /GET LOW-ORDER ADDRESS DCA FSECLO /STASH IT TAD FBLK /GET IT AGAIN AND [7400] /JUST HIGH-ORDER BITS CLL RAL /MOVE UP DCA FSECMD /STASH FOR NOW TAD FBLK+1 /GET HIGH-ORDER ADDRESS AND [17] /JUST LOW-ORDER BITS TAD FSECMD /ADD ON OTHER BITS RTL;RTL /MOVE EVERYBODY UP DCA FSECMD /STORE COMPOSITE TAD FBLK+1 /GET HIGH-ORDER ADDRESS RTR;RTR /MOVE DOWN AND [37] /REMOVE JUNK BITS TAD FSECHI /ADD ON UNIT BITS DCA FSECHI /STORE COMPOSITE DSRS /GET STATUS NOW SPA CLA /SKIP IF NOT BUSY JMP .-2 /ELSE WAIT FOR IT FTIME, RIF /GET OUR FIELD CLL RTR;RAR /MOVE OVER DSHI /GIVE IT (BANK AND) FIELD DSRS /GET STATUS NOW SMA CLA /SKIP IF NOW BUSY JMP .-2 /ELSE WAIT FOR IT DSCF /CLEAR THE FLAG NOW TAD (FRMCOMMAND) /POINT AT COMMAND DSGO /GO SEND IT JMS FWAIT /WAIT FOR COMMAND DSIM /GO EXECUTE IT JMS FWAIT /WAIT FOR COMMAND TO FINISH JMP I FRMTRK /RETURN FWAIT, .-. /WAIT ROUTINE TAD FTIME /GET GOOD CONSTANT DCA FTMOUT /SET TIME-OUT FWATLP, DSSF /FLAG UP? JMP FTWAIT /NO, TIME IT OUT DSCF /YES, CLEAR THE FLAG DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SNA /SKIP IF ANY ERRORS JMP I FWAIT /ELSE RETURN RAR /RESTORE ERROR IN AC JMP I FRMTRK /TAKE BAD RETURN TO MAIN CALLER FTWAIT, ISZ FFOO /WAITED ENOUGH? JMP FWATLP /NO, KEEP GOING ISZ FTMOUT /WAITED TOO LONG? JMP FWATLP /NO, KEEP WAITING JMS I [TERMRESET] /YES, RESET I/O DSRS /GET STATUS NOW SNA /SKIP IF ERRORS ALREADY NL7777 /ELSE MANUFACTURE SOME JMP I FRMTRK /TAKE ERROR RETURN TO MAIN CALLER FRMCOMM,6 /COMMAND LENGTH 6 /COMMAND - FORMAT TRACK FSECHI, .-. /UNIT, HIGH-ORDER ADDRESS FSECMD, .-. /MIDDLE ADDRESS BITS FSECLO, .-. /LOW-ORDER ADDRESS BITS 1 /INTERLEAVE FACTOR 0 /CONTROL FIELD FFOO, .-. /COUNTER FTMOUT, .-. /COUNTER TRKCNT, .-. /TRACK COUNTER PAGE / I/O HANDLER FOR MDC8. / USAGE: / CDF MYFLD /SET CALLING DATA FIELD / CIF PRGFLD /SET HANDLER FIELD / JMS I [IOHAND] /CALL HANDLER / ADDRESS /LOW-ORDER TRANSFER ADDRESS / FUNCTION /FUNCTION WORD; SEE BELOW / POINTER /POINTER TO I/O RECORD NUMBER; SEE BELOW / ERROR RETURN /RETURNS HERE WITH AC=4000 IF ERROR / GOOD RETURN /RETURNS HERE WITH AC=0000 IF OK / FUNCTION WORD: / BIT[0]: READ/WRITE / BITS[1-5]: PAGE COUNT (BIT 5 IGNORED IF BIT[10]=1) / BITS[6-8]: TRANSFER FIELD / BIT[9]: UNUSED / BIT[10-11]: LOGICAL UNIT ON MDC8 / POINTER: / POINTER CONTAINS ADDRESS OF DOUBLE-WORD DISK RECORD NUMBER / IN DOUBLE-PRECISION EAE FORMAT (LOW, HIGH). IOHAND, .-. /HANDLER ENTRY POINT CLA /CLEAN UP DCA IOTEMP /CLEAR SPECIAL SWITCH RDF /GET CALLING FIELD TAD (CIF) /MAKE INTO CIF RETURN FIELD INSTRUCTION DCA RETFLD /STORE IN-LINE TAD I IOHAND /GET TRANSFER ADDRESS DCA TRADDRESS /STASH IT ISZ IOHAND /BUMP TO FUNCTION WORD NL4000 /SET READ/WRITE MASK AND I IOHAND /GET READ/WRITE MASK CLL IAC RTL /4 IF READING, 5 IF WRITING RAL /10 IF READING, 12 IF WRITING DCA RWCOM /STORE AS COMMAND TAD I IOHAND /GET THE FUNCTION WORD AND [3700] /JUST USEFUL PAGE BITS SNA /FULL FIELD CALL? NL4000 /YES, USE FULL VALUE CLL RTR;RTR;RTR /MOVE DOWN ISZ IOTEMP /SPECIAL CALL? JMP .+3 /NO, FORGET IT CLA /YES, CLEAN UP TAD UPDATE /USE UPDATE INSTEAD DCA SCTCNT /SAVE FOR NOW TAD I IOHAND /GET FUNCTION WORD AGAIN RTR;RAR /MOVE OVER AND [7] /ISOLATE FIELD BITS DCA TRFLD /SAVE (BANK AND) FIELD NL0003 /SET UNIT MASK AND I IOHAND /GET LOGICAL UNIT BITS CLL RTL;RTL;RAL /MOVE UP DCA SECTHI /SAVE FOR NOW ISZ IOHAND /BUMP TO RECORD POINTER TAD I IOHAND /GET RECORD POINTER DCA IOTEMP /STASH IT ISZ IOHAND /BUMP TO ERROR RETURN TAD I IOTEMP /GET LOW-ORDER PORTION OF DISK ADDRESS DCA SECTLO /STASH IT ISZ IOTEMP /BUMP TO HIGH-ORDER PORTION TAD I IOTEMP /GET HIGH-ORDER PORTION DCA IOTEMP /SAVE IT TAD SECTHI /GET UNIT WORD AND [100] /JUST FLEXIBLE DISK BIT SNA CLA /SKIP IF FLEXIBLE DISK DRIVE JMP IOCOMMON /JUMP IF WINCHESTER DISK DRIVE TAD IOTEMP /GET HIGH-ORDER DISK ADDRESS CLL RAR /MOVE OVER DCA IOTEMP /STORE IT BACK TAD SECTLO /GET LOW-ORDER DISK ADDRESS RAR /MOVE OVER DCA SECTLO /STORE IT BACK TAD SCTCNT /GET SECTOR COUNT CLL RAR /%2 ALSO DCA SCTCNT /STORE IT BACK IOCOMMO,TAD SECTLO /GET LOW-ORDER ADDRESS AND [7400] /JUST NEEDED BITS CLL RAL /MOVE UP DCA SECTMD /SAVE FOR NOW TAD IOTEMP /GET HIGH-ORDER ADDRESS AND [17] /JUST NEEDED BITS TAD SECTMD /ADD ON LOW-ORDER BITS RTL;RTL /MOVE OVER DCA SECTMD /SAVE COMPOSITE TAD IOTEMP /GET HIGH-ORDER ADDRESS RTR;RTR /MOVE DOWN AND [37] /REMOVE JUNK BITS TAD SECTHI /ADD ON UNIT BITS DCA SECTHI /STORE COMPOSITE DSRS /GET STATUS NOW SPA CLA /SKIP IF NOT BUSY JMP .-2 /ELSE WAIT FOR IT TTIME, RIF /GET OUR FIELD CLL RTR;RAR /MOVE DOWN DSHI /LOAD (BANK AND) FIELD OF COMMAND DSRS /GET STATUS NOW SMA CLA /SKIP IF NOW BUSY JMP .-2 /ELSE WAIT FOR IT DSCF /CLEAR FLAG NOW TAD (TABLE) /POINT AT OUR COMMAND DSGO /START IT UP JMS WAIT /WAIT FOR COMMAND TRANSFER DSIM /START UP THE TRANSFER JMS WAIT /WAIT FOR IT ISZ IOHAND /ELSE BUMP RETURN ADDRESS RETFLD, .-. /WILL BE CIF RETURN FIELD JMP I IOHAND /RETURN TO CALLER WAIT, .-. /WAIT ROUTINE TAD TTIME /SETUP THE DCA TMOUT /TIME-OUT COUNTER WAITLP, DSSF /FLAG UP? JMP TWAIT /NO, TIME IT OUT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SNA /SKIP IF BAD JMP I WAIT /ELSE RETURN BADWAIT,DCA IOTEMP /SAVE FOR SOMEONE NL4000 /SET ERROR VALUE JMP RETFLD /TAKE ERROR RETURN TWAIT, ISZ IOTEMP /WAITED ENOUGH? JMP WAITLP /NO, WAIT AGAIN ISZ TMOUT /WAITED TOO MUCH? JMP WAITLP /NO, KEEP GOING JMS I [TERMRESET] /RESET I/O WHICH GETS US OUT OF HERE NL7777 /SET BAD STATUS JMP BADWAIT /FINISH IT THERE / COMMAND TABLE. TABLE, 6!DMA /TABLE LENGTH WITH DMA INDICATOR RWCOM, .-.&377 /0010 IF READING, 0012 IF WRITING SECTHI, .-.&377 /DISK ADDRESS - HIGH-ORDER FIVE BITS AND DRIVE BITS SECTMD, .-.&377 /DISK ADDRESS - MIDDLE EIGHT BITS SECTLO, .-.&377 /DISK ADDRESS - LOW-ORDER EIGHT BITS SCTCNT, .-.&377 /SECTOR COUNTER (1-40) CONTRL, 200&377 /CONTROL WORD - NO RETRIES TRFLD, .-.&377 /BANK (0000) AND TRANSFER FIELD (0-7) TRADDR, .-. /TRANSFER ADDRESS IOTEMP, .-. /TEMPORARY TMOUT, .-. /TIME-OUT COUNTER PAGE / DOUBLE-PRECISION DATA, ETC. AALENGT,AALENLO;AALENHI /ARCHIVING AREA LENGTH AALOW, AALOWLO;AALOWHI /ARCHIVING AREA LOWEST BLOCK XLIST OFF IFZERO FLEXLO < XLIST ON BLIMIT, -FLEXLO;-FLEXHI-1+1 /BACKUP DEVICE UPPER LIMIT XLIST OFF > IFNZRO FLEXLO < XLIST ON BLIMIT, -FLEXLO;-FLEXHI-1 /BACKUP DEVICE UPPER LIMIT XLIST OFF > XLIST ON CNTRLBL,ZBLOCK 2 /COPYING CONTROL BLOCK DALENGT,DALENLO;DALENHI /DAILY ACTIVITY AREA LENGTH DALOW, DALOWLO;DALOWHI /DAILY ACTIVITY AREA LOWEST BLOCK D2000, 0000; 2000 /CONSTANT 20000000 INBLK, ZBLOCK 2 /LATEST INPUT BLOCK LBLENGT,LBLENLO;LBLENHI /LIBRARY AREA LENGTH LBLOW, LBLOWLO;LBLOWHI /LIBRARY AREA LOWEST BLOCK OUTBLK, ZBLOCK 2 /LATEST OUTPUT BLOCK P0, 0; 0 /POINTER TO RECORD 000000 SAVEBLK,ZBLOCK 2 /SAVED CONTROL BLOCK SYLENGT,SYLENLO;SYLENHI /SYSTEM AREA LENGTH SYLOW, SYLOWLO;SYLOWHI /SYSTEM AREA LOWEST BLOCK UPPERLI,ZBLOCK 2 /UPPER LIMIT FOR BLOCK COPYING WNLENGT,WNLENLO;WNLENHI /WINCHESTER LOGICAL LENGTH WNLOW, WNLOWLO;WNLOWHI /WINCHESTER LOGICAL LOWEST BLOCK LABUFFE=. /LABEL RECORD BUFFER LA00, .-. /SEQUENCE NUMBER HERE LA01, .-. /UPPER MONTH DIGIT HERE LA02, .-. /LOWER MONTH DIGIT HERE LA03, .-. /UPPER DAYS DIGIT HERE LA04, .-. /LOWER DAYS DIGIT HERE LA05, .-. /UPPER DECADE DIGIT HERE LA06, .-. /LOWER DECADE DIGIT HERE LA07, .-. /UPPER YEARS DIGIT HERE LA08, .-. /LOWER YEARS DIGIT HERE LA09, .-. /UPPER HOURS DIGIT HERE LA10, .-. /LOWER HOURS DIGIT HERE LA11, .-. /UPPER MINUTES DIGIT HERE LA12, .-. /LOWER MINUTES DIGIT HERE LA13, .-. /FIRST TIME ZONE CHARACTER HERE LA14, .-. /SECOND TIME ZONE CHARACTER HERE LA15, .-. /THIRD TIME ZONE CHARACTER HERE ZBLOCK LABUFFER+400-. /REST OF LABEL RECORD LABUF2= . /LABEL RECORD COMPARE BUFFER ZBLOCK 400 /LABEL RECORD COMPARED HERE IFNZRO SBOOT-.&4000 / HERE COME THE LITERALS!!! FIELD PRGFLD%10 /DUMP THE LITERALS NOW FIELD MSGFLD%10 /LOAD INTO MESSAGE FIELD *0 /AS GOOD AS ANY XLIST OFF IFNZRO LSTMES < XLIST ON > / TEXT MESSAGES. AAMSG, TEXT "^A^RCHIVING ^A^REA^" ABMSG, TEXT "%^U^SE ^A^LTERNATE ^F^LEXIBLE ^D^ISK FOR ^B^ACKUP? " ALIENM, TEXT "%^D^ISK ^N^EVER ^U^SED FOR ^B^ACKUP ^P^URPOSES!%^" ARDTMSG,TEXT "%^E^NTER ^B^ACKUP ^D^ATE (^MM/DD/YY) ^OR ^P^RESS ^RETURN" TEXT " ^IF ^U^NKNOWN: ^" ATBMSG, TEXT " AT ^B^LOCK ^" ATMSG, TEXT "%^E^NTER ^B^ACKUP ^T^IME AND 3 ^C^HARACTER ^ID (HH:MM XXX): ^" BAMSG, TEXT "^CKUP ARCHIVING AREA%" BDCMSG, TEXT "%^B^ACKUP ^D^ATA ^D^IFFERS FROM ^D^ISK ^D^ATA!%" BDMESSA,TEXT "%^B^ACKUP OF " BDMSG, TEXT " ^BACKUP DAILY ACTIVITY AREA%" BDSEMSG,TEXT "%^I^NCORRECT ^S^EQUENCE ^N^UMBER!%^" BDTMSG, TEXT "%%^B^AD ^D^ATE!%^" BEMSG, TEXT " ^BACKUP ENTIRE DISK%" BK2MSG, TEXT " ^BACKUP DEVICE IS FLEXIBLE DISK DRIVE ZERO%^" BK3MSG, TEXT " ^BACKUP DEVICE IS FLEXIBLE DISK DRIVE ONE%" BLMSG, TEXT " ^BACKUP LIBRARY AREA%^" BSMSG, TEXT " ^BACKUP SYSTEM AREA%" BTMESSA,TEXT "%%^B^AD ^T^IME!%^" CDMESSA,TEXT "%^C^OMPARE OF ^" CERMSG, TEXT "%^F^ATAL ^C^ONTROLLER ^E^RROR!%" CFGMSG, TEXT "%^D^RIVE ^C^ONFIGURATION ^U^NUSABLE!%" COMMSG, TEXT "%^C^OMMAND: ^" COMPMSG,TEXT " ^C^OMPLETE!%" DAMSG, TEXT "^D^AILY ^A^CTIVITY ^A^REA" DISKMSG,TEXT " ^D^ISK (THEN ^P^RESS ANY ^K^EY) " DSKMSG, TEXT " ^D^ISK ^" DUMMSG, TEXT "^I AM A DUMMY RECORD, NOT DATA!" EDMSG, TEXT "^E^NTIRE ^D^ISK" EIGHTH, TEXT "^E^IGHTH^" ELEVENT,TEXT "^E^LEVENTH^" ERONMSG,TEXT " ^E^RROR ON ^" EXMSG, TEXT "^IT^%" FAILMSG,TEXT "%^FAILURE!%" FBDMSG, TEXT "%^F^ORMATTING" FCMPMSG,TEXT "%^F^ORMATTING ^O^PERATION ^C^OMPLETE!%^" FDSKMSG,TEXT "%^F^ORMAT ^C^URRENTLY ^M^OUNTED ^F^LEXIBLE ^D^ISK? " FIFTH, TEXT "^F^IFTH" FIPMSG, TEXT "%^F^ORMATTING ^O^PERATION ^B^EGUN, ^P^LEASE ^W^AIT!^%" FIRST, TEXT "^F^IRST" /FOURTE,TEXT "^F^OURTEENTH^" FOURTH, TEXT "^F^OURTH^" IBDMSG, TEXT "%^I^NPUT^" LAMSG, TEXT "^L^IBRARY ^A^REA^" LDMSG, TEXT "%^C^URRENTLY ^M^OUNTED ^D^ISK IS ^P^ART OF ^C^URRENT ^S^EQUENCE!" TEXT "%%^REMOVE IT!%^" LRBDMSG,TEXT "%^E^RROR WHILE ^R^EADING ^L^ABEL ^R^ECORD ON " LRVERR, TEXT "%^E^RROR WHILE ^V^ERIFYING ^L^ABEL ^R^ECORD ON " LUMSG, TEXT "%^L^AST ^U^SAGE:%%(" LWBDMSG,TEXT "%^E^RROR WHILE ^W^RITING ^L^ABEL ^R^ECORD ON " MENUMSG,TEXT " ^RETURN TO MAIN MENU%^" MOUNTME,TEXT "%^M^OUNT " MSGOK, TEXT "^OK!%" NINTH, TEXT "^N^INTH" NOMSG, TEXT "^N^O!%^" OBDMSG, TEXT "%^O^UTPUT" ONEMSG, TEXT "^W^INCHESTER ^D^ISK ^D^RIVE ^O^NE" PERMSG, TEXT "%^O^K TO ^U^SE ^D^ISK? " RAMSG, TEXT " ^RESTORE ARCHIVING AREA%" RDMESSA,TEXT "%^R^ESTORE OF ^" RDMSG, TEXT " ^RESTORE DAILY ACTIVITY AREA^%" RETMSG, TEXT "%^R^ETRY? ^" RLMSG, TEXT " ^RESTORE LIBRARY AREA%" RSAMSG, TEXT "^STORE ENTIRE DISK%" RSMSG, TEXT " ^RESTORE SYSTEM AREA^%" RS0MSG, TEXT " ^RESTORE DEVICE IS WINCHESTER DISK DRIVE ZERO%" RS1MSG, TEXT " ^RESTORE DEVICE IS WINCHESTER DISK DRIVE ONE%^" SAMSG, TEXT "^S^YSTEM ^A^REA" SCREN1, TEXT "%^B^ACKUP/^R^ESTORE ^U^TILITY ^V^ERSION " VERSION%12^66+VERSION+6060 /VERSION NUMBER "^^100+REVISION-300 /, REVISION LETTER TEXT "^%%^C^OMMAND ^A^CTION%%" TEXT "^BS - B^ACKUP ^S^YSTEM ^A^REA%" TEXT "^RS - R^ESTORE ^S^YSTEM ^A^REA%%" TEXT "^BL - B^ACKUP ^L^IBRARY ^A^REA %" TEXT "^RL - R^ESTORE ^L^IBRARY ^A^REA %%" TEXT "^BD - B^ACKUP ^D^AILY ^A^CTIVITY ^A^REA%" TEXT "^RD - R^ESTORE ^D^AILY ^A^CTIVITY ^A^REA%%" TEXT "^BA - B^ACKUP ^A^RCHIVING ^A^REA %" TEXT "^RA - R^ESTORE ^A^RCHIVING ^A^REA %%" TEXT "^BE - B^ACKUP ^E^NTIRE ^D^ISK%" TEXT "^RE - R^ESTORE ^E^NTIRE ^D^ISK%%" TEXT "^VA - V^ARY ^P^ARAMETERS%%" TEXT "^EX - E^XIT %" SCREN2, TEXT "%^B^ACKUP/^R^ESTORE ^U^TILITY " TEXT "^P^ARAMETER ^V^ARIATION%" TEXT "%^C^OMMAND ^A^CTION %" TEXT "%^F0 - B^ACKUP ^D^EVICE IS ^F^LEXIBLE ^D^ISK ^D^RIVE ^Z^ERO%" TEXT "%^F1 - B^ACKUP ^D^EVICE IS ^F^LEXIBLE ^D^ISK ^D^RIVE ^O^NE %" TEXT "%^W0 - R^ESTORE ^D^EVICE IS ^W^INCHESTER ^D^ISK ^D^RIVE ^Z^ERO %" TEXT "%^W1 - R^ESTORE ^D^EVICE IS ^W^INCHESTER ^D^ISK ^D^RIVE ^O^NE%" TEXT "%^VO - R^ESTORE IS ^V^ERIFY-^O^NLY %" TEXT "%^WO - B^ACKUP/^R^ESTORE IS ^W^RITE-^O^NLY %" TEXT "%^WV - B^ACKUP/^R^ESTORE IS ^W^RITE WITH ^V^ERIFY%" TEXT "%^ME - R^ETURN TO ^M^AIN ^M^ENU%" TEXT "%^EX - E^XIT%" SECOND, TEXT "^S^ECOND^" SEVENTH,TEXT "^S^EVENTH" SIXTH, TEXT "^S^IXTH" SKPMSG, TEXT "%^S^KIP ^P^AST ^E^RROR? ^" TDMSG, TEXT "%^E^NTER ^T^ODAY'S ^D^ATE (^MM/DD/YY): " TENTH, TEXT "^T^ENTH" THIRD, TEXT "^T^HIRD" THIRTEE,TEXT "^T^HIRTEENTH^" THREMSG,TEXT "^F^LEXIBLE ^D^ISK ^D^RIVE ^O^NE" TTMSG, TEXT "%^E^NTER ^C^URRENT ^T^IME AND 3 ^C^HARACTER ^ID (HH:MM XXX): " TWELFTH,TEXT "^T^WELFTH" TWOMSG, TEXT "^F^LEXIBLE ^D^ISK ^D^RIVE ^Z^ERO^" VBDMSG, TEXT "%^V^ERIFY" VIBDMSG,TEXT "%^V^ERIFY ^R^EAD^" VOMSG, TEXT " ^RESTORE IS VERIFY-ONLY%" VPMSG, TEXT "^RY PARAMETERS%" WDRMSG, TEXT "%^C^REATE ^D^UMMY ^R^ECORD? ^" WOMSG, TEXT " ^BACKUP/RESTORE IS WRITE-ONLY%" WRDTMSG,TEXT "%^I^NCORRECT ^D^ATE OR ^T^IME!%" WRTYPM, TEXT "%^I^NCORRECT ^B^ACKUP ^D^ATA!%^" WVMSG, TEXT " ^BACKUP/RESTORE IS WRITE WITH VERIFY%^" YESMSG, TEXT "^Y^ES!%" ZEROMSG,TEXT "^W^INCHESTER ^D^ISK ^D^RIVE ^Z^ERO^" XLIST ON $ /THAT'S ALL FOLK!