home *** CD-ROM | disk | FTP | other *** search
- '********************************EDIT2.BAS*****************************
- 'making a small line editor
- 'that stuffs the keyboard buffer
- '12/20/93
- DEFINT A-Z
- CONST False = 0, True = NOT False
-
- DECLARE SUB ClearKeyBoard ()
- DECLARE SUB Buffer (Cmd$)
- DECLARE SUB EditLine (a$, exitCode%)
- DECLARE FUNCTION KeyCode% ()
- DECLARE SUB LocateIt (Row%, text$)
- DECLARE SUB ColorIt (Fgd%, Bkgd%)
-
- 'Key code numbers
- CONST BACKSPACE = 8
- CONST DELETE = 21248
- CONST ENDKEY = 20224
- CONST ENTER = 13
- CONST ESCAPE = 27
- CONST HOME = 18176
- CONST INSERTKEY = 20992
- CONST LEFTARROW = 19200
- CONST RIGHTARROW = 19712
-
- SCREEN 0
- WIDTH 80
-
- 'COLOR 15, 1
- 'CLS
- DEF FnCenterit (text$) = 41 - (LEN(text$) \ 2)
- text$ = STRING$(14, 32)
- CALL EditLine(text$, exitCode%)
- 'STOP
- CALL ClearKeyBoard
- CALL Buffer(text$)
- 'PRINT
- 'PRINT
- 'PRINT
- 'PRINT "This is what you typed: "; text$
- END
-
- 'from QuickBASIC Bible p 721
- SUB Buffer (Cmd$)
- Cmd$ = LEFT$(Cmd$, 14) + CHR$(13)
- length% = LEN(Cmd$)
- DEF SEG = &H40
- head% = &H1A
- tail% = &H1C
- start% = &H1E
-
- FOR i = 1 TO length%
- POKE start% + (i - 1) * 2, ASC(MID$(Cmd$, i, 1))
- NEXT
-
- POKE tail%, start% + (i - 1) * 2
- POKE head%, start%
-
- DEF SEG
- END SUB
-
- SUB ClearKeyBoard
-
- DEF SEG = 0
- Temp& = PEEK(&H41A) + (PEEK(&H41B) * 256&)
- head = Temp& AND &HFFFF& 'Clear keyboard buffer
- POKE &H41C, head AND 255 'by setting head ptr
- POKE &H41D, head \ 256 'equal to tail ptr.
-
- END SUB
-
- SUB ColorIt (Fgd%, Bkgd%)
- COLOR Fgd%, Bkgd%
- END SUB
-
- SUB EditLine (a$, exitCode%) STATIC
-
- ' Set up some variables
- length% = LEN(a$)
- ptr% = 0
- Insert% = True
- Quit% = False
- Original$ = a$
-
-
- Work$ = "╓ EDIT: Home End Del Ins <Esc> ╖"
- CALL ColorIt(15, 4)
- CALL LocateIt(10, Work$)
-
- Work2$ = "║ ║"
- CALL LocateIt(11, Work2$)
-
- Work3$ = "╙ TO END: {Enter} <─┘ ╜"
- CALL ColorIt(14, 4)
- CALL LocateIt(12, Work3$)
-
- CALL ColorIt(7, 0)
- CALL LocateIt(11, a$)
-
- ' Main processing loop
- DO
-
- Row% = 11
- Col% = FnCenterit(a$)
- LOCATE Row%, Col%
- PRINT a$
- 'STOP
- ' Show appropriate cursor type
- IF Insert% THEN
- LOCATE Row%, Col% + ptr%, 1, 6, 7
- ELSE
- LOCATE Row%, Col% + ptr%, 1, 1, 7
- END IF
-
- ' Get next keystroke
- keyNumber% = KeyCode%
- ' STOP
-
- ' Process the key
- SELECT CASE keyNumber%
-
- CASE INSERTKEY
- IF Insert% THEN
- Insert% = False
- ELSE
- Insert% = True
- END IF
-
- CASE BACKSPACE
- 'STOP
- IF ptr% THEN
- a$ = a$ + " "
- a$ = LEFT$(a$, ptr% - 1) + MID$(a$, ptr% + 1)
- ptr% = ptr% - 1
- END IF
-
- CASE DELETE
- a$ = a$ + " "
- a$ = LEFT$(a$, ptr%) + MID$(a$, ptr% + 2)
-
- CASE LEFTARROW
- IF ptr% THEN
- ptr% = ptr% - 1
- END IF
-
- CASE RIGHTARROW
- IF ptr% < length% - 1 THEN
- ptr% = ptr% + 1
- END IF
-
- CASE ENTER
- exitCode% = 0
- Quit% = True
-
- CASE HOME
- ptr% = 0
-
- CASE ENDKEY
- ptr% = length% - 1
-
- CASE ESCAPE
- a$ = Original$
- ptr% = 0
- Insert% = True
-
- CASE IS > 255
- SOUND 999, 1
-
- CASE IS < 32
- SOUND 999, 1
-
- CASE ELSE
- 'STOP
- ' Convert key code to character string
- kee$ = CHR$(keyNumber%)
-
- ' Insert or overstrike
- IF Insert% THEN
- a$ = LEFT$(a$, ptr%) + kee$ + MID$(a$, ptr% + 1)
- a$ = LEFT$(a$, length%)
- ELSE
- 'the next is very clever
- IF ptr% < length% THEN
- MID$(a$, ptr% + 1, 1) = kee$
- END IF
- END IF
-
- ' Are we up against the wall?
- IF ptr% < length% THEN
- ptr% = ptr% + 1
- ELSE
- SOUND 999, 1
- END IF
-
-
- END SELECT
-
- LOOP UNTIL Quit%
-
-
- END SUB
-
- FUNCTION KeyCode% STATIC
- DO
- k$ = INKEY$
- LOOP UNTIL k$ <> ""
- KeyCode% = CVI(k$ + CHR$(0))
- END FUNCTION
-
- SUB LocateIt (Row%, text$)
- LOCATE Row%, FnCenterit(text$)
- PRINT text$;
- END SUB
-
-