ASMB,R,L,C
      HED "REA.C" FMGR INPUT ROUTINE 1-78 (DLB) 
*     NAME:   REA.C 
*     SOURCE: 92067-18208 
*     RELOC:  92067-16185 
*     PGMR:   G.A.A., D.L.B.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM REA.C,8 92067-16185 REV.2026 800428 
      ENT REA.C 
      EXT READF,MSS.,WRITF,$TIME,.MVW 
      EXT .E.R.,CAM.I,TTY.,ECH.,C.BUF,IFBRK 
      EXT REIO,PCIBF
      SPC 1 
      EXT TPSK.,NXTK.,EDSK.,CRSK.,C.TAB 
A     EQU 0 
B     EQU 1 
      SPC 1 
* PURPOSE:
*      THIS SUBROUTINE DOES ALL COMMAND INPUT FOR THE FMGR PROGRAM. 
*   IF THE INPUT IS FROM A TRANSFER FILE (NON-TERMINAL) ALL COMMANDS
*   ARE IN THE STANDARD FMGR INPUT REQUIREMENTS.  IF INPUT IS FROM
*   A TERMINAL (TTY. = 1) THERE ARE SEVERAL NEW FEATURES ADDED AS 
*   TYPING AIDS.
* 
*    1).  ALL FMGR COMMANDS "EXECUTED" FROM A KEYBOARD ARE PUT INTO 
*   INTO A "COMMAND STACK" (RESIDENT IN FMGR MODULE) SO THAT THEY 
*   CAN BE DISPLAYED, MODIFIED AND EXECUTED LATER.  THE MODIFY COMMANDS 
*   WERE DELIBERATELY CHOSEN TO BE A SUBSET OF THE "EDITR" COMMANDS.  
*   THE FOLLOWING IS A LIST OF THE COMMANDS THAT CAN BE USED TO 
*   EDIT THE "COMMAND STACK". 
* 
*    :Ln   "n" IS NUMBER OF LINES TO LIST. IF :L  THEN WHOLE COMMAND STACK. 
*    :P    DISPLAY PENDING LINE WITH SAME OPTIONS AS EDITR. (CNTL I,S,T,R,C)
*    :n    POSITION PENDING LINE TO THE "n"TH LINE IN COMMAND STACK.
*    :^n OR :Rn  POSITION n LINES PRECEDING PENDING LINE. 
*    :/n   POSITION n LINES PAST PENDING LINE.
*    :-n   DELETE n LINES FROM COMMAND STACK FROM THE PENDING LINE. 
* 
*   ONCE A LINE FROM THE COMMAND STACK HAS BEEN DISPLAYED AS THE
*   "PENDING" LINE, IT MAY BE EXECUTED BY TYPING A LONESOME CARRIAGE
*   RETURN (TLOG = 0 RETURN FROM EXEC).                             
* 
*   2).  ALL INPUT FROM A KEYBOARD THAT IS NOT A LEGAL "FMGR" COMMAND 
*   OR A COMMAND STACK COMMAND WILL HAVE A  :RU,  PLACED IN FRONT OF
*   THE INPUT STRING AND PASSED ON AS A "RUN" COMMAND.  THIS "IMPLIED 
*   RUN" FEATURE MAKES THE SYSTEM SEEM MORE HOMOGENEOUS TO NEW USERS
*   WHO HAVE DIFFICULTY UNDERSTANDING THE DIFFERENCE BETWEEN A
*   "PROGRAM" AND A "FMGR" COMMAND.  IT ALSO REDUCES THE TYPING FOR AN
*   EXPERIENCED RTE USER A SURPRISING AMOUNT. 
* 
*   3).  AN AGING FEATURE IS PLACED ON THE "COMMAND STACK" BY ELIMINATING 
*   DUPLICATE ENTRIES.  BEFORE A NEW COMMAND IS PLACED AT THE BOTTOM  
*   OF THE STACK, ALL THE OTHER ENTRYS ARE CHECKED FOR DUPLICATION AND
*   DELETED IF NECESSARY.  THIS WAS DONE TO KEEP THE BOTTOM OF THE
*   STACK AS "FRESH" AS POSSIBLE -- REPRESENTING THE LATEST DIFFERENT 
*   COMMANDS EXECUTED.
* 
*   4).  THE COMMAND STACK IMPLEMENTS A MECHANISM FOR DISPLAYING COMMANDS 
*   THAT ARE PASSED TO THE "FMGR" TO BE EXECUTED FROM THE STRING BUFFER 
*   PASSED FROM A SCHEDULE REQUEST OR RETURNED FROM A "RUN'ED PROGRAM". 
*   THIS FEATURE MAKES IT MUCH EASIER TO UNDERSTAND THE AN ERROR
*   MESSAGE THAT MAY APPEAR WHEN EXECUTING A STRING BUFFER.  THE
*   COMMAND THAT CAUSED THE ERROR MAY BE DISPLAYED BY TYPING  :P .
* 
*   5).  A "NULL" COMMAND (::FILENA), I.E. THE "IMPLIED TRANSFER" 
*   COMMAND IS NOT PLACED INTO THE COMMAND STACK BECAUSE IT WAS 
*   NOTICED THAT "SOFT KEYS" FROM 26XX TERMINALS OFTEN USE THIS 
*   COMMAND TO LOAD UP SOFT KEYS AND EXECUTE SOMETHING.  PLACING
*   THESE "NULL" TRANSFER COMMANDS IN THE COMMAND STACK SIMPLY
*   CLUTTERS UP THE COMMAND STACK.  IF IT IS DESIRED TO HAVE THESE
*   COMMANDS PUT INTO THE COMMAND STACK, THE FORMAL  :TR,FILENA  COMMAND
*   MAY BE PLACED IN THE SOFT KEYS. 
* 
* TEST PROGRAM: 
**    ASMB,R,L
**          NAM TES,3 TEST PROGRAM FOR "REA.C" FMGR SUBROUTINE 780503 
**          ENT MSS.,.E.R.,CAM.I,TTY.,ECH.,C.BUF
**          ENT TPSK.,NXTK.,EDSK.,CRSK. 
**          EXT T0DCB,EXEC,REA.C,RMPAR
**          SPC 1 
**    BEGIN JSB RMPAR 
**          DEF *+2 
**          DEF LU
**          JSB T0DCB 
**          DEF *+4 
**          DEF CAM.I     DCB 
**          DEF .E.R. 
**          DEF LU
**          CLA,INA 
**          STA TTY.
**    BEGI1 JSB REA.C     GO DO INPUT 
**          DEF *+1 
**          JSB EXEC      NOW WRITE OUT THE INPUT BUFFER
**          DEF *+5 
**          DEF O2
**          DEF LU
**          DEF C.BUF 
**          DEF ECH.
**          JMP BEGI1 
**          SPC 1 
**    NXTK. DEF BUF 
**    CRSK. DEF *+2 
**    TPSK. DEF *+1 
**          OCT 1 
**          ASC 1,**
**    BUF   OCT 400 
**          BSS 170 
**    EDSK. DEF *-1 
**          SPC 1 
**    C.BUF BSS 36
**    CAM.I BSS 144 
**    .E.R. NOP 
**    MSS.  NOP 
**          HLT 0 
**    ECH.  NOP 
**    O7    OCT 7 
**    LU    BSS 5 
**    O2    OCT 2 
**    TTY.  NOP 
**          END BEGIN 
      SPC 1 
