ASMB,R
*  **************************************************************** 
      HED RTE-M INTERACTIVE (SCROLLING) EDITOR
*     NAME:   EDITM 
*     SOURCE: 92064-18125 
*     RELOC:  92064-16025 
* 
*     PROGMR: H.L.CLAWSON 
* 
* 
      NAM EDITM,3,90  92064-16025  REV.1813  780223 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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.        * 
*  **************************************************************** 
* 
* 
*   MOD TO REPLACE CALL TO DTTY WITH CALL TO IFTTY      780221 GLM
* 
* 
* 
*     ENCODED PROGRAM HALTS DENOTE ALGORITHM ERRORS 
*     IF THEY EVER OCCUR. 
*     HLT 1-NEGATIVE CHAIN LENGTH 
*           GETHD 
*           GETTL 
*     HLT 2-DEST CHAIN EMPTY (ALL RECORDS IN SOURCE CHAIN)
*           READ
*           WRITE 
*     HLT 4-CHAIN LENGTH ALGORITHM ERROR
*           ./^ 
*     HLT 77-PENDING LINE CHARACTER GOT DROPPED 
*           CXT 
* 
      SUP           SUPPRESS EXTRANEOUS LISTING 
      SKP 
      SPC 1 
EDITM JSB RMPAR     GET 'ON' PARAMETERS 
      DEF *+2 
      DEF TTYLU 
      LDB .75 
      STB MAXOP 
      LDB TBUFP 
      STB TBUFF 
      LDB MBUFP 
      STB MBUFF 
      LDB PBUFP 
      STB PBUFF 
      LDB EBUFP 
      STB EBUFF 
      LDB XYBFP 
      STB XYBUF 
      LDB M150
      STB WIND2 
      LDB MINUS 
      STB SDLM
      LDB ";" 
      STB TABCR 
      LDB M6
      STB TAB0
      LDB M20 
      STB TAB0+1
      LDB "@" 
      STB INDE2 
      LDB "/" 
      STB DLMTR 
      LDB "]" 
      STB TERM
      LDB M4
      STB LN        FOUR-CHAR PROMPT
      STB TTY       ASSUME NO INTERACTION 
      STB LIST      ASSUME NO LIST DEVICE 
      LDB B3537 
      STB /+1 
      JSB LIMEM 
      DEF *+4 
      DEF ZERO      GET AVAILABLE MEMORY
      DEF DCBI      FIRST WORD
      DEF ECH       NO. OF WORDS
      CLB 
      STB TAB0+2
      STB SLENG 
      STB DLENG 
      STB PASS
      STB WIND1 
      STB ERR 
      LDA ECH 
      DIV B600      DIVIDE MEMORY INTO 3-SECTOR BLOCKS
      SZA,RSS 
      JMP ER005     INSUFFICIENT MEMORY FOR DCB'S 
      CLB 
      MPY B200      CONVERT SECTOR COUNT TO WORD COUNT
      STA DCBSZ     SIZE OF EACH DCB BUFFER 
      ALS           MULTIPLY BY 2 
      ADA .64       2 DCB HEADERS IN EACH DCB 
      CMA,INA 
      ADA ECH       REMAINING MEMORY USED FOR LINE BUFFERS
      DIV .78 
      STA ALENG     NO. OF LINE BUFFERS AVAILABLE 
      CMA,INA,SZA,RSS 
      JMP ER005     INSUFFICIENT MEMORY 
      STA ./R$
      CLB 
      LDA DCBI
      ADA .9
      STB A,I       CLEAR OPEN FLAG 
      ADA .23       9+23=16*2 
      ADA DCBSZ 
      STA DCBO      START OF SECOND DCB 
      ADA .9
      STB A,I       CLEAR OPEN FLAG 
      ADA .26       9+26=16*2+3 
      ADA DCBSZ 
      STA AHEAD     HEAD OF AVAILABLE MEMORY CHAIN
      LDB A 
      ADA M3       STEP TO FORWARD LINK 
      ADB .78      CALCULATE NEXT BLOCK ADDRESS 
      STB A,I      SET FORWARD LINK 
      ADB M156     CALCULATE PREVIOUS BLOCK ADDRESS 
      INA          STEP TO BACKWARD POINTER 
      STB A,I      SET BACKWARD LINK
      ADA .77      STEP TO NEXT RECORD'S FORWARD LINK 
      ADB .234     CALCULATE THAT FORWARD LINK
      ISZ ./R$     LAST RECORD? 
      JMP *-7      NO-INITIALIZE NEXT BLOCK 
      ADA M78      YES-STEP TO LAST RECORD OF CHAIN 
      CCB 
      STB SHEAD 
      STB STAIL 
      STB DHEAD 
      STB DTAIL 
      STB A,I      DENOTE AS END-OF-CHAIN 
      ADA .3       STEP TO LAST RECORD'S DATA ADDRESS 
      STA ATAIL    SET TAIL POINTER 
      LDA AHEAD    STEP TO FIRST RECORD OF CHAIN
      ADA M2       STEP TO BACKWARD POINTER 
      STB A,I      DENOTE AS START-OF-CHAIN 
      LDB ALFIL     SET TO INPUT ALL FILE NAMES 
      LDA TTYLU+3 
      SZA,RSS       IF FOURTH 'RUN' PARAMETER NOT ENTERED 
      LDB NOSCR       DO NOT ASK FOR SCRATCH FILES
      CLA           NO ERRORS SO FAR
      STA SF1       CREATE SCRATCH FILES IF OPERATOR DEFAULTS 
      STA SF2 
