/ COS 300 MULTI V 1.16 / / MULTI-TERMINAL DIBOL / LOADER AND RUNTIME SYSTEM / / /COPYRIGHT 1973 /DIGITAL EQUIPMENT CORP. /MAYNARD MASS. 01754 / /THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE /ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION /OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT /AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMENT CORPORATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY /OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / ASSEMBLY INSTRUCTIONS: / / .R PAL8 / *MULTI.BN,MULTI.LS / VERSION NUMBER FOR PRINTOUT DECIMAL VN2=1 / . VN1=1 VN0=6 OCTAL / BEGIN SECTION 0 LISTING CONTROL IFNZRO LIST&1 / PSEUDO MRI'S FIXMRI CALL= 4400 FIXMRI EXIT= 5400 FIXTAB / ASSEMBLY PARAMETERS JOBMAX= 10 /MAXIMUM NUMBER OF JOBS INCLUDING LPTSPL DKQMAX= JOBMAX TTISIZ= 7 TFTSIZ= 11 SWPSTK= 40 /# OF STACK LOCATIONS TO SAVE PDLEND= 0200+SWPSTK /SIZE OF FIELD ONE STACK L2QSIZ= 70 /LEVEL TWO TASK REQUEST QUEUE STKSIZ= 10 /SIZE OF FIELD ZERO STACK FILMAX= 17 /NUMBER OF POSSIBLE I/O CHANNELS BFRMAX= 7 /MAX NUMBER OF FILES AT ANY TIME (INCL LPT) UTFTSZ= 7 /NUMBER OF WORDS PER ENTRY IN USER BUFFER TABLE RCLKMX= 7 /MAXIMUM # RECORD LOCKS PER USER RCLKSZ= 2 /TWO WORDS PER LOCK IN RECORD LOCK TABLE EXECNT= 100 /# INSTRUCTIONS TO EXECUTE PER TIME SLICE NULCNT= 6 / NUMBER OF NULLS TO FOLLOW CRLF DIGITS= 21 / FREE LOCATION INDICATOR XXX= NOP / MULTI-BINARY FILE EXTENSION BINEXT= 0415 / "DM" VERSON= 20 / COMPILER VERSION NUMBER RSFLD= 10 / JOB STORAGE AREA ALLOCATIONS / / JOB SAVE AREA BEGINS AT THE BASE ADDRESS IN BASTBL SET UP BY / ONCE ONLY CODE AT STARTUP. THE FIRST (JOBSAV) WORDS ARE USED TO / SAVE FIELD ONE PAGE ZERO STATE AND CONTENTS OF THE STACK. USER / BUFFER USAGE TABLES, I/O CHANNEL TABLES, AND BUFFER STATUS TABLES ARE / ALSO STORED IN THIS AREA. / / STARTING AT THE 15 BIT JOB BASE ADDRESS: / JOBSAV= 400 /SIZE OF JOB SAVE AREA / JOBBAS= 0 PAGE0= JOBBAS /BEGINNING OF PAGE ZERO STATE AND STACK STORAGE STACK= PAGE0+SWPEND-SWPBEG /STACK SAVE BEGINS FOLLOWING PAGE 0 STATE BARRAY= STACK+SWPSTK /BUFFER USAGE TABLE FARRAY= BARRAY+BFRMAX /I/O CHANNEL STATUS TABLE UTFT= FARRAY+FILMAX /BUFFER STATUS TABLE JOBEND= UTFTSZ^BFRMAX+UTFT /FIRST FREE LOCATION IFNZRO JOBSAV-JOBEND&4000 <^^^JOB SAVE AREA OVERFLOW ^^^> / STAND ALONE MONITOR LEFTOVERS OL7400= 2 OL7600= 70 PFT= 6200 IODIE= 7702 FLAGS= 7772 SWITCH= 7776 OLD7= 40 KM1= 45 OLD70= 65 OLD77= 20 KM4= 66 OLDCDF= 71 KSPLIT= 76 KSYS= 77 OLDBSW= 22 KMOVE= 23 KRDOIO= 26 KCDOIO= 27 KGETC= 24 OLDW0= 46 OLDW1= 47 OLDW2= 50 OLDW3= 51 OLDW4= 52 OLDW5= 53 OLDU0= 54 OLDU1= 55 OLDU2= 56 SBT= 6370 TOPFLD= 7775 DATE= 7777 KPTRST= 43 KINITI= 72 IZERO= 63 PTF0= 62 KTICHR= 30 KTOCHR= 31 KOTOPD= 74 RK8= 6410 /ADDRESS OF DISK HANDLER FOR LOGICAL UNITS COMPARISON COMPWA= 100 EDITWA= 40 /DEFINE RK01 IOT'S DLDCX= 6732 DLWC= 6753 DLDR= 6733 DLCAX= 6755 DSKD= 6745 DSKE= 6747 DRDS= 6741 DCLS= 6742 DCLA= 6751 DRCA= 6757 DRDA= 6734 DRWC= 6752 /DEFINE RK05 IOT'S DSKP= 6741 DCLR= 6742 DLAG= 6743 DLCA= 6744 DRST= 6745 DLDC= 6746 /DEFINE RF08 IOT'S DCMA= 6601 DMAR= 6603 DXAL= 6643 DIMA= 6616 DCIM= 6611 DIML= 6615 DFSE= 6621 DISK= 6623 DCXA= 6641 DXAC= 6645 /LP08/LS8E IOT'S LSF= 6661 LCF= 6662 LSE= 6663 LIE= 6665 LLS= 6666 LIF= 6667 /CARD READER IOT'S RCSF= 6631 RCRA= 6632 RCSD= 6671 RCSE= 6672 /TC08 DECTAPE IOT'S DTSF= 6771 DTRA= 6761 DTCA= 6762 DTXA= 6764 DTRB= 6772 DTLB= 6774 /EAE MQL= 7421 MQA= 7501 /8E / FASTER-THAN-STINK AC ZINGERS / OF COURSE WE CAN ONLY USE THE ONES THAT WORK / ON PDP-5'S ETC. AC5777= CLA CLL CMA RTR AC7775= CLA CLL CMA RTL AC7776= CLA CLL CMA RAL AC7777= CLA CLL CMA AC4000= CLA CLL CML RAR AC0000= CLA CLL AC0001= CLA CLL IAC AC0002= CLA CLL CML RTL AC2000= CLA CLL CML RTR AC3777= CLA CLL CMA RAR / I/O STATUS BIT DEFINITIONS TTIBIT= L0010 TTOBIT= L0020 PTRBIT= L0040 PTPBIT= L0100 CDRBIT= L0200 LPTBIT= L0400 DDDBIT= L1000 /DISK WAIT OFFBIT= 2000 /SHOWS JOB IS TERMINATED BY STOP OR CTRL/C /DEFINE IOT'S FOR ALL THE TERMINALS KSF0= 6031 TSF0= 6041 KSF1= 6301 TSF1= 6311 KSF2= 6321 TSF2= 6331 KSF3= 6341 TSF3= 6351 KSF4= 6361 TSF4= 6371 KSF5= 6401 TSF5= 6411 KSF6= 6421 TSF6= 6431 KSF7= 6441 TSF7= 6451 / END SECTION 0 LISTING CONTROL IFNZRO LIST&1 / BEGIN SECTION 1 LISTING CONTROL IFNZRO LIST&2 / PAGE ZERO BITS AND LINKS / *10 / K10, 0 /USED BY LOOKUP / K11, 0 / " / K12, 0 / " / 0 / K14, 0 /USED BY GETNAM *15 STLPNT, 0 / K16, 0 /USED BY GETLIN / K17, 0 /USED BY MULTI LOADER *100 JOBPTR, 0 KNJOBS, -2 NAM1, 0 NAM2, 0 NAM3, 0 NAM4, 0 NCHARS, 0 NCPL, 0 FILSZ, 0 DBLOCK, 0 UNIT, 0 DAVICE, 0 KJOBX, JOBTBL PDCNT, DIRECT PDORG, DIRECT+1 PDLINK, DIRECT+2 PDWSTE, DIRECT+4 K7600, 7600 KCDF, CDF QUESTN, 0 /CHANGE TERMINAL NUMBERS FLAG KEROR, BEATIT BATFLG, 0 LININP, 0 LINBEG, 0 *200 LINE=. /THIS PAGE USED BY LINE SCANNER AFTER EXECUTION START, NOP /!!!!! TAD IZERO DCA I (PREASI TAD I KM4 DCA KSYS TAD I (FLAGS SPA CLA JMP I (FGND /NOT WHILE FGBG IS RUNNING! TAD I (SWITCH CALL OLDBSW JMS OPTION TAD I (SWITCH JMS OPTION CALL (BATTST /IS ANYONE THERE? JMP IOFIX OPTION, 0 AND OLD77 DCA OPTCHR TAD OPTCHR TAD (-77 /WAS OPTION CHARACTER A ? SNA CLA ISZ QUESTN /IF YES SET QUESTN NON ZERO TAD OPTCHR TAD (-71 /WAS IT A DIGIT IN RANGE 1-8? SMA JMP OPTEXT TAD (11 SPA SNA JMP OPTEXT CIA DCA KNJOBS OPTEXT, CLA EXIT OPTION OPTCHR, 0 IOFIX, IOF /SELF-PRESERVATION DTOK, AC0001 6732 /RK01 INSTRUCTION, SHOULD CLA SNA CLA /DID IT? JMP RKOK /LOOKS LIKE...(RK01 IS DEFAULT) TAD (CLA /NOP THE DISK CLEAR IF NOT RK01 CDF 20 DCA I (DSKBIT CDF 00 AC2000 /RK05? 6742 /RK05 INSTRUCTION, SHOULD CLA SNA CLA /DID IT? JMP RK05IN /YUP, SO WE MUST HAVE ONE OF 'EM RFLP, TAD (DCMA DCA I (DSKCLR TAD I RFGET /BY ELIMINATION, WE'LL TRY RF08 ISZ RFGET DXAL /RF08 IOT DIMA CLL RTR SZL CLA /LOOK FOR NON-EXISTENT DISK JMP RFEND /WE GOT ONE (OR RATHER, DON'T GOT ONE?) TAD (100 TAD RFSIZE DCA RFSIZE /BUMP UP THE RF SEGMENT COUNT ISZ RFCNT /TRIED FOR 4 DISKS? JMP RFLP /NOT YET RFEND, TAD RFSIZE SNA CLA /DID WE GET ANYTHING? JMP RKOK /NOPE - IGNORE TAD (RF08-RK05 /PUT IN RF08 HANDLER ISZ DSKBMP JMP .+3 RK05IN, TAD (DCLR DCA I (DSKCLR TAD (RK05-1 /PUT IN RK05 DCA DISKAD TAD K7600 CDF 00 /"FROM" FIELD JMS I KMOVE CDF 20 DISKAD, 0 DKSTRT-1 /ADDR OF INTERRUPT DISK HANDLER DSKBMP, TAD DKSKPL /*** MAY BE BUMPED DCA DKSKPM CDF 00 TAD (-6 CALL KMOVE CDF 20 DKSKPM, 0 DSKSKP-1 RKOK, ION JMP I (NXTPAG RFSIZE, 0 RFCNT, -4 RFGET, RFTABL RFTABL, 77 177 277 377 DKSKPL, RK5SKP-1 RF8SKP-1 DIRECT=. /NEXT TWO PAGES OVERLAYED BY /DIRECTORY DURING LOOKUPS /HERE ARE THE PATCHES TO THE INTERRUPT SKIP CHAIN FOR THE /DEVICES THAT MAY CHANGE (DISK AND DTA) RK5SKP, DSKP SKP CLA RK5INT&177+5600 /JMP I RK5INT IN DISGUISE NOP;NOP;NOP RF8SKP, DFSE SKP CLA RF8BAD&177+5600 /JMP I RF8INT DISK SKP CLA RF8INT&177+5600 / PAGE /THIS CODE MAY MOVE TO "DKSTRT" RK05, 0 /RK05 HANDLER DCA I (DKSTAT /CLEAR RECALIBRATE FLAG TAD I (DKARG1 /LOW BLK # AND JOB # AND L7 DCA I (DKJOB TAD I (DKARG1 AND L7400 DCA I (DKBLOC TAD I (DKARG2 /R/W,LEN,FLD,UNIT AND L7 TAD I (DKARG2 /UNIT# * 2 + R/W + FIELD AND (4077 TAD L0400 /ENABLE INTERRUPT (SHUDDER) DCA RKECMD TAD I (DKARG3 DCA I (DKCORE TAD I (DKARG2 AND (3700 SNA AC4000 DCA PAGCNT TAD I (DKBLOC CLL RAL TAD I (DKARG4 /WATCH THE LINK! RTL RTL DCA I (DKBLOC /WE'VE COMBINED HIGH & LOW BLK #, MAYBE BIT IN LINK JMS RKEOPR /THIS ROUTINE USES LINK... JMP I RK05 RKEOPR, 0 /ENTER WITH 0 OR 2000 SZL /DO WE NEED TO BUMP SUPER ADDRESS BIT? ISZ RKECMD /IF YES DCA CHKHED /SET "CHECK HEADER" 0 OR 2000 RKELPX, DCLR /CLEAR DONE FLAG, FOR ONE THING TAD I (DKCORE /CORE ADDRESS DLCA TAD PAGCNT AND L7600 SNA CLA /HALF BLOCK? TAD L0200 /YUP TAD CHKHED CLL RAR TAD RKECMD DLDC TAD I (DKBLOC DLAG /DO IT! JMP I RKEOPR RK5SRV, TAD I (DKSTAT SZA CLA /ARE WE DOING A RECALIBRATE? JMP RKEXXX /YES DRST CLL RAL SZA CLA JMP RKEBAD /GOT AN ERROR TAD PAGCNT TAD L7600 SPA SNA JMP RKEDUN DCA PAGCNT TAD I (DKCORE TAD L0400 /BUMP CORE ADDRESS DCA I (DKCORE TAD I (DKBLOC CMA CLL /WATCH THE LINK AND (37 SZA CLA /SEE IF WE CROSS A TRACK BOUNDARY AC2000 /IF NOT, SET "DON'T CHECK HEADER" ISZ I (DKBLOC /IF THIS OVERFLOWS, SET LINK SKP CML JMS RKEOPR L1DIS RKEXXX, ISZ I (DKSTAT JMP RKEER2 RKERET, ISZ I (DKTRY JMP I (DKRETR DCLR JMP I (DKERR RKEBAD, AC7776 DCA I (DKSTAT DRST DCA I (ERSTAT DCLR AC0002 RKEER2, DCLR TAD RKECMD AND L7 /GET DRIVE # TAD (600 /ENABLE INTERRUPT ON SEEK DONE DLDC L1DIS RKEDUN, CLA CLL DCLR /KILL THAT FLAG! JMP I (DKDONE RKECMD, 0 PAGCNT, 0 CHKHED, 0 / PAGE /THIS CODE MAY MOVE TO "DKSTRT" RF08, 0 /RF08 HANDLER TAD I (DKARG1 AND L7 /GET # OF JOB REQUESTING OPERATION DCA I (DKJOB TAD I (DKARG2 AND L70 /GET FIELD BITS TAD (500 /ENABLE INTERRUPT (SHUDDER) DIML AC7777 TAD I (DKARG3 /GET ADDRESS-1 DCA RF08T TAD I (DKARG2 CLL RAL /R/W TO LINK AND L7600 /# OF WORDS TO TRANSFER IN AC SZA /DON'T CLOBBER LINK WITH CIA! CIA DCA I (7750 TAD RF08T DCA I (7751 TAD I (DKARG4 /GET HIGH BLOCK BITS DXAL RTL /R/W TO BIT 10 TAD (DMAR DCA RFINST /6603 OR 6605 TAD I (DKARG1 AND L7400 /GET LOW BLOCK BITS RF08T, RFINST, 0 /GO! JMP I RF08 RF8ERR, 6616 /GET ERROR BITS DCA I (ERSTAT DCMA /CLEAR FLAG ISZ I (DKTRY /TRIED 3 TIMES? JMP I (DKRETR /NOT YET JMP I (DKERR /GIVE UP RF8SRV, DCMA /CLEAR FLAG JMP I (DKDONE /LINK MUST = 0 HERE! BATTST, 0 /CALL TO SEE IF RUNNING FROM BATCH TAD I (SBT /OR IF COMMANDS IN SYS FILE SNA JMP .+4 /NOTHING TAD (-EDITWA /EDITOR SCRATCH AREA SZA /COUNTS AS NOTHING ALSO TAD (EDITWA /RESTORE REAL BLOCK # TO BINARY DCA BATFLG TAD BATFLG SZA CLA /SETUP PROPER LINE-GETTER TAD (BATINP-USRINP TAD (USRINP DCA LININP TAD BATFLG SZA CLA AC0002 /BUMP PAST LINE NUMBER IF BATCH DCA LINBEG TAD BATFLG SNA CLA EXIT BATTST /DONE IF NOT BATCH AC0002 /SET UP IFN FOR BATCH INPUT CALL KPTRST TAD (200 /ONE BLOCK,READ,FIELD 0 DCA I OLDW0 TAD (BATBFR /WOULDN'T THE CAPED CRUSADER LOVE THIS? DCA I OLDW1 DCA I OLDW3 TAD BATFLG CLL RTR RTR DCA I OLDW4 TAD I OLDW4 RAR AND OL7400 DCA I OLDW5 /KSPLIT REALLY DOES THIS FASTER TAD I OLDW4 AND (377 DCA I OLDW4 EXIT BATTST / PAGE NXTPAG, TAD QUESTN SNA CLA JMP I [GETRUN IAC CALL KCDOIO VERSNO-1 XXX NXTJOB, TAD JOBCTR /SET UP TO ASK FOR NEW NUMBERS TAD KNJOBS SNA CLA JMP I [GETRUN TAD JOBCTR /MAKE A MESSAGE STRING TAD (121 DCA I (MSJOBX /WITH THE JOB NUMBER (0-7) AC0001 CALL KCDOIO /CHANGE THIS ONE? MSJOB-1 XXX CALL LININP CALL (GETC SNA JMP BMPJOB /CR MEANS LEAVE ALONE TAD (-270 /CR MEANS LEAVE AS ZERO SMA JMP NOGOOD /HA MOOCH? TAD (10 SPA JMP NOGOOD /LESS THAN ZERO NOT ALLOWED DCA INTEMP /STORE THE OCTAL TAD (JOBTBL /FIND THE ENTRY IN THE JOB TAD JOBCTR /STATUS TABLE DCA JOBPTR CDF 20 /PRESENTLY IN FIELD 2 TAD I JOBPTR /MAY BE GOOD STUFF IN IT AND (7770 TAD INTEMP /JUST CHANGE LOW BITS DCA I JOBPTR /RESTORE CDF 00 BMPJOB, ISZ JOBCTR JMP NXTJOB JOBCTR, 0 INTEMP, 0 WRNGJB, CALL KEROR WRNGJS-1 7600 NOGOOD, CALL KEROR /ILLEGAL NUMBER OF JOBS ILLJOB-1 NXTJOB FGND, CALL KEROR /NOT WITH FGBG RUNNING YOU DON'T! FGNDMS-1 7600 BNNOG, CALL KEROR /BAD BINARY BADPRG-1 GETRUN GUESIT, 0 /HERE TO GUESS LOGICAL UNIT FOR LPTSPL AC0001 CALL KCDOIO /WARN HIM TOO GET READY WHCHUN-1 XXX CALL LININP DCA I PREASI NXTGES, CALL (GETC SNA /END OF LINE? EXIT GUESIT /MUST BE TAD (-272 /TRY FOR DIGIT SMA JMP BADGES TAD (12 SPA JMP BADGES DCA GTEM TAD I PREASI CLL RTL /MULTIPLY PREVIOUS PART BY 10 TAD I PREASI RAL TAD GTEM DCA I PREASI JMP NXTGES /KEEP ADDING IN UNTIL HE GIVES UP BADGES, CALL KEROR /BAD GUESS BUDDY ILLJOB-1 GUESIT+1 GTEM, 0 PREASI, 0 GETRUN, TAD (SBT-1 /ZERO OUT SBT TABLE DCA 13 TAD (-10 DCA 14 DCA I 13 ISZ 14 JMP .-2 AC0001 CALL KCDOIO ENTRMS-1 XXX CALL LININP /GET THE BIG COMMAND LINE CALL (GETC /ANYTHING THERE? SNA CLA JMP .+3 /NO, RUN SCRATCH AREA CALL (BACK1 JMP I (RUN TAD (COMPWA DCA I (SBT JMP I (JOBSET / PAGE /SCANS THE COMMAND LINE FOR UP TO A SIX-CHARACTER NAME. NAME /TERMINATORS ARE: SLASH, COMMA, OR END-OF-LINE. A SPACE CAN ALSO /BE A TERMINATOR FOR THE FIRST NAME ON A LINE (I.E., THE COMMAND). / GETNAM, 0 /GET A FILE NAME DCA NAM1 DCA NAM2 DCA NAM3 DCA NAMSW TAD (-7 DCA PTF0 GTNMCH, JMS ONECHR /GET CHAR, CHECK IT FOR SPECIAL CASES TAD (13 /TEST FOR BLANK SNA SPSW, JMP GTNMCH /"JMP NONAME" OR "JMP GTNMCH" TAD (240 AND OLD77 DCA NAMCHR TAD NAMSW /BEEN HERE BEFOR SNA ISZ GETNAM /NO, BUMP RETURN CLL RAR /LOW BIT INTO LINK TAD (NAM1 DCA NAMPTR TAD NAMCHR TAD I NAMPTR SZL JMP LOWNAM /IF CHAR COUNT IS ODD, LOWER CALL OLDBSW /OTHERWISE UPPER CHAR ISZ PTF0 SKP JMP SCNCLA LOWNAM, DCA I NAMPTR /STORE IT ISZ NAMSW /BUMP COUNT JMP GTNMCH SCANSP, JMS ONECHR /GOTTEN 6, SCAN TO DELIM SCNCLA, CLA JMP SCANSP ONECHR, 0 /GET A CHAR FOR NAME, CHECK FOR +,-./ DELIMITERS JMS GETC SNA JMP NONAME TAD (-260 CLL TAD (5 SNL JMP I ONECHR NONAME, JMS I [BACK1 JMP I GETNAM NAMPRE, 0 NAMCHR, 0 NAMSW, 0 NAMPTR, 0 USRINP, 0 /ROUTINE TO CALL TO REQUEST LINE OF CALL KCDOIO /COMMANDS FROM KEYBOARD LINE-1 JMP PREERR TAD LINBEG DCA CHARP EXIT USRINP BATINP, 0 /CALL TO GET COMMAND LINE FROM BATCH FILE AC0002 /CHANNEL 2 CALL KRDOIO LINE-1 JMP PREERR /END OF FILE? AC0001 /NOW GET RID OF THE LINE NUMBER TAD I (LINE DCA I (LINE+1 TAD LINBEG DCA CHARP AC0001 CALL KCDOIO /ECHO THE INPUT LINE /LINE-1+1 XXX EXIT BATINP PREERR, JMS BEATIT PREEND-1 7600 GETC, 0 /CALL TO GET A SINGLE CHARACTER TAD (LINE CALL KGETC CHARP, 0 ISZ CHARP SNA EXIT GETC /EOL TAD (-1 /IGNORE BLANKS SNA JMP GETC+1 TAD (240 EXIT GETC BACK1, 0 AC7777 TAD CHARP /ON YOUR HONOR NOT TO BACK UP DCA CHARP /PAST THE BEGINNING OF THE LINE EXIT BACK1 BEATIT, 0 /GENERAL ERROR MESSAGE ROUTINE TAD I BEATIT /ADDR OF NASTY MESSAGE FOLLOWS CALL ISZ BEATIT DCA .+5 TAD I BEATIT /AS DOES ERROR RECOVERY ADDR IF DCA BEATIT /NOT IN BATCH MODE AC0001 CALL KCDOIO HLT XXX TAD BATFLG /GIVE HIM ANOTHER CHANCE? SNA CLA EXIT BEATIT /TO FORGIVE IS DEVINE JMP I OL7600 /IF YOU'VE GOT THE ROOM / PAGE /ROUTINE TO DO LOOKUPS ON PS/8 DIRECTORIES /CALL: /JMS LOOKUP /POINTER-1 TO NAME /NOT FOUND RETURN /FOURND RETURN, ST. BLK. # IN AC, LENGHT IN "FILSZ" / /PROGRAM MUST HAVE PREVIOUSLY SET UP: /UINT=PHYSICAL UNIT # /DAVICE=DEVICE HANDLER ADDRESS /DBLOCK=0 /DIRECT=ADDRESS OF WHERE TO PUT THE DIRECTORY BLOCK READ IN (FIELD 0) / XXR=10 XXR1=12 XXR2=11 LOOKUP, 0 TAD I LOOKUP DCA PTNAME ISZ LOOKUP JMS MRDCAT JMS MDSRCH JMP I LOOKUP TAD SBLOCK CIA TAD I PDORG ISZ LOOKUP JMP I LOOKUP / MRDCAT, 0 SZA JMP MRDREN DCA SBLOCK DCA FILSZ CLA IAC MRDREN, TAD DAVICE /FORM A UNIQUE VALUE FOR EACH DEVICE'S DIRECTORY BLOCKS CIA TAD DBLOCK SNA JMP INLRDY CIA TAD DBLOCK DCA DBLOCK JMS MREADC INLRDY, TAD I PDCNT DCA NFILES TAD PDWSTE DCA XXR JMP I MRDCAT MDSRCH, 0 FSRCLP, TAD PTNAME DCA XXR2 TAD KM4 DCA CT TAD I XXR SNA JMP SKPMTF SKP SRCWDL, TAD I XXR CIA TAD I XXR2 SZA CLA JMP NXTFIL ISZ CT JMP SRCWDL JMS BUMPXR TAD I XXR SNA JMP SKPMTF+1 DCA FILSZ ISZ MDSRCH JMP I MDSRCH NXTFIL, TAD CT IAC JMS BUMPXR SKPMTF, TAD I XXR TAD SBLOCK DCA SBLOCK ISZ NFILES JMP FSRCLP DCA SBLOCK TAD I PDLINK SZA JMP MRDREN JMP I MDSRCH / BUMPXR, 0 TAD I PDWSTE CIA TAD XXR DCA XXR JMP I BUMPXR / MREADC, 0 TAD (200 TAD UNIT DCA DIOCTL TAD DBLOCK AND OLD7 JMS I KSPLIT JMS I DAVICE DIOCTL, 0 DIRECT 0 TAD I PDCNT /QUICK CHECK FOR LEGAL DIRECTORY TAD (100 SPA CLA JMP I (BADDIR TAD I PDLINK AND (7770 SZA CLA JMP I (BADDIR JMP I MREADC / SBLOCK, 0 CT, 0 NFILES, 0 PTNAME, 0 NOFILE, CALL KEROR NOFLMS-1 GETRUN / PAGE /THE "RUN" COMMAND PROCESSOR. /RUN WITH NO ARGS: RUNS THE LAST COMPILED DIBOL BINARY. RUN, TAD KSYS DCA DAVICE DCA RUNORG DCA UNIT DCA DBLOCK JMS I [GETNAM JMP DEFAU TAD (BINEXT RLOP, DCA NAM4 JMS I [LOOKUP NAM1-1 JMP I (NOFILE SKP DEFAU, TAD (COMPWA DCA I (SBT NWRITF, TAD (SBT /FORM FILE LIST DCA 13 TAD (-7 DCA FILCNT /MAX NUMBER OF FILES (7+BIN) GFILES, CALL (GETC SNA JMP GOBACK /END OF FILE LIST TAD (-257 ESNA, SNA GOBACK, JMS I [BACK1 TAD (4 SNA CLA /IS IT "+"? JMP KEEPOL /YES - KEEP OLD EXTENSION TAD (0123 /NO - PUT IN .AS DCA NAM4 KEEPOL, JMS I [GETNAM /GET NAME OF FILE JMP I (JOBSET ISZ FILCNT JMP LUKN BDCOM, CALL KEROR BADCOM-1 GETRUN LUKN, JMS I [LOOKUP NAM1-1 JMP I (NOFILE /NOT FOUND DCA I 13 JMP GFILES RUNORG, 0 DOSPL, TAD (-10 /SAVE THE SYS FILE STARTING CALL KMOVE /BLOCKS CDF RSFLD SBT-1 MSBT-1 / MULTI-SBT? TAD I (LPALOC SZA CLA /SEE IF WE'RE USING LPT DCA I OLDU0 /"THIS WILL MAKE $LPTSP UNIT UNDEFINED..." PTMOV, TAD (-FILMAX-1 /NOW SAVE THE LOGICAL UNITS TABLE DCA XXR /ADDING AN EXTRA WORD FOR LATER TAD (PFT-1 DCA XXR1 TAD (SYSPFT-1 DCA XXR2 PTMOVX, AC7776 /THREE TO MANY WORD GROUP CONVERSION DCA FILCNT CDF 00 TAD I XXR1 /PICK UP HANDLER ADDRESS DCA RUNORG TAD RUNORG AND (7770 TAD (-RK8 /ALLOW ONLY DISKS SNA CLA TAD RUNORG CDF RSFLD DCA I XXR2 PTMOVL, CDF 00 TAD I XXR1 CDF RSFLD DCA I XXR2 ISZ FILCNT /DONE GROUP? JMP PTMOVL /NOPE TAD XXR2 /BUMP PAST LABEL ETC. TAD (TFTSIZ-3 DCA XXR2 ISZ XXR /MAYBE EVEN MORE JMP PTMOVX CDF 20 TAD I (LPTBUF+14 /USE USER JOBSIZE TO SET SUBSCRIPT CLL RAL /LIMITS *2 FOR BYTES DCA FILCNT /TEMP STORAGE TAD I (LPTBUF+13 /HIGH ORDER PART RAL DCA RUNORG CDF RSFLD TAD FILCNT /STORE AS COMPLEMENT CLL CMA /FIRST ILLEGAL BYTE DCA I (SSLIM2 CML RAL TAD RUNORG CIA DCA I (SSLIM1 DSKCLR, DCLS CDF 20 TAD KNJOBS /MAY JUST NEED TO KNOW THIS DCA I (NJOBS CIF 20 JMP I .+1 /MOVE UP TO MOVE DOWN MOVDWN FILCNT, 0 / PAGE BADDIR, CALL KEROR ZAPDIR-1 7600 SCANER, 0 CALL (GETC SNA JMP NOSWT TAD (-"/ SZA CLA JMP NOSWT CALL [GETNAM SKP CLA TAD NAM1 NOSWT, DCA I (SWITCH EXIT SCANER CORSUM, CDF 0 TAD I (TOPFLD /HAVE TOTALED MEMORY REQUIREMENTS AND OLD70 /NOW SEE IF IT FITS CLL RTR /FORM 15 BIT CORE SIZE RAR IAC /ADD IN SIZE OF HIGH FIELD DCA XCORHI TAD I (KLOCOR CIA /DOUBLE PRECISION SUBTRAC DCA XCORLO CML RAL TAD I (KHICOR CIA TAD XCORHI DCA XCORHI SNL /LINK TELLS THE STORY JMP MORCOR /QUICK, CALL YOUR SALESMAN!! TAD (AVCOR1 /JUST SQUEAKED IT IN, REPORT LEFTOVERS JMS COROUT TAD QUESTN /ARE WE ON SPEAKING TERMS? SNA CLA JMP I (STLMOR /NO, DONT BOTHER WITH REPORT AC0001 CALL KCDOIO AVCOR-1 XXX JMP I (STLMOR MORCOR, TAD XCORLO /TOO BIG, TOO BAD CIA CLL DCA XCORLO /DOUBLE PRECISION COMPLEMENT FOR COROUT CML RAL TAD XCORHI CIA DCA XCORHI TAD (NMOR1 /LET HIM KNOW HOW MUCH TOO BIG JMS COROUT AC0001 CALL KCDOIO BUYMOR-1 XXX CALL KEROR NMOR-1 GETRUN XCORLO, 0 XCORHI, 0 / CALL WITH POINTER IN AC TO OUTPUT 15 BIT CORE SIZE AS / ' NNK AND NNNN LOCS.' POINTER IS TO WORD WITH NN (K). / ROUTINE FILLS IN THE CORRECT CHARACTERS FOR THE MESSAGE COROUT, 0 /POINTER TO TEXT STRING IN AC DCA KCORPT DCA KCOROX /ZERO HIGH ORDER COUNT TAD XCORHI /OUTPUT HIGH BITS CLL RTL / MAKE 10000 = 4K CALL KOTOPD DCA I KCORPT /STORE PACKED WORD TAD XCORLO CLL TAD (-144 /BY SUCCESIVE SUBTRACTIONS SNL JMP .+3 /UNTIL THE RESULT IS NEGATIVE ISZ KCOROX /COUNT HUNDREDS JMP .-5 TAD (144 /ADD BACK IN DCA XCORLO /STORE ONES TAD (4 /BUMP TEXT POINTER TO NNNN PART TAD KCORPT DCA KCORPT TAD KCOROX /OUTPUT HUNDREDS CALL KOTOPD DCA I KCORPT /STORE WORD ISZ KCORPT TAD XCORLO /NOW THE ONES CALL KOTOPD DCA I KCORPT JMP I COROUT KCORPT, 0 KCOROX, 0 / PAGE JOBSET, CALL (SCANER TAD I (SBT /READ FIRST BLOCK OF BINARY CALL KSPLIT CALL KSYS /THESE ARE STILL AROUND 0200+20 LPTBUF 0 CDF 20 TAD (KSF7 /IN CASE THIS IS THE SECOND TIME PAST DCA I (LPTKSF TAD I (LPTBUF+2 SPA /COMPILED WITHOUT ERRORS? JMP I (BNNOG /NO YOU DUMMY CMA /-PROCN-1 CDF 10 DCA I (PROCN CDF 20 TAD I (LPTBUF+7 /LOOK AT VERSION NUMBER SLOT TAD (-VERSON SZA CLA /ONE CHANCE IN 4096 JMP I (KNOBIN /OTHERWISE, GO AWAY TAD I (LPTBUF+15 /NOW LOOK TO SEE IF LPT WILL BE USED SZA CLA TAD (SKP DCA LPALOC TAD I (LPTBUF+15 SZA CLA JMP I (LPT1 /DO ONCE ONLY FOR LPT KNOLPT, AC7777 TAD KNJOBS DCA CORCTR TAD (BASTBL-1 DCA 10 TAD (BFRTBL-1 DCA 11 CDF 20 TAD I (LPTBUF+12 /LOW ORDER SIZE OF PROGRAM DCA KLOCOR TAD I (LPTBUF+11 /HI ORDER SIZE OF PROGRAM DCA KHICOR JMS CORRND /ROUND UP TO NEXT BLOCK BOUNDARY CDF 20 CORLOP, ISZ CORCTR /DONE ALL JOBS? JMP CORFIX /NOT YET LPALOC, SKP /GETS ZAPPED IF NO LPT JMP I (CORSUM /YES, OFF TO TELL THE NEWS TAD KHICOR /IF LPT, ALLOCATE ANOTHER 400 WORD SWAP AREA CLL RTL RAL /LINK IS ZERO HERE, YOU WILL NOTICE TAD OLDCDF DCA I (BASTBL+16 TAD KLOCOR DCA I (BASTBL+17 TAD (400 TAD KLOCOR DCA KLOCOR SZL ISZ KHICOR JMP I (CORSUM CORFIX, TAD KHICOR CLL RTL /MAKE A CDF RAL TAD OLDCDF /STORE BASE ADDR OF NEXT JOB DCA I 10 TAD KLOCOR DCA I 10 TAD I (LPTBUF+14 /ADD IN SIZE OF JOB DATA AREA TAD KLOCOR DCA KLOCOR RAL /WITH CARRY TAD I (LPTBUF+13 /ADDED TO HIGH ORDER SIZE TAD KHICOR DCA KHICOR JMS CORRND /BUFFERS START AT NEXT BLOCK BOUNDARY TAD KHICOR CLL RTL RAL /MOVE FIELD BITS INTO AC6-AC8 TAD KLOCOR /PAGE BITS INTO AC0-AC4 DCA I 11 /STORE IN BFRTBL TAD I (LPTBUF+2 /GET PROC # CLL RTR RTR / TIMES 400 RAR TAD KLOCOR /ADD IN TO GET NEXT JOB BASE ADDRESS DCA KLOCOR SZL ISZ KHICOR JMP CORLOP CORCTR, 0 KHICOR, 0 KLOCOR, 0 CORRND, 0 /CALL TO ROUND UP BASE ADDRESS TO NEXT TAD KLOCOR /400 WORD BOUNDARY AND OL7400 CLL /PREVENT LOSING MATH TAD (400 DCA KLOCOR SZL ISZ KHICOR EXIT CORRND / PAGE /SET UP LPT - ONCE-ONLY LPT1, CDF 0 ISZ I (LPTKSF /CHANGE SKIP TO A CLEAR AC0001 LPT2, JMS I KCDOIO /WARN USER WHAT HE'S GETTING INTO LPTSP-1 /"LINE PRINTER OUTPUT WILL BE SPOOLED" XXX TAD KNJOBS /MAKE SURE # OF OTHER JOBS IS .LE. 7 TAD (10 SMA SZA CLA JMP NJOK TAD (-7 /IF .GT. 7, MAKE IT 7 DCA KNJOBS AC0001 /NOW CONFESS OUR DEED JMS I KCDOIO NOJOB7-1 /"THERE IS NO JOB 7" XXX NJOK, CALL (GUESIT AC0001 /NOW DO AN INIT TO GET $LPTSP INFO JMS I KINITIO 4220 LPRING KLPTC-1 CDF 20 DCA I LPRPTR /ZERO OUT PRINTER RING BUFFER ISZ LPRPTR /ON ACCOUNT OF BECAUSE IF WE DON'T ISZ LPRCTR /THE WORLD WILL COME TO AN END JMP .-3 /WHEN IT USES RANDOM WORDS FOR BUFFER LINKS TAD (LPRING DCA I LPRPTR /...PUT IN THE REAL BUFFER LINK CDF 0 TAD I OLDU2 /GET SIZE OF $LPTSP FILE CLL TAD (MAXU2 /WE HAVE ROOM TO MAP THIS MUCH SZL CLA /IS LOGICAL UNIT SIZE MORE THAN OUR BITMAP? JMP ENUFBM /NOPE - WE HAVE ENOUGH BITMAP TAD (-MAXU2 /IF SUPER BIG LOGICAL UNIT, DCA I OLDU2 /PRETEND IT'S ONLY AS BIG AS THE BITMAP ENUFBM, TAD I OLDU2 CIA / (+) SIZE NOW CLL RAR RTR /DIVIDE BY 8 AND (1777 /TO GET OFFSET TO END OF BITMAP TAD (BITMAP /ADD IN THE START DCA LPT1 TAD I OLDU2 /GET THIS MAGIC SIZE AGAIN CIA AND OLD7 /GET REMAINDER OF DIVISION BY 8 TAD (FRETAB /FORM POINTER TO MAGIC TABLE DCA LPT2 TAD I LPT2 /THIS GETS US WHAT THE LAST WORD IN THE BITMAP SHOULD BE CDF 20 DCA I LPT1 /...SO MAKE IT THAT ISZ LPT1 AC4000 DCA I LPT1 / (-) MEANS END OF BITMAP CDF 0 AC7777 TAD I OLDU1 /GET STARTING SEGMENT #-1 OF $LPTSP CDF 20 DCA I (LPSTRT /AND SAVE IT CDF 0 TAD I OLDU0 /HANDLER ADDRESS, DRIVE # AND OLD7 /GET THE DRIVE # CDF 10 DCA I (LPTUNT /SAVE DRIVE # FOR INIT TAD I (LPTUNT /GET IT BACK AGAIN TAD (200 /SET 1-BLOCK READ CDF 20 DCA I (GLPTCT /SET LPTSPL GETTER CONTROL WORD TAD (400+7 /JOB 7 BECOMES LPTSPL JOB IFNZRO LPTBIT-L0400 /CHANGE THE ABOVE DCA I (LPTJOB TAD (CIF CDF 0 DCA I (J7STAK TAD (LPTSPL DCA I (J7STKX DCA I (LPTRUN /SET UP TO ALLOCATE A SWAP AREA TAD (DSKQ /SOMEDAY, THIS OUGHT TO CHECK, DCA I (GSPLDV /BECAUSE $LPTSP MIGHT BE ON DTA... TAD I (GSPLDV CDF 10 DCA I (SPLDEV /SAME FOR LPTSPL WRITER CODE CDF 0 JMP I (KNOLPT /GO AWAY AND PRETEND THIS NEVER HAPPENED KNOBIN, CDF 00 CALL KEROR KNOBN-1 GETRUN FRETAB, 377 /WHAT LAST WORD IN BITMAP SHOULD BE 001 /UNDER ANY POSSIBLE CONDITIONS 003 007 017 037 077 177 LPRCTR, 7401 LPRPTR, LPRING / PAGE STLMOR, CDF 20 TAD I (LPTBUF+6 / # SYMBOLS CDF RSFLD CLL RAL / TIMES 2 IAC / PLUS 1 FOR WORD COUNT DCA I (LITADD /LITERALS FOLLOW SYMBOLS CDF 20 TAD I (LPTBUF+4 /SIZE OF LITERALS CDF RSFLD DCA I (PC /PLUS SYMBOLS IS START OF CODE TAD I (PC DCA I (T1 /FOR LOADER CDF 20 TAD I (LPTBUF+3 /HIGH ORDER LITERALS CDF RSFLD CLL RTL RAL TAD STLCDF DCA I (PCFLD TAD I (PCFLD DCA I (PRGCDF /FOR LOADER STLCDF, CDF 00 AC0001 TAD I (SBT /NOW SET UP FAKE FILE ENTRY CALL KSPLIT /FOR THE LOADER CDF RSFLD DCA I (W5 /LOW ORDER BLOCK SKP /NEXT WORD FILLED IN BY SPLIT 0 TAD .-1 DCA I (W4 /HIGH ORDER BLOCK # CDF 20 TAD I (BASTBL CDF RSFLD /SET UP PHONEY JOB AREA FOR LOADER DCA I (USRFLD CDF 20 TAD I (BASTBL+1 CDF RSFLD DCA I (USRBAS CDF 00 TAD I (SWITCH /LOOK FOR /T SWITCH AND (7700 TAD (-2400 SNA CLA IAC /IF ON CHANGE WORD TO CLA IAC TAD (CLA CLL CDF RSFLD DCA I (HERET /STORE IN TRACE TRAP CDF 00 JMP I (DOSPL / PAGE WRNGJS, -13 /ILLEGAL OPTION SWITCH 5255;5546;5042 5501;6061;6552 6057;0164;7052 6544;5100 VERSNO, -22 /COS 300 MULTI-TERMINAL VERSION N.NN 4460;6401;2421 2101;5666;5565 5216;6546;6356 5257;4255;0167 4663;6452;6057 VN2+121;VN1+1721;VN0^100+2100 0000 /JUST IN CASE MSJOB, -20 /LOGICAL NUMBER FOR TERMINAL N? 5560;5052;4442 5501;5766;5643 4663;0147;6063 0165;4663;5652 5742;5501 MSJOBX, 0 4000 NMOR, -27 /AVAILABLE CORE EXCEEDED BY NK AND XXXX LOCS. 4267;4252;5542 4355;4601;4460 6346;0146;7144 4646;4546;4501 4372;0101 NMOR1, 0 5401;4257;4501 0 0 0155;6044;6417 AVCOR, -27 /FREE CORE REMAINING TOTALS NK AND XXXX LOCS. 4763;4646;0144 6063;4601;6346 5642;5257;5257 5001;6560;6542 5564;0101 AVCOR1, 0 5401;4257;4501 0 0 0155;6044;6417 KNOBN, -12 /ILLEGAL BINARY FILE 5255;5546;5042 5501;4352;5742 6372;0147;5255 4600 LPTSP, -22 /LINEPRINTER OUTPUT WILL BE SPOOLED 5552;5746;0161 6352;5765;4663 0160;6665;6166 6501;7052;5555 0143;4601;6461 6060;5546;4500 BUYMOR, -12 /INSUFFICIENT MEMORY! 5257;6466;4747 5244;5246;5765 0156;4656;6063 7202 ILLJOB, -7 /ILLEGAL NUMBER 5255;5546;5042 5501;5766;5643 4663 NOFLMS, -7 /FILE NOT FOUND 4752;5546;0157 6065;0147;6066 5745 NOJOB7, -11 /THERE IS NO JOB 7 6551;4663;4601 5264;0157;6001 5360;4301;3000 BADCOM, -7 /TOO MANY FILES 6560;6001;5642 5772;0147;5255 4664 FGNDMS, -14 /IMPROPER BACKGROUND JOB 5256;6163;6061 4663;0143;4244 5450;6360;6657 4501;5360;4302 ZAPDIR, -7 /BAD DIRECTORY 4342;4501;4552 6346;4465;6063 7201 KLPTC, 0555 / $LPSPL 6164 6155 BADPRG, -6 /BAD PROGRAM 4342;4501;6163 6050;6342;5600 ENTRMS, -20 /ENTER PROGRAM AND DATA FILENAMES 4657;6546;6301 6163;6050;6342 5601;4257;4501 4542;6542;0147 5255;4657;4256 4664 PREEND, -12 /BAD CONTROL COMMAND 4342;4501;4460 5765;6360;5501 4460;5656;4247 4500 WHCHUN, -24 /ASSIGN LOGICAL UNIT FOR PRINTER SPOOLING 4264;6452;5057 0155;6050;5244 4255;0166;5752 6501;4760;6301 6163;5257;6546 6301;6461;6060 5552;5750 / PAGE / BUFFER FOR BATCH INPUT COMMAND FILE BATBFR, ZBLOCK 400 / / FIELD 0 / END SECTION 1 LISTING CONTROL IFNZRO LIST&2 //////////////////////////////// / / / END OF MULTI1.PA / / / ////////////////////////////////