'===========================================================================
' Subject: K.I.S.S. EDITOR                    Date: 12-02-95 (00:00)       
'  Author: Kurt Kuzba                         Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: TEXT.ABC
'===========================================================================
'_|_|_|   KISSED.BAS
'_|_|_|   Keep It Simple, Stupid EDitor  [ Qbasic / QuickBasic ]
'_|_|_|   Released to the   PUBLIC DOMAIN   by Kurt Kuzba  (12/02/95)
  CLEAR ' $DYNAMIC
  TYPE TXT
    L AS STRING * 80
  END TYPE
  TYPE PARMS
    INS AS INTEGER
    TOP AS INTEGER
    LIN AS INTEGER
    CRS AS INTEGER
    TOT AS INTEGER
    MLA AS INTEGER
    MCA AS INTEGER
    MLZ AS INTEGER
    MCZ AS INTEGER
    WID AS INTEGER
  END TYPE
  DIM SHARED D0(800) AS TXT
  DIM SHARED D1(800) AS TXT
  DIM SHARED D2(800) AS TXT
  DIM SHARED CFG(3) AS PARMS
  DIM SHARED DOC$(6)
  DOC$(1) = COMMAND$
  DOC$(2) = ""
  DOCINIT 0
  DOCINIT 1
  DOCINIT 2
  DOC$(4) = ""
  DOC$(5) = "INS"
  IF DOC$(1) <> "" THEN
    DOCOPN DOC$(1), 1
  ELSE
    DOC$(1) = "text1.txt"
  END IF
  ED% = 1
  WHILE ED% <> 0
    ED% = EDDOC%(ED%)
  WEND

  COLOR 2, 0
  CLS
  SYSTEM
WHATTHE:
  DOC$(3) = STR$(ERR)
RESUME NEXT

REM $STATIC
'
SUB ALARM
  FOR T% = 0 TO 25
    SOUND 2200 + 2 * T%, .1
    SOUND 2225 + T%, .05
  NEXT
END SUB

SUB CHECKMARK (D%, SH%)
  IF SH% THEN
    IF CFG(D%).MCA = 0 THEN
      CFG(D%).MLA = CFG(D%).LIN
      CFG(D%).MLZ = CFG(D%).LIN
      CFG(D%).MCA = CFG(D%).CRS
      CFG(D%).MCZ = CFG(D%).CRS
    END IF
   ELSE
    CFG(D%).MCA = 0
  END IF
END SUB

SUB CLIPBOARD
  CFG(0).LIN = 0
  CFG(0).CRS = 1
  K% = 0
  DOC$(0) = "CLIPBOARD    [ESC] TO EXIT"
  WHILE K% <> 27
    L% = CFG(0).LIN
    CFG(0).MCA = 1
    CFG(0).MCZ = 80
    CFG(0).MLA = L%
    CFG(0).MLZ = L%
    SHOWDOC 0
    INFOBAR 0
    K% = GETKEY%
    SELECT CASE K%
       CASE -71                                                   '__HOME*
      CFG(0).LIN = 0
      CFG(0).TOP = 0
       CASE -79                                                    '__END*
      L% = CFG(0).TOT - 23
      IF L% < 0 THEN L% = 0
      CFG(0).TOP = L%
      CFG(0).LIN = CFG(0).TOT - 1
CASE -73:
      IF L% <> 0 THEN
        C% = L% - 24
        CFG(0).LIN = -C% * (C% >= 0)
        C% = CFG(0).TOP - 24
        CFG(0).TOP = -C% * (C% >= 0)
      END IF
       CASE -81                                              '__PAGE DOWN*
      T% = CFG(D%).TOT - 1
      P% = T% - 23
      L% = L% + 24
      IF L% <= (T% + 23) THEN
        IF L% > T% THEN L% = T%
        CFG(0).LIN = L%
        L% = CFG(0).TOP + 24
        IF L% > P% THEN L% = P%
        CFG(0).TOP = -L% * (L% >= 0)
      END IF
       CASE -72                                                '__CRSR UP*
      L% = L% - 1
      IF L% >= 0 THEN
        CFG(0).LIN = L%
        IF CFG(0).TOP > L% THEN CFG(0).TOP = L%
      END IF
       CASE -80                                            '__CURSOR DOWN*
      L% = L% + 1
      IF L% < CFG(0).TOT THEN
        CFG(0).LIN = L%
        T% = CFG(0).TOP
        IF L% > (T% + 23) THEN CFG(0).TOP = T% + 1
      END IF
    END SELECT
  WEND
END SUB