* 
BADFL JSB FMPER     PRINT ANY ERRORS
      CLA 
      LDB OPT 
      CPB SCR1
      STA SF1       ALWAYS CREATE DEFAULT SCRATCH FILES 
      CPB SCR2
      STA SF2 
      JSB GTFIL     ASK OPERATOR FOR FILE NAMES 
      DEF *+10
      DEF OPT       OPTIONS 
      DEF TTYIP     ERROR 
      DEF TTYLU     COMMAND INPUT 
      DEF INPUT     SOURCE FILE 
      DEF RUBSH     OUTPUT
      DEF RUBSH     LIST
      DEF RUBSH     ERROR LIST
      DEF SF1       SCRATCH 1 
      DEF SF2       SCRATCH 2 
      LDA GDCB+9    SEE IF GDCB IS OPEN TO THIS PROGRAM 
      SZA,RSS 
      JMP ER002     TELL OPERATOR 'COMMAND FILE NOT FOUND'
      LDA GDCB.     ADDRESS OF COMMAND INPUT DCB
      STA LDCB.     LIST DCB
      LDB GDCB+2    FILE TYPE 
      STB TYPE
      SZB 
      JMP NOTTY     NOT TYPE 0, NO INTERACTION
**
**  CALL IFTTY TO SEE IF INTERACTIVE DEVICE    780221 GLM 
**
      JSB IFTTY     CHECK FOR INTERACTIVE COMMAND INPUT DEVICE
      DEF *+2 
      DEF GDCB+3    LU
**
**
      SSA,RSS 
      JMP NOTTY 
      CLA,INA 
      STA TTY       INTERACTION ALLOWED (A=1) 
      STA LIST      LISTING ALLOWED 
NOTTY LDA TTYIP     ERROR CODE
      CPA M12       END OF FILE?
      JMP ./AB      YES, ABORT
      LDB INFL      ASK FOR INPUT FILE AGAIN
      LDA INPUT+1      IF ERROR OCCURRED
      SSA 
      JMP BADFL 
      LDB SCR1
      LDA SF1+1 
      SSA 
      JMP BADFL     ASK FOR SCRATCH FILE AGAIN
      LDB SCR2
      LDA SF2+1 
      SSA 
      JMP BADFL     ASK FOR SCRATCH FILE AGAIN
      JSB PASS1     OPEN INPUT SCRATCH FILE 
      JMP BADFL     ERROR, TRY AGAIN
      LDA SFP1
      JSB OPENO     OPEN SCRATCH FILE FOR OUTPUT
      JMP BADFL     ERROR, TRY AGAIN
      JSB WRITF     WRITE END OF FILE 
      DEF *+5 
      DEF DCBO,I
      DEF RUBSH 
      DEF RUBSH 
      DEF M1
      LDB SCR1
      SSA 
      JMP BADFL     ERROR, TRY AGAIN