DFDSP DEF DSPLY     POINTER INTO DISPLAY BUFFER 
DSPLN NOP           CURRENT DISPLAY BUFFER LENGTH IN WORDS
      ASC 1,          LEADING SPACES FOR DISPLAY BUFFER 
DSPLY BSS 36        DISPLAY BUFFER
      ORG DSPLY     MAKE ROOM FOR INITIALIZE CODE 
INIT  LDA CLA       GET CLA INSTRUCTION 
      STA INIT1     PREVENT ANY FUTURE CALLS TO THIS CODE 
      LDA DFC.B     GET DEF TO C.BUF
      RSS           AND MAKE A DIRECT ADDRESS FOR SURE (RTE-III GEN BUG)
      LDA A,I       GET NEXT LEVEL
      RAL,CLE,SLA,ERA ETC.
      JMP *-2 
      STA DFC.B     AND PUT BACK
      JMP INIT1     AND CONTINUE
      ORR           RETURN TO MAIN CODE 
      SPC 1 
MODEF NOP           EDIT MODE FLAG
EDITF NOP           EDITED PENDING BUFFER FLAG
TTYLU NOP           LU OF TERMINAL
REA.C NOP           ENTRY 
INIT1 JMP INIT      CLA           SET LENGTH OF DISPLAY BUFFER
      STA EDITF     CLEAR THE EDITED PENDING DISPLAY FLAG 
      STA DSPLN     CLEAR DISPLAY BUFFER LENGTH 
REAC1 LDA DFMES     RESET THE TIMOUT BRANCH ADDRESS 
      STA MSFLG     TO 0 TIMEOUT HISTORY
      LDA TTY.      NOW GO CHECK IF KEYBOARD DEVICE?
      SZA,RSS       KEYBOARD DEVICE?
      JMP REAC5     NO, SKIP THE ":" ECHO 
REAC2 LDB DFCOL     GET ASCII ":_"
      CLA,INA       LENGTH = 1 WORD 
      JSB WRITI     GO PROMPT THE COLON 
      CCA           PRESET THE INPUT BUFFER TO ILLEGAL VALUE
      STA C.BUF     FOR ACTIVE TERMINAL TEST
      LDA $TIME     GET THE CURRENT TIME
      CMA,INA       NEGATE
      STA TIMER     SAVE FOR LATER USE
CLA   CLA           SET STARTING CHAR IN C.BUF
      STA GTCCT     INIT THE GTC.B ROUTINE
      STA PCONT     INIT THE PUTCR ROUTINE
      STA GTCDE     INIT THE GTCSC ROUTINE
      STA MODEF     INIT THE EDIT MODE FLAG 
      LDA CAM.I+3   GET THE LU OF KEYBOARD
      IOR O400      MAKE SURE THE ECHO BIT IS SET 
      STA TTYLU     SAVE FOR REIO REQUEST 
      JSB REIO      AND REQUEST INPUT FROM KEYBOARD 
      DEF *+5 
      DEF O1
      DEF TTYLU 
DFC.B DEF C.BUF+0   DIRECT ADDRESS OF INPUT BUFFER!!
      DEF DM72      36 WORDS MAX
      SZB,RSS       CHECK IF ANY INPUT? 
      JMP EXECU     NO, GO CHECK IF EXECUTE COMMAND 
      STB CRCNT     SAVE NUMBER OF CHARS INPUT
      SPC 1 
*  BEGIN HERE TO LEFT JUSTIFY INPUT BUFFER
      SPC 1 
      LDA OM6       FIX UP COMMAND LENGTH COUNTER 
      STA MCDLN     MAX COMMAND LENGTH = 6 CHARS
PACK1 JSB GTC.B     GET NEXT CHARACTER FROM INPUT BUFFER
      JMP PACK6     DONE, CONTINUE
      CPA O40       IGNORE LEADING SPACES 
      JMP PACK1     IN BUFFER 
      JMP PACK3     NOT SPACE, GO STORE 
      SPC 1 
*  BEGIN HERE TO CALCULATE THE LENGTH OF POSSIBLE FMGR COMMAND
      SPC 1 
PACK2 JSB GTC.B     GET NEXT CHARACTER
      JMP PACK6     OUT OF BUFFER, GO CALCULATE LENGTH
      CPA O40       CHECK IF SPACE OR COMMA?
      RSS 
PACK3 CPA COMMA     TO CALCULATE THE "COMMAND LENGTH" 
      RSS           COMMAND TERMINATOR, CALCULATE LENGTH
      CPA COLON     : IS ALSO A TERMINATOR
      JMP PACK5     COMMAND TERMINATOR, CONTINUE
      JSB PTEBF     OK, GO PUT INTO BUFFER
      ISZ MCDLN     MAX LENGTH COMMAND = 6 CHARS
      JMP PACK2     TRY NEXT CHARACTER
      SPC 1 
PACK4 JSB GTC.B     GET NEXT CHARACTER
      JMP PACK6     OUT OF BUFFER, GO CALCULATE LENGTH
PACK5 JSB PTEBF     PUT THE CHARACTER INTO THE INPUT BUFFER 
      JMP PACK4     GOT CHARACTER AND PACK IT IN
      SPC 1 
PACK6 LDA PCONT     GET CHARACTER LENGTH OF INPUT BUFFER
      STA CRCNT     AND SET IT TO TRUE CHAR LENGTH
      INA           AND ALSO SET THE WORD LENGTH FOR FMGR PARSE 
      CLE,ERA       DIVIDE BY TWO FOR WORD LENGTH 
      STA ECH.      FOR FMGR PARSE
      LDA O40       PUT IN A TRAILING SPACE IF ODD CHAR LENGTH
      JSB PTEBF     PUT TRAILING SPACE INTO INPUT BUFFER
      CLA           NOW RE-SET STARTING CHARS FOR GET & PUT 
      STA GTCCT     GET CHARACTER FROM INPUT BUFFER AND 
      STA PCONT     PUT CHARACTER TO INPUT BUFFER ROUTINE 
      SPC 1 