SUB CUTTEXT (D%)
  IF CFG(D%).MCA = 0 THEN
    T% = MSG%("No Text Marked", "")
    EXIT SUB
  END IF
  ORDERMARK D%, LA%, LZ%, CA%, CZ%
  DOCINIT 0
  R% = CFG(D%).LIN
  I% = LZ% - LA%
  CFG(0).TOT = I% + 1
  FOR L% = 0 TO I%
    CFG(0).LIN = L%
    CFG(D%).LIN = LA% + L%
    T$ = GETLINE$(D%)
    IF L% = I% THEN T$ = LEFT$(T$, CZ%)
    IF L% = 0 THEN T$ = MID$(T$, CA%)
    D0(L%).L = T$
  NEXT
  CFG(D%).LIN = R%
  NOISE
END SUB

SUB DELETETEXT (D%)
  IF CFG(D%).MCA = 0 THEN
    T% = MSG%("No Text Marked", "")
    EXIT SUB
  END IF
  ORDERMARK D%, LA%, LZ%, CA%, CZ%
  L% = LZ% - LA%
  R% = LA%
  CFG(D%).CRS = CA%
  CFG(D%).MCA = 0
  CFG(D%).LIN = LA%
  T$ = MID$(LEFT$(" " + GETLINE$(D%), CA%), 2)
  CFG(D%).LIN = LZ%
  P$ = RTRIM$(MID$(GETLINE$(D%), CZ% + 1))
  B$ = T$ + P$
  IF LA% = LZ% THEN
    IF B$ = "" THEN
      B$ = DELLINE$(D%)
    ELSE
      PUTLINE D%, B$
    END IF
  END IF
  IF LZ% > LA% THEN
    IF P$ = "" THEN
      LZ% = LZ% + 1
     ELSE
      PUTLINE D%, P$
    END IF
    IF T$ <> "" THEN
      CFG(D%).LIN = LA%
      LA% = LA% + 1
      PUTLINE D%, T$
    END IF
  END IF
  IF LA% < LZ% THEN
    L% = LZ% - LA%
    Z% = CFG(D%).TOT - L%
    CFG(D%).TOT = Z%
    FOR T% = LA% TO Z%
      IF D% = 1 THEN D1(T%).L = D1(T% + L%).L
      IF D% = 2 THEN D2(T%).L = D2(T% + L%).L
    NEXT
    FOR T% = Z% TO 799
      IF D% = 1 THEN D1(T%).L = ""
      IF D% = 2 THEN D2(T%).L = ""
    NEXT
  END IF
  CFG(D%).LIN = R%
  R% = R% - 1
  IF CFG(D%).TOT < 0 THEN CFG(D%).TOT = 1
  IF R% + 25 > CFG(D%).TOT THEN R% = CFG(D%).TOT - 24
  CFG(D%).TOP = R% * -(R% >= 0)
  NOISE
END SUB

FUNCTION DELLINE$ (D%)
  L% = CFG(D%).LIN
  E% = CFG(D%).TOT - 1
  IF D% = 1 THEN
    DELLINE$ = RTRIM$(D1(CFG(1).LIN).L)
    FOR T% = L% TO E% - 1
      D1(T%).L = D1(T% + 1).L
    NEXT
    D1(E%).L = SPACE$(80)
  END IF
  IF D% = 2 THEN
    DELLINE$ = RTRIM$(D2(CFG(2).LIN).L)
    FOR T% = L% TO E% - 1
      D2(T%).L = D2(T% + 1).L
    NEXT
    D2(E%).L = SPACE$(80)
  END IF
  CFG(D%).TOT = E% - (E% = L%)
  SHOWDOC D%
END FUNCTION

SUB DOCINIT (D%)
  FOR T% = 0 TO 799
    IF D% = 0 THEN D0(T%).L = ""
    IF D% = 1 THEN D1(T%).L = ""
    IF D% = 2 THEN D2(T%).L = ""
  NEXT
  PARMSINIT D%
END SUB