* 
      LDA INPUT+4 
      SSA 
      JMP RWND      DEFAULT TO SCRATCH INPUT FILE 
      LDA INPP
      JSB OPENI     OPEN USER SOURCE FILE 
      JMP BADFL     ERROR, TRY AGAIN
      CCA 
      STA PASS      SET TO OPEN SCRATCH AFTER ONE PASS
* 
RWND  JSB RWNDO     REWIND OUTPUT FILE
      JSB RWNDI     REWIND INPUT FILE 
* 
READ1 JSB READ      READ IN FIRST LINE
* 
DISPL JSB LSTSB     LIST PENDING LINE 
* 
NODE1 CLA 
      STA EXFLG      EXCHANGE FLAG
      LDA TTY 
      LDB GDCB. 
      SSA,RSS       IF INTERACTIVE, 
      STB LDCB.        RESET LIST DEVICE TO INPUT DEVICE
* 
*     'X', 'Z', 'U', AND 'V' RETURN TO NODE2 UPON COMPLETION. 
*     SO THE EXCHANGE PATTERN REMAINS ENABLED.
NODE2 JSB TTYIP     INPUT COMMAND 
      JSB CAPS      FETCH COMMAND CHARACTER 
      JMP ER001     NULL IS AN INVALID COMMAND
      STA COMND     SAVE FOR LATER
      CPA "A" 
      JMP ./A       ABORT EDITOR
      LDB B40       RESET TAB FILL
      STB TBFIL     TO SPACE
      CPA B40 
      JMP O/PEB     INSERT AFTER
      CPA "=" 
      JMP ./=       CHANGE LINE LENGTH
      CPA %G
      JMP ./CG      MUTE BELL WITH PROMPT.
      CPA "P" 
      JMP ./P       DISPLAY PENDING LINE
      CCB 
      STB TRFLG     DO TRANSFER TO DEST. FILE 
      STB LSTFG     DO LIST 
      CPA "C" 
      JMP ./P       EDIT PENDING LINE & GOTO NEXT 
      CPA "!" 
      JMP ./!       PRINT SOURCE FILENAME 
      CPA "$" 
      JMP ./$       LIST OR CHANGE CONSTANT CHARACTERS
      CPA "L" 
      JMP NUMBR     LIST SEVERAL LINES
      CLB 
      STB LSTFG     DON'T LIST
      CPA "#" 
      JMP ./#       APPEND SEQUENCE NUMBERS 
      CPA "O" 
      JMP ./O       COPY & EDIT PENDING LINE
      CPA "K" 
      JMP ./K       KILL TRAILING BLANKS
      CPA "M" 
      JMP ./M       MERGE FILE AFTER PENDING LINE 
      CPA "?" 
      JMP ./?       ANSWER A QUESTION 
      CPA "/"       SLASH AND "+" MEAN THE SAME 
      RSS 
      CPA PLUSS 
      JMP NUMBR     GO DOWN SEVERAL LINES 
      CPA "E" 
      JMP ./E       END EDITOR
      CPA "N" 
      JMP ./N       DISPLAY PENDING LINE NUMBER 
      CPA "T" 
      JMP ./T       CHANGE TABS 
      CPA "U" 
      JMP ./U       UNCOND. REPLACE W/O LIST. 
      CPA "V" 
      JMP ./V       THIS WITH LIST. 
      CPA "W" 
      JMP ./W       SPECIFY A NEW WINDOW
      CPA "G" 
      JMP ./Z       EXCHANGE IN PENDING LINE
      CPA "X" 
      JMP ./X       EXCHANGE IN ALL LINES WITH LIST 
      CPA "Y" 
      JMP ./X       EXCHANGE IN PENDING LINE AND SEARCH FOR NEXT MATCH
      CPA "Z" 
      JMP ./Z       EXCHANGE IN ALL LINES W O LIST
      CPA "^" 
      JMP ./^       GO UP SEVERAL LINES 
      STB TRFLG     DON'T TRANSFER
      CPA MINUS 
      JMP NUMBR     DELETE SEVERAL LINES
      JSB ASCII 
      RSS 
      JMP FNUM      FIND LINE NUMBER
      JSB TAB       TAB THE COMMAND LINE
      LDA COMND      RESTORE COMMAND CHARACTER
      CPA "R" 
      JMP ./R       REPLACE PENDING LINE
      CPA "I" 
      JMP ./I       INSERT BEFORE 
      CPA "D" 
      JMP SERCH     DELETE UNTIL MATCH
      CCB 
      STB TRFLG     DO TRANSFER 
      CPA "F" 
      JMP SERCH     FIND MATCH
      CPA "B"       COMPLETE TRANSFER AND START SEARCH
      JMP ./B         FROM THE BEGINNING
      CPA "S" 
      JMP ./S       SEARCH AND MERGE
      JMP ER001     INVALID COMMAND 