*  NOW CHECK IF INPUT IS A FMGR COMMAND 
      SPC 1 
      LDA MCDLN     GET COMMAND LENGTH COUNTER
      CMA,INA       NEGATE, AND FORM COUNTER
      ADA OM6       IN NEGATED FORM 
      STA MCDLN     FOR MATCH CALCULATION 
      CPA OM2       CHECK IF 2 CHARACTER COMMAND? 
      JMP MATII     YES, USE FMGR TABLE FOR MATCHING
      SZA,RSS       CHECK IF COMMAND LENGTH = 0 CHARACTERS? 
      JMP EXIT2     YES, LET THE FMGR PARSE HANDLE
      INA,SZA,RSS   CHECK IF COMMAND = 1 CHARACTER? 
      JMP NAFMC     YES, SKIP FMGR COMMAND CHECK
      SPC 1 
*  COMMAND LENGTH IS = 3 OR MORE CHARACTERS, CHECK LOCAL TABLE FOR
*  POSSIBLE FMGR COMMAND. (ANY COMMAND NOT IN THIS TABLE MUST BE
*  TWO CHARACTERS IN LENGTH, EXCEPT "RU" & "SY".) 
      SPC 1 
      LDA C.BUF     GET 1ST 2 CHARS OF INPUT BUFFER 
      CPA ASCRU     CHECK IF :RU_____ COMMAND?
      RSS           YES 
      CPA ASCSY     CHECK IF :SY____ COMMAND? 
      JMP EXIT1     YES, LET FMGR PARSE 
      LDB EXLST     GET STARTING ADDRESS OF EXTENDED FMGR COMMANDS
MATC2 LDA B,I       GET 1ST 2 CHARS 
      SZA,RSS       CHECK IF END OF LIST? 
      JMP NAFMC     YES, NOT A FMGR COMMAND 
      CPA C.BUF     CHECK IF MATCHING 2 CHARACTERS
      JMP MATC3     YES, NOW CHECK IF ALL CHARS OF COMMAND MATCH
      ADB O3        NO, BUMP TO NEXT ONE
      JMP MATC2     AND TRY NEXT COMMAND FROM LIST
      SPC 1 
MATC3 RBL           FORM CHARACTER ADDRESS OF COMMAND LIST
      STB MATCA     SAVE CURRENT CHARACTER ADDRESS
MATC4 LDB MATCA     GET CURRENT CHARACTER ADDRESS 
      ISZ MATCA     AND BUMP TO NEXT
      CLE,ERB       FORM WORD ADDRESS 
      JSB GTCHR     GET THE CHARACTER 
      STA MATCB     SAVE TEMP FOR LATER TEST
      JSB GTC.B     GET NEXT CHARACTER FROM INPUT BUFFER
      JMP NAFMC     MUST BE ZERO LENGTH COMMAND 
      CPA MATCB     CHECK IF MATCHING?
      RSS           YES, KEEP ON TRUCKING 
      JMP NAFMC     NOT A FMGR COMMAND
      ISZ MCDLN     CHECK IF ANY MORE CHARACTERS TO MATCH?
      JMP MATC4     YES, KEEP ON TRUCKING 
      SPC 1 
*  MATCH WAS ACHIEVED, PUT COMMAND INTO BUFFER LIST AND EXIT. 
      SPC 1 
EXIT1 JSB PCIBF     MUST BE LEGAL COMMAND>>PUT INTO BUFFER LIST 
      DEF *+3 
      DEF C.BUF 
      DEF ECH.
EXIT2 LDA ECH.      GET BUFFER LENGTH 
      LDB REA.C,I   GET RETURN ADDRESS
      JMP B,I       AND EXIT TO CALLER
      SPC 1 
MCDLN NOP           NEG. NUMBERS IN COMMAND BUFFER
MATCA NOP           CURRENT CHAR ADDRESS FOR MATCHING BUFFER
MATCB NOP           CURRENT CHARACTER VALUE FROM MATCHING BUFFER
      SPC 1 
*  TWO CHARACTER COMMAND, CHECK IF "C.TAB" HAS MATCHING FMGR COMMAND. 
      SPC 1 
MATII LDB C.TAB     GET STARTING ADDRESS OF C.TAB 
MATI1 ADB O2        SKIP 1ST ENTRY
      LDA B,I       GET NEXT 2 CHARS
      SZA,RSS       CHECK IF END OF LIST? 
      JMP NAFMC     YES, MUST NOT BE FMGR COMMAND 
      RAL,CLE,ERA   STRIP OFF BIT 15
      CPA C.BUF     CHECK IF MATCH? 
      JMP EXIT1     YES, GO EXECUTE 
      JMP MATI1     NO, TRY NEXT ONE
      SPC 1 
*  NOT A FMGR COMMAND, DO LOCAL PROCESSING
      SPC 1 
NAFMC CLA           RESET STARTING CHARACTER NUMBER FOR RE-SCAN 
      STA GTCCT     OF INPUT BUFFER 
      JSB GTC.B     YES, GET THE POSSIBLE COMMAND CHAR
      JMP EXIT2     CANT HAPPEN UNLESS BUG IN TTY. FLAG 
      CPA ASCR      CHECK IF RECALL COMMAND?
      RSS           YES 
      CPA ASCUP     CHECK IF RECALL COMMAND?  (^) 
      JMP DECRM     BACK UP THE CURRENT BUFFER POINTER
      CPA SLASH     CHECK IF MOVE FORWARD COMMAND?
      JMP ADVNS     GO MOVE THE COMMAND BUFFER POINTER
      CPA ASCL      CHECK IF LIST COMMAND?
      JMP LISTC     YES, GO PROCESS 
      CPA ASCP      CHECK IF EDIT COMMAND?
      JMP EDIT2     YES, GO PROCESS 
      CPA MINUS     CHECK IF DELETE COMMAND?
      JMP DELET     YES, GO DELETE CURRENT LINE 
      JSB NUMBR     CHECK IF NUMERIC? 
      SPC 1 
*  1ST CHARACTER IS NUMBERIC, GO PARSE WHOLE INPUT AS NUMBER. 
      SPC 1 
      CLA           RESTART THE SCAN ROUTINE
      STA GTCCT     TO THE 1ST CHARACTER
      JSB NMBLN     YES, GO CONVERT 
      SPC 1 
*  CONVERT TO NUMBER WAS SUCCESSFUL, COUNT DOWN N LINES FROM TOP. 
      SPC 1 
      LDB TOPSK     GET THE TOP OF THE STACK
      STB CURSK     AND SET THE CURRENT TO TOP
      SSA,INA,SZA   CHECK IF 0 OR -1? 
LINEN JSB ADVSK     ADVANCE THE CURRENT BUFFER LIST POINTER 
      JMP DECR2     BEYOND LAST, GO PRINT LAST LINE 
      INA,SZA       CHECK IF END?PRINT LAST ONE 
      JMP LINEN     NO, CONTINUE
      JMP DECR2     NOW, GO PRINT 
      SPC 1 