SUB DOCOPN (F$, D%)
  ON ERROR GOTO WHATTHE
  T% = 1
  DOC$(3) = "ok"
  IF F$ <> "" THEN OPEN F$ FOR INPUT AS #1
  T$ = "File Error :: " + F$ + " :: Hit a Key"
  IF DOC$(3) <> "ok" THEN
    T% = MSG%(T$, "")
    EXIT SUB
  END IF
  WHILE T% = 1
    L% = 0
    DOCINIT D%
    WHILE ((L% < 800) AND (NOT EOF(1)))
      LINE INPUT #1, P$
      P$ = RTRIM$(P$)
      CFG(D%).LIN = L%
      WHILE INSTR(P$, CHR$(9)) <> 0
        P% = INSTR(P$, CHR$(9))
        T$ = MID$(P$, P% + 1)
        T$ = "   " + T$
        IF P% > 1 THEN T$ = LEFT$(P$, P% - 1) + T$
        P$ = T$
      WEND
      IF LEN(P$) > 79 THEN
        IF L% < 799 THEN
          PUTLINE D%, LEFT$(P$, 79)
          P$ = MID$(P$, 80)
          L% = L% + 1
          CFG(D%).LIN = L%
        END IF
        P$ = LEFT$(P$, 79)
      END IF
      PUTLINE D%, P$
      L% = L% + 1
    WEND
    T$ = "File too large. Load next section (Y/N)?"
    IF (NOT EOF(1)) THEN
      T% = MSG%(T$, "yn")
     ELSE
      T% = 0
    END IF
  WEND
  CLOSE 1
  CFG(D%).TOT = L%
  CFG(D%).LIN = 0
  ALARM
  DOC$(D%) = UCASE$(F$)
END SUB