*** 
      SKP 
      SPC 1 
*     '-', '/', AND '+' COMMANDS
* 
NUMBR JSB NUMIN     READ NUMERIC PARAMETER
      CMA,INA,SZA,RSS COMPLEMENT NUMBER 
      CCA           IF NUMBER IS ZERO SET 
      STA COUNT      TO -1
      JSB NLSLU     SET UP NEW LU IF GIVEN
./CC  JSB TR
FNUM2 ISZ COUNT     FOUND LINE NUMBER?
      JMP ./CC      NO, FETCH NEXT LINE 
      JMP DISPL     YES, DISPLAY IT 
*** 
*     'D', 'F', AND 'B' COMMANDS
* 
SERCH JSB M.T       MOVE PATTERN TO MATCH BUFFER
NEXT  JSB TR        WRITE PENDING LINE & READ NEXT
      JSB COMPR     COMPARE PENDING LINE TO MATCH BUFFER
      JMP NEXT      PATTERN NOT FOUND - CONTINUE
      JMP DISPL     FOUND - DISPLAY IT
      SKP 
      SPC 1 
* 
*     THIS ROUTINE POSITIONS TO A GIVEN LINE NUMBER.
*     LINES IN THE SOURCE CHAIN ARE SKIPPED TO
*     INSURE THAT LINE NUMBERS MATCH RECORD NUMBERS 
*     ON THE DISC.
      SPC 1 
FNUM  CLA           RESET COMMAND 
      STA ECCNT       CHARACTER POINTER 
      JSB NUMIN     COMPUTE LINE NUMBER 
      CMA,INA,SZA,RSS  COMPLEMENT AND IF ZERO 
      CCA             SET TO -1 
      STA COUNT         AND SAVE
      STA TRFLG     SET TRANSFER FLAG 
      JSB NLSLU     SET UP NEW LU IF GIVEN
      LDB LINEM 
      SZB 
      JMP ER003     MORE THAN 32000 RECORDS 
      LDA LINES 
      SSA 
      JMP ER003     MORE THAN 32000 RECORDS 
      SZA,RSS       IF NULL INPUT FILE
      JMP FNUM3       ROLL OVER FILES 
      ADA COUNT     SUBTRACT DESIRED LINE 
      SSA,RSS 
      JMP FNUM3     BACK UP 
      LDB SLENG 
      CMB,INB       CLEAR OUT SOURCE CHAIN
      ADA B           THEN ADVANCE INPUT FILE 
      STA COUNT 
      JMP ./CC      GO FIND LINE
*** 
*** 
./#   LDA M3        SKIP OVER 
      STA COUNT     ALPHA COMMENT.