*  AT THIS POINT IS MUST BE AN IMPLIED :RUN COMMAND.
*  STICK A ":RU," IN FRONT OF COMMAND AND EXIT. 
      SPC 1 
RUCMD CLA           RESET THE STARTING CHARACTER NUMBER OF INPUT BUFFER 
      STA GTCCT     FOR INPUT BUFFER
      STA DSPLN     FOR STORING NEW STRING WITH RU, 
      LDA ASCR      GET AN ASCII "R"
      JSB PUTCR     AND PUT INTO DISPLAY BUFFER 
      LDA ASCRU     GET AN ASCII "U"
      JSB PUTCR     AND PUT INTO DISPLAY BUFFER 
      LDA COMMA     GET ASCII COMMA 
RUCM1 JSB PUTCR     AND PUT INTO DISPLAY BUFFER 
      JSB GTC.B     GET NEXT CHAR FROM INPUT BUFFER 
      RSS           DONE, GO CALCULATE BUFFER LENGTH
      JMP RUCM1     AND PUT INTO DISPLAY BUFFER 
      LDA NXTSK     FORCE THE BUFFER INTO BUFFER LIST 
      STA CURSK     AND FORCE THE EDIT MODE 
      STA EDITF     FLAG
      LDA O40       MAKE SURE THERE IS TRAILING SPACE IN BUFFER 
      JSB PUTCR     BECAUSE WE ARE GOING TO MAKE IT EVEN
      LDB DSPLN     GET NUMBER OF CHARS STORED
      BRS           DIVIDE BY 2 
      JMP REAC3     MOVE DISPLAY BUFFER INTO INPUT BUFFER 
      SPC 1 
*  TLOG=0 ENTRY, EXECU CHECKS IF EXECUTE COMMAND WAS INPUT. 
      SPC 1 
EXECU LDA DSPLN     GET CURRENT DISPLAY BUFFER LENGTH 
      SZA,RSS       CHECK IF THERE IS A DISPLAY BUFFER? 
      JMP PWAIT     NO, DISPLAY BUFFER >> WAITING FOR INPUTMEOUT? 
      JSB TIMOT     > 20 SECONDS ?
      SEZ,RSS       E-REG = 1 IF > 20 SECONDS 
      ISZ C.BUF     NO, CHECK IF KEYBOARD TOUCHED?
      JMP PWAIT     KEYBOARD TOUCHED OR > 20 SECONDS
      SPC 1 
*  EXECUTE REQUEST IS REQUIRED, MOVE DISPLAY BUFFER TO C.BUF & EXIT 
      SPC 1 
      LDB DSPLN     GET THE DISPLAY LENGTH
REAC3 LDA DFDSP     GET THE FROM BUFFER ADDRESS 
REAC4 STB ECH.      SAVE LENGTY IN WORDS
      LDB DFC.B     GET "TO" BUFFER ADDRESS 
      JSB .MVW      AND MOVE THE BUFFER 
      DEF ECH.      NUMBER OF WORD TO MOVE
      OCT 0         FUKIE-UPIE
      JMP EXIT1     PUT IN THE BUFFER LIST
      SPC 1 
*  SUBROUTINE TO DETERMINE IF 20 SECONDS HAS ELAPSED SINCE ":" OUTPUT.
      SPC 1 
TIMOT NOP           ENTRY A-REG IS NOT MODIFIED 
      LDB $TIME     GET CURRENT TIME
      ADB TIMER     SUBTRACT THE PREVIOUS TIME
O40   CLE           DO A 16 BIT ARITHMETIC CHECK
      ADB DM2K      2000 TICKS OF CLOCK (20 SEC)
      JMP TIMOT,I   E-REG = 1 IF > 20 SECONDS.
      SPC 1 
*  TIMOUT ENTRY, WRITE OUT THE CORRECT MESSAGE
      SPC 1 
PWAIT JSB TIMOT     CHECK IF 20 SECONDS 
      LDA DFMES     GET ADDRESS OF 1ST MESSAGE
      CLB,SEZ       ELAPSED?
      ISZ C.BUF     CHECK IF KEYBOARD TOUCHED?
      STA MSFLG     START OVER IF < 20 SEC OR KEYBOARD TOUCHED. 
      STB DSPLN     CLEAR THE DISPLAY BUFFER
      LDB MSFLG,I   GET POINTER TO MESSAGE
      LDA B,I       GET MESSAGE LENGTH
      INB           BUMP ADDRESS TO ASCII MESSAGE 
      JSB WRITI     AND WRITE OUT THE MESSAGE 
      ISZ MSFLG     BUMP TO NEXT MESSAGE
      LDA MSFLG     CHECK IF "GONE"?
      CPA DFGON     ? 
      RSS           USE "EX" PROCESSING 
      JMP REAC2     GO PROMPT ":" 
      SPC 1 
*  TIMED OUT!, GO EXECUTE "EX,SP,,KILL" 
      SPC 1 
      LDA DFEXS     GET MESSAGE "EX,SP,,KILL" 
      LDB O5        GET MESSAGE LENGTH IN WORDS 
      JMP REAC4     AND GO EXECUTE
      SPC 1 
DFEXS DEF *+1 
      ASC 5,EX,SP,,KILL 
      SPC 1 
*  ENTRY IS NORMAL DATA FROM FILE OTHER THAN A KEYBOARD.
      SPC 1 
REAC5 JSB READF     AND GO READ THE INPUT 
      DEF *+6 
      DEF CAM.I     DCB 
      DEF .E.R.     GLOBAL ERROR VALUE
      DEF C.BUF+0   INPUT BUFFER
      DEF D36       72 CHARACTERS MAX INPUT 
      DEF ECH.      SAVE NUMBER OF ! WORDS ! INPUT
      SSA           CHECK IF ANY READ ERROR 
      JMP EREXT     YES, DO A ERROR EXIT
      LDA ECH.      GET THE TLOG VALUE
      SZA,RSS       CHECK IF ZERO LENGTH FILE RECORD? 
      JMP REAC5     YES, IGNORE IT, AND CONTINUE TO NEXT
      SSA           CHECK IF END OF FILE? 
      JMP EXIT4     YES, EXIT WITH ZERO LENGTH RECORD 
      JMP EXIT2     EXIT TO PROCESS THE INPUT BUFFER
      SPC 1 
EREXT JSB MSS.      OUTPUT THE ERROR MESSAGE
      DEF *+3 
      DEF .E.R.     ERROR NUMBER
      DEF DM2K      -2000 
EXIT4 CLA           AND EXIT TLOG = 0 
      STA ECH.      SET TRANS LOG 
      JMP EXIT2 
      SPC 1 
*  PUTCR PUTS A CHARACTER IN A-REG INTO THE DISPLAY BUFFER
      SPC 1 