FUNCTION EDDOC% (D%)
  DEF SEG = 0
  EDDOC% = D%
  IF D% = 0 THEN GOTO CYCLE
  SHOWDOC D%
  EDIT$ = "YES"
  S$ = SPACE$(80)
  WHILE EDIT$ = "YES"
    T$ = GETLINE$(D%) + S$
    L% = CFG(D%).LIN
    C% = CFG(D%).CRS
    SHOWDOC D%
    INFOBAR D%
    LOCATE L% - CFG(D%).TOP + 2, C%, 1, 13 * CFG(D%).INS, 13
    K% = GETKEY%
    SH% = ((PEEK(&H417) AND 3) <> 0)
    W% = CFG(D%).WID
    IF K% = 9 THEN
      T$ = LEFT$(T$, C% - 1) + SPACE$(9) + MID$(T$, C%)
      K% = 32
      C% = C% + 9
    END IF
    SELECT CASE K%
     CASE 32 TO 254                                               '__TEXT*
      IF CFG(D%).INS <> 0 THEN MID$(T$, C% + 1) = MID$(T$, C%)
      MID$(T$, C%) = CHR$(K%)
      T$ = RTRIM$(T$)
      IF (LEN(T$) > W%) THEN
        P$ = MID$(T$, W% + 1)
        T$ = LEFT$(T$, W%)
        T% = 0
        WHILE T% = 0
          R$ = RIGHT$(T$, 1)
          L% = LEN(T$)
          T% = INSTR("*+\]}:)/- ", R$) - (L% < (W% * .75))
          IF T% = 0 THEN
            P$ = R$ + P$
            T$ = LEFT$(T$, L% - 1)
          END IF
        WEND
        PUTLINE D%, T$
        L% = CFG(D%).LIN
        T% = LEN(T$)
        IF L% < 799 THEN
          CFG(D%).LIN = L% + 1
          INSLINE D%, P$
        END IF
        IF C% > W% AND L% < 799 THEN
          C% = C% - T%
          L% = L% + 1
        END IF
        CFG(D%).LIN = L%
        IF C% > W% AND L% > 788 THEN C% = T%
       ELSE
        PUTLINE D%, T$
      END IF
      CFG(D%).CRS = C% + 1
     CASE 8                                                  '__BACKSPACE*
      L% = CFG(D%).LIN
      T% = LEN(RTRIM$(T$))
      IF (C% = 1) AND (L% = 0) THEN GOTO CYCLE
      IF C% > 1 THEN
        IF T% <> 0 THEN MID$(T$, C% - 1) = MID$(T$, C%) + " "
        CFG(D%).CRS = C% - 1
        PUTLINE D%, T$
       ELSE
        LINECAT D%, L% - 1
      END IF
       CASE -83                                                 '__DELETE*
      T% = LEN(RTRIM$(T$))
      IF C% <= T% THEN
        MID$(T$, C%) = MID$(T$, C% + 1) + " "
        PUTLINE D%, T$
       ELSE
        LINECAT D%, CFG(D%).LIN
      END IF
       CASE -82                                                 '__INSERT*
      T$ = DOC$(6)
      IF SH% THEN
        IF T$ <> "" THEN
          INSLINE D%, T$
          CFG(D%).CRS = 1
        END IF
       ELSE
        CFG(D%).INS = ABS(CFG(D%).INS - 1)
        NOISE
      END IF
     CASE 13                                                     '__ENTER*
      L% = CFG(D%).LIN
      IF L% >= 799 THEN GOTO CYCLE
      IF C% = 1 THEN
        P$ = ""
       ELSE
        P$ = LEFT$(T$, C% - 1)
      END IF
      PUTLINE D%, P$
      CFG(D%).LIN = L% + 1
      INSLINE D%, MID$(T$, C%)
      CFG(D%).CRS = 1
       CASE -61, -38                                       '__ALT/L or F3*
      SAVEQRY D%
      LOADDOC D%
      GOTO CYCLE
       CASE -60, -31                                       '__ALT/S or F2*
      SAVEDOC D%
     CASE 27, -45                       '__ESCAPE or CTRL/X : exit editor*
      EDIT$ = "NO"
       CASE -94                         '__CTRL/F1 : switch to Document 1*
      IF DOC$(1) = "" THEN DOC$(1) = "text1.txt"
      EDDOC% = 1
      GOTO CYCLE
       CASE -95                         '__CTRL/F2 : switch to Document 2*
      IF DOC$(2) = "" THEN DOC$(2) = "text2.txt"
      EDDOC% = 2
      GOTO CYCLE
       CASE -96                                                '__CTRL/F3*
      CLIPBOARD
     CASE 25                                                    '__CTRL/Y*
      DOC$(6) = DELLINE$(D%)
      CFG(D%).CRS = 1
       CASE -71                                                   '__HOME*
      CHECKMARK D%, SH%
      CFG(D%).CRS = 1
      SETMARK D%, SH%
       CASE -79                                                    '__END*
      CHECKMARK D%, SH%
      C% = LEN(RTRIM$(T$)) + 1
      CFG(D%).CRS = -C% * (C% < 81) - 80 * (C% > 80)
      SETMARK D%, SH%
       CASE -119                                             '__CTRL/HOME*
      CHECKMARK D%, SH%
      CFG(D%).CRS = 1
      CFG(D%).LIN = CFG(D%).TOP
      SETMARK D%, SH%
       CASE -117                                              '__CTRL/END*
      CHECKMARK D%, SH%
      C% = CFG(D%).TOP + 23
      T% = CFG(D%).TOT - 1
      IF C% >= T% THEN C% = T%
      CFG(D%).LIN = C%
      T$ = RTRIM$(GETLINE$(D%))
      T% = LEN(T$)
      CFG(D%).CRS = T% - (T% < 80)
      SETMARK D%, SH%
       CASE -132                                          '__CTRL/PAGE UP*
      CHECKMARK D%, SH%
      CFG(D%).TOP = 0
      CFG(D%).LIN = 0
      CFG(D%).CRS = 1
      SETMARK D%, SH%
       CASE -118                                        '__CTRL/PAGE DOWN*
      CHECKMARK D%, SH%
      C% = CFG(D%).TOT
      CFG(D%).TOP = -(C% - 24) * (C% > 23)
      CFG(D%).LIN = C% - 1
      CFG(D%).CRS = 1
      SETMARK D%, SH%
       CASE -73                                                '__PAGE UP*
      CHECKMARK D%, SH%
      IF L% = 0 THEN GOTO CYCLE
      C% = L% - 24
      CFG(D%).LIN = -C% * (C% >= 0)
      C% = CFG(D%).TOP - 24
      CFG(D%).TOP = -C% * (C% >= 0)
      SETMARK D%, SH%
       CASE -81                                              '__PAGE DOWN*
      CHECKMARK D%, SH%
      T% = CFG(D%).TOT - 1
      P% = T% - 23
      L% = CFG(D%).LIN + 24
      IF L% > (T% + 23) THEN GOTO CYCLE
      IF L% > T% THEN L% = T%
      CFG(D%).LIN = L%
      L% = CFG(D%).TOP + 24
      IF L% > P% THEN L% = P%
      CFG(D%).TOP = -L% * (L% >= 0)
      SETMARK D%, SH%
       CASE -72                                                '__CRSR UP*
      CHECKMARK D%, SH%
      L% = L% - 1
      IF L% < 0 THEN GOTO CYCLE
      CFG(D%).LIN = L%
      IF CFG(D%).TOP > L% THEN CFG(D%).TOP = L%
      SETMARK D%, SH%
       CASE -80                                            '__CURSOR DOWN*
      CHECKMARK D%, SH%
      L% = L% + 1
      IF L% >= CFG(D%).TOT THEN GOTO CYCLE
      CFG(D%).LIN = L%
      T% = CFG(D%).TOP
      IF L% > (T% + 23) THEN CFG(D%).TOP = T% + 1
      SETMARK D%, SH%
       CASE -75                                            '__CURSOR LEFT*
      CHECKMARK D%, SH%
      IF C% = 1 THEN GOTO CYCLE
      CFG(D%).CRS = C% - 1
      SETMARK D%, SH%
       CASE -77                                           '__CURSOR RIGHT*
      CHECKMARK D%, SH%
      IF C% > 79 THEN GOTO CYCLE
      CFG(D%).CRS = C% + 1
      SETMARK D%, SH%
       CASE -46                                      '__ALT/C :: CUT TEXT*
      CUTTEXT D%
       CASE -32                                   '__ALT/D :: DELETE TEXT*
      DELETETEXT D%
       CASE -25                                    '__ALT/P :: PASTE TEXT*
      PASTETEXT D%
       CASE -59, -35                               '__ALT/H OR F1 :: HELP*
      HELP
       CASE -115                                             '__CTRL/LEFT*
      CFG(D%).WID = W% + (W% > 10)
       CASE -116                                            '__CTRL/RIGHT*
      CFG(D%).WID = W% - (W% < 79)
    END SELECT
  WEND
  T$ = CHR$(13) + "yn " + CHR$(27)
  SAVEQRY D%
  EDDOC% = -D% * (MSG("Exit KISSED (Y/N)?", T$) > 2)