./#0  JSB ECH 
      NOP 
      ISZ COUNT 
      JMP ./#0
      JSB NUMIN     FETCH START NUMBER
      STA BASE       AND SAVE AS BASE 
      JSB NUMIN     FETCH 2ND NUMBER
      SZA,RSS       IF ZERO SET 
      LDA .10        TO 10 AND
      STA INCR        SAVE AS INCREMENT 
      JSB ./B1       GO TO BEGINNING OF FILE
      JSB READE     READ A LINE 
*** 
./#1  CLA           RESET CHARACTER OUTPUT
      STA OCCNT      COUNTER
      LDA M72       MOVE
      STA COUNT      FIRST PART OF SOURCE 
./#2  JSB PCH         CHARACTERS
      JMP SPC          OF SOURCE
      JSB OUTCR         TO OUTPUT 
      ISZ COUNT          BUFFER 
      JMP ./#2
      JMP ./#3
*** 
SPC   LDA B40       BLANK 
      JSB OUTCR       FILL TO 
      ISZ COUNT       COLUMN 72 
      JMP SPC 
./#3  CLA,INA       SET UP COMMAND
      STA ECCNT      BUFFER COUNTER 
      LDA M3        SET UP LOOP 
      STA COUNT      COUNTER FOR 3 CHARACTERS 
./#4  JSB ECH       FETCH NEXT ALPHA COMMENT
      LDA B40       LOAD BLANKS IF NO COMMENT 
      JSB OUTCR     OUTPUT CHARACTER
      ISZ COUNT     THIRD CHARACTER?
      JMP ./#4      NO, FETCH NEXT CHARACTER
*** 
      LDA BASE      OUTPUT LINE NUMBER
      CLB 
      JSB DEC        IN ASCII 
      LDA BASE      UPDATE
      ADA INCR       LINE 
      STA BASE        NUMBER
      JSB ./R$      SWAP TBUFF AND PBUFF
      JSB TR        WRITE PENDING LINE AND READ NEXT
      JMP ./#1      CONTINUE
*** 
      SKP 
      SPC 1 
*     SET UP MAXIMUM OUTPUT LENGTH (ALWAYS WORD COUNT)
* 
./=   JSB NUMIN     GET REQUESTED LENGTH
      SZA,RSS 
      JMP ER000     ZERO ILLEGAL
      ADA M151      IF LONGER THAN ALLOWABLE
      SSA,RSS 
      JMP ER000     PRINT ERROR 
      ADA .152
      CLE,ERA       CONVERT TO WORD COUNT 
      STA MAXOP 
NLS   JSB NLSLU     CHECK FOR NEW LIST DEVICE 
      JMP NODE1 
      SPC 3 
*     SET UP WINDOW FOR SEARCH AND EXCHANGE COMMANDS
* 
./W   JSB CHKN      CHECK PARAMETERS
      JSB NUMIN     FETCH 
      SZA            START OF 
      ADA M1          WINDOW
      STA WIND1        POINTER
      JSB NUMIN     FETCH 
      CMA,INA,SZA,RSS  END OF 
      LDA M150        WINDOW
      STA WIND2        POINTER
      ADA WIND1     TEST THAT START IS BEFORE END 
      SSA,RSS 
      JMP ER000 
      JMP NODE1     GET NEXT COMMAND
      SPC 1 3 
*                                   DELETE TRAILING BLANKS FROM THE FILE
./K   JSB ./B1      ROLL-OVER FILE
./K1  JSB READE     READ FIRST LINE 
      INA           ROUND UP
      CLE,ERA       CONVERT TO WORD COUNT 
./K2  ADA M1        BACK UP ONE WORD
      SZA,RSS 
      JMP ./K3      DO NOT DELETE LAST WORD 
      LDB PBUFF 
      ADB A 
      LDB B,I 
      CPB SPSP      CHECK FOR 2 BLANKS
      JMP ./K2      YES, DECREMENT LINE LENGTH
./K3  INA 
      ALR           CONVERT TO CHARACTER COUNT
      STA PLNG      STORE NEW RECORD LENGTH 
      JSB O/PSB     MOVE NEW RECORD TO DEST. FILE 
      JMP ./K1      AND FIX IT
                                