PUTCR NOP           ENTRY A-REG = CHARACTER 
      LDB DSPLN     GET CHARACTER COUNT 
      CLE,ERB       FORM WORD OFFSET
      CPB D36       CHECK IF AT END?
      JMP PUTCR,I   YES, JUST IGNORE
      ADB DFDSP     INDEX INTO DISPLAY BUFFER 
      JSB PTCHR     AND PUT THE CHARACTER INTO BUFFER 
      ISZ DSPLN     BUMP CHARACTER COUNT
      JMP PUTCR,I   AND EXIT
      SPC 1 
PTCHR NOP           ENTRY A-REG = CHAR, B=ADDRESS, E=EVEN/ODD FLAG
      AND O377      MASK TO JUST CHARACTER
      SEZ,RSS       CHECK IF EVEN OR ODD? 
      ALF,ALF       EVEN, POSITION
      XOR B,I       PUT IN OR TAKE OUT
      SEZ,RSS       CHECK IF HI-LO CHAR 
      ALF,ALF       HI, POSITION FOR MASKING
      AND O377      MASK OFF UNTOUCHED CHARACTER
      SEZ,RSS       CHECK IF NEED UNPOSITIONING?
      ALF,ALF       YES, DO IT. 
      XOR B,I       NOW MERGE IN UNTOUCHED, & TAKE OUT REPLACED 
      STA B,I       CHARACTER AND PUT BACK INTO WORD
      JMP PTCHR,I   AND EXIT
      SPC 1 
DELET JSB NMBLN     GET NUMBER OF LINES TO DECREMENT
      SSA,RSS       CHECK IF POSITIVE?
      CCA           YES, FORCE TO ONE LINE
      STA ACCUM     SAVE NUMBER OF LINES TO DELETE
DELE1 LDA CURSK     GET THE CURRENT BUFFER POINTER
      CPA NXTSK     CHECK IF DELETED LAST LINE? 
      JMP REAC1     YES, RE-ENTER THE READ ROUTINE
      JSB DELIN     AND DELETE FROM BUFFER LIST 
      ISZ ACCUM     CHECK IF DONE?
      JMP DELE1     NO, CONTINUE
      JMP DECR2     OUTPUT NEXT LINE & RE-ENTER READ
      SPC 1 
TIMER NOP           TIMER 
      SPC 1 
DECRM JSB NMBLN     GET NUMBER OF LINES TO DECREMENT
DECR1 JSB DECSK     DECREMENT STACK POINTER 
      JMP DECR3     BEYOND BEGINNING, PRINT BEGINNING 
      SZA,RSS       CHECK IF DONE BUMPING?
      JMP DECR2     YES, GO PRINT 
      INA,SZA       DONE? 
      JMP DECR1     YES, KEEP ON TRUCKING 
DECR2 JSB MCBDB     WRITE OUT THE DISPLAY BUFFER
      JMP REAC1     AND RE-ENTER THE READ THIS SUBROUTINE 
      SPC 1 
DECR3 SZA           CHECK IF MULTI-LINE MOVE? 
      JMP DECR2     YES, PRINT LIMIT LINE 
      JMP REAC1     NO, IGNORE REQUEST IF BEYOND LIMIT AND ZERO LINE REQ. 
      SPC 1 
ADVNS JSB NMBLN     GET NUMBER OF LINES TO ADVANCE
ADVN1 JSB ADVSK     MOVE POINTER FORWARD
      JMP DECR3     BEYOND, END, PRINT END
      SZA,RSS       CHECK IF MULTI-LINE MOVE
      JMP DECR2     NO, GO PRINT LINE 
      INA,SZA       CHECK IF MOVE TO ADVANCE
      JMP ADVN1     YES, CONTINUE 
      JMP DECR2     MOVE "CURSK" TO THE DISPLAY BUFFER
      SPC 1 
*  ROUTINE TO PROCESS THE "P" COMMAND 
      SPC 1 
EDIT1 STA MODEF     AND SET THE MOVE FLAG 
      STA EDITF     SET THE EDIT MODE FLAG
EDIT2 JSB GTC.B     GET NEXT CHARACTER FROM EDIT BUFFER 
      JMP EDIT3     MOVE C.BUF INTO DISPLAY BUFFER AND PRINT
      CPA CNTLR     CHECK IF REPLACE MODE CHARACTER 
      RSS           YES, SET THE REPLACE MODE 
      CPA CNTLC     CHECK IF THE DELETE MODE CHARACTER
      RSS           YES, SET THE DELETE CHARACTER MODE
      CPA CNTLS     CHECK IF INSERT CHARACTER MODE? 
      RSS           YES,
      CPA CNTLI     CHECK IF INSERT ETC.
      JMP EDIT1     MODE CHANGE, SET THE MODE AND CONTINUE
      CPA CNTLT     CHECK IF END OF EDIT MODE?
      JMP EDIT4     DONE, MOVE INTO DISPLAY BUFFER
      LDB MODEF     GET THE MODE FLAG 
      SZB,RSS       CHECK IF MODE IS DEFINED YET? 
      JMP CKSHS     NO, MUST BE 1ST CHARACTER 
      CPB CNTLR     REPLACE MODE? 
      JMP REPMD     REPLACE MODE
      CPB CNTLC     DELETE MODE?
      JMP DELCR     DELETE MODE, JUST IGNORE CHAR 
      SPC 1 
*  MUST BE INSERT MODE, CONTINUE
      SPC 1 
      CPA SLASH     IF "/" THEN MAKE A SPACE
      LDA O40       GET ASCII SPACE 
      JSB PTEBF     PUT THE CHARACTER INTO THE EDIT BUFFER
      JMP EDIT2     AND CONTINUE
      SPC 1 
DELCR JSB GTCSC     GET THE DELETE POSITION 
      NOP 
      JMP EDIT2     AND GO GET NEXT EDIT CHARACTER
      SPC 1 
REPMA NOP           TEMP SAVE OF EDIT BUFFER CHARACTER
CKSHS CPA SLASH     1ST CHAR, MUST BE "/" 
      RSS           YES, DEFAULT TO THE REPLACE MODE
      JMP RUCMD     MUST BE FMGR IMPLIED RUN COMMAND
      LDB CNTLR     GET REPLACE MODE
REPMD STA REPMA     REPLACE MODE, SAVE CHAR IF NEEDED LATER 
      STB MODEF     SET THE EDIT MODE FLAG TO REPLACE 
      STB EDITF     AND SET THE EDIT FLAG 
      JSB GTCSC     GET NEXT CHARACTER FROM DISPLAY BUFFER
      LDA O40       NO MORE, FAKE IT WITH SPACE 
      LDB REPMA     GET THE CHARACTER FROM EDIT BUFFER
      CPB SLASH     WHICH CHARACTER SHOULD BE STORED? 
      RSS           IF SLASH, THEN USE DISPLAY BUFFER 
      STB A         IF NOT USE THE EDIT BUFFER CHARACTER
      JSB PTEBF     AND PUT INTO THE EDITED BUFFER
      JMP EDIT2     AND GET NEXT CHARACTER
      SPC 1 