CYCLE:
  NOISE
  DEF SEG
END FUNCTION

FUNCTION GETKEY%
  T$ = ""
  WHILE T$ = ""
    T$ = INKEY$
  WEND
  GETKEY% = ASC(T$)
  IF ASC(T$) = 0 THEN GETKEY% = -ASC(MID$(T$, 2))
END FUNCTION

FUNCTION GETLINE$ (D%)
  GETLINE$ = ""
  IF D% = 1 THEN GETLINE$ = D1(CFG(1).LIN).L
  IF D% = 2 THEN GETLINE$ = D2(CFG(2).LIN).L
END FUNCTION

FUNCTION GETSTR$ (P$, D$, M%)
  PCOPY 0, 1
  SCREEN , , 1, 1
  L% = 7 + LEN(P$) + M%
  INS% = 1
  Y% = 40 - L% \ 2
  X% = 11
  COLOR 9, 1
  LOCATE X%, Y%
  FOR T% = 1 TO 3
    LOCATE , Y%
    PRINT STRING$(L%, CHR$(176))
  NEXT
  LOCATE X% + 1, Y% + 2
  COLOR 15, 4
  PRINT " "; P$; " ";
  X% = CSRLIN
  Y% = POS(0)
  PRINT SPACE$(M% + 1);
  D$ = LEFT$(D$ + SPACE$(M%), M%)
  B$ = CHR$(29)
  P% = (LEN(RTRIM$(D$)) MOD M%) + 1
  WHILE T% <> 13
    LOCATE , Y%, 0
    COLOR 14, 4
    PRINT D$;
    COLOR 1, 7
    LOCATE , Y% + P% - 1, INS%, 13, 13
    PRINT MID$(D$, P%, 1); B$;
    T% = GETKEY%
    SELECT CASE T%
     CASE 32 TO 127
      IF INS% <> 0 THEN D$ = LEFT$(LEFT$(D$, P%) + MID$(D$, P%), M%)
      MID$(D$, P%) = CHR$(T%)
      IF P% < M% THEN P% = (P% MOD M%) + 1
     CASE 8
      IF P% > 1 THEN MID$(D$, P% - 1) = MID$(D$, P%) + " "
      P% = P% + (P% > 1)
      IF P% = 1 THEN SOUND 1000, .1
     CASE 27
      D$ = ""
      T% = 13
       CASE -82
      INS% = ABS(INS% - 1)
       CASE -83
      MID$(D$, P%) = MID$(D$, P% + 1) + " "
       CASE -75
      P% = ((P% - 2 + M%) MOD M%) + 1
       CASE -77
      P% = (P% MOD M%) + 1
     CASE 25
      D$ = SPACE$(M%)
      P% = 1
       CASE -71
      P% = 1
       CASE -79
      P% = LEN(RTRIM$(D$))
      P% = P% - (P% <> M%)
    END SELECT
  WEND
  SCREEN , , 0, 0
  GETSTR$ = RTRIM$(D$)
END FUNCTION

