COMMAND VT100; BEGIN EXTERNAL PROCEDURE VT1XX_CHANGE; EXTERNAL STRING PROCEDURE VT1XX_LINE; INTEGER IDX,TOP,BOTTOM,NUM2DO,RATIO,QN,IDX2; INTEGER POWERUP,LOOPBACK,EIA,REPEAT,CHANNEL; STRING FCN,KEYWD,MESS,FIL,CHAR; PARSE NOISE "function"; PARSE KEYWORD(WORDS( ANSI:0, ARROW_MODE:0, AUTOREPEAT:0, BLACK:0, CHARACTER_ATTRIBUTE:0, COLUMNS:0, DOUBLE:0, EEEEEE:0, KEYPAD_MODE:0, LED:0, LOCK:0, MUSIC:0, NO_AUTOREPEAT:0, QUACK:0, REGION:0, RESET:0, SCROLL_MODE:0, SELECT_CHARACTERS:0, SIREN:0, TESTS:0, VT52:0, WHITE:0)); FCN = $ATOM; SELECT FCN OF BEGIN ["BLACK"]: BEGIN PARSE NOISE "background"; PARSE EOL; CALL VT1XX_CHANGE ("[?5l"); EXIT; END; ["TESTS"]: BEGIN POWERUP = 0; !default to no tests LOOPBACK = 0; EIA = 0; REPEAT = 0; GUIDE "which ones?"; TLOOP:PARSE ( EOL; KEYWORD(WORDS ( EIA_MODEM_CONTROL:0, LOOP_BACK:0, POWER_UP:0, REPEAT:0 )):BEGIN SELECT $ATOM OF BEGIN ["REPEAT"]:BEGIN GUIDE "until power off or failure"; REPEAT = 8;END; ["EIA-MODEM-CONTROL"]:BEGIN GUIDE "loop back connector required"; EIA = 4;END; ["LOOP-BACK"]:BEGIN GUIDE "loop back connector required"; LOOPBACK = 2;END; ["POWER-UP"]:POWERUP = 1; END; GOTO TLOOP;END;); CALL VT1XX_CHANGE("[2;" + $STRING(EIA+POWERUP+LOOPBACK+REPEAT) + "y"); EXIT; END; ["QUACK"]: BEGIN QN = 1000000; !default to many many quacks RATIO = 30; !one that seems to produce good quack CHAR = " "; !linefeed seems to be a good character LOOP:PARSE ( EOL; SWITCH(WORDS ( CHARACTER::0, QUANTITY::0, RATIO::0 )):BEGIN SELECT $ATOM[1:$LENGTH($ATOM)-1] OF BEGIN ["CHARACTER"]: PARSE ( QUOTEDSTRING(HELP "quoted string of characters to use between bells"):CHAR = $ATOM; NUMBER(HELP "ASCII value of character to use between bells", RADIX 8):CHAR = $CVITC($VALUE);); ["QUANTITY"]: BEGIN PARSE NUMBER(HELP "number of quacks");QN = $VALUE;END; ["RATIO"]: BEGIN PARSE NUMBER(HELP "number of characters between bells"); RATIO = $VALUE;END; END; GOTO LOOP;END;); DOCOMMAND "VT100 SCROLL JUMP";DISPLAY "[VT100 SCROLL JUMP being set]"; IDX2 = 0; WHILE IDX2 LSS QN DO BEGIN DISPLAY BINARY ""; IDX = 0; WHILE IDX LSS RATIO DO BEGIN DISPLAY BINARY CHAR; IDX = IDX + 1; END; IDX2 = IDX2 + 1; END; END; ["SELECT-CHARACTERS"]: BEGIN PARSE NOISE "set"; PARSE KEYWORD (DEFAULT "ASCII", WORDS( ASCII:66, GRAPHICS:48, ROM1:49, ROM2:50, UNITED_KINGDOM:65)); IDX = $VALUE; PARSE EOL; CALL VT1XX_CHANGE ("(" + $CVITC(IDX) + ")" + $CVITC(IDX)); !Make both CTRL/N and CTRL/O sets be the specified one for now! EXIT; END; ["CHARACTER-ATTRIBUTE"]: BEGIN PARSE NOISE "is"; PARSE KEYWORD (DEFAULT "NONE", WORDS( BLINK:5, BOLD:1, NONE:0, REVERSE_VIDEO:7, UNDERSCORE:4)); IDX = $VALUE; !Get correct selective parameter PARSE NOISE "for subsequent typeout"; PARSE EOL; CALL VT1XX_CHANGE ("[" + $STRING(IDX) + "m"); EXIT; END; ["EEEEEE"]: BEGIN PARSE NOISE "eeeeee!"; PARSE EOL; CALL VT1XX_CHANGE ("#8"); EXIT; END; ["MUSIC"]: BEGIN PARSE NOISE "mode"; PARSE EOL; DOCOMMAND "VT100 AUTOREPEAT"; CALL VT1XX_CHANGE (""); DISPLAY "Requires keyclick to be on -- hold a key down to get a note!"; DISPLAY "Use VT100 RESET to turn off music mode."; EXIT; END; ["SIREN"]: BEGIN PARSE EOL; CALL VT1XX_CHANGE (""); DISPLAY "Use VT100 RESET to stop this cacophony!"; EXIT; END; ["LED"]: BEGIN PARSE KEYWORD (WORDS( CYCLE:0, L1_ON:1, L2_ON:2, L3_ON:3, L4_ON:4, OFF:0)); IDX = $VALUE; FCN = $ATOM; PARSE EOL; SELECT FCN OF BEGIN ["CYCLE"]: BEGIN IDX = 0; UNTIL 2+2=5 DO BEGIN DOCOMMAND "VT100 LED OFF"; DOCOMMAND "VT100 LED L" + $STRING(1+IDX-IDX/4*4); IDX = IDX + 1;END; END; [OTHERWISE]:CALL VT1XX_CHANGE("[" + $STRING(IDX) + "q"); END; EXIT; END; ["RESET"]: BEGIN PARSE NOISE "to default settings"; PARSE EOL; CALL VT1XX_CHANGE ("c"); EXIT; END; ["WHITE"]: BEGIN PARSE NOISE "background"; PARSE EOL; CALL VT1XX_CHANGE ("[?5h"); EXIT; END; ["NO-AUTOREPEAT"]: BEGIN PARSE NOISE "when keys held down"; PARSE EOL; CALL VT1XX_CHANGE ("[?8l"); EXIT; END; ["LOCK"]: BEGIN PARSE NOISE "keyboard"; PARSE EOL; CALL VT1XX_CHANGE (""); EXIT; END; ["AUTOREPEAT"]: BEGIN PARSE NOISE "when keys held down"; PARSE EOL; CALL VT1XX_CHANGE ("[?8h"); EXIT; END; ["COLUMNS"]: BEGIN PARSE NOISE "wide"; PARSE KEYWORD (DEFAULT "80", WORDS ( 132:0, 80:0)); KEYWD = $ATOM; PARSE EOL; DOCOMMAND "TERMINAL WIDTH " + KEYWD; SELECT KEYWD OF BEGIN ["132"]:CALL VT1XX_CHANGE ("[?3h"); ["80"]:CALL VT1XX_CHANGE ("[?3l"); END; EXIT; END; ["DOUBLE"]: BEGIN PARSE KEYWORD (WORDS ( HEIGHT:0, WIDTH:1)); KEYWD = $ATOM;SELECT KEYWD OF BEGIN ["HEIGHT"]: BEGIN PARSE NOISE "file"; PARSE FILE( HELP "file to be displayed in big letters", INPUT); FIL = $FILES; PARSE EOL; IDX = 24; CHANNEL = $OPEN(FIL,$INPUT); IF CHANNEL = 0 THEN ABORT $LASTERROR; WHILE $EOF(CHANNEL) EQL 0 DO BEGIN MESS = $READ(CHANNEL); IF IDX = 24 THEN IDX = 0; DISPLAY BINARY VT1XX_LINE(IDX+1) + "#3"; DISPLAY NORETURN $CR+MESS; DISPLAY BINARY VT1XX_LINE(IDX+2) + "#4"; DISPLAY NORETURN $CR+MESS; IDX = IDX + 2; END; END; ["WIDTH"]: BEGIN PARSE EOL; NUM2DO = 24; WHILE NUM2DO > 0 DO BEGIN CALL VT1XX_CHANGE ("[" + $STRING (NUM2DO) + ";0H#6"); NUM2DO = NUM2DO - 1; END; CALL VT1XX_CHANGE (""); END; END; EXIT; END; ["KEYPAD-MODE"]: BEGIN PARSE NOISE "is"; PARSE KEYWORD (DEFAULT "NUMERIC", WORDS ( APPLICATION:0, NUMERIC:1)); KEYWD = $ATOM; PARSE EOL; SELECT KEYWD OF BEGIN ["APPLICATION"]:CALL VT1XX_CHANGE ("="); ["NUMERIC"]:CALL VT1XX_CHANGE (">"); END; EXIT; END; ["ARROW-MODE"]: BEGIN PARSE NOISE "is"; PARSE KEYWORD (DEFAULT "CURSOR", WORDS ( APPLICATION:0, CURSOR:1)); KEYWD = $ATOM; PARSE EOL; SELECT KEYWD OF BEGIN ["APPLICATION"]:CALL VT1XX_CHANGE ("[?1h"); ["CURSOR"]:CALL VT1XX_CHANGE ("[?1l"); END; EXIT; END; ["SCROLL-MODE"]: BEGIN PARSE NOISE "style"; PARSE KEYWORD (DEFAULT "SMOOTH", WORDS ( JUMP:0, SMOOTH:1)); KEYWD = $ATOM; PARSE EOL; SELECT KEYWD OF BEGIN ["JUMP"]:CALL VT1XX_CHANGE ("[?4l"); ["SMOOTH"]:CALL VT1XX_CHANGE ("[?4h"); END; EXIT; END; ["REGION"]: BEGIN GUIDE "from line"; PARSE NUMBER (HELP "Line number of top of region",DEFAULT "1"); TOP = $VALUE; GUIDE "through line"; PARSE NUMBER (HELP "Line number of bottom of region",DEFAULT "24"); BOTTOM = $VALUE; PARSE EOL; DOCOMMAND "TER LEN " + $STRING (BOTTOM-TOP+1); IDX = TOP; WHILE IDX LEQ BOTTOM DO BEGIN !Clear new region CALL VT1XX_CHANGE ("[" + $STRING(IDX) + ";0H"); IDX = IDX + 1; END; CALL VT1XX_CHANGE ("[" + $STRING(TOP) + ";" + $STRING(BOTTOM) + "r"); CALL VT1XX_CHANGE ("[" + $STRING(TOP) + ";0H"); EXIT; END; ["ANSI"]: BEGIN GUIDE "mode"; PARSE EOL; IF $TTYPE = 15 THEN BEGIN DISPLAY BINARY "<"; DOCOMMAND "TERMINAL VT100"; DOCOMMAND "TERMINAL NO PAUSE END-OF-PAGE"; END; EXIT; END; ["VT52"]: BEGIN GUIDE "mode"; PARSE EOL; IF $TTYPE = 16 THEN BEGIN DISPLAY BINARY "[?2l"; DOCOMMAND "TERMINAL VT52"; DOCOMMAND "TERMINAL NO PAUSE END-OF-PAGE"; END; EXIT; END; END; END; PROCEDURE VT1XX_CHANGE (STRING STR); BEGIN EXTERNAL STRING PROCEDURE VT1XX_ANSIIZE; DISPLAY BINARY VT1XX_ANSIIZE(STR); END; !VT1XX_LINE(N) returns the string necessary to put the VT100 cursor at line N. STRING PROCEDURE VT1XX_LINE(INTEGER N); BEGIN STRING X; EXTERNAL STRING PROCEDURE VT1XX_ANSIIZE; X = VT1XX_ANSIIZE("[" + $STRING(N) + ";0H"); RETURN X; END; !VT1XX_ANSIIZE puts appropriate escape codes on strings so that they work !regardless of whether VT100 is in ANSI or VT52 mode. STRING PROCEDURE VT1XX_ANSIIZE(STRING STR); BEGIN STRING RESULT; IF $TTYPE = 15 THEN RESULT = "<"; RESULT = RESULT + STR; IF $TTYPE = 15 THEN RESULT = RESULT + "[?2l"; RETURN RESULT; END; !Make V work as VD like it did before SYNONYM V VDIRECTORY