*  SETUP THE DISPLAY BUFFER IF NECESSARY, AND OUTPUT TO THE TERMINAL
      SPC 1 
EDIT3 JSB GTCSC     GET REMAINING STRING FROM DISPLAY 
      JMP EDIT4     NO MORE, MOVE INTO DISPLAY BUFFER 
      JSB PTEBF     BUFFER AND PUT INTO C.BUF 
      JMP EDIT3     AND CONTINUE
      SPC 1 
EDIT4 LDA O40       MAKE SURE THERE IS TRAILING SPACE IN BUFFER 
      JSB PTEBF     BECAUSE WE ARE GOING TO MAKE IT A WORD BUFFER 
      LDA PCONT     GET NUMBER OF CHARS IN BUFFER 
      ARS           DIVIDE BY 2 
      STA DSPLN     AND SAVE THE WORD LENGTH
      SZA,RSS       CHECK IF ANY LENGTH?
      JMP DECR2     NO, GET CURRENT BUFFER LIST POINTER 
      LDA DFC.B     GET FROM BUFFER ADDRESS 
      JSB WDSPB     AND WRITE OUT THE DISPLAY BUFFER
      JMP REAC1     AND RE-ENTER THIS SUBROUTINE
      SPC 1 
*  ROUTINE TO LIST FROM "CURSK" FOR N LINES 
      SPC 1 
LISTC JSB IFBRK     CLEAR THE BREAK FLAG
      DEF *+1 
      JSB NMBLN     GET NUMBER OF LINES TO PRINT
      LDB TOPSK     GET POINTER TO TOP OF BUFFER LIST 
      SZA,RSS       CHECK IF ZERO LINES TO LIST?
      STB CURSK     YES, LIST WHOLE BUFFER LIST 
      STA ACCUM     SET NEG NUMBER OF LINES TO LIST 
LIST1 JSB MCBDB     AND WRITE IT OUT
      JSB ADVSK     ADVANCE THE CURSK POINTER 
      JMP REAC1     DONE, RE-ENTER THIS ROUTINE 
      JSB IFBRK     CHECK IF BREAK REQUESTED? 
      DEF *+1 
      SSA           TRYING TO STOP? 
      JMP LIST2     YES, STOP 
      ISZ ACCUM     CHECK IF DONE?
      JMP LIST1     NO, CONTINUE
LIST2 JSB MCBDB     AND WRITE IT OUT
      JMP REAC1     YES, RE-ENTER THIS ROUTINE
      SPC 1 
*  WRITE BUFFER IN B-REG OUT THRU A-REG NUMBER OF WORDS TO KEYBOARD 
      SPC 1 
WRITA NOP 
WRITI NOP           ENTRY TO WRITE A MESSAGE
      STA WRITA     SAVE TLOG 
      STB BUFAD     SAVE MESSAGE ADDRESS
      JSB WRITF     AND USE THE FMP WRITE ROUTINE 
      DEF *+5 
      DEF CAM.I 
      DEF .E.R. 
BUFAD DEF * 
      DEF WRITA     NUMBER OF WORDS 
      JMP WRITI,I   AND RETURN
      SPC 1 
DM2K  DEC -2000 
DM72  DEC -72 
D36   DEC 36
MSFLG ABS 0         POINTER TO ROUTINE TO HANDLE NEXT TIMEOUT 
DFCOL DEF ASCOL     POINTER TO COLON PROMPT WORD
ASCOL ASC 1,:_    PROMPT WORD 
ASCSY ASC 1,SY      ASCII "SY"
      SPC 1 
*  DONT MOVE THE FOLLOWING 9 WORDS FOR THE EE.. ROUTINE 
      SPC 1 
ASCRU ASC 1,RU      ASCII "RU"
ASCP  OCT 120       RIGHT JUSTIFIED ASCII "P" 
ASCL  OCT 114       RIGHT JUSTIFIED ASCII "L" 
ASCUP OCT 136       RIGHT JUSTIFIED ASCII "^" 
ASCR  OCT 122       RIGHT JUSTIFIED ASCII "R" 
COMMA OCT 54        RIGHT JUSTIFIED ASCII "," 
COLON OCT 72        RIGHT JUSTIFIED ASCII ":" 
      SPC 1 
SLASH OCT 57        RIGHT JUSTIFIED ASCII "/" 
CNTLR OCT 22        RIGHT JUSTIFIED ASCII (CNTL) "R"
CNTLC OCT 3         RIGHT JUSTIFIED ASCII (CNTL) "C"
CNTLI OCT 11        RIGHT JUSTIFIED ASCII (CNTL) "I"
CNTLS OCT 23        RIGHT JUSTIFIED ASCII (CNTL) "S"
MINUS OCT 55        RIGHT JUSTIFIED ASCII "-" 
CNTLT OCT 24        RIGHT JUSTIFIED ASCII (CNTL) "T"
      SPC 1 
DFMES DEF *+1 
      DEF WAIT      WAITING FOR INPUT 
      DEF STILL     STILL WAITING 
      DEF GOING     GOING 
      DEF GOING     GOING 
      DEF GONE      GONE
DFGON DEF * 
      SPC 1 
WAIT  DEC 11
      ASC 11,WAITING FOR INPUT 5 BELLS 
STILL DEC 9 
      ASC 9,STILL WAITING 5 BELLS
GOING DEC 5 
O5    EQU GOING 
      ASC 5,GOING! 4 BELLS
GONE  DEC 5 
      ASC 5,GONE! 5 BELLS
      SPC 1 
TOPSK EQU TPSK.     ADDRESS OF TOP OF BUFFER LIST BUFFER
NXTSK EQU NXTK.     NEXT AVAILABLE WORD IN BUFFER LIST BUFFER 
ENDSK EQU EDSK.     END + 0 WORD OF BUFFER LIST BUFFER
CURSK EQU CRSK.     CURRENT DISPLAY POINTER 
      SPC 1 