SUB HELP
  SCREEN , , 1, 1
  COLOR 11, 1
  CLS
  T$ = STRING$(80, CHR$(177))
  FOR T% = 1 TO 25
    LOCATE T%, 1
    PRINT T$;
  NEXT
  COLOR 14, 0
  LOCATE 3, 7, 0
  PRINT "____NORMAL KEYS_______________"
  LOCATE , 7
  PRINT " Left Arrow     (Cursor Left) "
  LOCATE , 7
  PRINT " Right Arrow   (Cursor Right) "
  LOCATE , 7
  PRINT " Up Arrow         (Cursor Up) "
  LOCATE , 7
  PRINT " Down Arrow     (Cursor Down) "
  LOCATE , 7
  PRINT " Page Up     (Cursor Page UP) "
  LOCATE , 7
  PRINT " Page Down (Cursor Page Down) "
  LOCATE , 7
  PRINT " Home           (Cursor Home) "
  LOCATE , 7
  PRINT " End             (Cursor End) "
  LOCATE , 7
  PRINT " Insert       (Toggle Insert) "
  LOCATE , 7
  PRINT " Delete              (Delete) "
  LOCATE , 7
  PRINT " F1                    (Help) "
  LOCATE , 7
  PRINT " F2               (Load Text) "
  LOCATE , 7
  PRINT " F3               (Save Text) "
  LOCATE , 7
  PRINT " ESCAPE        (EXIT  EDITOR) "
  LOCATE 19, 7
  PRINT "____SHIFT KEYS________________"
  LOCATE , 7
  PRINT " Insert  (Insert CTRL/Y Line) "
  LOCATE , 7
  PRINT "    Any Cursor movement key   "
  LOCATE , 7
  PRINT "   with SHIFT will mark text. "
  LOCATE 3, 45
  PRINT "____CONTROL KEYS______________"
  LOCATE , 45
  PRINT " F1              (Document 1) "
  LOCATE , 45
  PRINT " F2              (Document 2) "
  LOCATE , 45
  PRINT " F3          (View Clipboard) "
  LOCATE , 45
  PRINT " Home              (Page Top) "
  LOCATE , 45
  PRINT " End            (Page Bottom) "
  LOCATE , 45
  PRINT " Page Up           (Text top) "
  LOCATE , 45
  PRINT " Page Down      (Text Bottom) "
  LOCATE , 45
  PRINT " Left Arrow    (-line length) "
  LOCATE , 45
  PRINT " Right Arrow   (+line length) "
  LOCATE , 45
  PRINT " CTRL/Y         (Delete Line) "
  LOCATE 17, 45
  PRINT "____ALT KEYS__________________"
  LOCATE , 45
  PRINT " ALT/H                 (Help) "
  LOCATE , 45
  PRINT " ALT/C    (Copy To Clipboard) "
  LOCATE , 45
  PRINT " ALT/D   (Delete Marked Text) "
  LOCATE , 45
  PRINT " ALT/P      (Paste ClipBoard) "
  LOCATE , 45
  PRINT " ALT/X                 (EXIT) "
  T% = GETKEY%
  SCREEN , , 0, 0
END SUB

SUB INFOBAR (D%)
  P$ = SPACE$(80)
  MID$(P$, 7) = "l" + MID$(STR$(CFG(D%).LIN + 1), 2)
  MID$(P$, 27) = STR$(CFG(D%).TOT) + " lines"
  MID$(P$, 40) = DOC$(D%)
  MID$(P$, 24) = CHR$(64 + D%)
  MID$(P$, 18) = DOC$(CFG(D%).INS + 4)
  MID$(P$, 13) = "w" + MID$(STR$(CFG(D%).WID), 2)
  LOCATE 1, 1
  MID$(P$, 2) = "c" + MID$(STR$(CFG(D%).CRS), 2)
  COLOR 15, 1
  PRINT P$;
END SUB

SUB INSLINE (D%, S$)
  L% = CFG(D%).LIN
  IF D% = 1 THEN
    FOR T% = 799 TO L% + 1 STEP -1
      D1(T%).L = D1(T% - 1).L
    NEXT
    D1(CFG(1).LIN).L = S$
  END IF
  IF D% = 2 THEN
    FOR T% = 799 TO L% + 1 STEP -1
      D2(T%).L = D2(T% - 1).L
    NEXT
    D2(CFG(2).LIN).L = S$
  END IF
  IF CFG(D%).TOT < 800 THEN CFG(D%).TOT = CFG(D%).TOT + 1
  SHOWDOC D%
END SUB

