WINDOWS.LSP



; File: WINDOWS.LSP  (C)        12/03/87        Soft Warehouse, Inc.
(SETQ *PRODUCT* "muLISP")
(DEFUN WINDOWS (*COMMAND-LINE*
    *FULL-WINDOW* *CURRENT-WINDOW* *WINDOWS* *GCHOOK* *FREE-DATA*
    WINDOW PANE EXPN ROW1 COL1 ROW2 COL2 *CURRENT-AREA* *PROMPT*
    *OPTIONS* *INVERSE-OPTION* *MAX-LENGTH* *OPTION-COLUMN* *LOCAL-DEMONS*
    *UPDATE-FUNCTION* *AUTO-NEWLINE* *INTERRUPT-HOOK* *CURSOR-ON*)
  (MAPC 'WRITE-CONSOLE *INIT-SCREEN*)   ; Initialize screen
  (CURSOR-OFF)                          ; Turn OFF cursor
  (MAKE-WINDOW NIL)                     ; Take whole window
  (CSMEMORY 940 0 T)                    ; Disable Ctrl-V insert mode toggle
  (CSMEMORY 962 6 T)                    ; Disable Ins insert mode toggle
  (SETQ *FULL-WINDOW* (MAKE-WINDOW)
	*CURRENT-WINDOW* 0
	*GCHOOK* 'GCHOOK)
  (GCHOOK)
  (SETQ *WINDOWS* (LIST (LIST 0 (LIST NIL) 1 1
	(- (CADDR *FULL-WINDOW*) 6)
	(- (CADDDR *FULL-WINDOW*) 2) )))
  (CLEAR-SCREEN)
  (BORDER-WINDOWS)
  (WINDOW-STATE *CURRENT-WINDOW* (APPLY *INIT-WINDOW* 'CREATE-WINDOW NIL))
  (SETQ *COMMAND-LINE* "")
  (UPDATE-WINDOWS)
  (SETQ *PROMPT* "")
  (LOOP
    (SETQ EXPN (CATCH NIL
	    (APPLY (CAR (WINDOW-STATE)) 'RUN-WINDOW (CDR (WINDOW-STATE))) ))

    ( ((EQ *THROW-TAG* 'CLOSE-WINDOW)                   ; Close window
	(SETQ WINDOW *CURRENT-WINDOW*
	      *CURRENT-WINDOW* EXPN)
	((NOT (APPLY (CAR (WINDOW-STATE)) 'CLOSE-WINDOW (CDR (WINDOW-STATE))))
	  (SETQ *CURRENT-WINDOW* WINDOW) )
	(SETQ *CURRENT-WINDOW* WINDOW)
	((CDR (WINDOW-STATES EXPN))
	  (WINDOW-STATES EXPN
		(DELETE-NTH (WINDOW-STATES EXPN) (WINDOW-PANE EXPN)))
	  (WINDOW-PANE EXPN
		(MIN (WINDOW-PANE EXPN) (SUB1 (LENGTH (WINDOW-STATES EXPN)))))
	  (UPDATE-WINDOW EXPN) )
	(SETQ ROW1 (SUB1 (WINDOW-ROW EXPN))
	      COL1 (SUB1 (WINDOW-COL EXPN))
	      ROW2 (+ (WINDOW-ROW EXPN) (WINDOW-ROWS EXPN))
	      COL2 (+ (WINDOW-COL EXPN) (WINDOW-COLS EXPN))
	      *WINDOWS* (DELETE-NTH *WINDOWS* EXPN))
	( ((< *CURRENT-WINDOW* EXPN))
	  ((ZEROP *CURRENT-WINDOW*))
	  (SETQ *CURRENT-WINDOW* (SUB1 *CURRENT-WINDOW*)) )
	( ((AND (UPPER-RIGHT ROW1 COL1) (LOWER-RIGHT ROW2 COL1))
	    (LOOP
	      ((= ROW1 ROW2))
	      (SETQ EXPN (UPPER-RIGHT ROW1 COL1))
	      (WINDOW-COLS EXPN (- (+ (WINDOW-COLS EXPN) COL2) COL1))
	      (UPDATE-WINDOW EXPN)
	      (SETQ ROW1 (+ ROW1 (WINDOW-ROWS EXPN) 1)) ) )
	  ((AND (LOWER-LEFT ROW1 COL1) (LOWER-RIGHT ROW1 COL2))
	    (LOOP
	      ((= COL1 COL2))
	      (SETQ EXPN (LOWER-LEFT ROW1 COL1))
	      (WINDOW-ROWS EXPN (- (+ (WINDOW-ROWS EXPN) ROW2) ROW1))
	      (UPDATE-WINDOW EXPN)
	      (SETQ COL1 (+ COL1 (WINDOW-COLS EXPN) 1)) ) )
	  ((AND (UPPER-LEFT ROW1 COL2) (LOWER-LEFT ROW2 COL2))
	    (LOOP
	      ((= ROW1 ROW2))
	      (SETQ EXPN (UPPER-LEFT ROW1 COL2))
	      (WINDOW-COL EXPN (ADD1 COL1))
	      (WINDOW-COLS EXPN (- (+ (WINDOW-COLS EXPN) COL2) COL1))
	      (UPDATE-WINDOW EXPN)
	      (SETQ ROW1 (+ ROW1 (WINDOW-ROWS EXPN) 1)) ) )
	  ((AND (UPPER-LEFT ROW2 COL1) (UPPER-RIGHT ROW2 COL2))
	    (LOOP
	      ((= COL1 COL2))
	      (SETQ EXPN (UPPER-LEFT ROW2 COL1))
	      (WINDOW-ROW EXPN (ADD1 ROW1))
	      (WINDOW-ROWS EXPN (- (+ (WINDOW-ROWS EXPN) ROW2) ROW1))
	      (UPDATE-WINDOW EXPN)
	      (SETQ COL1 (+ COL1 (WINDOW-COLS EXPN) 1)) ) ) )
	(BORDER-WINDOWS) )

      ((EQ *THROW-TAG* 'SWITCH-PANE)                    ; Switch panes
	(WINDOW-PANE *CURRENT-WINDOW* EXPN)
	(UPDATE-WINDOW *CURRENT-WINDOW*) )

      ((EQ *THROW-TAG* 'SWITCH-WINDOW)                  ; Switch windows
	(APPLY 'MAKE-WINDOW *FULL-WINDOW*)
	(SET-CURSOR (SUB1 (WINDOW-ROW *CURRENT-WINDOW*))
		    (SUB1 (WINDOW-COL *CURRENT-WINDOW*)))
	(NORMAL-VIDEO (FIRST *WINDOW-COLORS*))
	(PRIN1 (ADD1 *CURRENT-WINDOW*))
	(SETQ *CURRENT-WINDOW* EXPN
	      *CURRENT-AREA*)
	(SET-CURSOR (SUB1 (WINDOW-ROW *CURRENT-WINDOW*))
		    (SUB1 (WINDOW-COL *CURRENT-WINDOW*)))
	(INVERSE-VIDEO (FIRST *WINDOW-COLORS*))
	(PRIN1 (ADD1 *CURRENT-WINDOW*)) )

      ((EQ *THROW-TAG* 'SPLIT-WINDOW)                   ; Split window
	(WINDOW-PANE (ADD1 *CURRENT-WINDOW*) 0)
	(WINDOW-STATES (ADD1 *CURRENT-WINDOW*)
		       (LIST (COPY-TREE (WINDOW-STATE))))
;If the above 3 lines of code are replaced with the next 2 lines, the new
;window will contain a copy of the hidden panes as well as the top pane.
;       (WINDOW-STATES (ADD1 *CURRENT-WINDOW*)
;                      (COPY-TREE (WINDOW-STATES)))
	(BORDER-WINDOWS)
	(UPDATE-WINDOW *CURRENT-WINDOW*)
	(UPDATE-WINDOW (ADD1 *CURRENT-WINDOW*)) )

      ((EQ *THROW-TAG* 'DESIGNATE-WINDOW)               ; Designate window
	((APPLY (CAR (WINDOW-STATE)) 'CLOSE-WINDOW (CDR (WINDOW-STATE)))
	  (WINDOW-STATE *CURRENT-WINDOW* (APPLY EXPN 'CREATE-WINDOW NIL))
	  (UPDATE-WINDOW *CURRENT-WINDOW*) ) )

      ((EQ *THROW-TAG* 'OPEN-PANE)                      ; Open pane
	(WINDOW-STATES *CURRENT-WINDOW*
		(INSERT-NTH (APPLY EXPN 'CREATE-WINDOW NIL)
			    (WINDOW-STATES) (WINDOW-PANE)))
	(UPDATE-WINDOW *CURRENT-WINDOW*) )

      ((EQ *THROW-TAG* 'QUIT-PROGRAM)                   ; Quit program
	(SETQ WINDOW 0)
	(LOOP
	  ((= WINDOW (LENGTH *WINDOWS*))
	    (APPLY 'MAKE-WINDOW *FULL-WINDOW*)
	    (SET-CURSOR (SUB1 (CADDR *FULL-WINDOW*)) 0)
	    (SETQ *INSERT-MODE*)
	    (CURSOR-ON)
	    (MAPC 'WRITE-CONSOLE *RESET-SCREEN*)        ; Reset screen

	    (SETQ *WINDOW-COLORS* '(7 7 7 7 7 0))
	    (BORDER-COLOR 0) ;(CLEAR-SCREEN) 
	    (UPDATE-WINDOWS)
	    (SYSTEM) )

	  (SETQ PANE 0)
	  ((LOOP
	    ((= PANE (LENGTH (WINDOW-STATES WINDOW))) NIL)
	    ((NOT (APPLY (CAR (NTH PANE (WINDOW-STATES WINDOW))) 'CLOSE-WINDOW
		     (CDR (NTH PANE (WINDOW-STATES WINDOW))))))
	    (INCQ PANE) ))
	  (INCQ WINDOW) ) )

      ((EQ *THROW-TAG* 'SWITCH-SCREEN)                  ; Switch screen
	(BORDER-WINDOWS)
	(UPDATE-WINDOWS)
	(SETQ *PROMPT* ""
	  *OPTIONS*) )

      ((EQ *THROW-TAG* 'DRIVER))                        ; Throw to driver

      (THROW *THROW-TAG* EXPN) ) ) )                    ; Unrecognized throw

(DEFUN UPDATE-WINDOWS (
    WINDOW)
  (SETQ WINDOW 0)
  (LOOP
    ((= WINDOW (LENGTH *WINDOWS*)))
    (UPDATE-WINDOW WINDOW)
    (INCQ WINDOW) ) )

(DEFUN UPDATE-WINDOW (*CURRENT-WINDOW*)
  (APPLY (CAR (WINDOW-STATE)) 'UPDATE-WINDOW (CDR (WINDOW-STATE))) )

(DEFUN QUIT-PROGRAM ()
  (THROW 'QUIT-PROGRAM) )

;               * * *   Window Option Functions   * * *

(DEFUN CHANGE-WINDOW ()
  (EXECUTE-OPTION 'WINDOW '(
	("Close" . CLOSE-WINDOW)
	("Designate" . DESIGNATE-WINDOW)
	("Flip" . NEXT-PANE)
	("Goto" . GOTO-WINDOW)
	("Next" . NEXT-WINDOW)
	("Open" . OPEN-PANE)
	("Previous" . LAST-WINDOW)
	("Split" "WINDOW SPLIT" (
		("Horizontal" . HORIZONTAL-SPLIT)
		("Vertical" . VERTICAL-SPLIT) )) )) )

(DEFUN CLOSE-WINDOW (
    WINDOW)
  ((OR (CDR *WINDOWS*) (CDR (WINDOW-STATES)))
    (RPLACA (CAR CLOSE-WINDOW) (ADD1 *CURRENT-WINDOW*))
    (LOOP
      ((NOT (MODE-QUERY "WINDOW CLOSE" CLOSE-WINDOW)) NIL)
      ;((NOT 2) NIL) ;mt
      (SETQ WINDOW (PARSE-INTEGER (CAAR CLOSE-WINDOW)))
      ((AND WINDOW (<= 1 WINDOW (LENGTH *WINDOWS*)))
	  (THROW 'CLOSE-WINDOW (SUB1 WINDOW)) )
      (ERROR-BEEP) ) ) )

(SETQ CLOSE-WINDOW '(("" 0 0 "Enter window number" "Window" 2)))

(DEFUN OPEN-PANE ()
  (RPLACA (CAR DESIGNATE-WINDOW) (CAR (WINDOW-STATE)))
  (REPLACE-NTH *WINDOW-TYPES* (CAR DESIGNATE-WINDOW) 5)
  ((MODE-QUERY "WINDOW OPEN" DESIGNATE-WINDOW)
    (THROW 'OPEN-PANE (CAAR DESIGNATE-WINDOW)) ) )

(DEFUN DESIGNATE-WINDOW ()
  (RPLACA (CAR DESIGNATE-WINDOW) (CAR (WINDOW-STATE)))
  (REPLACE-NTH *WINDOW-TYPES* (CAR DESIGNATE-WINDOW) 5)
  ((MODE-QUERY "WINDOW DESIGNATE" DESIGNATE-WINDOW)
    (THROW 'DESIGNATE-WINDOW (CAAR DESIGNATE-WINDOW)) ) )

(SETQ DESIGNATE-WINDOW '(("" 0 0 "Enter window type" "Type" NIL)))
(IF (ATOM *WINDOW-TYPES*) (SETQ *WINDOW-TYPES*))

(DEFUN GOTO-WINDOW (
    WINDOW)
  (RPLACA (CAR GOTO-WINDOW)
	  (ADD1 (MOD (ADD1 *CURRENT-WINDOW*) (LENGTH *WINDOWS*))))
  (LOOP
    ((NOT (MODE-QUERY "WINDOW GOTO" GOTO-WINDOW)) NIL)
    (SETQ WINDOW (PARSE-INTEGER (CAAR GOTO-WINDOW)))
    ((AND WINDOW (<= 1 WINDOW (LENGTH *WINDOWS*)))
      (THROW 'SWITCH-WINDOW (SUB1 WINDOW)) )
    (ERROR-BEEP) ) )

(SETQ GOTO-WINDOW '(("" 0 0 "Enter window number" "Window" 2)))

(DEFUN LAST-WINDOW ()
  (THROW 'SWITCH-WINDOW (MOD (SUB1 *CURRENT-WINDOW*) (LENGTH *WINDOWS*))) )

(DEFUN NEXT-WINDOW ()
  (THROW 'SWITCH-WINDOW (MOD (ADD1 *CURRENT-WINDOW*) (LENGTH *WINDOWS*))) )

(DEFUN LAST-PANE ()
  (THROW 'SWITCH-PANE (MOD (SUB1 (WINDOW-PANE)) (LENGTH (WINDOW-STATES)))) )

(DEFUN NEXT-PANE ()
  (THROW 'SWITCH-PANE (MOD (ADD1 (WINDOW-PANE)) (LENGTH (WINDOW-STATES)))) )

(DEFUN HORIZONTAL-SPLIT (
    ROW)
  (RPLACA (CAR HORIZONTAL-SPLIT) (CEILING (WINDOW-ROWS) 2))
  (LOOP
    ((NOT (MODE-QUERY "WINDOW SPLIT HORIZONTAL" HORIZONTAL-SPLIT)) NIL)
    (SETQ ROW (PARSE-INTEGER (CAAR HORIZONTAL-SPLIT)))
    ((AND ROW (<= 3 ROW (- (WINDOW-ROWS) 2)))
      (RPLACD (NTHCDR *CURRENT-WINDOW* *WINDOWS*)
	      (CONS (COPY-LIST (NTH *CURRENT-WINDOW* *WINDOWS*))
		    (NTHCDR (ADD1 *CURRENT-WINDOW*) *WINDOWS*)))
      (WINDOW-ROWS *CURRENT-WINDOW* (SUB1 ROW))
      (WINDOW-ROW (ADD1 *CURRENT-WINDOW*)
		  (+ (WINDOW-ROW (ADD1 *CURRENT-WINDOW*)) ROW))
      (WINDOW-ROWS (ADD1 *CURRENT-WINDOW*)
		   (- (WINDOW-ROWS (ADD1 *CURRENT-WINDOW*)) ROW))
      (THROW 'SPLIT-WINDOW) )
    (ERROR-BEEP) ) )

(SETQ HORIZONTAL-SPLIT '(("" 0 0 "Enter line number" "At line" 3)))

(DEFUN VERTICAL-SPLIT (
    COL)
  (RPLACA (CAR VERTICAL-SPLIT) (CEILING (WINDOW-COLS) 2))
  (LOOP
    ((NOT (MODE-QUERY "WINDOW SPLIT VERTICAL" VERTICAL-SPLIT)) NIL) 
    ;((NOT 45) NIL) ;mt
    (SETQ COL (PARSE-INTEGER (CAAR VERTICAL-SPLIT)))
    ((AND COL (<= 7 COL (- (WINDOW-COLS) 6)))
      ( ((MEDIUM-RESOLUTION-P))
	((EVENP COL))
	(DECQ COL) )
      (RPLACD (NTHCDR *CURRENT-WINDOW* *WINDOWS*)
	      (CONS (COPY-LIST (NTH *CURRENT-WINDOW* *WINDOWS*))
		    (NTHCDR (ADD1 *CURRENT-WINDOW*) *WINDOWS*)))
      (WINDOW-COLS *CURRENT-WINDOW* (SUB1 COL))
      (WINDOW-COL (ADD1 *CURRENT-WINDOW*)
		  (+ (WINDOW-COL (ADD1 *CURRENT-WINDOW*)) COL))
      (WINDOW-COLS (ADD1 *CURRENT-WINDOW*)
		   (- (WINDOW-COLS (ADD1 *CURRENT-WINDOW*)) COL))
      (THROW 'SPLIT-WINDOW) )
    (ERROR-BEEP) ) )

(SETQ VERTICAL-SPLIT '(("" 0 0 "Enter column number" "At column" 3)))

(DEFUN UPPER-LEFT (ROW COL
    WINDOW)
  (SETQ WINDOW 0)
  (LOOP
    ((= WINDOW (LENGTH *WINDOWS*)) NIL)
    ((AND (= ROW (SUB1 (WINDOW-ROW WINDOW)))
	  (= COL (SUB1 (WINDOW-COL WINDOW)))) WINDOW)
    (INCQ WINDOW) ) )

(DEFUN UPPER-RIGHT (ROW COL
    WINDOW)
  (SETQ WINDOW 0)
  (LOOP
    ((= WINDOW (LENGTH *WINDOWS*)) NIL)
    ((AND (= ROW (SUB1 (WINDOW-ROW WINDOW)))
	  (= COL (+ (WINDOW-COL WINDOW) (WINDOW-COLS WINDOW)))) WINDOW)
    (INCQ WINDOW) ) )

(DEFUN LOWER-LEFT (ROW COL
    WINDOW)
  (SETQ WINDOW 0)
  (LOOP
    ((= WINDOW (LENGTH *WINDOWS*)) NIL)
    ((AND (= ROW (+ (WINDOW-ROW WINDOW) (WINDOW-ROWS WINDOW)))
	  (= COL (SUB1 (WINDOW-COL WINDOW)))) WINDOW)
    (INCQ WINDOW) ) )

(DEFUN LOWER-RIGHT (ROW COL
    WINDOW)
  (SETQ WINDOW 0)
  (LOOP
    ((= WINDOW (LENGTH *WINDOWS*)) NIL)
    ((AND (= ROW (+ (WINDOW-ROW WINDOW) (WINDOW-ROWS WINDOW)))
	  (= COL (+ (WINDOW-COL WINDOW) (WINDOW-COLS WINDOW)))) WINDOW)
    (INCQ WINDOW) ) )

;               * * *   Window State Functions   * * *

(DEFUN UPDATE-STATE (LST1
    LST2)
  (SETQ LST2 (WINDOW-STATE))
  (LOOP
    (POP LST2)
    ((NULL LST2))
    (RPLACA LST2 (EVAL (POP LST1))) ) )

(DEFUN WINDOW-PANE LST
  (WINDOW-BOX 0) )

(DEFUN WINDOW-STATES LST
  (WINDOW-BOX 1) )

(DEFUN WINDOW-STATE LST
  ((NULL LST)
    (NTH (WINDOW-PANE) (WINDOW-STATES)) )
  ((CDR LST)
    (REPLACE-NTH (CADR LST) (WINDOW-STATES (CAR LST)) (WINDOW-PANE (CAR LST)))
    (CADR LST) )
  (NTH (WINDOW-PANE (CAR LST)) (WINDOW-STATES (CAR LST))) )

(DEFUN WINDOW-ROW LST
  (WINDOW-BOX 2) )

(DEFUN WINDOW-COL LST
  (WINDOW-BOX 3) )

(DEFUN WINDOW-ROWS LST
  (WINDOW-BOX 4) )

(DEFUN WINDOW-COLS LST
  (WINDOW-BOX 5) )

(DEFUN WINDOW-BOX (NUM)
  ((NULL LST)
    (NTH NUM (NTH *CURRENT-WINDOW* *WINDOWS*)) )
  ((CDR LST)
    (REPLACE-NTH (CADR LST) (NTH (CAR LST) *WINDOWS*) NUM)
    (CADR LST) )
  (NTH NUM (NTH (CAR LST) *WINDOWS*)) )

;               * * *   Display Option Functions   * * *

(DEFUN SET-COLOR (
    NUM1 NUM2 NUM3 NUM4 NUM5 NUM6 NUM7 NUM8)
  ((SETQ MODE (VIDEO-MODE))
    ((EQ MODE 255) NIL)
    (MAPC 'RPLACA SET-COLOR *WINDOW-COLORS*)
    (RPLACA (SEVENTH SET-COLOR) (BORDER-COLOR))
    (RPLACA (EIGHTH SET-COLOR) (PALETTE-COLOR))
    (LOOP
      ((NOT (MODE-QUERY 'COLOR SET-COLOR)) NIL)
      (SETQ NUM1 (PARSE-INTEGER (CAR (FIRST SET-COLOR)))
	    NUM2 (PARSE-INTEGER (CAR (SECOND SET-COLOR)))
	    NUM3 (PARSE-INTEGER (CAR (THIRD SET-COLOR)))
	    NUM4 (PARSE-INTEGER (CAR (FOURTH SET-COLOR)))
	    NUM5 (PARSE-INTEGER (CAR (FIFTH SET-COLOR)))
	    NUM6 (PARSE-INTEGER (CAR (SIXTH SET-COLOR)))
	    NUM7 (PARSE-INTEGER (CAR (SEVENTH SET-COLOR)))
	    NUM8 (PARSE-INTEGER (CAR (EIGHTH SET-COLOR))) )
      ((AND (COLORP NUM1) (COLORP NUM2) (COLORP NUM3) (COLORP NUM4)
	    (COLORP NUM5) (COLORP NUM6) (COLORP NUM7) (COLORP NUM8))
	(SETQ *WINDOW-COLORS* (LIST NUM1 NUM2 NUM3 NUM4 NUM5 NUM6))
	(BORDER-COLOR NUM7)
	(PALETTE-COLOR NUM8)
	(THROW 'SWITCH-SCREEN) )
      (ERROR-BEEP) ) ) )

(SETQ SET-COLOR '(
	("" 0 0 "Enter color number" "Frame" 3)
	("" 0 0 "Enter color number" "Working" 3)
	("" 0 0 "Enter color number" "Option" 3)
	("" 0 0 "Enter color number" "Prompt" 3)
	("" 0 0 "Enter color number" "Status" 3)
	("" 0 0 "Enter color number" "Bckgrnd" 3)
	("" 0 0 "Enter color number" "Border" 3)
	("" 0 0 "Enter color number" "Palette" 3) ))

(DEFUN COLORP (NUM)
  (AND NUM (<= 0 NUM 63)) )


(DEFUN SET-INSERT ()
  (RPLACA (CAR SET-INSERT) (IF *INSERT-MODE* "Insert" "Replace"))
  ((MODE-QUERY 'MODE SET-INSERT)
    (INSERT-STATUS (EQ (CAAR SET-INSERT) "Insert")) ) )

(SETQ SET-INSERT '(("" 0 0 "Select edit mode" "Edit" ("Insert" "Replace"))))


(DEFUN SET-MUTE ()
  (MODE-QUERY 'MUTE SET-MUTE) )

(SETQ SET-MUTE '(("No" 0 0 "Mute warning messages" "Active" ("Yes" "No"))))


(DEFUN SET-DISPLAY (
    MODE NUM)
  ((SETQ MODE (VIDEO-MODE))
    ((= MODE 255) NIL)
    (RPLACA (FIRST SET-DISPLAY)
	    (IF (<= MODE 6)  "CGA"
	    (IF (= MODE 7)   "MDA"
	    (IF (<= MODE 10) "PCjr"
	    (IF (<= MODE 20) "EGA"  "AT&T")))))
    (RPLACA (SECOND SET-DISPLAY)
	    (IF (GRAPHICS-MODE-P MODE) "Graphics" "Text") )
    (RPLACA (THIRD SET-DISPLAY)
	    (IF (OR (MEDIUM-RESOLUTION-P MODE) (= MODE 65)) "Medium" "High") )
    ((MODE-QUERY 'DISPLAY SET-DISPLAY)
      ( ((EQ (FIRST (SECOND SET-DISPLAY)) "Text")
	  (SETQ NUM (IF (EQ (FIRST (FIRST SET-DISPLAY)) "MDA")
			7
			(IF (EQ (FIRST (THIRD SET-DISPLAY)) "High") 3 1))) )
	((EQ (FIRST (FIRST SET-DISPLAY)) "CGA")
	  (SETQ NUM (IF (EQ (FIRST (THIRD SET-DISPLAY)) "High") 6 4)) )
	((EQ (FIRST (FIRST SET-DISPLAY)) "PCjr")
	  (SETQ NUM (IF (EQ (FIRST (THIRD SET-DISPLAY)) "High") 10 9)) )
	((EQ (FIRST (FIRST SET-DISPLAY)) "AT&T")
	  (SETQ NUM (IF (EQ (FIRST (THIRD SET-DISPLAY)) "High") 64 65)) )
	(RPLACA (CAR EGA-DISPLAY)
		(IF (MEMBER MODE '(7 15))
		    "Monochrome"
		    (IF (= MODE 16) "Enhanced" "Color")))
	((MODE-QUERY "DISPLAY MONITOR" EGA-DISPLAY)
	  ((EQ (CAAR EGA-DISPLAY) "Monochrome")
	    (SETQ NUM 15) )
	  ((EQ (FIRST (THIRD SET-DISPLAY)) "High")
	    ((EQ (CAAR EGA-DISPLAY) "Enhanced")
	      (SETQ NUM 16) )
	    (SETQ NUM 14) )
	  (SETQ NUM 13) )
	(RETURN) )
      (VIDEO-MODE NUM)
      (CURSOR-OFF)
      ( ((MEDIUM-RESOLUTION-P MODE)
	  ((MEDIUM-RESOLUTION-P))
	  (RPLACA (CDR *FULL-WINDOW*) (* 2 (CADR *FULL-WINDOW*)))
	  (RPLACA (CDDDR *FULL-WINDOW*) (* 2 (CADDDR *FULL-WINDOW*)))
	  (SETQ NUM (LENGTH *WINDOWS*))
	  (LOOP
	    ((ZEROP NUM))
	    (DECQ NUM)
	    (WINDOW-COL NUM (SUB1 (* 2 (WINDOW-COL NUM))))
	    (WINDOW-COLS NUM (ADD1 (* 2 (WINDOW-COLS NUM))))
	    ( ((= (+ (WINDOW-COL NUM) (WINDOW-COLS NUM))
		  (- (CADDDR *FULL-WINDOW*) 2))
		(WINDOW-COLS NUM (ADD1 (WINDOW-COLS NUM))) ) ) ) )
	((MEDIUM-RESOLUTION-P)
	  (RPLACA (CDR *FULL-WINDOW*) (TRUNCATE (CADR *FULL-WINDOW*) 2))
	  (RPLACA (CDDDR *FULL-WINDOW*) (CEILING (CADDDR *FULL-WINDOW*) 2))
	  (SETQ NUM (LENGTH *WINDOWS*))
	  (LOOP
	    ((ZEROP NUM))
	    (DECQ NUM)
	    (WINDOW-COL NUM (CEILING (WINDOW-COL NUM) 2))
	    (WINDOW-COLS NUM (TRUNCATE (SUB1 (WINDOW-COLS NUM)) 2)) ) ) )
      (THROW 'SWITCH-SCREEN) ) ) )

(SETQ SET-DISPLAY '(
 ("" 0 0 "Select display adapter" "Adapter" ("MDA" "CGA" "EGA" "AT&T" "PCjr"))
 ("" 0 0 "Select screen mode" "Mode" ("Text" "Graphics"))
 ("" 0 0 "Select screen resolution" "Res" ("Medium" "High")) ))

(SETQ EGA-DISPLAY '(
  ("" 0 0 "Select monitor type" "Monitor" ("Color" "Enhanced" "Monochrome")) ))

(DEFUN GO-DOS (
    COMMAND)
  (SETQ COMMAND "")
  ;(SETQ COMMAND (PROMPT-INPUT "Dame un comando para ejecutar" ;un solo comando
  ;               (PACK* (DEFAULT-DRIVE) ":\\" (DEFAULT-PATH) "> ") ""))
  ((EQ *LINE-TERMINATOR* 27))
  (STATUS-WINDOW)
  (CLEAR-SCREEN)
  ((EQ COMMAND "")
    (SHOW-PROMPT "Type	EXIT  to return")
    (CURSOR-ON)
    (MAPC 'WRITE-CONSOLE *RESET-SCREEN*)        ; Reset screen
    (EXECUTE (GETSET 'COMSPEC))
    (MAPC 'WRITE-CONSOLE *INIT-SCREEN*)         ; Initialize screen
    (CURSOR-OFF)
    (THROW 'SWITCH-SCREEN) )
  (SHOW-PROMPT "")
  (MAKE-WINDOW NIL)
  (SET-CURSOR (- (THIRD (MAKE-WINDOW)) 3) 0)
  (CURSOR-ON)
  (MAPC 'WRITE-CONSOLE *RESET-SCREEN*)          ; Reset screen
  (EXECUTE (GETSET 'COMSPEC) (PACK* "/C " COMMAND))
  (MAPC 'WRITE-CONSOLE *INIT-SCREEN*)           ; Initialize screen
  (CURSOR-OFF)
  (TERPRI 2)
  (SETQ *CURRENT-AREA*)
  (CONTINUE-PROMPT)
  (THROW 'SWITCH-SCREEN) 
  )

(SETQ *EDIT-TERMINATORS* '(27 13 10))

(DEFUN EXECUTE-OPTION (TITLE OPTIONS
    NUM CHAR POSITION)
  (LOOP
    (SETQ NUM 0)
    (LOOP
      (LOOP
	( ((LISTEN))
	  (SHOW-OPTIONS TITLE OPTIONS)
	  ((EQ NUM *INVERSE-OPTION*))
	  (OPTION-WINDOW)
	  (SHOW-OPTION *INVERSE-OPTION* OPTIONS)
	  (SETQ *INVERSE-OPTION* NUM
		*OPTIONS* OPTIONS)
	  (INVERSE-VIDEO (THIRD *WINDOW-COLORS*))
	  (SHOW-OPTION *INVERSE-OPTION* OPTIONS)
	  (NORMAL-VIDEO (THIRD *WINDOW-COLORS*)) )
	((SETQ CHAR (READ-CONSOLE-STATUS)))
	(SHOW-PROMPT "Dame la opcion (1er. letra)")
	(PROMPT-WINDOW) )
      ((MEMBER CHAR *EDIT-TERMINATORS*))
      ((OR (SETQ POSITION (POSITION (CHAR-UPCASE (ASCII CHAR)) OPTIONS
		    '(LAMBDA (CHAR OPTION) (CHAR= CHAR (CAR OPTION)))))
	   (AND (ALPHA-CHAR-P (ASCII CHAR))
		(SETQ POSITION (POSITION (CHAR-UPCASE (ASCII CHAR)) OPTIONS
		    '(LAMBDA (CHAR OPTION) (FINDSTRING CHAR (CAR OPTION)))))))
	(SETQ NUM POSITION) )
      ( ((OR (= CHAR 32) (= CHAR 9))
	  (SETQ NUM (MOD (ADD1 NUM) (LENGTH OPTIONS))) )
	((OR (= CHAR 8) (= CHAR 2) (= CHAR -15))
	  (SETQ NUM (MOD (SUB1 NUM) (LENGTH OPTIONS))) )
	(ERROR-BEEP) ) )
    ((= CHAR 27) NIL)
    ( ((EQ OPTIONS *OPTIONS*)
	(OPTION-WINDOW)
	(SHOW-OPTION *INVERSE-OPTION* OPTIONS)
	(SETQ *OPTIONS* OPTIONS) ) )
    (SETQ *INVERSE-OPTION* NIL
	  CHAR (CDR (NTH NUM OPTIONS)))
    ((IF (ATOM CHAR)
	 (FUNCALL CHAR (CAR (NTH NUM OPTIONS)))
	 (APPLY 'EXECUTE-OPTION CHAR))) ) )

(DEFUN SHOW-OPTIONS (TITLE OPTIONS)
  ((EQ OPTIONS *OPTIONS*))
  (OPTION-WINDOW)
  (CLEAR-SCREEN)
  (WRITE-STRING TITLE)
  (WRITE-STRING ": ")
  (SETQ *OPTIONS* OPTIONS
	*OPTION-COLUMN* (COLUMN)
	*MAX-LENGTH* (MAX-LENGTH OPTIONS)
	*INVERSE-OPTION*)
  (LOOP
    (LOOP
      (WRITE-STRING (SUBSTRING (CAAR OPTIONS) 0 (SUB1 *MAX-LENGTH*)))
      (POP OPTIONS)
      ((ATOM OPTIONS))
      ((>= (+ (COLUMN) (MIN *MAX-LENGTH* (LENGTH (CAAR OPTIONS))))
	   (CADDDR *FULL-WINDOW*)))
      (SPACES 1) )
    ((ATOM OPTIONS))
    (TERPRI)
    (SPACES *OPTION-COLUMN*) ) )

(DEFUN MAX-LENGTH (OPTIONS
    ROW COL MAX LST)
  (SETQ MAX (REDUCE '(LAMBDA (NUM OPTION)
	      (MAX NUM (LENGTH (CAR OPTION))) ) OPTIONS 0))
  (LOOP
    (SETQ LST OPTIONS
	  ROW 0)
    ((LOOP
	((= ROW (IF (< (CADDDR *FULL-WINDOW*) 75) 3 2)) NIL)
	(SETQ COL *OPTION-COLUMN*)
	(LOOP
	  ((ATOM LST)
	    (RETURN MAX) )
	  (SETQ COL (+ COL (MIN MAX (LENGTH (CAAR LST))) 1))
	  ((> COL (CADDDR *FULL-WINDOW*)))
	  (POP LST) )
	(INCQ ROW) ))
    (DECQ MAX) ) )

(DEFUN SHOW-OPTION (NUM OPTIONS
    ROW COL)
  ((NOT NUM))
  (SETQ ROW 0)
  (LOOP
    (SETQ COL *OPTION-COLUMN*)
    (LOOP
      ((ZEROP NUM)
	(SET-CURSOR ROW COL)
	(WRITE-STRING (SUBSTRING (CAAR OPTIONS) 0 (SUB1 *MAX-LENGTH*)))
	(RETURN) )
      (SETQ COL (+ COL (MIN *MAX-LENGTH* (LENGTH (CAAR OPTIONS)))))
      (DECQ NUM)
      (POP OPTIONS)
      ((>= (+ COL (MIN *MAX-LENGTH* (LENGTH (CAAR OPTIONS))))
	   (CADDDR *FULL-WINDOW*)))
      (INCQ COL) )
    (INCQ ROW) ) )

(DEFUN MODE-QUERY1 (TITLE let) ;mt
  (SHOW-PROMPT "EJ: (b 1 1 b)<enter>")
  (OPTION-WINDOW)
  (CLEAR-SCREEN)
  (WRITE-STRING TITLE)
  (WRITE-STRING ": ")
  (CURSOR-ON)
  (SETQ MT_ENTRADA (READ))
)

(DEFUN MODE-QUERY (TITLE OPTIONS
    NUM COLUMN QUERY)
  (OPTION-WINDOW)
  (CLEAR-SCREEN)
  (WRITE-STRING TITLE)
  (WRITE-STRING ": ")
  (SETQ COLUMN (IF (< (CADDDR *FULL-WINDOW*) 75) 2 (COLUMN))
	NUM 0)
  (LOOP
    ((= NUM (LENGTH OPTIONS)))
    (SETQ QUERY (NTH NUM OPTIONS))
    ( ((> (+ (COLUMN) (LENGTH (FIFTH QUERY)) 2 (QUERY-LENGTH (SIXTH QUERY)))
	  (CADDDR *FULL-WINDOW*))
	(SET-CURSOR (ADD1 (ROW)) COLUMN) ) )
    ( ((= (COLUMN) 0)
	(SET-CURSOR (ROW) COLUMN) ) )
    (WRITE-STRING (FIFTH QUERY))
    (IF (AND (NEQ (FIFTH QUERY) "")
	     (EQ (FIFTH QUERY) (STRING-RIGHT-TRIM " " (FIFTH QUERY))))
	(WRITE-STRING ": "))
    (RPLACA (CDR QUERY) (ROW))
    (RPLACA (CDDR QUERY) (COLUMN))
    ( ((INTEGERP (SIXTH QUERY))
	(WRITE-STRING (SUBSTRING (MAKE-STRING (CAR QUERY)) 0
			(SUB1 (SIXTH QUERY)))) )
      (SHOW-MODES (CAR QUERY) (SIXTH QUERY)) )
    (SET-CURSOR (ROW) (+ (CADDR QUERY) (QUERY-LENGTH (SIXTH QUERY)) 1))
    (INCQ NUM) )

  (SETQ NUM 0)
  (LOOP
    (SETQ QUERY (NTH NUM OPTIONS))
    (RPLACA QUERY (APPLY 'MAKE-QUERY QUERY))
    ((MEMBER *LINE-TERMINATOR* *EDIT-TERMINATORS*)
      (NEQ *LINE-TERMINATOR* 27) )
    ((AND (ZEROP *LINE-TERMINATOR*) (EQ (LENGTH OPTIONS) 1)))
    ( ((OR (EQ *LINE-TERMINATOR* 9) (ZEROP *LINE-TERMINATOR*))
	(SETQ NUM (MOD (ADD1 NUM) (LENGTH OPTIONS))) )
      ((OR (EQ *LINE-TERMINATOR* 2) (EQ *LINE-TERMINATOR* -15))
	(SETQ NUM (MOD (SUB1 NUM) (LENGTH OPTIONS))) ) ) ) )

(DEFUN MAKE-QUERY (DEFAULT ROW COLUMN PROMPT TITLE OPTIONS
    POSITION NUM )
  (SHOW-PROMPT PROMPT)
  ((INTEGERP OPTIONS)
    (OPTION-WINDOW)
    (SET-CURSOR ROW COLUMN)
    (SETQ NUM (CSMEMORY 914 0 T))                       ; Disable tabbing
    (PROG1 (LINE-EDITOR DEFAULT '(27 13 10 9 2 -15) 0 0 OPTIONS)
	   (CSMEMORY 914 NUM T) ) )                     ; Enable tabbing
  (SETQ NUM (POSITION DEFAULT OPTIONS))
  (LOOP
    (OPTION-WINDOW)
    (SET-CURSOR ROW (SUB1 COLUMN))
    (SPACES 1)
    (SETQ *LINE-TERMINATOR* (SELECT-OPTION NUM OPTIONS))
    ((MEMBER *LINE-TERMINATOR* '(27 13 10 9 2 -15)))
    ((OR (SETQ POSITION (POSITION (CHAR-UPCASE (ASCII *LINE-TERMINATOR*))
				OPTIONS 'CHAR=))
	 (AND (ALPHA-CHAR-P (ASCII *LINE-TERMINATOR*))
	      (SETQ POSITION (POSITION (CHAR-UPCASE (ASCII *LINE-TERMINATOR*))
				     OPTIONS 'FINDSTRING))))
      (SETQ NUM POSITION
	    *LINE-TERMINATOR* 0) )
    ( ((= *LINE-TERMINATOR* 32)
	(SETQ NUM (MOD (ADD1 NUM) (LENGTH OPTIONS))) )
      ((= *LINE-TERMINATOR* 8)
	(SETQ NUM (MOD (SUB1 NUM) (LENGTH OPTIONS))) )
      (ERROR-BEEP) ) )
  (SETQ DEFAULT (NTH NUM OPTIONS))
  (OPTION-WINDOW)
  (SET-CURSOR ROW COLUMN)
  (SHOW-MODES DEFAULT OPTIONS)
  DEFAULT )

(DEFUN SHOW-MODES (DEFAULT OPTIONS
    NUM)
  (SETQ NUM 0)
  (LOOP
    ((ATOM OPTIONS))
    ( ((EQUAL DEFAULT (CAR OPTIONS))
	(WRITE-BYTE 8)
	(WRITE-STRING "(")
	(WRITE-STRING (POP OPTIONS))
	(WRITE-STRING ")") )
      (WRITE-STRING (POP OPTIONS))
      (SPACES 1) )
    (INCQ NUM) ) )

(DEFUN SELECT-OPTION (DEFAULT OPTIONS
    MODE NUM)
  (SETQ NUM 0)
  (LOOP
    ((ATOM OPTIONS))
    (SETQ MODE (POP OPTIONS))
    ( ((EQ NUM DEFAULT)
	(INVERSE-VIDEO (THIRD *WINDOW-COLORS*))
	(WRITE-STRING MODE)
	(NORMAL-VIDEO (THIRD *WINDOW-COLORS*)) )
      (WRITE-STRING MODE) )
    ( ((= (COLUMN) 0))
      (SPACES 1) )
    (INCQ NUM) )
  (PROMPT-WINDOW)
  (LOOP
    ((READ-CONSOLE-STATUS)) ) )

(DEFUN QUERY-LENGTH (OPTIONS
    NUM)
  ((INTEGERP OPTIONS)
    (ADD1 OPTIONS) )
  (SETQ NUM 0)
  (LOOP
    ((ATOM OPTIONS) NUM)
    (SETQ NUM (+ NUM (LENGTH (POP OPTIONS)) 1)) ) )

(DEFUN BORDER-WINDOWS (
    WINDOW ROW1 COL1 ROW2 COL2)
  (APPLY 'MAKE-WINDOW *FULL-WINDOW*)
  (NORMAL-VIDEO (FIRST *WINDOW-COLORS*))
  (HORIZONTAL-BORDER 0 1 (- (CADDDR *FULL-WINDOW*) 2))
  (VERTICAL-BORDER 1 0 (- (CADDR *FULL-WINDOW*) 6))
  (SETQ WINDOW 0
	*CURRENT-AREA*)
  (LOOP
    ((= WINDOW (LENGTH *WINDOWS*)))
    (SETQ ROW1 (SUB1 (WINDOW-ROW WINDOW))
	  COL1 (SUB1 (WINDOW-COL WINDOW))
	  ROW2 (+ (WINDOW-ROW WINDOW) (WINDOW-ROWS WINDOW))
	  COL2 (+ (WINDOW-COL WINDOW) (WINDOW-COLS WINDOW)))
    (SET-CURSOR ROW1 COL1)
    ( ((= WINDOW *CURRENT-WINDOW*)
	(INVERSE-VIDEO (FIRST *WINDOW-COLORS*))
	(PRIN1 (ADD1 WINDOW))
	(NORMAL-VIDEO (FIRST *WINDOW-COLORS*)) )
      (PRIN1 (ADD1 WINDOW)) )
    (SET-CURSOR ROW1 COL2)
    ( ((UPPER-LEFT ROW1 COL2))
      ((LOWER-RIGHT ROW1 COL2)
	(WRITE-BORDER 9) )
      (WRITE-BORDER 2) )
    (SET-CURSOR ROW2 COL1)
    ( ((UPPER-LEFT ROW2 COL1))
      ((LOWER-RIGHT ROW2 COL1)
	(WRITE-BORDER 6) )
      (WRITE-BORDER 4) )
    (SETQ ROW1 (ADD1 ROW1)
	  COL1 (ADD1 COL1))
    ( ((AND (= ROW2 (- (CADDR *FULL-WINDOW*) 5)) (MEDIUM-RESOLUTION-P)))
      (HORIZONTAL-BORDER ROW2 COL1 (- COL2 COL1)) )
    (VERTICAL-BORDER ROW1 COL2 (- ROW2 ROW1))
    (INCQ WINDOW) )
  ((MEDIUM-RESOLUTION-P))
  (SET-CURSOR ROW2 COL2)
  (WRITE-BORDER 5) )

(DEFUN HORIZONTAL-BORDER (ROW COL COLS)
  (SET-CURSOR ROW COL)
  (WRITE-BORDER 0 COLS) )

(DEFUN VERTICAL-BORDER (ROW COL ROWS)
  (SETQ ROWS (+ ROW ROWS))
  (LOOP
    ((= ROW ROWS))
    (SET-CURSOR ROW COL)
    (WRITE-BORDER 7)
    (INCQ ROW) ) )

(DEFUN WRITE-BORDER (CHAR NUM)
  (WRITE-BYTE (NTH CHAR *BORDER-CHARS*) NUM) )

(DEFUN CURRENT-WINDOW ()
  (NORMAL-VIDEO (SECOND *WINDOW-COLORS*))
  ((EQUAL *CURRENT-AREA*
	  (SETQ *CURRENT-AREA* (CDDR (NTH *CURRENT-WINDOW* *WINDOWS*)))))
  (MAKE-WINDOW (+ (CAR *FULL-WINDOW*) (WINDOW-ROW))
	       (+ (CADR *FULL-WINDOW*) (WINDOW-COL))
	       (WINDOW-ROWS)
	       (WINDOW-COLS)) )

(DEFUN OPTION-WINDOW (
    ROWS)
  (NORMAL-VIDEO (THIRD *WINDOW-COLORS*))
  (SETQ *OPTIONS*)
  ((EQ *CURRENT-AREA* (SETQ *CURRENT-AREA* 'OPTION-WINDOW)))
  (SETQ ROWS (IF (< (CADDDR *FULL-WINDOW*) 75) 3 2 ))
  (MAKE-WINDOW (- (+ (CAR *FULL-WINDOW*) (CADDR *FULL-WINDOW*)) ROWS 2)
	       (CADR *FULL-WINDOW*)
	       ROWS
	       (CADDDR *FULL-WINDOW*)) )

(DEFUN PROMPT-WINDOW ()
  ((EQ *CURRENT-AREA* (SETQ *CURRENT-AREA* 'PROMPT-WINDOW)))
  (NORMAL-VIDEO (FOURTH *WINDOW-COLORS*))
  (MAKE-WINDOW (+ (CAR *FULL-WINDOW*) (CADDR *FULL-WINDOW*) -2)
	       (CADR *FULL-WINDOW*)
	       1
	       (CADDDR *FULL-WINDOW*)) )

(DEFUN STATUS-WINDOW ()
  ((EQ *CURRENT-AREA* (SETQ *CURRENT-AREA* 'STATUS-WINDOW)))
  (NORMAL-VIDEO (FIFTH *WINDOW-COLORS*))
  (MAKE-WINDOW (+ (CAR *FULL-WINDOW*) (CADDR *FULL-WINDOW*) -1)
	       (CADR *FULL-WINDOW*)
	       1
	       (CADDDR *FULL-WINDOW*)) )


(DEFUN GRAPHICS-MODE-P (MODE)
  (IF (NOT MODE)
      (SETQ MODE (VIDEO-MODE)) )
  ((NUMBERP MODE)
    ((>= MODE 4)
      (/= MODE 7) ) ) )

(DEFUN MEDIUM-RESOLUTION-P (MODE)
  (IF (NOT MODE)
      (SETQ MODE (VIDEO-MODE)) )
  (MEMBER MODE '(0 1 4 5 9 13)) )

(DEFUN CONTINUE-PROMPT (
    BYTE)
  (CLEAR-INPUT T)
  (LOOP
    (SETQ BYTE (PROMPT-READ-BYTE "Presiona alguna tecla para continuar"))
    ((NEQ BYTE 19) BYTE) ) )

(DEFUN PROMPT-YN (PROMPT
    BYTE )
  (LOOP
    (SETQ BYTE (PROMPT-READ-BYTE PROMPT))
    ((MEMBER BYTE '(83 115 25))
      (WRITE-BYTE 83 NIL T)
      (SETQ *PROMPT*)
      T )
    ((MEMBER BYTE '(78 110 14))
      (WRITE-BYTE 78 NIL T)
      (SETQ *PROMPT*) )
    (ERROR-BEEP) ) )

(DEFUN PROMPT-READ-BYTE (PROMPT)
  (PROMPT-WINDOW)
  ( ((EQ PROMPT *PROMPT*)
      (SET-CURSOR 0 (LENGTH *PROMPT*)) )
    (CLEAR-SCREEN)
    (SETQ *PROMPT* (WRITE-STRING PROMPT T)) )
  (READ-CONSOLE-BYTE) )

(DEFUN SHOW-PROMPT (PROMPT)
  ((OR (NULL PROMPT) (EQ PROMPT *PROMPT*)))
  (PROMPT-WINDOW)
  (CLEAR-SCREEN)
  (SETQ *PROMPT* (WRITE-STRING PROMPT T))
  (SET-CURSOR 0 0) )

(DEFUN ERROR-BEEP ()
  ((EQUAL (CAAR SET-MUTE) "Yes"))
  (CLEAR-INPUT)
  ((EQ (CSMEMORY 855) 2)
    (TONE 1000 100) )
  (WRITE-BYTE 7) )

(DEFUN MAKE-STRING (EXPN)
  ((SYMBOLP EXPN) EXPN)
  (PACK* EXPN) )

(IF (EQ *DEFAULT-TYPE* '*DEFAULT-TYPE*) (SETQ *DEFAULT-TYPE* ""))

(DEFUN PROMPT-TEXT-FILE (COMMAND FILE-NAME)
  (SETQ FILE-NAME (STRING-UPCASE
		(PROMPT-INPUT "Enter file name" COMMAND FILE-NAME)))
  ((OR (EQ *LINE-TERMINATOR* 27) (EQ FILE-NAME "")) "")
  (NORMALIZE-FILE-NAME FILE-NAME *DEFAULT-TYPE*) )

(DEFUN NORMALIZE-FILE-NAME (FILE-NAME DEFAULT-TYPE
    NUM)
  (SETQ NUM (IF (EQ (CHAR FILE-NAME 1) '\:) 2 0))
  ( ((EQ (CHAR FILE-NAME NUM) '\.)
      (INCQ NUM)
      ((EQ (CHAR FILE-NAME NUM) '\.)
	(INCQ NUM) ) ) )
  ((SETQ NUM (FINDSTRING '\. FILE-NAME NUM))
    (SUBSTRING FILE-NAME 0 (+ NUM 3)) )
  (PACK* FILE-NAME '\. DEFAULT-TYPE) )

(DEFUN PROMPT-INPUT (PROMPT COMMAND DEFAULT)
  (SHOW-PROMPT PROMPT)
  (OPTION-WINDOW)
  (CLEAR-SCREEN)
  (WRITE-STRING COMMAND T)
  (LINE-EDITOR DEFAULT *EDIT-TERMINATORS* 0 0
		(- (CADDDR *FULL-WINDOW*) (COLUMN) 1)) )

(DEFUN LINE-EDITOR (TEXT TERMINATORS *LINE-POINT* *LINE-COLUMN* COLS
    ROW COL )
  (SETQ ROW (ROW)
	COL (COLUMN))
  (LOOP
    (OPTION-WINDOW)
    (SET-CURSOR ROW COL)
    (CURSOR-ON)
    (SETQ TEXT (LINE-EDIT TEXT *LINE-POINT* *LINE-COLUMN* COLS))
    (CURSOR-OFF)
    ((MEMBER *LINE-TERMINATOR* TERMINATORS)
      (STRING-TRIM " " TEXT) )
    ( ((MEMBER *LINE-TERMINATOR* '(11 15)))
      (DEMON-BYTE *LINE-TERMINATOR*) ) ) )


(SETQ *FREE-STATUS* NIL)

(DEFUN GCHOOK (
    ROW COL FOREGROUND-COLOR BACKGROUND-COLOR WINDOW
    *CURRENT-AREA* *OUTPUT-FILE*)
  ( ((ZEROP (SETQ *FREE-DATA* (DSMEMORY 8 NIL T)))
      (SETQ *FREE-DATA* 65536) ) )
  (SETQ *FREE-DATA* (TRUNCATE (* 100 (- (+ (- *FREE-DATA* (DSMEMORY 6 NIL T))
		(DSMEMORY 2 NIL T)) (DSMEMORY 0 NIL T))) *FREE-DATA*)
	*FREE-DATA* (MIN *FREE-DATA* (TRUNCATE (* 100 (DSMEMORY 44 NIL T))
		(- 65536 (DSMEMORY 46 NIL T)))))
  ((NOT *FREE-STATUS*))
  (SETQ ROW (ROW)
	COL (COLUMN)
	FOREGROUND-COLOR (FOREGROUND-COLOR)
	BACKGROUND-COLOR (BACKGROUND-COLOR)
	WINDOW (MAKE-WINDOW))
  (FUNCALL *FREE-STATUS*)
  (APPLY 'MAKE-WINDOW WINDOW)
  (FOREGROUND-COLOR FOREGROUND-COLOR)
  (BACKGROUND-COLOR BACKGROUND-COLOR)
  (SET-CURSOR ROW COL) )


(DEFUN CLEAR-STATUS (PROMPT)
  (STATUS-WINDOW)
  (CLEAR-SCREEN)
  (INSERT-STATUS *INSERT-MODE*)
  (SET-CURSOR 0 (- (CADDDR *FULL-WINDOW*) (LENGTH PROMPT)))
  (WRITE-STRING PROMPT T)
  (SET-CURSOR 0 0)
  ((< (CADDDR *FULL-WINDOW*) 75))
  (SET-CURSOR 0 (- (- (CADDDR *FULL-WINDOW*) (LENGTH PROMPT))
		   (ADD1 (LENGTH *PRODUCT*))))
  (WRITE-STRING *PRODUCT* T)
  (SET-CURSOR 0 0) )

(DEFUN TOGGLE-INSERT ()
  (INSERT-STATUS (NOT *INSERT-MODE*)) )

(DEFUN INSERT-STATUS (MODE)
  (SETQ *INSERT-MODE* MODE)
  ((EQ (CAR (WINDOW-STATE)) "Graph"))
  (STATUS-WINDOW)
  (SET-CURSOR 0 (TRUNCATE (* 2 (CADDDR *FULL-WINDOW*)) 3))
  ((NOT *INSERT-MODE*)
    (SPACES 6) )
  (WRITE-STRING "Insert") )

(DEFUN PARSE-INTEGER (SYM RADIX
    CHAR SIGN N )
  (SETQ *STRING-INDEX* 0)
  (LOOP
    ((NULL (SETQ CHAR (CHAR SYM *STRING-INDEX*))) NIL)
    ((NEQ CHAR '| |)
      (SETQ SIGN 1)
      ( ((EQ CHAR '+)
	  (INCQ *STRING-INDEX*) )
	((EQ CHAR '-)
	  (SETQ SIGN -1)
	  (INCQ *STRING-INDEX*) ) )
      ((SETQ CHAR (CHAR SYM *STRING-INDEX*))
	((SETQ N (DIGIT-CHAR-P CHAR RADIX))
	  (IF (NULL RADIX) (SETQ RADIX 10))
	  (LOOP
	    (INCQ *STRING-INDEX*)
	    ((NULL (SETQ CHAR (CHAR SYM *STRING-INDEX*))))
	    ((NOT (SETQ CHAR (DIGIT-CHAR-P CHAR RADIX))))
	    (SETQ N (+ (* N RADIX) CHAR)) )
	  (* SIGN N) ) ) )
    (INCQ *STRING-INDEX*) ) )

(DEFUN READ-CONSOLE-STATUS (
    *INPUT-FILE*)
  (LOOP
    (IF *UPDATE-FUNCTION* (FUNCALL *UPDATE-FUNCTION*))
    ((NOT (LISTEN)) NIL)
    ((DEMON-BYTE (READ-CONSOLE-BYTE))) ) )

(DEFUN READ-CONSOLE-BYTE (
    *INPUT-FILE*)
  (CURSOR-ON)
  (PROG1 (CONSOLE-BYTE (READ-BYTE))
	 (CURSOR-OFF)) )

(DEFUN DEMON-BYTE (BYTE
    DEMON)
  (SETQ BYTE (NORMALIZE-BYTE BYTE))
  ((SETQ DEMON (OR (ASSOC BYTE *LOCAL-DEMONS*) (ASSOC BYTE *GLOBAL-DEMONS*)))
    (FUNCALL (CDR DEMON) BYTE)
    (IF *UPDATE-FUNCTION* (FUNCALL *UPDATE-FUNCTION*))
    NIL )
  BYTE )

(DEFUN NORMALIZE-BYTE (BYTE)
  ( ((<= -103 BYTE -94)                 ;Ctrl Fx --> Shift Fx
      (SETQ BYTE (+ BYTE 10)) )
    ((<= -113 BYTE -104)                ;Alt Fx --> Shift Fx
      (SETQ BYTE (+ BYTE 20)) ) )
  ((CDR (ASSOC BYTE *CURSOR-KEYS*)))
  BYTE )

(SETQ *CURSOR-KEYS* '(
	(-72 . 5)                       ;Up arrow       Ctrl-E
	(-80 . 24)                      ;Down arrow     Ctrl-X
	(-75 . 19)                      ;<--            Ctrl-S
	(-77 . 4)                       ;-->            Ctrl-D
	(-73 . 18)                      ;PgUp           Ctrl-R
	(-81 . 3)                       ;PgDn           Ctrl-C
	(-115 . 1)                      ;Ctrl <--       Ctrl-A
	(-116 . 6)                      ;Ctrl -->       Ctrl-F
	(-82 . 22)                      ;Ins            Ctrl-V
	(-83 . 7) ))                    ;Del            Ctrl-G

(SETQ *GLOBAL-DEMONS* '(
	(22 . TOGGLE-INSERT)            ;Ctrl-V (Ins)
	(-59 . NEXT-WINDOW)             ;F1
	(-84 . LAST-WINDOW)             ;Shift F1
	(-60 . NEXT-PANE)               ;F2
	(-85 . LAST-PANE) ))            ;Shift F2

;       * * *   Computer customization section   * * *

(SETQ *INIT-SCREEN* NIL)                        ;Generic values
(SETQ *RESET-SCREEN* NIL)
(SETQ *BORDER-CHARS* '(45 32 32 45 32 32 45 124 124 124 43))
(MOVD 'IDENTITY 'NORMAL-VIDEO)
(MOVD 'IDENTITY 'INVERSE-VIDEO)
(MOVD 'WRITE-STRING 'BLINK-WRITE-STRING)
(MOVD 'IDENTITY 'CURSOR-ON)
(MOVD 'IDENTITY 'CURSOR-OFF)
(MOVD 'IDENTITY 'CONSOLE-BYTE)

(DEFUN WRITE-CONSOLE (BYTE)
  (REGISTER 0 512)
  (REGISTER 3 BYTE)
  (INTERRUPT 33) )

(IF (EQ (CSMEMORY 855) 2)                       ;IBM PC?
    (PROGN

(SETQ *BORDER-CHARS* '(205 213 184 209 212 190 207 179 198 181 216))

(SETQ *WINDOW-COLORS* '(3 15 7 13 11 0))

(DEFUN NORMAL-VIDEO (COLOR)
  ( ((ZEROP COLOR))
    ((>= COLOR 15))
    ((EQ (VIDEO-MODE) 7)
      (SETQ COLOR 7) ) )
  (FOREGROUND-COLOR COLOR)
  (BACKGROUND-COLOR (LOGAND (SIXTH *WINDOW-COLORS*)
			    (IF (GRAPHICS-MODE-P) 15 7))) )

(DEFUN INVERSE-VIDEO (COLOR)
  ( ((ZEROP COLOR))
    ((>= COLOR 15))
    ((EQ (VIDEO-MODE) 7)
      (SETQ COLOR 7) ) )
  (FOREGROUND-COLOR (SIXTH *WINDOW-COLORS*))
  (BACKGROUND-COLOR (LOGAND COLOR (IF (GRAPHICS-MODE-P) 15 7))) )

(DEFUN BLINK-WRITE-STRING (STRING
    *BLINK*)
  (SETQ COLOR (FOREGROUND-COLOR))
  ((EQ (VIDEO-MODE) 15)
    (NORMAL-VIDEO 4)
    (WRITE-STRING STRING)                       ;Write string
    (NORMAL-VIDEO COLOR) )
  ((GRAPHICS-MODE-P)
    (INVERSE-VIDEO COLOR)
    (WRITE-STRING STRING)                       ;Write string
    (NORMAL-VIDEO COLOR) )
  (SETQ *BLINK* T)                              ;Turn blink mode ON
  (WRITE-STRING STRING) )                       ;Write string

(DEFUN CURSOR-ON ()                             ;Turn cursor ON
  ((NOT *INSERT-MODE*)
    (CURSOR-LINES NIL) )
  ((MEMBER (VIDEO-MODE) '(7 15 16))
    (CURSOR-LINES 9 12) )
  (CURSOR-LINES 5 7) )

(DEFUN CURSOR-OFF ()                            ;Turn cursor OFF
  ((NOT *CURSOR-ON*)
    (CURSOR-LINES 14 0) ) )

(DEFUN CONSOLE-BYTE (BYTE)
  ((AND (= BYTE 255) (LISTEN))                  ;Extended function key?
    (- (READ-BYTE)) )
  BYTE )
))


(IF (<= 9 (CSMEMORY 855) 10)                    ;NEC PC-9801 or Fujitsu?
    (PROGN

(SETQ *BORDER-CHARS* '(149 152 153 145 154 155 144 150 147 146 143))

(DEFUN WRITE-BORDER (CHAR NUM)
  (MAPC 'WRITE-CONSOLE '(27 41 51))             ;Activate graphics mode
  (WRITE-BYTE (NTH CHAR *BORDER-CHARS*) NUM)
  (MAPC 'WRITE-CONSOLE '(27 41 48)) )           ;Activate kanji mode

(DEFUN CURSOR-ON ()                             ;Turn cursor ON
  (MAPC 'WRITE-CONSOLE '(27 91 62 53 108)) )

(DEFUN CURSOR-OFF ()                            ;Turn cursor OFF
  ((NOT *CURSOR-ON*)
    (MAPC 'WRITE-CONSOLE '(27 91 62 53 104)) ) )

(DEFUN CONSOLE-BYTE (BYTE)
  ((AND (EQ BYTE 27) (LISTEN))                  ;Function key?
    (SETQ BYTE (READ-BYTE))
    ((CDR (ASSOC BYTE '(
	(83 . -59)                              ;F1
	(84 . -60)                              ;F2
	(85 . -61)                              ;F3
	(86 . -62)                              ;F4
	(87 . -63)                              ;F5
	(69 . -64)                              ;F6
	(74 . -65)                              ;F7
;       (80 . -66)                              ;F8
	(81 . -67)                              ;F9
	(68 . -83)                              ;Del
	(80 . -82) ))))                         ;Ins
    (UNREAD-CHAR)
    27 )
  ((EQ BYTE 127) -68)                           ;F10
  BYTE )
))

(IF (OR (<= 3 (CSMEMORY 855) 4)                 ;ANSI or TI-PC?
	(<= 8 (CSMEMORY 855) 10))               ;NEC XA, 9801 or Fujitsu?
    (PROGN

(DEFUN NORMAL-VIDEO ()
  (MAPC 'WRITE-CONSOLE '(27 91 48 109)) )

(DEFUN INVERSE-VIDEO ()
  (MAPC 'WRITE-CONSOLE '(27 91 48 59 55 109)) )

(DEFUN BLINK-WRITE-STRING (STRING)
  (MAPC 'WRITE-CONSOLE '(27 91 48 59 53 109))   ;Turn blink mode ON
  (WRITE-STRING STRING)                         ;Write string
  (MAPC 'WRITE-CONSOLE '(27 91 48 109)) )       ;Turn blink mode OFF
))


(IF (EQ (CSMEMORY 855) 5)                       ;Z-100?
    (PROGN

(SETQ *INIT-SCREEN* '(27 122 27 121 63))        ;Disable key expansion
(SETQ *RESET-SCREEN* '(27 122))                 ;Power-up configuration
(SETQ *BORDER-CHARS* '(97 102 99 117 101 100 117 96 118 116 98))

(DEFUN WRITE-BORDER (CHAR NUM)
  (MAPC 'WRITE-CONSOLE '(27 70))                ;Activate graphics mode
  (WRITE-BYTE (NTH CHAR *BORDER-CHARS*) NUM)
  (MAPC 'WRITE-CONSOLE '(27 71)) )              ;Deactivate graphics mode

(DEFUN NORMAL-VIDEO ()
  (MAPC 'WRITE-CONSOLE '(27 113)) )

(DEFUN INVERSE-VIDEO ()
  (MAPC 'WRITE-CONSOLE '(27 112)) )

(DEFUN BLINK-WRITE-STRING (STRING)
  (MAPC 'WRITE-CONSOLE '(27 112))               ;Turn reverse video ON
  (WRITE-STRING STRING)                         ;Write string
  (MAPC 'WRITE-CONSOLE '(27 113)) )             ;Turn reverse video OFF

(DEFUN CURSOR-ON ()                             ;Turn cursor ON
  (MAPC 'WRITE-CONSOLE '(27 121 53)) )

(DEFUN CURSOR-OFF ()                            ;Turn cursor OFF
  ((NOT *CURSOR-ON*)
    (MAPC 'WRITE-CONSOLE '(27 120 53)) ) )

(SETQ *CURSOR-KEYS* '(          ;Z-100 Key            Generic Key
	(165 . 5)               ;Up arrow               Ctrl-E
	(184 . 5)               ;Keypad 5               Ctrl-E
	(166 . 24)              ;Down arrow             Ctrl-X
	(178 . 24)              ;Keypad 2               Ctrl-X
	(168 . 19)              ;<--                    Ctrl-S
	(180 . 19)              ;Keypad 4               Ctrl-S
	(167 . 4)               ;-->                    Ctrl-D
	(182 . 4)               ;Keypad 6               Ctrl-D
	(185 . 18)              ;Keypad 9               Ctrl-R
	(249 . 18)              ;Shift-Keypad 9         Ctrl-R
	(179 . 3)               ;Keypad 3               Ctrl-C
	(243 . 3)               ;Shift-Keypad 3         Ctrl-C
	(244 . 1)               ;Shift-Keypad 4         Ctrl-A
	(246 . 6)               ;Shift-Keypad 6         Ctrl-F
	(176 . 22)              ;Keypad 0               Ctrl-V
	(240 . 22)              ;Shift-Keypad 0         Ctrl-V
	(174 . 7)               ;Keypad .               Ctrl-G
	(238 . 7)               ;Shift-Keypad .         Ctrl-G
	(227 . 7)               ;D CHR                  Ctrl-G

	(163 . 22)              ;I CHR                  Ctrl-V
	(151 . -59)             ;F1                     F1
	(215 . -84)             ;Shift F1               Shift F1
	(152 . -60)             ;F2                     F2
	(216 . -85)             ;Shift F2               Shift F2

	(228 . 25)              ;DELLINE                Ctrl-Y
	(164 . 14)              ;INSLINE                Ctrl-N
	(232 . -31)             ;Shift <--              Alt-S
	(167 . -32)             ;Shift -->              Alt-D
	(229 . -19)             ;Shift Up arrow         Alt-R
	(230 . -46)             ;Shift Down arrow       Alt-C
	(173 . -20)             ;Keypad -               Alt-T
	(237 . -20)             ;Shift-Keypad -         Alt-T
	(169 . -71)             ;HOME                   Home
	(183 . -71)             ;Keypad 7               Home
	(247 . -119)            ;Shift-Keypad 7         Ctrl-Home
	(233 . -79)             ;Shift-HOME             End
	(177 . -79)             ;Keypad 1               End
	(241 . -117)            ;Shift-Keypad 1         Ctrl-End
	(141 . -120)            ;ENTER                  Alt-!
	(205 . -120) ))         ;Shift-ENTER            Alt-!
))