*   IF THE FOLLOWING THREE LINES WERE ADDED TO BUFFER LIST
*   IT WOULD LOOK LIKE THIS:
*   (1) MESSAGE 
*   (2) TWO 
*   (3) THREE 
* 
*        BIT !15!14!13!12!11!10! 9! 8! 7! 6! 5! 4! 3! 2! 1! 0!
* TOPSK      !        (0)            !         (4)           !
*            !         M             !          E            !
*            !         S             !          S            !
*            !         A             !          G            !
*            !         E             !      (SPACE)          !
*            !        (4)            !         (2)           !
*            !         T             !          W            !
*            !         O             !      (SPACE)          !
* CURSK **   !        (2)            !         (3)           !
*            !         T             !          H            !
*            !         R             !          E            !
*            !         E             !      (SPACE)          !
* NXTSK **   !        (3)            !        (0)            !
*            !   THIS IS BEYOND THE END OF THE BUFFER        !
*            !     LIST AND WILL CONTAIN GARBAGE DATA        !
* ENDSK      !  THIS IS LAST WORD IN BUFFER LIST BUFFER      !
* 
*   **  THESE WORDS ARE DYNAMIC POINTERS INTO LIST BUFFER 
      SPC 1 
*  TAKE BUFFER POINTED TO BY A-REG OUT OF BUFFER LIST 
*   NOTE: A-REG MUST NOT = NXTSK !!!
      SPC 1 
DELIA NOP           "FROM" POINTER
DELIB NOP           "TO" POINTER
DELIN NOP           ENTRY TO DELETE A BUFFER FROM BUFFER LIST 
      STA DELIB     SAVE POINTER TO BUFFER TO DELETE
      CPA NXTSK     CHECK IF AT END?
      JMP DELIN,I   YES, IGNORE DELETE REQUEST
      LDA DELIB,I   GET THE OFFSET VALUE
      AND O377      MASK TO OFFSET BITS 
      STA B         SAVE IN B-REG THE DELETE BUFFER LENGTH
      BLF,BLF       POSITION TO HIGH BITS 
      ADB A         B-REG = DELETE BUFFER LENGTH IN HI & LO-BITS
      ADA DELIB     BUMP TO LENGTH WORD OF NEXT BUFFER-1
      INA           BUMP TO LENGTH WORD OF NEXT BUFFER
      STA DELIA     SAVE "FROM" ADDRESS FOR MOVE
      LDA DELIA,I   GET LENGTH WORD AT END-CURR/BEG-NEXT BUFFER 
      XOR DELIB,I   WITH BEG-CURR/END OF PREVIOUS BUFFER LENGTH 
      XOR B         TAKE OUT DELETE BUFFER LENGTHS
      LDB NXTSK     GET END ADDRESS OF LAST BUFFER LENGTH WORD
DELI1 STA DELIB,I   AND PUT HIGHER IN BUFFER LIST 
      CPB DELIA     CHECK IF FINISHED PACKING MOVE? 
      JMP DELI2     YES, EXIT 
      ISZ DELIA     BUMP "FROM" BUFFER ADDRESS
      ISZ DELIB     BUMP "TO" BUFFER ADDRESS
      LDA DELIA,I   GET NEXT WORD TO MOVE UP
      JMP DELI1     CONTINUE TO NEXT WORD 
      SPC 1 
DELI2 LDA DELIB     MOVE THE NXTSK POINTER
      STA NXTSK     TO ITS NEW VALUE
      JMP DELIN,I   AND EXIT P+1
      SPC 1 
*  ADVANCE CURRENT DISPLAY POINTER
*  CALLED:       JSB ADVSK
*                <RETURN IF UNSUCCESSFUL> 
*                <RETURN IF SUCCESSFUL> 
      SPC 1 
SAVA  NOP           A-REG SAVE FOR BOTTOM SUBROUTINES 
ADVSK NOP           GET CURRENT DISPLAY BUFFER
      STA SAVA      SAVE A-REG FOR RETURN 
      LDA CURSK,I   GET THE LENGTH
      AND O377      MASK TO LENGTH
      SZA           CHECK IF AT END?
      INA           BUMP ONE FOR GOOD MEASURE 
      ADA CURSK     SET NEW DISPLAY BUFFER POINTER
      CPA NXTSK     CHECK IF AT END OF BUFFER LIST? 
      JMP ADVS1     YES, SKIP ADVANCE 
      STA CURSK     FOR NEXT TIME 
      ISZ ADVSK     P+2 EXIT >> MOVED 
ADVS1 LDA SAVA      RESTORE A-REG 
      JMP ADVSK,I   YES, EXIT 
      SPC 1 
*  DECREMENT THE CURRENT DISPLAY POINTER
*  CALLED:       JSB DECSK
*                <RETURN IF UNSUCCESSFUL> 
*                <RETURN IF SUCCESSFUL> 
      SPC 1 
DECSK NOP           ENTRY TO DECREMENT CURRENT POINTER CURSK
      STA SAVA      SAVE A-REG
      LDB CURSK     GET CURRENT DISPLAY POSITION
      CPB TOPSK     CHECK IF ALREADY AT TOP?
      JMP DECS1     YES, IGNORE REQUEST 
      LDA B,I       GET THE LENGTH
      ALF,ALF       POSITION
      AND O377      MASK TO JUST LENGTH 
      CMA           NEGATE - 1
      ADA CURSK     CALCULATE NEW "CURSK" 
      STA CURSK     AND SET NEX CURSK 
      ISZ DECSK     BUMP TO P+2 RETURN
DECS1 LDA SAVA      RESTORE A-REG 
      JMP DECSK,I   AND EXIT
      SPC 1 
* MOVE "CURSK" BUFFER TO DISPLAY BUFFER AND PRINT OUT IF ANY LENGTH 
      SPC 1 
MCBDB NOP           ENTRY 
      LDA CURSK,I   GET LENGTH
      AND O377      OF THE CURSK BUFFER 
      SZA,RSS       CHECK IF ANY LENGTH?
      JMP MCBD1     NO, EXIT NOP
      STA DSPLN     YES, SET THE LENGTH 
      LDA CURSK     GET THE MESSAGE ADDRESS 
      INA 
      JSB WDSPB     AND MOVE AND DISPLAY
MCBD1 JMP MCBDB,I   AND EXIT DONE 
      SPC 1 
* MOVE BUFFER IN A-REG TO DISPLAY BUFFER AND PRINT OUT
      SPC 1 
WDSPB NOP           ENTRY TO WRITE OUT THE DISPLAY BUFFER 
      LDB DFDSP     GET DISPLAY BUFFER ADDRESS
      JSB .MVW      MOVE "DSPLN" WORDS INTO DISPLAY BUFFER
      DEF DSPLN 
      OCT 0         ??
      CCB           GET THE BUFFER OUTPUT ADDRESS - 1 
      ADB DFDSP     FOR ADDING TWO LEADING SPACES TO
      LDA DSPLN     THE DISPLAY MESSAGE 
      INA           BUMP FOR THE TWO ADDITIONAL SPACES
      JSB WRITI 
      JMP WDSPB,I   AND RETURN
      SPC 1 
*  ROUTINE TO PUT A CHARACTER INTO THE C.BUF AFTER BEING EDITED 
      SPC 1 