SUB LINECAT (D%, L%)
  R% = CFG(D%).LIN
  CFG(D%).LIN = L% + 1
  P$ = RTRIM$(GETLINE$(D%))
  C% = CFG(D%).CRS
  CFG(D%).LIN = L%
  T$ = GETLINE$(D%)
  IF R% = L% THEN T$ = LEFT$(T$, C% - 1)
  IF R% <> L% THEN
    T$ = RTRIM$(T$)
    CFG(D%).CRS = LEN(T$) + 1
  END IF
  T$ = T$ + P$
  T% = LEN(T$)
  IF T% < 80 THEN P$ = DELLINE$(D%)
  IF LEN(T$) > 79 THEN
    CFG(D%).LIN = L% + 1
    PUTLINE D%, MID$(T$, 80)
  END IF
  CFG(D%).LIN = L%
  PUTLINE D%, LEFT$(T$, 79)
  SHOWDOC D%
END SUB

SUB LOADDOC (D%)
  DN$ = GETSTR$("Load File?", "", 32)
  IF DN$ <> "" THEN DOCOPN DN$, D%
END SUB

FUNCTION MSG% (M$, P$)
  M% = LEN(M$)
  P$ = UCASE$(P$)
  PCOPY 0, 1
  SCREEN , , 1, 1
  IF P$ = "" THEN P$ = CHR$(13) + CHR$(27) + " "
  WHILE INKEY$ <> ""
  WEND
  C% = 37 - (M% + 1) \ 2
  LOCATE 10, C%
  COLOR 9, 1
  LOCATE 11, C%, 0
  PRINT STRING$(M% + 6, CHR$(176))
  LOCATE , C%
  PRINT CHR$(176); CHR$(176);
  COLOR 14, 4
  PRINT " "; M$; " ";
  COLOR 9, 1
  PRINT CHR$(176); CHR$(176)
  LOCATE , C%
  PRINT STRING$(M% + 6, CHR$(176))
  ALARM
  T% = 0
  WHILE INSTR(P$, UCASE$(CHR$(T%))) < 1
    T% = GETKEY%
  WEND
  SCREEN , , 0, 0
  MSG% = INSTR(P$, UCASE$(CHR$(T%)))
END FUNCTION

SUB NOISE
  SOUND 1000, .1
END SUB

SUB ORDERMARK (D%, LA%, LZ%, CA%, CZ%)
  CA% = CFG(D%).MCA
  LA% = CFG(D%).MLA
  CZ% = CFG(D%).MCZ
  LZ% = CFG(D%).MLZ
  LA& = LA%
  LZ& = LZ%
  LA& = LA& * 80 + CA%
  LZ& = LZ& * 80 + CZ%
  IF LA& > LZ& THEN
    SWAP LA%, LZ%
    SWAP CA%, CZ%
  END IF
END SUB

SUB PARMSINIT (D%)
  CFG(D%).INS = 1
  CFG(D%).TOP = 0
  CFG(D%).LIN = 0
  CFG(D%).CRS = 1
  CFG(D%).TOT = 1
  CFG(D%).MLA = 0
  CFG(D%).MCA = 0
  CFG(D%).MLZ = 0
  CFG(D%).MCZ = 0
  CFG(D%).WID = 70
END SUB

SUB PASTETEXT (D%)
  IF CFG(0).TOT = 1 AND RTRIM$(D0(0).L) = "" THEN
    T% = MSG%("No text in Clipboard", "")
    EXIT SUB
  END IF
  L% = CFG(D%).LIN
  R% = L%
  C% = CFG(D%).CRS
  CFG(D%).MCA = 0
  O% = CFG(0).TOT
  I% = O% - 1
  E% = CFG(D%).TOT
  IF (C% > 1) AND (I% = 0) THEN
    T$ = GETLINE$(D%) + SPACE$(80)
    T$ = RTRIM$(LEFT$(T$, C% - 1) + RTRIM$(D0(0).L) + MID$(T$, C%))
    PUTLINE D%, LEFT$(T$, 79)
    IF LEN(T$) > 79 AND L% < 799 THEN
      CFG(D%).LIN = L% + 1
      INSLINE D%, MID$(T$, 80)
      CFG(D%).LIN = L%
    END IF
    NOISE
    EXIT SUB
  END IF
  FOR T% = 799 TO L% STEP -1
    IF T% - 0 >= 0 THEN
      IF D% = 1 THEN D1(T%).L = D1(T% - O%).L
      IF D% = 2 THEN D2(T%).L = D2(T% - O%).L
    END IF
  NEXT
  FOR T% = 0 TO I%
    IF D% = 1 THEN D1(T% + L%).L = D0(T%).L
    IF D% = 2 THEN D2(T% + L%).L = D0(T%).L
  NEXT
  CFG(D%).TOT = E% + O%
  IF E% + O% > 800 THEN CFG(D%).TOT = 800
  NOISE
END SUB

