ASMB,R
*                   <800822.0737> 
* 
* 
*  ***************************************************************
*  * (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.       *
*  ***************************************************************
* 
* 
*           NAME:   EDIT4 
*           SOURCE: 92074-18011 
*           RELOC:  PART OF 92074-12002 
*           PGMR:   J.D.J.
* 
* 
      NAM EDIT4,5,51 92074-1X011 REV.2034 800818
* 
      ENT EDIT4 
      ENT ED%SC     SCREEN COPY 
      ENT ED%SM     SCREEN MODE 
      ENT ED%QP     DVR05 Q COMMAND 
      ENT ED%SL     SCREEN MODE LIST
      ENT ED%SE     SET CODE
      ENT ED%SH     SHOW CODE 
      ENT ED%.T     TABS
      ENT ED%TI     TI TIME COMMAND 
      ENT ED%.J     JOIN COMMAND
      ENT ED%H2 
      EXT KEY 
* 
      EXT SHOW
      EXT EHLP2 
      EXT ADDSK 
* 
      EXT FTIME 
* 
* 
* 
      EXT KEYFG 
      EXT SNEXT 
*     EXT PSL1
      EXT L1LIN 
      EXT L1FLG 
      EXT L1SAV 
      EXT L2LIN 
      EXT ENDCK 
      EXT ROLLN 
*     EXT SETAB     SET LINES SPEC FLAGS TO ABSOLUTE
* 
      EXT .LBT,.SBT,.MBT,.MVW,.CMW,.XFER,.ENTR
      EXT CNUMD 
      EXT $CVT1,$CVT3 
* 
      EXT SRTN
* 
      EXT ./B1
      EXT TRN 
      EXT PRINT 
      EXT PSLN
      EXT ./R 
      EXT LSTSB 
      EXT TR
      EXT ECH 
      EXT ECHL
      EXT ECCNT 
      EXT PBKE
      EXT ELNG
      EXT EBUFF 
      EXT RBUFF 
      EXT RLNG
      EXT RCCNT 
      EXT PATCH 
      EXT CD1ST 
      EXT OUTCR 
      EXT TBUFF 
      EXT OCCNT 
      EXT OUTBK 
      EXT EOFLN 
      EXT LST 
      EXT LSTA
      EXT LSTSZ 
      EXT WRTLN 
      EXT SWPET 
      EXT SLNG
      EXT TTYDV 
      EXT TSFLG     TIME STAMP FLAG 
      EXT ATLOG 
      EXT LSTLU 
      EXT ERR 
      EXT DISPL 
      EXT NODE1 
      EXT NODE3 
      EXT EOFPR 
      EXT L1ERR 
      EXT L2ERR 
      EXT CSTRP 
      EXT NUMIN 
      EXT DOUTP 
      EXT DFL1S     MOVE TO LINE SPEC 1 , DEFAULT TO DOT
      EXT TTYNO 
      EXT CDVR5 
      EXT LULOG 
      EXT TTYLU 
      EXT MAXOP 
      EXT LINES 
      EXT T#REC 
      EXT TRFLG 
      EXT BKFLG 
      EXT LSTFG 
      EXT MODFG 
      EXT NLFLG 
      EXT UNFLG 
      EXT R1STF     FIRST REPLACE BY ./R$ FLAG
      EXT SPFLG 
      EXT NSAVE 
      EXT PSSAV 
      EXT MLFLG 
*     EXT BYCNT 
      EXT TMSIZ 
      EXT TMDFT 
      EXT ABOVE 
      EXT BELOW 
      EXT OLAP
      EXT QSFLG 
      EXT DSPFG 
      EXT ^DSPF 
      EXT B^FNM 
      EXT FNSIZ 
      EXT SSTRT 
      EXT SMTSV 
      EXT SMBSV 
      EXT DOWN
      EXT Q#LST 
* 
* 
* 
* 
      EXT ./QT
      EXT ASK 
      EXT SETOK 
      EXT PUNCT 
      EXT GETNM 
      EXT NUMIN 
      EXT LST 
      EXT SWPET 
      EXT ASCII 
      EXT NOLSP 
* 
      EXT ERR 
      EXT NODE1 
* 
      EXT ASKFG     ASK FLAG
      EXT FOLDF     CASE FOLDING FLAG 
      EXT FDFLG     CASE FOLDING FLAG 100000=> DON'T FOLD  0=> FOLD 
      EXT REFLG     REGULAR EXPRESSION FLAG 
      EXT DSPFG     DISPLAY FUNCTION FLAG 
      EXT FRTNF     FIND RETURN FLAG
      EXT ANCCH     ANCHOR CHAR 
      EXT INDEF     INDEFINATE MATCH CHAR 
      EXT ESCCH     ESCAPE CAHR 
      EXT BAR       COMMAND SEPERATOR 
      EXT DLMTR     PROMPT
      EXT TABCH     TAB CHARACTER 
      EXT VWABV     VERTCAL WINDOW ABOVE
      EXT VWBLW       "      "     BELOW
      EXT ABOVE     SCREEN WINDOW ABOVE 
      EXT BELOW     SCREEN WINDOW BELOW 
      EXT OLAP       SCREEN OVERLAP 
      EXT WIND1     WINDDOW START COLUM 
      EXT WIND2     -WINDOW STOP COLUMN 
      EXT TBUFF     POINTER TO OUTPUT BUFFER
      EXT TAB0      TAB BUFFER
      EXT MAXOP     MAX LINE LENGTH 
      EXT MAXIN 
      EXT MAX 
      EXT /         PROMPT
      EXT LN        PROMPT LENGTH 
      EXT OCCNT     OUTPUT BUFFER COUNT 
      EXT SPFLG     LEADING SPACES FLAG 
      EXT TTYDV 
      EXT TAB0      TAB BUFFER
* 
      EXT ./R$      REPLACE PENDING LINE
      EXT OUTCR     PUT CHAR IN T BUFF
      EXT UNDOD     UNDO SET UP 
      EXT I/PSB 
      EXT SCH 
      EXT ENDCK 
* 
      EXT DISPL 
      EXT ERR 
* 
      EXT SLNG
* 
A     EQU 0 
B     EQU 1 
* 
************************
* 
EDIT4 JMP SRTN      JUMP BACK TO MAIN 
* 
ED%SH NOP 
      JSB KEYST       SET KEY 
      JSB SHOW      GO GIVE HELP MESSAGES 
       DEF SHOWR
SHOWR EQU * 
      JMP NODE1     RETURN
* 
*  SECOND PART OF HELP SEGMENT
* 
* 
ED%H2 NOP 
      JSB EHLP2 
        DEF EHL2R 
EHL2R EQU * 
      JMP ED%H2,I 
* 
******************************************* 
* 
M32 DEC -32 
M10   DEC -10 
M7    DEC -7
M6    DEC -6
M3    DEC -3
M2    DEC -2
M1    DEC -1
.1    DEC 1 
I.1   OCT 100001
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.5    DEC 5 
.6    DEC 6 
.10   DEC 10
.12   DEC 12
.15   DEC 15
.39   DEC 39
.40   DEC 40
.25    DEC 25 
.77   DEC 77
.100  DEC 100 
K32   OCT 77777 
* 
B17   OCT 17
B40   OCT 40        A BLANK 
B77   OCT 77
* 
"R"   OCT 122 
"O"   OCT 117 
"B"   OCT 102 
"S"   OCT 123 
"D"   OCT 104 
SPSP  ASC 1,
* 
MSPSP DEF SPSP
* 
SLASH OCT  57 
PLUS  OCT  53 
"@"   OCT 100 
"^"   OCT 136 
">"   OCT  76 
"."   OCT  56 
"C"   OCT 103 
* 
TMASK OCT 240       MASK FOR CNTR-L D BITS
DVR05 OCT 2400      MASK FOR DRIVER TYPE 5
* 
* 
TEMP  BSS 1         CAN'T DO A JSB AND EXPECT TEMP TO SAY 
ELSAV BSS 1         ELNG SAVE HERE DURING A SCREEN READ 
ESB0B DBL ESBF0     BYTE POINTER TO E SAVE BUFF 
ESBF0 BSS 75        SAVE AREA FOR EBUFF 
SRFLG BSS 1         IF -1 THEN DO SCREEN READ 
* 
* 
* 
******************************************************* 
* 
* 
ED%SC CCA           SNARF MODE
      STA SNRFG       SET SNARF FLAG
      JSB UNDOD     SET UP FOR A POSSIBLE UNDO
      STA TRFLG     SET TRANSFER FLAG 
      CLA           CLEAR 
      STA LSTFG       LIST FLAG 
      JSB TR        TRNASFER PENDING LINE 
      JSB SREAD 
      CLA           CLEAR 
      STA SNRFG      SNARF FLAG 
      JSB QSEX      CLEAN UP KEYBOARD LOCK
      JMP NODE1 
* 
SNRFG DEC 0         IF -1 THEN DON'T REMOVE FIRST 2 CHAR ON SCREEN READ 
* 
* 
**************************************************
* 
*   SCREEN MODE 
* 
ED%SM EQU * 
* 
      CLA             CLEAR 
      STA QSFLG         RETURN TO SCREEN MODE FLAG
      JSB PRINT       CLEAR DISPLAY,SET MARGINS + MEMORY LOCK ON
      DEF ./QS2 
      DEC -33 
      OCT 015532      <ESC>< Z > DISPLAY FUNCTIONS OFF
      OCT 015543      <ESC>< c > LOCK KEYBOARD
      OCT 015530      <ESC>< X > FORMAT OFF 
      OCT 015555      <ESC>< m > MEMORY LOCK OFF
      OCT 015522      <ESC>< R >  INSERT OFF
      OCT 015446      <ESC>< & > POSITION CURSOR TO 1ST ROW AND COL 
      ASC 3,a0r00C
      OCT 015464      <ESC>< 4 > SET LEFT MARGIN
      OCT 015502      <ESC>< B > CURSOR DOWN
      OCT 015504      <ESC>< D > CURSOR LEFT ( WILL WRAP) 
      OCT 015465      <ESC>< 5 > SET RIGHT MARGIN 
      OCT 015510      <ESC>< H > HOME UP
      OCT 015512      <ESC>< J > CLEAR DISPLAY
      OCT 015554      <ESC>< l > MEMORY LOCK ON 
      OCT 057400      < _ > 
* 
* 
* 
./QS2 CLA           CLEAR 
      STA SPFLG       LEADING SPACES FLAG 
      STA NLFLG       NUMBER LIST FLAG
      LDA L1LIN     STARTING LINE NUMBER
      LDB ^TOPL     GET A POINTER TO SPECIAL START LINE 
      JSB WRTSL     GO WRITE OUT START LINE 
      CLA           CLEAR 
      STA TRFLG      TRANSFER FLAG
      CCA           SET 
      STA MLFLG         MEMORY LOCK FLAG
      STA LSTFG           AND LIST FLAG 
      LDA Q#LST     GET NUMBER OF LINES TO LIST 
      JSB TRN        AND LIST THEM
      CLA             CLEAR 
      STA MLFLG           MEMORY LOCK FLAG
      LDA SSTRT     COMPUTE NUMBER OF 
      CMA,INA         LINES 
      ADA LINES        LISTED 
      STA Q#LST 
      ADA L1LIN     AND ALSO
      ADA M1          COMPUTE THE STOP LINE NUMBER
      STA L2LIN     AND SAVE AS LINE SPEC 2 
      LDA SSTRT     GET START LINE NUMBER 
      JSB PSLN      RETURN FILE TO THERE
      LDA L1SAV     IF LINE SPEC GIVEN
      LDB L1FLG       THEN POSITION CURSOR TO IT
      SSB                WITHOUT ANY OFFSET 
      STA DOWN
      LDA L1LIN     COMPUTE 
      CMA,INA        LINES TO MOVE
      ADA DOWN       CURSOR DOWN WHEN LIST IS FINISHED
      SSA           TEST FOR NEGITIVE 
.QSNS CCA             YES - SET NEG TO WE WILL CENTER 
      STA DOWN      SET CURSOR DOWN MOVEMENT. 
      LDA L2LIN     GET LINE 2 NUMBER 
      LDB ^BOTL     GET POINTER TO SPECIAL BOTTOM LINE
      JSB WRTSL     WRITE OUT THE LINE
      LDB DOWN      GET NUMBER OF TO MOVE DOWN
      SSB,RSS       IF NEGITIVE THEN CENTER CURSOR
      JMP .QS12       POSITIVE - USE AS IS
      LDB Q#LST       CENTER CURSOR, GET NUMBER LISTED
      CLE,ERB       DIVIDE BY 2 
      STB DOWN
.QS12 CMB           MAKE NEGITIVE AND SUBSTRACT ONE 
      ADB Q#LST     TEST FOR AT LEST THAT MANY LISTED 
      CLA           SET A REG TO ZERO 
      SSB           IF POSITIVE THEN OK 
      STA DOWN        NEGITIVE - POSITION AT ROW 0
      ISZ DOWN       BUMP BECAUSE TOP LINE ADDS ONE 
      LDA DOWN       POSITION SCREEN TO TEN ABOVE 
      ADA M10          WHERE CURSOR WILL
      SSA              BE . TEST FOR NEGITIVE.
      CLA           YES - POSITION AT ROW ZERO
      STA DOWN1 
      JSB CNUMD     CONVERT DOWN1 TO ASCII
        DEF .QS.1 
        DEF DOWN1 
        DEF FDOWN 
* 
.QS.1 JSB CNUMD     CONVERT DOWN TO ASCII 
        DEF .QS.2 
        DEF DOWN
        DEF ADOWN 
.QS.2 JSB PRINT      MOVE SCREEN AND CURSOR 
        DEF .STAB 
        DEC -24 
        OCT 15446     <ESC>< & >
        ASC 1,a        EXTRA SPACE
FDOWN   BSS 3 
        OCT 051033    < R ><ESC>
        ASC 1,&a
ADOWN   BSS 3 
        OCT 051033    < R ><ESC>
        ASC 1,b_          ESC b  - UNLOCK KEYBOARD
* 
DOWN1 BSS 1 
* 
.STAB EQU * 
*.STAB JSB SETAB     SET UP LINE SPEC FLAG FOR ABOLUTE
*                       THE COMMNADS WILL FILL IN THE VALUES LATER !
./QS3 JSB HONST      SET HONSET INPUT MODE
* 
./QS4 CLA 
      STA ECCNT 
      CCA 
      STA SRFLG     SET SCREEN READ FLAG
      JSB TTYNO     READ IN THE LINE - NO PROMPT MODE 
      LDB ELNG        INPUT LINE
      SZB,RSS       IF LINE IS ZERO 
      JMP ./QS4       LENGTH THEN CAN'T BE A COMMAND
      LDA MAXIN     IF LINE IS
      CMA,INA             MAX LENGTH
      CPA ELNG             THEN 
      JMP ./QS4             CAN'T BE A COMMAND SO GET NEXT
      LDA =D1 
      CPA ELNG
      JMP .QSRC   ONLY ONE CHAR - MUST BE A READ
* 
      LDB EBUFF     TEST IF LAST TWO BYTES MATCH
      CLE,ELB       MAKE IT A BYTE ADDRESS
      ADB ELNG
      ADB =D-2
      JSB .LBT      GET THE NEXT TO LAST BYTE 
      STA TEMP
      JSB .LBT      GET LAST BYTE 
      XOR TEMP      TEST IF THEY ARE THE SAME 
      SZA,RSS 
      STA SRFLG       CLEAR SCREEN READ FLAG FOR NO READ. (A REG IS ZERO) 
* 
.QSRC JSB NORMA     RESTORE TO MODE 
      LDB EBUFF     GET 
      CLE,ELB         LAST CHAR 
      ADB ELNG
      ADB =D-1
      JSB .LBT
      CLB           CLEAR B REG BECUASE IT IS USED AS A FLAG
      CPA %P        PREV SCREEN ? 
      LDB ^QS%P       YES - GET COMMAND HANDLER 
      CPA %S        START HERE ON NEXT SCREEN ? 
      JMP .QSSC       YES - GO READ CURSOR POSITON
      CPA %X        START HER WITH EXTRA LARGE SCREEN ? 
      JMP .QSXC       YES - GO READ CURSOR POSITON
      CPA %F        FOLLOWING SCREEN ?
      LDB ^QS%F       YES - GET COMMAND HANDLER ADDRESS 
      CPA %Q        QUIT SCREEN MODE
      LDB ^QS%Q       YES - GET COMMAND HANDLER 
      CPA %C        SCREEN COMMAND MODE ? 
      JMP .QSCC       YES - GO GET COMMAND
      CPA %O        IS IT A COPY ONE LINE 
      JMP .QS%O       YES - GO DO IT
      SZB,RSS       IS B REG STILL ZERO ? 
      JMP ./QS3       YES - NOT A COMMAND - STAY IN SCREEN MODE 
.QSC1 STB SCCMD       NO  - SAVE AS ADDRESS OF COMMAND HANDLER
      LDB SRFLG     TEST SCREEN READ FLAG 
      SSB 
      JSB SREAD      SET SO READ SCREEN 
      JMP SCCMD,I   GO DO COMMAND 
* 
SCCMD BSS 1         COMMAND HANDLER ADDRESS SAVE HERE 
* 
%C    OCT  3
%F    OCT  6
%O    OCT 17
%P    OCT 20
%Q    OCT 21
%S    OCT 23
%X    OCT 30
* 
^QS%P DEF .QS%P 
^QS%S DEF .QS%S 
^QS%F DEF .QS%F 
^QS%Q DEF .QS%Q 
^QS%C DEF .QS%C 
* 
.QSSC JSB CURPS     GET CURSOR POSITION 
      LDA ABOVE 
      ADA BELOW     GET DEFAULT SCREEN SIZE 
*     INA 
.QSS1 STA %SSIZ       AND SET AS SCREEN SIZE. 
      LDB ^QS%S     GET COMMAND HANDLER ADDRESS 
      JMP .QSC1     AND CONTINE PROCESSING
* 
.QSXC JSB CURPS     GET CURSOR POSITION 
      LDA K32       GET A LARGE NUMBER
      JMP .QSS1          AND CONTINUE PROCESSING
* 
.QSCC LDA SRFLG     GET SCREEN FLAG 
      LDB "\_"      ASSUME NO READ
      SSA           IF SET THEN  READ 
      LDB "/_"        SET - USE A DIFFERENT PROMPT
      STB QSCP      PATCH IN THE PROMPT 
      JSB PRINT     INSET A LINE AND PRINT THE PROMPT 
      DEF .QSCI 
      DEC 7 
      OCT 015532    <ESC>< Z > DISPLAY FUNCTIONS OFF
      OCT 015514    <ESC>< L > INSERT LINE
      OCT 015446    <ESC>< & > CURSOR ABSOLUTE POSITION 
      ASC 2,a00C      TO COLUMN ZERO
      OCT  015464   <ESC>< 4 > SET LEFT MARGIN
QSCP  BSS 1         PROMPT PATCH IN HERE
* 
"/_"  ASC 1,/_      BACKARROW SUPPERSSES CRLF 
"\_"  ASC 1,\_      BACKARROW SUPPERSSES CRLF 
* 
.QSCI JSB TTYNO     INPUT LINE WITH NO PROMPT INTO EBUFF
      JSB CURUP     MOVE THE CURSOR UP DO TO CR LF
      LDA ELNG      GET LENGTH OF INPUT BUFFER
      SZA,RSS       TEST FOR ZERO 
      JMP .QSC2      YES - JUST REMOVE LINE AND STAY IN SMODE 
      STA RLNG       NO  - SET LENGTH IN INPUT BUFFER 
      INA 
      CLE,ERA 
      STA TEMP        COPY COMMAND TO IT. 
      CLA 
      STA RCCNT 
      LDA EBUFF 
      LDB RBUFF 
      JSB .MVW
        DEF TEMP
        NOP 
      JSB CURPS     GET CURSOR POSITION 
      JSB DELLN     DELETE THE COMMAND
      LDB ^QS%C     GET A POINTER TO THE AFTER READ COMMAND HANDLE
      JMP .QSC1     GO DO SCREEN IF NEEDED
* 
.QSC2 JSB DELLN     REMOVE THE LINE 
      JMP ./QS3     RETURN TO SCREEN MODE 
* 
.QS%C CLA,INA       TURN ON COMMAND IN RBUFF FLAG 
      STA PATCH 
      STA CD1ST     SET SO COMMAND WILL BE RE-LISTED
      JSB ADDSK     ADD LINE TO COMMAND STACK 
       DEF .Q%C1
       DEF RBUFF,I
       DEF RLNG 
.Q%C1  EQU *
      LDA L2LIN     GET WHERE SCREEN STOPED 
      STA SMBSV     SAVE AS WHERE TO STOP NEXT SCREEN 
      CLA 
      STA LSTFG 
      CCA           SET 
      STA TRFLG       TRANSFER FLAG AND 
      STA QSFLG       RETURN TO SCREEN MODE FLAG
      LDA L1LIN     GET WHERE SCREEN STARTED
      STA SMTSV     SAVE AS WHERE TO START NEXT SCREEN
      ADA CURRW     ADD CURSOR ROW
      STA DOWN      SAVE AS WHERE TO RETURN CURSOR
      JSB ROLLN     ROLL FILE TO THIS POSITION
      JSB QSEX      EXIT SCREEN MODE
      JMP NODE3     GO DO LINE MODE COMMAND 
* 
*** 
* 
* 
.QS%O JSB PRINT 
      DEF .QSO1 
      DEC -16 
      ASC  8,&a0C4D5CA_ 
*  ABSOLUTE POSTION TO COLUMN ZERO, SET LEFT MARGIN, CURSOR LEFT
*   (WILL WRAP), SET RIGHT MARGIN  CURSOR RIGHT ( WILL WRAP BACK), CUSOR UP 
* 
* 
.QSO1 JSB SLINE     READ ONE LINE 
      CCA 
      ADA ELNG      TEST IF IT FITS WITHIN SMAX 
      ADA MSMAX 
      LDB ESCL
      SSA 
      CLB           YES - JUST INSERT ONE LINE
      STB QSOLN     SET NULL OR INSERT LINE 
      JSB PRINT     NO  - INSERT TO LINES 
      DEF .QSO2 
      DEC -5
QSOLN BSS 1 
ESCL  ASC 2,L_     <ESC>< L > UNDERSCORE 
* 
.QSO2 CCA           SET SCREEN MODE LIST FLAG 
      STA MLFLG 
      LDA EBUFF 
      LDB ELNG
      JSB LST 
      CLA 
      STA MLFLG 
      JSB PRINT 
      DEF ./QS3 
      DEC -17 
      ASC 9,DDD5CCCA_   RESET RIGHT MARGIN  
* 
* 
.QS%P LDA OLAP      DEFAULT TO (SPAN SIZE - OVERLAP)
      CMA,INA         MAKE IT NEGITIVE
      ADA ABOVE 
      ADA BELOW 
      CMA,INA       A REG. HAS THE NUMBER OF LINES TO MOVE UP 
      ADA L1LIN     AND MOVE NEXT START LINE UP BY THIS MANY
      ADA =D-1
      JMP .QSM1      GO COMPLETE COMMAND
* 
.QS%S LDA CURRW     GET CURSOR ROW NUMBER 
      ADA L1LIN     ADD OLD START LINE
      STA DOWN      SET CURSOR DOWN LINE TO NEXT START LINE 
      LDB %SSIZ     GET SCREEN SIZE 
      JMP .QSM2      GO COMPLETE COMMAND
* 
.QS%F LDA OLAP     GET MINUS OVERLAP
      CMA,INA        MAKE NEGITIVE
      ADA L2LIN     MOVE DOWN N LINES.(SREAD UPDATES L2LIN) 
      INA 
.QSM1 CCB           SET DOWN TO -1
      STB DOWN         SO WE WILL CENTER
      LDB ABOVE     COMPUTE SCREEN SIZE 
      ADB BELOW 
.QSM2 SSA           TEST IF START IS  NEGITIVE
      CLA,INA         YES - USE LINE 1
      STA SMTSV     SET AS NEXT START LINE
      ADA B         COMPUTE NEXT STOP LINE
      SSA           TEST IF IT WENT NEGITIVE
      LDA K32         YES - USE A VERY LARGE NUMBER INSTEAD 
      STA SMBSV     AND SET.
      LDA L2LIN     GET BOTTOM LINE OF THIS SCREEN
      LDB SMTSV     TEST IF START LINE IS PAST IT 
      CMB,INB 
      ADB A 
      SSB           NEGITIVE
      STA SMTSV       YES - GO SET LAST LINE AS START LINE
      JMP SNEXT     GO WRITE NEXT SCREEN
* 
******************************************
* 
*  WRTSL -  BUILD AND WRITE OUT SPECIAL SCREEN LINE 
*     A REG - LINE NUMBER TO BE PATCH IN
*     B REG - START ADDRESS OF SPECIAL LINE 
*        IF IT IS ^BOTL THEN SPECIAL STUFF PATCH
* 
WRTSL NOP 
      STB WRTTP     SAVE START ADDRESS
      CCE           SET FOR DECIMAL 
      JSB $CVT3     CONVER TO ASCII 
      LDB WRTTP     GET POINTER TO WERE TO PUT IT 
      ADB =D7       LINE NUMBER IS 14 CHAR IN 
      STB ^NUML     SAVE IN CASE IT GET REPACED BY EOF
      JSB .XFER     MOVE 3 WORDS
      LDA WRTTP     GET BACK CENTER OF LINE ADDRESS 
      CPA ^BOTL     TEST IF THIS IS THE END OF SCREEN 
      JMP WSL10     YES - GO DO SPECIAL STUFF 
WSL01 EQU *         COPY
      LDB TBUFF       START 
      JSB .MVW         OF LINE TO TBUFF 
      DEF .39 
      NOP 
      LDA MAXOP     COMPUTE WHERE TO PUT RIGHT MARGIN 
      ADA MSMAX     PICK SMALLER OF 
      SSA,RSS         MAX LINE SIZE AND MAX SCREEN  SIZE
      CLA             SMAX IS SMALLER, (ADD TO 0 IS A LOAD) 
      ADA SMAX      IF MAXOP THEN THIS IS MAXOP (-SMAX+SMAX)
      ADA M10        BUMP IT BACK TEN 
      SSA           TEST IF NOT ENOUGH CHARS
      LDA =D2       RIGH MARGIN LESS THAN TEN - USE (2+8) INSTEAD 
      ADA =D8       COMPUTE WHERE TO PUT END CHARS -10+8=2
      STA OCCNT       AND SET OUTPUT COUNT TO THIS LENGTH 
      LDA =D2       GET LENGTH
      LDB WRTTP     GET CENTER LINE ADDRESS 
      CPB ^BOTL     TEST IF IT IS THE BOTTOM LINE 
      ADA =D4         YES - ADD 4 FOR SETING  RIGHT MARGIN
      STA WRTTP     SET LENGTH FOR .MBT IN THIS TEMP
      LDB TBUFF     GET T BUFFER ADDRESS
      CLE,ELB       CONVERT IT TO A BYTE ADDRESS
      ADB OCCNT     BUMP IT IT END CURRENT TBUFF LINE 
      ADA OCCNT     COMPUTE LENGTH OF 
      STA OCCNT       TBUFF AFTER THE NEXT .MBT AND SET 
      LDA B^END     GET BYTE POINTER TO END LINE
      JSB .MBT      AND MOVE THEM IN. 
        DEF WRTTP 
        NOP 
      LDA TBUFF     GET BUFFER ADDRESS
      LDB OCCNT     AND LENGTH
      JSB LST       GO LIST THE LINE
      JMP WRTSL,I   RETURN
* 
* 
WSL10 JSB EOFLN     GET EOF LINE NUMBER 
      CPA L2LIN     DOES IT MATCH LAST LINE ? 
      RSS 
      JMP WSL11       NO - GO CONTINUE BUILDING THE LINE
      LDA ^EOF        YES - COVER LINE NUMBER  WITH EOF 
      LDB ^NUML 
      JSB .XFER      MOVE 3 WORDS 
WSL11 LDA B^BFL     FILL
      LDB B^BNM      IN BOTTON
      JSB .MBT          LINE WITH BLANKS
      DEF .40 
      NOP 
      LDA FNSIZ     GET FILE NAME SIZE
      SZA,RSS       TEST IF IT IS ZERO
      JMP WSL12       YES - JUST REUTRN 
      STA TEMP      SET AS BYTE COUNT 
      LDA B40       GET A BLANK 
      LDB B^BNM 
      JSB .SBT      PUT IT IN BOTTOM LINE 
      LDA B^FNM 
      JSB .MBT
        DEF TEMP
        NOP 
      LDA B40       ANOTHER BLANK 
      JSB .SBT
WSL12 LDA WRTTP     GET BACK LINES ADDRESS
      JMP WSL01     CONTINUE BUILDING LINE
* 
WRTTP BSS 1         SAVE AREA FOR WHICH LINE POINTER
^NUML BSS 1         ADDRESS OF WHERE TO PUT LINE NUMBERS
* 
* 
^EOF  DEF EOF 
EOF   ASC 3,   EOF
* 
TOPL  ASC  7,>>****** line                                THIS IS   \ 
      ASC  8,XXXXXX *********                               A TABLE.! 
      ASC  25, cntl Q reads *** cntl Q cntl Q aborts *************  / 
^TOPL DEF TOPL
* 
BOTL  ASC  7,>>------ line    \ THIS IS 
      ASC  8,XXXXXX --------- !   A TABLE.
      ASC  5,----------       ! 
BNAME BSS 20                  / 
^BOTL DEF BOTL
BFILL ASC 20,-------------------------------------------------- 
B^BNM DBL BNAME 
B^BFL DBL BFILL 
* 
^ENDL DEF ENDL
B^END DBL ENDL
ENDL  ASC 1,<<                                  \ THIS
      OCT 015504    <ESC>< D > CURSOR LEFT      ! 
      OCT 015465    <ESC>< 5 > SET RIGHT MARGIN /   TABLE 
* 
**
%SSIZ BSS 1         NEXT SIZE FROM SCREEN COMMAND 
* 
************************
* 
*     EXIT SCREEN MODE BECAUSE OF LIN1 ONE ERROR
* 
SL1ER JSB QSEX
      JMP L1ERR 
* 
********************
*     EDIT SCREEN MODE BECAUSE OF LINE 2 ERROR
* 
SL2ER JSB QSEX
      JMP L2ERR 
* 
* 
********************* 
* 
* 
* 
.QSER JSB QSEX      EXIT SCREEN MODE WITH ERROR 
      JMP ERR 
* 
************************* 
.QS%Q JSB QSEX      EXIT SCREEN MODE; LIST PENDING LINE 
      JMP DISPL 
* 
* 
***************************************** 
* 
*  EXIT SCREEN MODE - 
* 
* 
QSEX  NOP 
      JSB PRINT       THEN CLEAR DISPLAY
      DEF QSEX,I       RETURN 
      DEC -28 
      OCT 015532      <ESC>< Z > DISPLAY FUNCTIONS OFF
      OCT 015555      <ESC>< m > MEMORY LOCK OFF
      OCT 015522      <ESC>< R >  INSERT OFF
      OCT 015446      <ESC>< & > POSITION CURSOR TO 1ST COL 
      ASC 2,a00C
      OCT 015464      <ESC>< 4 > SET LEFT MARGIN
      OCT 015502      <ESC>< B > CURSOR DOWN
      OCT 015504      <ESC>< D > CURSOR LEFT ( WILL WRAP) 
      OCT 015465      <ESC>< 5 > SET RIGHT MARGIN 
      OCT 015506      <ESC>< F > HOME DOWN
      OCT 015512      <ESC>< J >  CLEAR DISPLAY 
      OCT 015523      <ESC>< S > ROLL UP
      OCT 015542    <ESC>< b > KEYBOARD ENABLE
* 
************************* 
* 
CURPS NOP           READ CURSOR POSITION
      JSB SLSU      SET UP TTY LU 
      JSB PRINT 
      DEF CURP0 
      DEC -6
      OCT 15501     <ESC>< A > CURSOR UP
      OCT 15532     <ESC>< Z > DISPLAY FUNCTIONS OFF
      OCT 15541     <ESC>< a > CURSOR ABS SENSE 
CURP0 JSB TTYNO     INPUT POSITION
      JSB SLRS      RESTORE TTY LU
      JSB ECH      SRTIP ESC
       JMP CURP3     NONE SO USE ZERO 
      JSB ECH      STRIP &
        JMP CURP3 
      JSB ECH      STRUP a
        JMP CURP3 
CURP1 JSB DIG3#     GET 3 DIGIT NUMBER
      JSB ECHL
        JMP CURP3 
      CPA "R"       WAS THIS THE ROW ?
      JMP CURP2       YES -  THEN WE'RE DONE
      JMP CURP1     GO TRY AGAIN IF THIS IS ROW 
* 
CURP2 LDA D3NUM     GET ROW NUMBER
      ADA M1        SUBRATCT ONE BECAUSER OF TOP LINE 
      SSA           TEST IF WE WERE ON TOP LINE 
CURP3 CLA             YES - FORCE IT TO LINE ZERO ALSO
      STA CURRW 
      STA CURAR 
      LDA ELNG      THROW AWAY
      STA ECCNT       REST OF INPUT LINE .
      JMP CURPS,I   RETURN
* 
CURRW BSS 1   CURSOR ROW AFTER ADJUSTING FOR CONTINUATION LINES 
CURAR BSS 1   CURSOR READ FROM TERMINAL 
* 
* 
DIG3# NOP           CONVERT 3 DIGITS IN E BUFF TO A NUMBER
      LDA M3
      STA TEMP
      CLA 
D3#.1 MPY .10 
      STA D3NUM 
      JSB ECH       GET NEXR CHAR 
      JMP DIG3#,I    IF NONE THEN GIVE UP 
      AND B17       CONVERT ASCCII TO BINARY
      ADA D3NUM 
      ISZ TEMP
      JMP D3#.1 
      STA D3NUM     SAVE FINAL NYUMBER
      JMP DIG3#,I   RETURN
* 
D3NUM BSS 1 
* 
**************************************************
* 
DELLN NOP             DELETE ONE LINE FROM SCREEN 
      LDA ATLOG     GET LAST TRANSMISSION LOG 
      AND TMASK 
      SZA           IF ZERO THEN NOT CNTRL D
      JMP DELN1      IT WAS CNTRL - DON'T MOVE CURSOR UP
      JSB PRINT 
      DEF DELLN,I     RETURN WHEN FINISHED
      DEC -3
      OCT 015515      <ESC>< M > DELETE LINE
      ASC 1,_          BACKARROW
* 
DELN1 JSB PRINT 
      DEF DELLN,I 
      DEC -5
      OCT 015502     <ESC>< B > CURSOR DOWN 
      OCT 015515     <ESC>< M > DELETE LINE 
      ASC 1,_        BACKARROW
* 
************************************************************* 
* 
SREAD NOP             READS SCREEN INTO DESTINATION FILE. 
*                     TERMINATES WHEN STOP LINE IS FOUND OR 
*                     MAX(24,Q#LST)  ZERO LENGHT LINES READ.
* 
SR0   JSB PRINT       HOME CURSOR,FIX MARGIN, MEM LOCK OFF
      DEF SR1 
      DEC -29 
      OCT 015532  <ESC>< Z >   DISPLAY FUNCTIONS OFF
      OCT 015543  <ESC>< c >   LOCK KEYBORRD
      OCT 015522  <ESC>< R >   INSERT OFF 
      OCT 015555  <ESC>< m >   MEMORY LOCK OFF
      OCT 015530  <ESC>< X >   FORMAT MODE OFF
      OCT 015446  <ESC>< & >   POSITION CURSOR TO ROW 0 COL 0 
      ASC 3,a00r0C
      OCT 015464  <ESC>< 4 >   SET LEFT MARGIN
      OCT 015502  <ESC>< B >   CURSOR DOWN
      OCT 015504  <ESC>< D >   CURSOR LEFT ( WILL WRAP )
      OCT 015465  <ESC>< 5 >   SET RIGHT MARGIN 
      OCT 015510  <ESC>< H >   CURSOR HOME
      ASC 1,_ 
SR1   EQU * 
* 
      CLA           CLEAR THE 
      STA #READ       THE NUMBER OF LINES TO DEST FILE COUNTER
      STA LINE#       AND THE ROW NUMBER ON THE SCREEN
      CCA           SET WARN FLAG TO -1 
      STA WRNFG       TO SUPPESS 'SAVE WHAT ?' MESSAGE
      STA MODFG     WE ARE MODIFING THE FILE SO SET THE FLAG
      LDA SNRFG     GET SNARF FLAG
      SZA            SET ?
      JMP SNRF1       YES - SKIP CHECKING FIRST LINE
SR2   JSB SLINE     READ FIRST LINE 
      LDA ELNG      MAKE SURE THERE ARE AT LEAST 8 BYTES
      ADA =D-8
      SSA 
      JMP SR08      NO START LINE FOUND 
      LDA ^TOPL     GET ADDESS OF  COMPASION LINE 
      LDB EBUFF     AND ADDRESS OF LINE READ
      JSB .CMW      COMPARE THEM
        DEF .4        FIRST  8 BYTES
        NOP 
      JMP SR10      STRING ARE EQUAL -
      NOP           NOT EQUAL ( LESS) 
SR08  JSB PRINT     HOME CURSOR SO WE WILL RE-READ THE LINE 
      DEF SR09
      DEC -3
      OCT 015550   <ESC>< h > 
      ASC 1,_ 
SR09  CLA,RSS 
SR10  CCA           SET START OK FLAG 
      STA STROK     SET START WARNING 
* 
*  LOOP UNTIL END OF SCREEN FOUND 
* 
SNRF1 EQU * 
SR20  JSB SLINE 
SR21  LDA ELNG    MAKE SURE THE ARE AT LEAST 10 BYTES 
      SZA,RSS       IS IT ZERO ?
      JMP SRZC1     YES - GO LOOK FOR MORE OF ZERO LEN LINES
      ADA =D-8
      SSA 
      JMP SR22      NO - SO THIS CAN'T BE STOP FLAG 
      LDA SNRFG     IS THIS SNARF MODE ?
      SZA 
      JMP SR22       - YES - SKIP TEST
      LDA ^BOTL     GET POINTER TO COMPARSION LINE
      LDB EBUFF     AND POINTER OF LINE READ
      JSB .CMW      COMPARE 
       DEF .4         10 BYTES
       NOP
      JMP SR30      SUCESSFUL FIND - DONE READING SCREEN
      NOP           NOT EQUAL(LESS) 
SR22  JSB SLOUT     NOT EQUAL - OUTPUT LINE TO DEST. FILE 
        JMP SR32       ERROR - STOP READING, SAVE ORIGINAL  
      JMP SR20
* 
* 
SRZC1 LDA M24         INITIALIZE ZERO LINE COUNT
      ADA Q#LST       USE MAX(24,NUMBER OF LINES LISTED)
      SSA               IF NEG THEN Q#LST IS < 24 
      CLA 
      ADA .24 
      CMA,INA        MAKE IT NEGITVE
      STA MAXZC     SAVE AS MAX ZERO LEN LINESN 
      STA ZCNT      SAVE A LOOP COUNT 
* 
SRZC2 JSB SLINE       READ NEXT LINE
      CLA             CHECK FOR 
      CPA ELNG          ZERO LEN INPUT
      JMP SRZC4         YES IT IS ZERO LEN. - GO TRY NEXT ONE 
      LDA ZCNT        NOT ZERO LEN. OUTPUT BLANK LINES
      CMA             COMPUTE NEGITVE OF NUMBER 
      ADA MAXZC        OF BLANK LINES =(-ZCNT)-1-15 
      STA ZCNT          AND SAVE
      LDA ELNG      FUDGE A ZERO LENGTH LINE
      STA MAXZC     KEEP REAL LENGTH HERE WHILE WE ARE DOING IT 
      CLA 
      STA ELNG      AND RESTORE IT. 
SRZC3 JSB SLOUT     OUTPUT THE 'ZERO LENGTH' LINE 
       JMP SR32        ERROR - STOP READING AND DON'T DELETE ORIGINAL 
      ISZ ZCNT        ENOUGH BLANK LINES ?
      JMP SRZC3         NO - LOOP 
      LDA MAXZC         YES - GET BACK REAL EBUFF LENGTH
      STA ELNG               AND RESTORE IT.
      JMP SR21          YES - CONTINUE READING SCREEN 
* 
SRZC4 ISZ ZCNT        TEST FOR ENOUGH ZERO LINES TO TERMINATE 
      JMP SRZC2         NO - TRY NEXT LINE
      CLA,RSS           YES - CLEAR END OK FLAG 
SR30  CCA            SET END OK FLAG
      STA ENDOK     UPDATE END WARNING FLAG 
* GET HERE WHEN SCREEN IS READ
      LDA SNRFG     GET SNARF FLAG
      SZA             IS THIS A SNARF READ ?
      JMP SREAD,I       YES - JUST RTRUN NOW
      LDA ^STRT     GET THE POINTER TO 'START'
      ISZ STROK     TEST IF START LINE FOUND
      JSB WRNMS       NO - START OK FLAG NOT SET - GIVE MESSAGE 
      LDA ^STOP     GET POINTER TO ' STOP'
      ISZ ENDOK     TEST IF END LINE FOUND
      JSB WRNMS       NO  - GIVE MESSAGE
      ISZ WRNFG     SHOULD WE DO NOT FOUND STUFF
      JMP SR40      YES - GO DO IT
SR31  CLA           NO -DELETE LINES FROM SOURCE - CLEAR
      STA TRFLG         TRANSFER FLAG 
      STA LSTFG         AND LIST FLAG 
      STA BKFLG         AND ALLOW BREAK FLAG
SR33  LDA Q#LST       GET NUMBER OF LINES LISTED
      JSB TRN           AND DELETE THEM 
      CCA             RESET 
      STA BKFLG         ALLOW BREAK FLAG
SR32  LDA T#REC     GET WHERE WE STOPED 
      STA L2LIN     AND SAVE IT.
      JMP SREAD,I   RETURN
* 
* 
SR39  JSB PRINT 
      DEF SR40
      DEC 68
      OCT 6412    CR LF 
      ASC 20,O saves original text written to screen
      OCT 6412    CR LF 
      ASC 17,S saves text just read from screen 
      OCT 6412    CR LF 
      ASC  7,B saves both (                                                 
      ASC 21,inserts screen text before original text)
* 
SR40  JSB PRINT     GET HERE WHEN START OR STOP LINE NOT FOUND
      DEF SR41
      DEC -26 
      OCT 015542    <ESC>< b > KEYBOARD ENABLE
      ASC 12,What should be saved ?_ 
SR41  JSB TTYNO     GET THE RESPONSE
      JSB ECHL      GET THE CHARACTER 
      CLA           IN CASE OF NONE 
      CPA "S"       KEEP SCREEN ? 
      JMP SR31        YES -  GO HANDLE AS NORMAL COMPLETION 
      CPA "B"       KEEP BOTH ? 
      JMP SR32         YES - DON'T DELETE ORIGINAL  
      CPA "O"       KEEP ORIGINAL ? 
      JMP SR50         YES - GO DO IT 
      JMP SR39      NOT KNOWN - TRY AGAIN GIVING HELP 
* 
SR50  LDA LINES     REMOVE LINES READ FROM WORKSPACE
      STA TEMP
      CLA 
      STA LSTFG 
      STA BKFLG 
      CCA           SET 
      STA TRFLG      TRNASFER FLAG
      JSB ./B1      ROLL TOP TOP
      LDA TEMP
      ADA M1
      JSB TRN       ROLL BACK TO WHERE WE WHERE 
      CLA           CLEAR 
      STA TRFLG      TRANSFER FLAG
      LDA #READ     GET NUMBER OF LINES READ IN 
      JSB TRN       DELETE THEM 
      JMP SREAD,I   RETURN
* 
* 
ZCNT  BSS 1 
MAXZC BSS 1 
M24   DEC -24 
.24   DEC 24
STROK BSS 1    WARNING FLAG - -1  IF  << IN 1ST LINE
ENDOK BSS 1    WARNING FLAG - -1  IF  >> LAST LINE
WRNFG BSS 1         IF SET THEN WRANING MESSAGE WAS GIVEN.
* 
***** 
*  PRINT OUT WARNING MESSAGE
*     A REG HAS POINTER TO FIRST 6 CHARS
* 
WRNMS NOP 
      STA WRNFG     SET WARN FLAG TO NOT -1 TO SHOW WE BEEN HERE
      LDB ^WMES     GET ADDRESS OF MESSAE 
      JSB .XFER     MOVE THE FIRST SIX CHAR IN
      JSB PRINT 
      DEF WRNMS,I   RETURN WHEN DONE
      DEC -20 
WMES  BSS 3         START OR STOP PATCHED IN HERE 
      ASC 7,line not found
^WMES DEF WMES
^STOP DEF STOP
STOP  ASC 3,Stop
^STRT DEF STRT
STRT  ASC 3,Start 
* 
* 
******* 
*                                                                 
*                                                                 
SLOUT NOP         OUTPUT LINE TO DEST FILE                        
      ISZ #READ     BUMP THE NUMBER OF LINES PUT IN DEST FILE     
      LDA ELNG      GET LENGTH                                          
      SZA,RSS       TEST FOR ZERO 
      JMP SLOUZ      ZERO SO HANDLE ZERO LENGTH LINE
      LDB EBUFF       NO - SEND OLD LINE OUT ( A IS LENGTH) 
SLOU2 JSB DOUTP 
      JMP SLOUT,I      ERROR RETURN 
      ISZ SLOUT      BUMP TO GOOD RETURN
      JMP SLOUT,I    RETURN 
* 
* 
SLOUZ LDA .2        GET LENGTH
      LDB ^BLKS     AND ADDRESS OF A ALL BLANK LINE 
      JMP SLOU2     SET - GO CLEAR FLAG AND RETURN
* 
#READ BSS 1         NUMBER OF LINES READ IN DEST FILE 
LINE# BSS 1         ROW NUMBER ON THE SCREEN
OCNTS BSS 1         STORAGE OF TBUFF LENGTH DURING JOIN READ
* 
**************************************************************
* 
CURUP NOP             CURSOR UP ONE LINE
      JSB PRINT 
      DEF CURUP,I         
      DEC -5              
      OCT 015532      <ESC>< Z >  DISPLAY FUNCTIONS OFF 
      OCT 015501      <ESC>< A >  CURSOR UP ONE LINE
      OCT 057400      < _ ><NUL>
* 
* 
HONST NOP             SET HONEST MODE BIT ON TTYLU
      LDA TTYLU       GET TTYLU 
      STA HONSS       SAVE IT 
      LDA LULOG 
      IOR HMASK 
      STA TTYLU 
      STA LULOG 
      JMP HONST,I 
* 
HONSS BSS 1           STORAGE FOR TTYLU WHILE IN HONEST MODE
* 
NORMA NOP             RESTORE NO NORMAL MODE PRINT
      LDA HONSS 
      STA TTYLU 
      LDA LULOG 
      AND =B77
      STA LULOG 
      JMP NORMA,I 
* 
QSNPS BSS 1 
QSTYS BSS 1 
* 
HMASK OCT 2600
* 
**
CNTFG BSS 1         CONTINUATION LINE PROCESSED FLAG
* 
* 
******************************
* 
*  READ LINE OFF SCREEN  - JOIN WITH NEXT LINE IF .. IN COLUMNS 79,80 
* 
* 
SLINE NOP     READ LINE OFF SCREEN -
      CLA           CLEAR 
      STA JOINF       JOIN FLAG 
SLIN0 ISZ LINE#     BUMP THE LINE NUMBER
      JSB SLSU      SET TTYLU TO BLOCK READ MODE
      JSB PRINT 
      DEF SLIN1 
ELEN  DEC -2
      OCT 015544      <ESC>< d >  BLOCK TRANSER 
      OCT 057400      < _ ><NUL>
SLIN1 EQU * 
* 
*  READ LINE WITHOUT PUTING IT IN COMMAND STACK 
* 
      LDA OCCNT       SAVE OUTPUT COUNT 
      STA OCCNS         IN CASE WE JOINING LINES
      JSB TTYNO 
      LDA OCCNS       RESTORE 
      STA OCCNT         OUTPUT COUNT
      JSB SLRS        RESTORE TTYLU TO NORMAL 
      LDB ELNG
      CPB .80         CHECK IF LINE IS 80 CHARS 
      JMP SLIN4        YES - MAY NEED TO JOIN LINES 
SLN10 ISZ JOINF       IF  FLAG IS -1 THEN  JOIN OCCURED 
      JMP SLINE,I     NOT -1  - JUST RETURN 
SLIN2 JSB ECH       ELSE MUST COPY TO TBUFF 
      JMP SLIN3      END OF LINE - GO SWAP BUFFERS
      JSB OUTCR     PUT CHAR IN TBUFF 
      JMP SLIN2     LOOP
* 
SLIN3 JSB SWPET     SWAP E AND T BUFFERS
      JMP SLINE,I   RETURN
* 
* 80 CHAR LINE - CHECK FOR CONTINUE FLAG
* 
SLIN4 LDA EBUFF     GET ADDRESS OF THE BUFF 
      ADA .39       BUMP TO LAST TWO CHARS
      LDA A,I       GET THE CHAR THERE
      CPA ".."      IS IT THE CONTINUE FLAGS
      JMP SLIN5       YES - GO JOIN LINES 
      JMP SLN10     GO RETURN 
* 
SLIN5 LDA ELNG      SHORTEN ELNG
      ADA M2          BY 2 TO REMOVE
      STA ELNG          THE CONTINUE FLAGS. 
      CCA           SET JOIN FLAG 
      STA JOINF      TO -1
      LDA CURAR     GET CURSOR ROW NUMBER 
      INA 
      CMA,INA       MAKE IT NEGITAVE
      ADA LINE#     TEST IF WE ARE BEFORE CURSOR
      SSA,RSS       ROW 
      JMP SLIN6     YES - DON'T ADJUST CURRW    
      CCA           NO - DECREASE CURRW         
      ADA CURRW      BY 
      STA CURRW        ONE. 
SLIN6 EQU * 
* 
SLIN7 JSB ECH       GET CHAR FROM EBUFF 
      JMP SLIN0       NO MORE SO GO READ NEXT LINE
      JSB OUTCR     AND SEND IT TO OUTPUT BUFFER
      JMP SLIN7     LOOP
* 
JOINF BSS 1         JOIN FLAG - IF -1 THEN LINES WERE JOINED
OCCNS BSS 1         SAVE AREA FOR TBUFF SIZE
* 
.80   DEC 80
* 
* 
**********************
* 
* 
SLSU  NOP             SETUP FOR BLOCK MODE INPUT
      LDA TTYLU       GET INPUT LU
      STA TTYSA       AND SAVE IT 
      LDA LULOG       CLEAR UPPER BITS
      IOR EMASK 
      STA TTYLU       SAVE IT 
      STA LULOG 
      JMP SLSU,I      RETURN
* 
SLRS  NOP             RESTORE TTYLU AFTER SLINE INPUT 
      LDA TTYSA 
      STA TTYLU 
      LDA LULOG 
      AND =B77
      STA LULOG 
      JMP SLRS,I
* 
TTYSA BSS 1 
EMASK OCT 3000
* 
* 
QLEOF BSS 1         IF EOF HIT ON QLIST THEM -1 
* 
**************************************************************
* 
QPTSA BSS 1 
* 
UNSAV BSS 1 
******************************************************************
* 
ED%QP  LDA TTYDV      TEST FOR DRIVER TYPE 05B
      CPA DVR05 
      RSS           YES, GO ON
      JMP ERR       NO, ERROR 
      LDA SLNG      IF
      SSA            AT 
      JMP EOFPR       EOF  GO PRINT IT. 
      CMA,INA       TEST IF IT WILL WRAP
      ADA SMAX
      CLB           CLEAR B SO WE WILL OUTPUT 2 NULLS 
      SSA,RSS 
      JMP .QP81 
      JSB PRINT 
      DEF .QP80 
      DEC  24 
      ASC  24,Put cursor on first line when edit is complete. 
* 
.QP80 LDB ESCA
.QP81 STB QPCUP 
      CCA           SET MEMORY LOCK 
      STA MLFLG        FLAG SO WE WILL GET SCREEN MODE LIST 
      JSB LSTSB     LIST THE PENDING LINE 
      CLA           CLEAR 
      STA MLFLG      MEMORY LOACK FLAG
      JSB PRINT     POSITION CURSOR 
      DEF .QP92      FOR
      DEC -5          INTRINSIC EDITING.
QPCUP BSS 1         THIS WILL BE NULLS OR <ESC>< A >
ESCA  OCT 015501    <ESC>< A >
      OCT 057433    < _ ><NUL>
* 
.QP92 JSB TTYNO     REQUEST INPUT 
      JSB PRINT 
      DEF .QP93 
      DEC -5
      OCT 015522      <ESC>< R >  INSERT OFF
      OCT 015501      <ESC>< A >  CURSOR UP 
      OCT 057400      < _ ><NUL>
.QP93 JSB SLINE       READ LINE 
      CLA                TEST FOR ZERO LENGHT 
      CPA ELNG
      JMP QPZER       ZERO INPUT LENGHT - DON'T REPLACE.
.QP94 JSB ECH             MOVE CHAR TO TBUFF
      JMP .QP95 
      JSB OUTCR 
      JMP .QP94 
.QP95 JMP ./R       COMPLETE THE REPLACEMENT OPERATION. 
* 
QPZER JMP DISPL   DISPLAY CURRENT LINE ONLY 
* 
* 
* 
* 
********************************************************* 
* 
* SMLST- SCREEN MODE LINES LIST SUBROUTINE - DOES SPECIAL CONTROL 
*        DISPLAY FUNCTION STUFF AND LINE SPLITTING. 
* 
*     LSTA  IS THE ORIGINAL ADDRESS BUT IS CHANGED BY SMLST 
*     LSTSZ IS THE ORIGINAL BYTE COUNT BUT IS CHANGED 
* 
* 
SMLST NOP 
ED%SL EQU SMLST 
      LDA LSTLU     GET LU
      STA LST.T     SAVE IT 
      AND B77 
      IOR LMASK      LIST IN HONEST MODE
      STA LSTLU 
      LDA LSTA      GET STARING ADDRESS 
      CLE,ELA       MAKE IT A BYTE ADDRESS
      STA LSTBP     AND SET AS THE BYTE POINTER 
      LDA LSTSZ     GET THE SIZE OF THE LINE
      CMA,INA       TAKE NEGITIVE 
      STA LSTCT     SET AS LOOP COUNT( ALSO SPLIT LINE FLAG)
SCR.1 CLB 
      STB OCCNT     CLEAR THE TEMP BUFFER COUNT 
      STB CCFLG     AND THE LIST LEADING SPACES FLAG
      STB LASTC     AND THE LAST CHARACTER SO IT NOT A ESC
      LDB MSMAX     INIT MAX LINE LIST SIZE TO -(MAX CHARS) 
      STB SCRSZ 
      SZA,RSS       IS LINE LENGTH IS 0 ? (NOTE JUMP TO SCR.1)
      JMP SCR13      YES - SKIP SCAN FOR CONTROL CHARS
* 
* SCAN LINE FOR CONTROL CHARS  AND IF LINE IS TOO LONG. 
*  IF ESC Z   ( DISPLAY FUNCION OFF ) THEN INSERT AN ESC Y
*    TO TURN THEM BACK ON 
*  IF NULL,ENQ,CR,RS,DEL DELETE THEM
* 
SCR06 LDB LSTBP     GET SOURCE BYTE ADDRESS 
      JSB .LBT      GET BYTE
      STA THISC     SAVE THE CHARACTER
      STB LSTBP     UPDATE SOURCE ADDRESS 
      LDB DSPFG     TEST IF WE SHOULD TURN DISP FUNCT ON
      SZB,RSS         FLAG SET ?
      JMP SCR11         NO - SKIP TEST
      CPA NULL
      JMP SCR07           INGORE IT 
      CPA ENQ 
      JMP SCR07        INGORE IT
      CPA CR
      JMP SCR07        INGORE IT
      CPA RS
      JMP SCR07        INGORE IT
      CPA DEL 
      JMP SCR07        INGORE IT
      LDB LASTC     GET LAST CHARACTER
      CPB ESC       WAS IT AN ESCAPE
      JMP LSTES     YES- GO TEST FOR ESC Z
SCR10 EQU * 
      ISZ SCRSZ     TEST IF PRINTING SIZE OF LINE IS TO LONG
      JMP SCR01        NO  - GO CHECK CHECK FOR SPECIAL CHARS 
      JMP SCRWP        YES - GO DO LINE WRAP STUFF
* 
SCR01 CPA B40       IS IT A BLANK ? 
      JMP SCMOV        YES - GO DO CURSOR POSITION STUFF
SCR02 ADA M32       TEST FOR CONTROL CHAR 
      SSA             IF NEGITIVE THEN ITS A CONTROL CHAR 
      JSB CCHAR        YES - GO DO SPECIAL STUFF
      LDA THISC     RESTORE ORIGINAL CHAR 
SCR11 JSB OUTCR     OUTPUT THIS CHAR
SCR07 LDA THISC     SAVE FOR NEXT TIME
      STA LASTC 
      ISZ LSTCT     CHECK LOOP COUNT
      JMP SCR06     TRY NEXT BYTE 
* 
SCR12 LDA CCFLG     TEST IF 
      SZA             THERE WAS A CONTROL CHAR IN THE LINE
      JMP SCRCC         YES - GO DO SPECIAL END LINE STUFF
SCR13 LDA .2        ADD 
      LDB ^CRLF       CR LF TO
SCR20 JSB OUTBK        END OF OUTPUT BUFFER.
      LDA OCCNT     SET 
      STA LSTSZ       LINE LENGTH 
      LDA TBUFF     SET 
      STA LSTA        NEW LINE ADDRESS
      JSB WRTLN     WRITE OUT THE LINE
      LDA LSTCT     TEST IF ALL CHARACTER ARE USED
      SZA 
      JMP SCR.1       NOT ZERO SO THERE ARE MORE - LOOP 
      LDA LST.T       NO MORE - RESTORE 
      STA LSTLU       LIST LU 
      JMP SMLST,I     DONE - RETURN 
* 
SCRSZ BSS 1         LINE SIZE ON SCREEN COUNTER( INIT -SMAX)
LSTBP BSS 1         CURRENT SOURCE LINE BYTE ADDRESS
THISC BSS 1         TEMP STORAGE FOR CURRENT CHARACTER
LASTC BSS 1         TEMP STORAGE FOR CONT CHAR SCAN LOOP
NULL  OCT 0         NULL CHARACTER
ENQ   OCT 5         ENQUIRE CHARACTER 
CR    OCT 15
RS    OCT 36        RECORD SEPERATOR CHARACER 
DEL   OCT 177       DELETE CHARACTER
      SPC 1 
* 
************************************************* 
*  BLANK OPTIMIZER  - IF MORE THAN 6 SPACES THEN MOVE CURSOR
SCMOV LDB CCFLG     IS DISPLAY FUNCTION ON ?
      SZB 
      JMP SCR02     YES - JUST PUT OUT THIS SPACE 
      SZB 
      JMP SCR02     YES - JUST PUT OUT THIS SPACE 
      LDA SCRSZ     GET CURRENT SCREEN POSITION COUNTER 
      STA MOVTP     SAVE IT 
      ISZ LSTCT     CHECK IF THIS IS THE LAST CHAR IN THE LINE
      JMP SCM.2     NO  - GO DO BLANK SCAN
      JMP SCR12     YES - GO FINSH OFF
* 
* HERE WHEN THERE IS 1 BLANK, MORE CHARS IN LINE AND MORE ROOM SCREEN 
SCM.2 EQU * 
      CLA,INA       INITILIZE 
      STA BKCNT       THE BLANK COUNT 
SCM01 LDB LSTBP     GET BYTE ADDRESS OF NEXT CHAR 
      JSB .LBT      LOAD NEXT BYTE
      STB LSTBP     SAVE THE NEW ADDRESS
* 
      CPA B40       IS IT A BLANK ? 
      JMP SCM02       YES - LOOP FOR NEXT 
      JMP SCM04       NO  - OUTPUT THE BLANKS FOUND SO FAR
* 
SCM02 ISZ SCRSZ     TEST SCREEN SIZE
      JMP SCM03       THINGS OR STILL OK - CONTINUE 
      JMP SCM05       JUST GOT TO BIG - OUTPUT THE BLANKS 
* 
SCM03 ISZ BKCNT     BUMP THE BLANK COUNT
      ISZ LSTCT     TEST IF THIS IS THE LAST CHAR 
      JMP SCM01       NO  - LOOP FOR NEXT CHAR
**                    YES - STRIP BLANKS(HP2621 WILL DO IT ANYWAY)
******JSB MCUSR       YES - OUTPUT THE BLANKS AND CLEAN UP
      JMP SCR12          GO FINISH OFF LINE 
* 
*** 
* 
SCM04 STA THISC       SAVE THIS NON-BLANK CHAR
      JSB MCUSR     MOVE CUSOR TO CURRENT COLUMN
      LDA B40 
      STA LASTC 
      LDA THISC     GET THE CHAR BACK 
      JMP SCR10     GO CONTINUE SCAN (TEST FOR BLANK WILL FAIL) 
* 
SCM05 CCA           SET SCREEN SIZE TO MINUS -1 
      STA SCRSZ 
*                   LAST BLANK WILL BE PUT OUT WAY LINE SPLIT CODE
      JSB MCUSR     END OF SCREEN REACHED - MOVE CURSOR 
      LDA B40       GET A BLANK 
      STA THISC     SET AS CURRENT CHARACTER
      JMP SCRWP      GO SPLIT LINE
* 
* 
* 
************* 
* 
*  MCUSR - PUT THE CHARS IN TBUFF TO MOVE THE CURSOR
*       FROM CURRENT POSITION (MOVTP+SMAX) TO COLUMN(SCRSZ+SMAX)
*      IF DIFFERENCE IS LESS THAN SIX OUTPUT SPACES 
*          ELSE OUTPUT ESC & a XX C 
*         MOVTP AND SCRSZ ARE NEGITIVE AND START AT -(SMAX) 
* 
MCUSR NOP 
      LDA BKCNT     TEST BLANK COUNT
      ADA M6        TEST IF >=  6 BLANKS
      SSA           IF POSITIVE THE USE ESC & ....
      JMP MCU01       NEGITIVE - OUTPUT THE SPACES
      LDA SCRSZ       POSITIVE - POSITION THE CURSOR
      ADA SMAX      THIS COMPUTE THE COLUMN 
      CCE 
      JSB $CVT1     CONVERT  TO ASCII 
      STA MOVTP     SAVE IT 
      LDA .3        MOVE IN THE ESC & a 
      LDB ^CMOV       INTO
      JSB OUTBK         TBUFF 
      LDA .2        MOVE THE COLUMN 
      LDB ^MVTP      INTO 
      JSB OUTBK         TBUFF 
      LDA "C"       MOVE A  'C' 
      JSB OUTCR        INTO TBUFF 
      JMP MCUSR,I   RETURN
* 
* 
MCU01 LDA BKCNT     GET THE NUMBER OF BLANK T PUT OUT 
      LDB ^BLKS     GET A POINTER TO SOME BLANKS
MCU00 JSB OUTBK     MOVE THEM TO TBUFF
      JMP MCUSR,I   RETURN
* 
^CMOV DEF CMOV
CMOV  OCT 015446    <ESC>< & > CURSOR ABSOLUTE
      ASC 1,a           POSITION
^MVTP DEF MOVTP 
MOVTP BSS 1 
BKCNT BSS 1         BLANK COUNT 
^BLKS DEF BLKS
BLKS  ASC 3,         SIX BLANKS 
"Z"   OCT 132       ASCII "Z" 
* 
BLKCT BSS 1         BLANK COUNT 
* 
*************************************************** 
*  LINE IS TO LONG - BREAK IT INTO TWO
SCRWP ADA M32       TEST FOR CONTROL CHARACTER
      SSA 
      JSB CCHAR       YES - GO DO SPECIAL STUFF 
      LDA THISC     GET BACK THIS CHARACTER 
      JSB OUTCR     SEND OUT THIS CHAR
      ISZ LSTCT     BUMP COUNT TO SHOW WE USE THIS CHAR 
      JMP SCWP1       NO - GO OUTPUT WRAP FLAG
      JMP SCR12       THIS IS THE LAST CHAR - THINGS ARE OK 
SCWP1 JSB CCHAR     GO SET CONTROL CHAR FLAG
      LDA .2        GET A TWO 
      LDB ^DOTS      OUTPUT  TWO
      JSB OUTBK         DOTS
      JMP SCRCC     GO TURN OFF DISP FUNCT AND LIST 
* 
**************************************************
* 
* ESC WAS THE LAST CHAR - CHECK IF THIS ONE IS A Z
* 
LSTES CPA "Z"        IS IT A 'Z' ?
      JMP LSTEZ        YES - GO ADD ESC Y 
      JMP SCR10        NO  - GO TEST LOOP COUNT(CCFLG ALREADY SET)
* 
*  LSTEZ -  SEND THE Z, ADD AND ESC, CHANGE THIS CHAR TO Y
*            (TURNS DISPLAY FUNCTION OFF THEN BACK ON)
LSTEZ LDA .2        MOVE 2 BYTES
      LDB ^ZESC       WHICH ARE Z ESC 
      JSB OUTBK     USE THE OUTPUT BLOCK TO T BUFF SUBROTUINE 
      LDA "Y"       SET THE CURRENT CHAR
      STA THISC       TO "Y"
      JMP SCR10     JUMP BACK TO LOOP (CCFLG IS ALREADY SET)
* 
* 
* 
*   MAKE UP LINE WITH DISPLAY FUNCTIONS ON - TEXT - DISPLAY FUNCTION OFF
SCRCC LDA .12       MOVE IN THE 12 CHAR 
      LDB ^DFOF       IT TAKES TO TURN
      JMP SCR20         DISPLAY  FUNCTIONS OFF AND CR LF
* 
****************
* 
*  CCHAR - SET CONTROL CHAR FLAG AND PUT ESC Y IN BUFFER IF NEEDED
* 
CCHAR NOP 
      LDA CCFLG     TEST CONTROL CHAR FLAG
      SZA 
      JMP CCHAR,I   ALREADY SET - JUST RETURN 
      CCA           NOT SET - SO SET IT NOW 
      STA CCFLG 
      LDA .2        PUT ESC Y 
      LDB ^ESCY      INTO 
      JSB OUTBK        TBUFF
      JMP CCHAR,I   RETURN
* 
***** 
* 
CCFLG BSS 1         IF SET THEN DISPLAY FUNCTIONS IS ON 
* 
LSTCT BSS 1         PRESCAN LOOP COUNT, LINE SPLIT FLAG 
LST.T BSS 1       TTY LU SAVE SORAGE
LMASK OCT 2600    HONEST MODE WRITE BITS
MSMAX DEC -78      -(MAX SCREEN CHAR WITH DISP. FUN. OFF) 
SMAX  DEC  78      MAX SCREEN CHAR WITH DISP. FUN. OFF
".."  ASC 1,..      LINE WRAP FLAG
^DOTS DEF ".."
* 
^ZESC DEF ZESC
ZESC  OCT 055033    < Z ><ESC> CENTER OF DISP F. OFF,DISP F. ON 
"Y"   OCT    131     ASCII Y
^ESCY DEF ESCY
ESCY  OCT 015531    <ESC>< Y > DISPLAY FUNCTIONS ON 
ESC   OCT     33     ESC
* 
^DFOF DEF DFOFF 
^CRLF DEF CRLF
* 
*$$$$$$$$$$$$$$ CRLF MUST FOLLOW 'ESC D' OF DFOFF 
* 
DFOFF OCT 015532    <ESC>< Z > DISPLAY FUNCTIONS OFF(MAY WRAP AROUND) 
      OCT 015504    <ESC>< D > CURSOR LEFT ONE
      OCT 015504    <ESC>< D > CURSOR LEFT - (MAY WARP BACK)
      ASC 1,K      <ESC>< K > CLEAR LINE    ( REMOVE ESC Z)
      OCT 015504    <ESC>< D > CURSOR LEFT ( UNDER LAST CHAR )
CRLF  OCT 006412    <CR >< LF>  MUST NOT MOVE RELATIVE TO DFOFF 
* 
*$$$$$$$$$$$$$$ CRLF MUST FOLLOW 'ESC D' OF DFOFF 
* 
*************************************************************** 
      SKP 
      HED SET       SET OPTIONS,TABS
ED%SE JSB NOLSP     MAKE SURE THE ARE NO LINE SPECS 
      JSB CSTRP     STRIP ANY COMMAS
      JMP ERR       NOTHING LEFT SO ERROR 
      JSB ECHL      GET FIRST CHAR
      JMP ERR       NONE SO ERROR 
      ALF,ALF       PUT IT IN HIGH BYTE 
      STA SETKY     SAVE IT 
      JSB ECHL      GET NEXT CHAR 
      JMP ERR       NONE SO ERROR 
      IOR SETKY     MAKE IT IN A PACKED KEY 
      STA SETKY 
      CLB           USE B AS THE POINTER TO A ON,OFF OPTION 
      CPA "AS"
      LDB ^ASKF     GETR POINTER TO ASKING LFAG 
      CPA "DF"
      LDB ^DSPF 
      CPA "CF"
      JMP .FOLD 
      CPA "RT"
      LDB ^FRTN 
      CPA "RE"
      LDB ^REFG 
      CPA "BE"
      JMP .BELL 
      CPA "TS"
      LDB ^TSFG 
      CPA "CS"
      JMP .CSEP 
      CPA "EC"
      JMP .ESCH 
      CPA "AC"
      JMP .ANCH 
      CPA "IC"
      JMP .INCH 
      CPA "TC"
      JMP .TBCH 
      CPA "PC"
      JMP .PMCH 
      CPA "SD"
      JMP .SCDF 
      CPA "VW"
      JMP .VWDF 
      CPA "WC"
      JMP .WIND 
      CPA "LE"
      JMP .LENG 
      CPA "SL"
      JMP .SLNS 
      SZB           DID B CHANGE ?
      JMP .ONOF       YES GO SET THE FLAG 
      JMP ERR       NOT KNOWN ERROR 
* 
* 
**
.FOLD LDA ^FLDF     GET POINTER TO -1/0 FOLD FLAG 
      JSB ONOFF 
        JMP ERR 
        STA FOLDF   SET DEFAULT TO OPPISITE 
      LDA FOLDF 
      LDB =B10000 
      SSA 
      CLB 
      STB FDFLG     REAL FLAG MUST BE 100000 => NO FOLD 
      JMP .ONF1 
* 
* 
.ONOF LDA B         GET POINTER IN TO A REG 
      STA CHKNT     SAVE THE POINTER IN A TEMP
      JSB ONOFF 
        JMP ERR       ERROR 
        STA CHKNT,I   VALUE DEFAULTED, SET COMPLEMENT IN FLAG 
.ONF1 JSB ENDCK     TEST FOR ANYTHING ELSE
      JMP NODE1     GO GET NEXT COMMAND 
* 
* 
.SLNS JSB NUMIN       GET THE NUMBER OF SCREEN LINES
      STA TEMP
      JSB ENDCK 
      LDA TEMP
      SZA,RSS         TEST FOR DEFAULT
      LDA TMDFT       ZERO ENTERED SO USE DEFAULT VALUE 
      CMA,INA         KEEP AS NEGITIVE VALUE
      STA TMSIZ 
      JMP NODE1       GET NEXT COMMAND
* 
* 
.BELL LDA ^BELL 
      JSB ONOFF 
        JMP ERR       ERROR - REPORT
        JMP .BELT     TOGGLE
      LDA  BKABL    GTURN BELL ON FOR NOW; GET BACKARROW BELL 
      STA /+1       SET INTO PROMPT 
      LDA =D-4      SET LENGTH TO 3 
      STA LN
      LDA BELL      IF WE ARE TO SET
      SSA 
      JMP NODE1     THEN WERE DONE
.BELT LDA /+1         ELSE TOGGLE 
      ALF,ALF 
      STA /+1       REVERSE ORDER OF _ AND BELL 
      CLA,INA 
      XOR LN        TOGGLE  LENGTH
      STA LN
      JMP NODE1 
* 
BKABL ASC 1,_
BELL  BSS 1 
^BELL DEF BELL
* 
.ESCH JSB GTONE 
      LDA "\"       DEFAULT SO USE "\"
      STA ESCCH 
      JMP NODE1 
* 
.CSEP JSB GTONE    SE COMMAND SEPERATOR 
      LDA "BAR" 
      STA BAR 
      JMP NODE1 
* 
.ANCH JSB GTONE 
      LDA "^" 
      STA ANCCH 
      JMP NODE1 
* 
.INCH JSB GTONE 
      LDA "@" 
      STA INDEF 
      JMP NODE1 
* 
.TBCH JSB GTONE 
      LDA %TAB
      STA TABCH 
      JMP NODE1 
* 
.PMCH JSB GTONE 
      LDA SLASH 
      STA DLMTR 
      IOR =B6400
      STA / 
      JMP NODE1 
* 
.SCDF JSB NUMIN       GET FIRST PARAMETER (ABOVE) 
      SZA,RSS         IF ZERO, GET ORIGINAL ABOVE 
      LDA =D10
      STA QD.P1 
* 
.QD1  JSB NUMIN       GET SECOND PARAMETER (BELOW)
      SZA,RSS         IF ZERO, GET ORIGINAL BELOW 
      LDA =D10
      STA QD.P2 
* 
.QD2  JSB NUMIN       GET THIRD PARAMETER (OVERLAP) 
      SZA,RSS         IF ZERO, GET ORIGINAL OVERLAP 
      LDA =D2 
      STA QD.P3 
* 
      JSB ENDCK       CHECK OF END OF LINE
      LDB QD.P1       CHECK TO SEE IF SPAN IS 
      ADB QD.P2          GREATER THAN OVERLAP 
      CMB,INB 
      ADB QD.P3       
      SSB,RSS        SKIP IF SPAN>OVERLAP 
      JMP ERR 
* 
* 
      LDA QD.P1      GET AND STORE ABOVE
      STA ABOVE 
* 
      LDA QD.P2      GET AND STORE BELOW
      STA BELOW 
* 
      LDA QD.P3      GET AND STORE OVERLAP
      STA OLAP
      JMP NODE1      EXIT 
* 
QD.P1 BSS 1 
QD.P2 BSS 1 
QD.P3 BSS 1 
******************************************************************* 
* 
.WIND 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 MAXIN       WINDOW
      STA WIND2        POINTER
      JMP NODE1     GET NEXT COMMAND
* 
.VWDF JSB CHKN      CHECK PARAMETERS
      JSB NUMIN 
      SZA,RSS 
      LDA =D10      DEFAULT IS 10 ABOVE 
      STA VWABV 
      JSB NUMIN 
      SZA,RSS 
      LDA =D10      DEAFULT IS 10 BELOW 
      STA VWBLW 
      JMP NODE1 
* 
************************************
* 
.LENG EQU * 
      JSB SETOK     STRIP POSSIBLE SLASH
      JSB NUMIN     GET REQUESTED LENGTH
      STA TEMP
      JSB ENDCK 
      LDA TEMP
      SZA,RSS 
      LDA MAX       IF ZERO USE MAX 
      ADA MAXIN     IF LONGER THAN ALLOWABLE
      SSA,RSS         MAX, USE ALLOWABLE MAX
      JMP .LMAX 
      ADA MAX 
      STA TEMP
      LDA MAXOP     GET OLD VALUE 
      CMA,INA 
      ADA TEMP
      SSA           IF OLD IS LESS THEN SKIP ASKING 
      JSB ASK 
      LDA TEMP
.LEN1 STA MAXOP 
      JMP NODE1 
* 
.LMAX JSB PRINT 
      DEF .LMX1 
      DEC  9
      ASC  9,Length set to 150. 
.LMX1 LDA MAX 
      JMP .LEN1 
* 
************************
* 
*  GTONE   GET ONE CHAR - MAKE SURE THERE ARE NO MORE CHAR
*            AND TEST THAT IT IS PUNCUTUON CHAR 
*            IF THERE IS ONE CHAR THEN RETURN AT P+1
*            IF NO CHARS RETURN TO P+1
*            IF ERR JUMP TO ERROR 
GTONE NOP 
      JSB CSTRP     STRIP BLANKS, COMMA 
      JMP GTONE,I     DEFAULT IT
      JSB ECH 
      JMP GTONE,I 
      STA CHKNT     SAVE THE CHAR 
      JSB ENDCK     TEST IF ANY MORE CHARS
* 
      LDA CHKNT     GET CHAR BACK 
      JSB PUNCT     IS IT PUNCATION ? 
      JMP ERR         NO - GIVE ERROR 
      LDA CHKNT     GET IT BACK AGAIN 
      ISZ GTONE     BUMP RETURN 
      JMP GTONE,I   RETURN
* 
* 
      SPC 1 
CHKN  NOP 
      LDA ECCNT     SAVE CURRENT COUNT
      STA CHKNT 
NPARA JSB NUMIN     FETCH NEXT PARAM
      LDA ELNG      IF END OF COMMAND 
      CPA ECCNT      THEN, ALL PARAMETERS 
      RSS              WERE NUMERIC 
      JMP NPARA     ELSE, FETCH NEXT PARAM
      LDA CHKNT     GET BACK COUNT
      STA ECCNT     RESET COUNT AND RETURN
      JMP CHKN,I
* 
CHKNT BSS 1 
* 
ED%.T EQU * 
      JSB ECHL      GET SECOND CHAR 
      JMP ERR         NONE SO ERROR 
      STA TEMP
      JSB NOLSP     MAKE SURE THER AR NO LINE SPECS 
      LDA  TEMP 
      CPA "R"       TRANSFER ?
       JMP ./QT        YES - GO DO IT 
      JSB PBKE      PUR IT BACK 
      JSB CSTRP     REMOVE COMMANS,BLANKS 
        JMP ERR     NOTHING SO ERROR
      JSB ECHL      GET NEXT COMMAND CHAR 
         JMP ERR       NO SO ERROR ( SHOULD NOT HAPPEN) 
      STA CHKNT     SAVE IT 
      JSB ASCII     CHECK IF  ASCII NUMBER
      JMP ./TX      NO  - PICK A TAB SET
      JSB PBKE      YES -PUT IT BACK
      JSB CHKN        CHECK PARAMETERS
      JMP .TNM        OK SO GO SET TABS 
* 
* REPLACE LINE WITH CURRENT TIME STATRTING AT N 
* 
ED%TI STA TEMP      SAVE COLUMN NUMBER
      LDB SLNG      AT EOF ?
      SSB 
      JSB ./R$       YES - REPLACE IT WITH A ZERO LENGTH LINE 
      LDA TEMP
      SZA,RSS       IF DEFAULT USE COLUMN 1 
      CLA,INA 
      ADA =D-1       COPY SOURCE CHAR BEFORE NUMBER 
      CMA,INA,SZA,RSS   MAKE IT LOOP COMNT
      JMP .TIM2 
      STA TEMP
.TIM1 JSB SCH       GET SOURCE LINE CHAR
      LDA B40       NONE SO USE A BLANK 
      JSB OUTCR     PUT IT IN T BUFF
      ISZ TEMP      ENOUGH ?
      JMP .TIM1     NO - LOOP 
.TIM2 JSB FTIME     GET FORMATED TIME 
        DEF .TIM3 
        DEF EBUFF,I 
.TIM3   EQU * 
      LDA =D30
      STA ELNG
      CLA 
      STA ECCNT 
.TIM4 JSB ECH       COPY TIME TO T BUFF 
        JMP .TIM5 
      JSB OUTCR 
      JMP .TIM4 
* 
.TIM5 LDA =D-30     REMOVE NEXT 30 CHAR FROM SOURCE LINE
      STA TEMP
.TIM6 JSB SCH 
        JMP .TIM8   NONE SO BREAK LOOP
      ISZ TEMP
      JMP .TIM6 
* 
.TIM7 JSB SCH       COPY REST OF LINE 
       JMP .TIM8
      JSB OUTCR 
      JMP .TIM7 
* 
.TIM8 JSB ./R$      REPLACE LINE
      JMP DISPL     GO DISPL
* 
* 
**********************************************
* 
* 
./TX  JSB ENDCK     ANY THING ESLE
* 
.TX1  LDA CHKNT 
      CPA "L"       LIST LINE MODE TABSV
      JMP ./TL      YES - GO DO IT
      CPA "S"       LIST SCREEN MODE TABS ? 
      JMP ./TS
      CLB           SET B TO KNOWN VALUE
      CPA "A"       SELECT TAB SET A ?
      LDB TAB^A      YES
      CPA "F"       TAB SET B ? 
      LDB TAB^F      YES
      CPA "M"       TAB SET M ? 
      LDB TAB^M      YES
      CPA "P"       TAB SET D ? 
      LDB TAB^P      YES
      SZB           DID B CHANGE
      JMP TABSE       YES - GO PICK TAB SET 
      JMP ERR       NO ERROR
* 
.TNM  LDA TBTMP     RESET POINTER TO START OF TEMP BUFFER 
      STA TBPNT      POINTER
      LDA M10       SET COUNTER 
      STA CNT1       TO -10 
      CLA           PUT A 
      STA TCNT        ZERO IN THE  LAST TAB TEMP
NXTNM JSB NUMIN     GET NEXT NUMBER 
      CPA =D1       TAB IN COLOMN 1 IS ILLEGAL
      JMP ERR 
      LDB TCNT      GET OLD TAB 
      STA TCNT      SET THIS ONE AS OLD ONE 
      CMA,INA,SZA,RSS TEST FOR ZERO, MAKE IT NEGITIVE 
      JMP .TNM1          ITS ZERO - LAST TAB
      ADB A            THIS 
      SSB,RSS           IS GERATER THAN LAST ?
      JMP ERR             NO - ERROR
      INA           NO, INCREMENT IT
.TNM1 STA TBPNT,I   STORE TAB NUMBER
      ISZ TBPNT     BUMP POINTER
      ISZ CNT1      LAST TAB? 
      JMP NXTNM      NO,CONTINUE
      JSB ENDCK     MAKE SURE THERE ARE NO MORE CHARS 
      LDB TBTMP      DONE GET POINTER TO TAB ARRAY
      JMP TABSE       GO SET
* 
TBTMP DEF TBTP0 
TBTP0 BSS 10
* 
* 
./TS  CLA           WRITE OUT SCREEN MODE TABS -
      STA SPFLG       CLEAR SPACES FLAG 
./TL  EQU * 
      LDA TABUF      GET TAB BUF ADDRESS
      STA TBPNT      AND SET TAB POINTER TO IT
      CLA            CLEAR
      STA OCCNT       TBUFF CHAR COUNT
      STA TCOL        AND COLUMN COUNT
TERM2 LDA TBPNT,I    GET TAB COLUMN POSITION
      SZA,RSS        END REACHED ?
      JMP TERM6        YES
      ADA TCOL         NO - COMPUTE NUMBER OF COLS TO FILL
      SZA,RSS        ZERO COLS TO FILL ?
      JMP TERM4        YES
      SSA,RSS        ALREADY PAST COL ? 
      JMP TERM5        YES
      STA TCNT       SET COLS TO FILL 
TERM3 LDA B40        GET FILL CHAR
      JSB OUTCR        AND SEND IT TO TBUFF 
      ISZ TCOL       INCREASE TAB COL 
      ISZ TCNT       CHECK IF ENOUGH FILL CHARS 
      JMP TERM3        NO - DO NEXT 
TERM4 LDA B377         YES - GET A NON-FILL CHAR
      JSB OUTCR          AND SEND IT TO TBUFF 
      ISZ TCOL       INCR TAB COLUMN
TERM5 ISZ TBPNT      INCR NEXT TAB POSITION POINTER 
      JMP TERM2        AND GO FILL TO NEXT TAB POSITION 
TERM6 JSB SWPET      SWAP TBUFF AND EBUFF 
      LDA "_"        SUPPRESS CLRF FOR FIRST HALF 
      JSB TABLN      GENERATE AND SEND 1ST HALF OF TABS 
      CLA            CLEAR
      STA SPFLG        SPACES FLAG
      LDA B40        SPACE WILL GIVE CRLF FOR 2ND HALF
      JSB TABLN   GENERATE AND SEND 2ND HALF OF TABS
      JMP NODE1   GET NEXT COMMAND
* 
TABSE STB TCOL          SAVE LOCATION TO GET TABS FROM
      LDA M10           SET LOOP COUNT TO 10
      STA TCNT
      LDB TABUF         GET TAB BUFFER ADDRESS
TABS1 LDA TCOL,I        GET TAB COLUMN
      STA B,I            AND SET IT INTO TAB BUFFER 
      SZA               IF COLUMN WAS NOT ZERO
      ISZ TCOL              BUMP FROM ADDRESS 
      INB               BUMP TO ADDRESS 
      ISZ TCNT         TEST FORM 10 TABS COPIES 
      JMP TABS1           NO - DO NEXT
      JMP NODE1           YES - GO EXIT 
* 
TCOL  BSS 1            TAB COL TEMP AND TAB FROM PTR TEMP 
* 
TABLN NOP         SEND 39 SET TABS AND CLEAR TABS TO TERMINAL 
      STA TCOL      SAVE THE LAST CHAR FOR NOW
      LDA M39     SET LOOP COUNTER TO 
      STA TCNT       39 
TABL1 JSB ECH     GET CHAR FROM TABED LINE
      LDA B377    LINE FINISHED SO FAKE A NON-TAB FILL CHAR 
      CPA B40     IS IT A TAB FILL CHAR ? 
      JMP CLRTB   YES- GO CLEAR TAB AT THIS POSITION
      LDA "ESC"   NO - SET TAB HERE 
      JSB OUTCR 
      LDA "1"     SET TAB 
      JSB OUTCR 
      LDA "T"     MARK COLUMN WITH A "T"
      JSB OUTCR 
      JMP TABL2   COMLETE LOOP
CLRTB LDA "ESC"   CLEAR TAB AT CURRENT POSITION 
      JSB OUTCR 
      LDA "2"    CLEAR TAB
      JSB OUTCR 
      LDA B40     SPACE FILL
      JSB OUTCR 
TABL2 ISZ TCNT   DONE WITH 39 SETS AND CLEARS ? 
      JMP TABL1     NO
      LDA TCOL      GET LAST CAHR 
      JSB OUTCR 
      LDA TBUFF  GET BUFFER LOCATION
      LDB OCCNT    AND LENGHT 
      JSB LST    AND OUTPUT IT
      CLA       RESET 
      STA OCCNT  OCCNT TO ZERO
      JMP TABLN,I   AND RETURN
* 
"ESC" OCT 33      ESCAPE
"_"   OCT 137     BACKARROW 
"BAR" OCT 174     "|" 
"%"   OCT 45
%TAB  OCT 11        TAB CHAR
"!"   OCT 41
"\"   OCT 134 
"A"   OCT 101 
"F"   OCT 106 
"I"   OCT 111 
"L"   OCT 114 
"M"   OCT 115 
"P"   OCT 120 
"T"   OCT 124 
* 
CNT1  BSS 1 
* 
      CLA 
DVR07 CCA 
* 
M39   DEC -39 
B377  OCT 377 
"1"   OCT 61      ASCII 1 
"2"   OCT 62      ASCII 2 
* 
TCNT  BSS 1       TEMP STORAGE
* 
TABUF DEF TAB0+0
************************************************************************* 
*   DEFAULT TABS ARE COLUMNS 7 AND 21 
* 
* TAB SET BUFFERS 
TABP  DEC -3,-6,-9,-12,-15,-18,-21,-24,-27,-30,0
TAB^P DEF TABP+0
TABA  DEC -6,-20,0
TAB^A DEF TABA+0
TABF  DEC -6,-10,-14,-18,-22,-26,-30,-34,-38,-42,0
TAB^F DEF TABF+0
TABM  DEC -9,-25,-39,-43,-47,-51,0
TAB^M DEF TABM+0
**************************************************************************
* 
TBPNT NOP 
* 
B54   OCT 54   ","
******************************************************* 
* 
SETKY BSS 1 
* 
"AS"  ASC 1,AS
"DF"  ASC 1,DF
"CF"  ASC 1,CF
"RT"  ASC 1,RT
"BE"  ASC 1,BE
"EC"  ASC 1,EC
"AC"  ASC 1,AC
"IC"  ASC 1,IC
"TC"  ASC 1,TC
"PC"  ASC 1,PC
"CS"  ASC 1,CS
"VW"  ASC 1,VW
"SD"  ASC 1,SD
"WC"  ASC 1,WC
"LE"  ASC 1,LE
"RE"  ASC 1,RE
"TS"  ASC 1,TS
"SL"  ASC 1,SL
* 
^REFG DEF REFLG+0 
^TSFG DEF TSFLG+0 
^ASKF DEF ASKFG+0 
^FLDF DEF FOLDF+0 
^FRTN DEF FRTNF+0 
      SKP 
      HED ONOFF     TEST FOR ON OR OFF
* 
*  ONOFF SETS OR CLEARS FLAG POINTER TO A REG 
*         WHEN AN ON OR OFF OR NOTHING IS ENTERED.
* RETURN AT P+1 ERROR - 
*           P+2 PARAMTER DEFAULTED, AREG IS COMPLEMENT OF FLAG
*           P+3 IF ON/OFF ENTERED, FLAG ALREADY SET 
*      FLAG STATES   -1=> ON
*                    0 => OFF 
* 
ONOFF NOP 
      STA ONADR     SAVE ADDERSS
      JSB CSTRP     STRIP POSIBLE COMMA 
       JMP ONOF2      DEFAULTED - GO COMPLMENT
      JSB ECHL      GET NEXT CHARS
       JMP ONOF2       DEFAULTED
      ALF,ALF 
      STA ONOFT 
      JSB ECHL
      NOP 
      IOR ONOFT 
      CPA "OF"      WAS "OFF" ENTERED ? 
      JMP ONOF5       YES GO - HANDLE 
      CPA "ON"      WAS "ON" ENTERED ?
      CCB,RSS         YES - COMPLENT B AND SKIP ERROR RETURN
      JMP ONOFF,I   ERROR RETURN
ONOF8 STB ONOFT     SAVE FLAG IN TEMP 
ONOF9 JSB ECH       TEST FOR END OF LINE
        JMP ONOF0      FOUND IT 
      CPA B40 
        JMP ONOF9   BLANKS ARE OK 
      JMP ONOFF,I   NO ERROR RETURN 
* 
ONOF0 ISZ ONOFF     BUMP RETURN 
      LDB ONOFT     GET FLAG
      STB ONADR,I   SET FLAG
ONOF1 ISZ ONOFF     BUMP TO SET REUTRN
      JMP ONOFF,I   RETURN
* 
ONOF2 LDA ONADR,I   GET CURRENT FLAG
      CMA           COMPLEMENT
      JMP ONOF1     GO RETURN AT P+2
* 
ONOF5  JSB ECHL 
        JMP ONOF6   NOTHING IS OK 
       CPA "F"
        JMP ONOF6    F IS OK
       JSB PBKE      NOT F SO PUT IT BACK SO CHECK FOR A BLANK
ONOF6  CLB
       JMP ONOF8
* 
* 
ONOFT BSS 1 
* 
ONADR BSS 1 
"OF"  ASC 1,OF
"ON"  ASC 1,ON
* 
* 
*************** 
      SKP 
      HED LINE JOIN 
* 
******************************
* 
* ED%.J  JOIN TWO LINE
* 
ED%.J JSB ENDCK     MAKE SURE THERE ARE NO MORE CHARS 
      LDA SLNG      AT
      SSA            EOF ?
      JMP ERR         YES - GIVE ERROR
      CCA           SET UNDO FLAG 
      STA UNFLG       SO CURRENT LINE WILL BE COPIED
      JSB UNDOD     SET UP FOR UNDO 
      CLA           CLEAR 
      STA R1STF       FIRST REPLCE FLAG SO WE DON'T MAKE ANOTHER COPY 
.QJ.1 JSB SCH       COPY FIRST TO TBUFF 
      JMP .QJ.2       DONE - BREAK LOOP 
      JSB OUTCR 
      JMP .QJ.1     MORE  - LOOP
* 
.QJ.2 JSB I/PSB     GET NET LINE
      SSB           TEST FOR EOF
      JMP .QJ.4       YES - SO SKIP COPYING OF THIS LINE TO T BUFF
.QJ.3 JSB SCH         NO - COPY LINE TWO
      JMP .QJ.4        DONE - GO REPALCE
      JSB OUTCR 
      JMP .QJ.3 
* 
.QJ.4 JSB ./R$      REPLACE SOURCE BLINE BUFFER 
      JMP DISPL     AND DISPLY LINE 
* 
* 
KEYST NOP 
      JSB CSTRP    STRIP COMMA,BLANK
      JMP KNONE       NONE SO GIVE SUMMARY
      JSB ECHL
      JMP KNONE 
      ALF,ALF       SHIFT TO UPPER BYTE 
      STA KEY       SAVE AS FIRST PART OF KEY 
      JSB ECHL      GET NEXT CHAR 
      LDA B40         NONE SO GET A BLANK 
      IOR KEY       OR IN HIGH PART 
KYST1 STA KEY       SET KEY 
      JMP KEYST,I   RETURN
* 
KNONE LDA "AL 
      JMP KYST1 
"AL   ASC 1,AL
* 
      END EDIT4 
                                                                                                            