PCONT NOP           NUMBER OF CHARS STORED IN C.BUF 
PTEBF NOP           ENTRY TO PUT CHARACTER IN C.BUF 
      LDB PCONT     INDEX TO CHARACTOR NUMBER 
      CLE,ERB       FORM WORD ADDRESS OF CHARACTER
      CPB D36       CHECK IF END OF C.BUF?? 
      JMP PTEBF,I   YES, JUST IGNORE
      ADB DFC.B     INDEX INTO WORD 
      JSB PTCHR     AND STORE 
      ISZ PCONT     AND BUMP THE NUMB CHARS STORED
      JMP PTEBF,I   AND EXIT
      SPC 1 
*  ROUTINE TO GET CHARACTER OUT OF C.BUF (EDIT BUFFER)
*  NOTE:  THIS ROUTINE WILL EXIT P+1 IF OUT OF BUFFER.
      SPC 1 
CRCNT NOP           CURRENT NUMBER OF CHARACTERS IN C.BUF 
GTCCT NOP           CHARACTER COUNTER OF EDIT LINE BUFFER (C.BUF) 
GTC.B NOP           GET NEXT CHARACTER FROM C.BUF 
      LDB GTCCT     GET CHARACTER NUMBER FROM C.BUF 
      CPB CRCNT     CHECK IF AT END OF BUFFER?
      JMP GTC.3     YES, EXIT P+1 
      CLE,ERB       CALCULATE WORD INDEX
      ISZ GTCCT     BUMP TO NEXT CHAR FOR NEXT PASS 
      ADB DFC.B     INDEX TO WORD 
      JSB GTCHR     GET THE CHARACTER 
      ISZ GTC.B     CONTINUATION EXIT 
GTC.3 JMP GTC.B,I   EXIT P+2
      SPC 1 
*  ROUTINE TO GET A CHARACTER OUT OF DISPLAY BUFFER 
      SPC 1 
GTCDE NOP           CURRENT CHAR NUMBER IN DISPLAY BUFFER 
GTCSC NOP           GET NEXT CHARACTER IN DISPLAY BUFFER
      LDB GTCDE     GET THE CHARACER NUMBER 
      CLE,ERB       CALCULATE WORD NUMBER 
      CPB DSPLN     CHECK IF AT END?
      JMP GTCS1     YES RETURN A ASCII SPACE
      ADB DFDSP     ADD IN THE BUFFER START ADDRESS 
      JSB GTCHR     GET THE CHARACTER 
      ISZ GTCDE     BUMP THE CHARACTER ADDRESS
      ISZ GTCSC     P+2 RETURN IF GOT CHAR
GTCS1 JMP GTCSC,I   AND EXIT P+1
      SPC 1 
*  GET A CHARACTER ROUTINE
*   ENTRY >> B-REG = BUFFER WORD ADDRESS
*            E-REG = 1>> LEAST CHAR, =0 >> HI-CHAR
      SPC 1 
GTCHR NOP           ENTRY B-REG = WORD ADDRESS E-REG = EVEN/ODD 
      LDA B,I       GET WORD
      SEZ,CLE,RSS   CHECK IF NEEDS POSITIONING? 
      ALF,ALF       YES, POSITION TO LO-BITS
      AND O377      MASK OFF HI-BITS
      STA B         SAVE CHAR TEMP *790615
      ADB OM173     CHECK IF > LOWER CASE Z 
      SEZ,CLE,RSS   YES >> EXIT 
      ADB O32       NO, CHECK IF < LOWER CASE A 
      SEZ,CLE       UPPER CASE ANY LOWER CASE A..Z
      XOR O40       WHILE IN INTERACTIVE MODE 
      JMP GTCHR,I   AND EXIT A-REG = CHAR 
      SPC 1 
*  ROUTINE TO GET A POSSIBLE NUMBER AFTER THE 1 CHAR COMMAND
      SPC 1 
ACCUM NOP           CONVERTED NUMBER
NMBLA NOP           TEMP
NMBLN NOP           ENTRY TO GET NUMBER OF LINES
      CLA           CLEAR THE ACCUMLATOR
NMBL1 STA ACCUM     BEFORE BEGINNING
NMBL2 JSB GTC.B     GET THE POSSIBLE NEXT CHARACTER 
      JMP NMBL3     NONE, EXIT P+1
      CPA O40       IGNORE ANY SPACES 
      JMP NMBL2     IN THE BUFFER 
      JSB NUMBR     CHECK IF IS A NUMBER? 
      STA NMBLA     SAVE IT TEMPORARY 
      LDA ACCUM 
      MPY D10       SCALE UP ONE DIGIT
      ADA NMBLA 
      JMP NMBL1 
      SPC 1 
NMBL3 LDA ACCUM     GET THE ACCUMULATED NUMBER
      CMA,INA       NEGATE
      JMP NMBLN,I   EXIT
      SPC 1 
NUMBR NOP           ENTRY ASCII CHARACTER IN A-REG
      CLE           CHECK AND CONVERT TO A NUMBER 
      ADA OM72      CHECK IF IN THE 0 TO 9
      SEZ,CLE,RSS   ASCII RANGE 
      ADA D10       BY THE MAGIC ALGORITHM
      SEZ,CLE       E-REG SET IF = LEGAL NUMBER DIGIT 
      JMP NUMBR,I   AND EXIT P+1 IF NUMBER
      JMP RUCMD     NOT NUMBER, EXECUTE IMPLIED RUN 
      SPC 1 
OM2   OCT -2
OM6   OCT -6
OM72  OCT -72 
O1    OCT 1 
O2    OCT 2 
O3    EQU CNTLC 
D10   DEC 10
O32   OCT 32
O377  OCT 377 
O400  OCT 400 
OM173 OCT -173
      SPC 1 
*   THE FOLLOWING IS A LIST OF COMMANDS THAT ARE POSSIBLY LONGER THAN 
*   2 CHARACTERS AND STILL WILL QUALIFY AS LEGAL FMGR COMMANDS. 
*   THEREFORE YOU MAY NOT HAVE "IMPLIED" RUN COMMANDS THAT MATCH OR 
*   ARE A SUBSET OF ANY OF THE FOLLOWING STRINGS. 
      SPC 1 
EXLST DEF *+1 
      ASC 3,EXIT
      ASC 3,LOG 
      ASC 3,TELL
      ASC 3,ANNOTATE
      ASC 3,CREATE
      ASC 3,PURGE 
      ASC 3,STORE 
      ASC 3,DUMP
      ASC 3,LIST
***   ASC 3,SAVE   *790808
      ASC 3,OFF 
      ASC 3,TRANSFER
      ASC 3,PAUSE 
      ASC 3,SET 
      ASC 3,CALCULATE 
      ASC 3,JOB 
      ASC 3,EOJ 
      ASC 3,ABORT 
      ASC 3,HELP
      ASC 3,CLALL 
      ASC 3,COPY
      OCT 0 
      END 
                          