SUB PUTLINE (D%, T$)
  IF D% = 1 THEN D1(CFG(D%).LIN).L = LEFT$(T$ + SPACE$(80), 80)
  IF D% = 2 THEN D2(CFG(D%).LIN).L = LEFT$(T$ + SPACE$(80), 80)
END SUB

SUB SAVEDOC (D%)
  ON ERROR GOTO WHATTHE
  DOC$(3) = "ok"
  L% = CFG(D%).LIN
  CFG(D%).LIN = 0
  T% = CFG(D%).TOT
  P$ = RTRIM$(GETLINE$(D%))
  IF P$ = "" AND T% = 1 THEN
    T% = MSG%("No Text", "")
    EXIT SUB
  END IF
  DN$ = DOC$(D%)
  DN$ = GETSTR$("Save As?", DN$, 32)
  IF DN$ = "" THEN
    CFG(D%).LIN = L%
    EXIT SUB
  END IF
  DOC$(D%) = DN$
  OPEN DN$ FOR OUTPUT AS #1
  IF DOC$(3) <> "ok" THEN
    T% = MSG%("File Error :: Hit a Key", "")
   ELSE
    FOR P% = 0 TO T% - 1
      CFG(D%).LIN = P%
      P$ = RTRIM$(GETLINE$(D%))
      IF P$ = "" THEN P$ = " "
      PRINT #1, P$
    NEXT
    CFG(D%).LIN = L%
    ALARM
    CLOSE 1
  END IF
END SUB

SUB SAVEQRY (D%)
  L% = CFG(D%).LIN
  CFG(D%).LIN = 0
  T% = CFG(D%).TOT
  CFG(D%).LIN = L%
  P$ = RTRIM$(GETLINE$(D%))
  IF P$ = "" AND T% = 1 THEN
    NOISE
    EXIT SUB
  END IF
  T% = MSG%("Save Current Document (Y:N)?", " ny" + CHR$(13))
  IF T% > 2 THEN
    NOISE
    SAVEDOC D%
   ELSE
    ALARM
  END IF
END SUB

SUB SETMARK (D%, SH%)
  IF SH% = 0 THEN EXIT SUB
  L% = CFG(D%).LIN
  C% = CFG(D%).CRS
  L& = L%
  L& = L& * 80 + C%
  A% = CFG(D%).MLA
  A& = A%
  A& = A% * 80 + CFG(D%).MCA
  CFG(D%).MLZ = L%
  CFG(D%).MCZ = C%
END SUB

SUB SHOWDOC (D%)
  L% = CFG(D%).LIN
  T% = CFG(D%).TOP
  COLOR 10, 0
  LOCATE , , 0
  IF T% + 23 < L% THEN
    T% = L% - 23
    CFG(D%).TOP = T%
  END IF
  FOR B% = 0 TO 23
    L% = B% + T%
    IF L% > 799 THEN
      LOCATE 2 + B%, 1
      PRINT SPACE$(80);
     ELSE
      SHOWLINE D%, L%, 2 + B%
    END IF
  NEXT
END SUB

SUB SHOWLINE (D%, L%, S%)
  LA% = 0
  LZ% = 0
  CA% = 0
  CZ% = 0
  IF CFG(D%).MCA <> 0 THEN ORDERMARK D%, LA%, LZ%, CA%, CZ%
  IF D% = 0 THEN T$ = D0(L%).L + SPACE$(80)
  IF D% = 1 THEN T$ = D1(L%).L + SPACE$(80)
  IF D% = 2 THEN T$ = D2(L%).L + SPACE$(80)
  LOCATE S%, 1
  COLOR 10, 0
  IF CA% = 0 OR (LA% > L%) OR (LZ% < L%) THEN
    PRINT LEFT$(T$, 80);
   ELSE
    IF LA% = LZ% THEN
      IF CA% > 1 THEN PRINT LEFT$(T$, CA% - 1);
      COLOR 0, 3
      PRINT MID$(T$, CA%, CZ% - CA% + 1);
      COLOR 10, 0
      PRINT MID$(T$, CZ% + 1, 80 - CZ%);
     ELSE
      IF (L% > LA%) AND (L% < LZ%) THEN
        COLOR 0, 3
        PRINT LEFT$(T$, 80);
       ELSE
        IF L% = LA% THEN
          IF CA% > 1 THEN PRINT LEFT$(T$, CA% - 1);
          COLOR 0, 3
          PRINT MID$(T$, CA%, 81 - CA%);
         ELSE
          COLOR 0, 3
          PRINT LEFT$(T$, CZ%);
          COLOR 10, 0
          PRINT MID$(T$, CZ% + 1, 80 - CZ%);
        END IF
      END IF
    END IF
  END IF
END SUB

