!***COPYRIGHT (C) 1974, 1975, 1976, 1977 DIGITAL EQUIPMENT CORP., MAYNARD, MASS.*** MODULE MCSGEN(SREG = #17, FREG = #16, VREG = #15, MLIST, TIMER=EXTERNAL(SIX12), FSAVE)= BEGIN GLOBAL BIND GEN = 1; REQUIRE MGNMAC.BLI; REQ (MGNEXT); REQ (MGNMC2); EXTERNAL PUTBLK, GETBLK, MOVE, ZAPMISC, GETWORD, FIN, WCORMISC, RCORMISC, ?.JBFF, ?.JBREL, MISCDEFFLAG; REQ (MGNPRG); REQ (MGNREL); GLOBAL ROUTINE MCSGEN = BEGIN MAP ROOTFORMAT ROOT; ! COMMAND DEFINATIONS: BIND COMMANDS=PLIT( %MAKE VERB% 'MAKE', MAKE, %DISPLAY VERB% 'DISPL', DISPLAY, %MODIFY VERB% 'MODIF', MODIFY, %DELETE VERB% 'DELET', DELETE, %PRINT VERB% 'PRINT', PRINT, %WRITE VERB% 'WRITE', WRITE, %READ COMMANDS% 'READ', READ, %SET VERB% 'SET', XSET, %EXCHANGE VERB% 'EXCHA', EXCHANGE, %WHAT VERB% 'WHAT', WHAT, %HELP VERB% 'HELP', HELP, '??', HELP, %EXIT VERB% 'EXIT', STOP, %NULL VERB% 0, XNULL %END OF COMMAND TABLE%); ! ROUTINE GETRTN ! ======= ====== ! GATHERS A COMMAND VERB FROM THE COMMAND BUFFER ! RETURNS VREG = TRUE IF GOOD COMMAND ELSE FALSE ! EXECUTE SET TO APPROPRIATE ROUTINE ADDRESS IF GOOD COMMAND ELSE ! IF UNKNOWN COMMAND THEN 0 ELSE -1 FOR NON-UNIQUE ROUTINE GETRTN= BEGIN REGISTER SIZE,SWITCH; IF .CCHAR EQL "/" THEN (ADV(CMDBUFF,CMDBPTR,CMDCOUNT,CCHAR); SWITCH _ FALSE) ELSE SWITCH _ TRUE; SWITCH _ NOT .SLASHSEEN OR .SWITCH; IF (SIZE _ GATHER(CMDLINE,CCHAR,ACCUM,5)) GTR 5 THEN SIZE _ 5; IF .SIZE EQL 0 THEN ! IF NOTHING GATHERED THEN ILLEGAL CHARACTER BEGIN ERROR( 7 ); EXECUTE _ XNULL; RETURN TRUE END; IF SEARCHTABLE(COMMANDS,ACCUM,.SIZE,1,EXECUTE) THEN BEGIN IF .SWITCH THEN TRUE ELSE IF .EXECUTE NEQ HELP THEN FALSE ELSE TRUE END ELSE BEGIN FALSE END END; LABEL BLOOP; ! MAIN LINE CALLI( 0, 0 ); ! RESET THE WORLD! ! OUTPUT TITLE AND VERSION OUTS('MCSGEN '); OUTO(.VER); IF .VER NEQ 0 THEN OUTC(.VER+"A"-1); OUTC("("); OUTO(.VER); OUTC(")"); IF .VER NEQ 0 THEN (OUTC("-"); OUTO(.VER)); CRLF;CRLF; ! INITIALIZE THE TABLES SA _ ( .?.JBFF + #200 ) AND NOT #177; IF .SA GTR .?.JBREL THEN !GET MORE CORE IF REQ'D BEGIN REGISTER FF; FF _ .SA; IFSKIP CORE(FF) THEN ELSE BEGIN ERROR( 63 ); XIT END END; ?.JBFF _ .SA; ! START AT THE COMPUTED START ADDRESS (SA) PORTTAB _ 0; MPPTAB _ 0; TERMTAB _ 0; SHOW _ TRUE; ZAPMISC(); ZERO( ROOT, ROOT + N0SIZE - 1 ); ROOT[ N0LEVEL ] _ - 1; ! SINCE PRIM LEVEL IS 0 ROOT'S LEVEL IS -1 ! MAIN LOOP ! IF .CCL THEN RELOAD(); ! IF CCL ENTRY RELOAD CORE REPEAT ! WHILE THE USER WANTS TO TALK TO US DO BEGIN IF NOT .CCL THEN ! IF CCL THEN DON'T READ THE FIRST LINE TO EXECUTE FROM THE TTY BEGIN ERRORFLG _ FALSE; ! RESET THE ERROR FLAG PROMPT; ! TELL THE USER WE WANT HIM TO TALK TO US CCHAR _ INPUT(CMDLINE,CMDLINELENGTH); ! ACCEPT HIS RESPONSE AND GET THE FIRST CHARACTER FIRST _ TRUE; END ELSE CCL _ FALSE; BLOOP: REPEAT BEGIN DCHANNEL _ TTYCHANNEL; ! MAKE SURE WE TALK TO THE CONTROLLING TTY IF NEWCMD(CCHAR) AND NOT .FIRST THEN ADV(CMDBUFF,CMDBPTR,CMDCOUNT,CCHAR); IF EOL(CCHAR) OR COMMNT(CCHAR) THEN LEAVE BLOOP; ! ALL DONE IF GETRTN() THEN (.EXECUTE)() ! DECODE COMMAND AND EXECUTE IF GOOD ELSE BEGIN ERROR(IF .EXECUTE EQL 0 THEN 5 ELSE 10); ! OTHERWISE COMPLAIN LEAVE BLOOP END; IF.ERRORFLG THEN LEAVE BLOOP; ! IF ERROR IGNORE THE REST OF THE LINE FIRST _ FALSE END END END; END; ! END OF MGNGEN.BLI