$OPTIMIZE(2) LARGE DEBUG NOINTVECTOR NOOVERFLOW TYPE MOD186 $NOCODE NOXREF NOSYMBOLS PAGEWIDTH(80) /*============================================================*/ $TITLE ('DPNL.PLM') /*-------------------------------------------------------------- NAME: Professional Digital Camera Control Panel --REV-- --DATE-- --AUTHOR-- --DESCRIPTION-- - 12/04/91 JEM PRODUCTION BASELINE ============================================================*/ DPNL: DO; /* Standard literals */ $INCLUDE (DLIT.INC) $INCLUDE (DMAS.INC) $INCLUDE (DSYS.INC) $INCLUDE (DSIO.INC) DCL BOARD_ID LIT '42'; /* Variables */ DCL MY_SLOT BYTE; DCL CURRENT_KEY BYTE; DCL KT BYTE; DCL REPEAT_KEY BYTE; DCL KEY_REPEAT_TIME DWORD; DCL KB_MODE BYTE; DCL KB_LAST BYTE; DCL KB_KEY BYTE; DCL CODES (256) BYTE; DCL CPTR BYTE; /* Register definitions */ DCL PNL_ATN_REG LIT 'REG(1)'; DCL LCD_CONTROL LIT 'REG(2)'; DCL ROW_SENSE LIT 'REG(3)'; DCL COL_SENSE_0 LIT 'REG(4)'; DCL COL_SENSE_1 LIT 'REG(5)'; DCL COL_SENSE_2 LIT 'REG(6)'; DCL LCD_INSTRUCTION LIT 'REG(4)'; DCL LCD_DATA LIT 'REG(5)'; /* Constants */ DCL CHAR (*) BYTE DATA (00000B, /* Char 0 */ 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, /* Char 1 */ 00000B, 00000B, 00000B, 01110B, 00100B, 00100B, 00000B, 01110B, /* Char 2 */ 01000B, 01110B, 00000B, 00000B, 00000B, 00000B, 00000B, 01110B, /* Char 3 */ 01000B, 01110B, 00000B, 01110B, 00100B, 00100B, 00000B, 00000B, /* Char 4 */ 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, /* Char 5 */ 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, /* Char 6 */ 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, /* Char 7 */ 00000B, 00000B, 00000B, 00000B, 00000B, 00000B, 00000B); /* Norm Caps Alt Scan Keycap Overlay */ DCL KEY_TABLE (51) STRUCTURE (CODE (3) BYTE) DATA ( 21, 21, 9, /* 0 tab menu */ 22, 22, 11, /* 1 esc video */ 23, 23, 7, /* 2 ins delete */ 24, 24, 8, /* 3 del tag */ 1, 1, 1, /* 4 up home */ 2, 2, 2, /* 5 lt < */ 3, 3, 3, /* 6 rt > */ 4, 4, 4, /* 7 dn find tags */ 29, 29, 5, /* 8 bs zoom */ '7', '7', 14, /* 9 modem */ '8', '8', 15, /* 10 connect */ '9', '9', 16, /* 11 send */ 'q', 'Q', '!', /* 12 */ 'w', 'W', '@', /* 13 */ 'e', 'E', '#', /* 14 */ 'r', 'R', '$', /* 15 */ 't', 'T', '%', /* 16 */ 'y', 'Y', '^', /* 17 */ 'u', 'U', '&', /* 18 */ 'i', 'I', '*', /* 19 */ 'o', 'O', '(', /* 20 */ 'p', 'P', ')', /* 21 */ '4', '4', 17, /* 22 crop */ '5', '5', 18, /* 23 data */ '6', '6', 19, /* 24 caption */ 0, 0, 0, /* 25 caps */ 'a', 'A', '_', /* 26 */ 's', 'S', '|', /* 27 */ 'd', 'D', '.', /* 28 */ 'f', 'F', '{', /* 29 */ 'g', 'G', '}', /* 30 */ 'h', 'H', ':', /* 31 */ 'j', 'J', '?', /* 32 */ 'k', 'K', '"', /* 33 */ 'l', 'L', 39, /* 34 */ 20, 20, 25, /* 35 return */ '1', '1', 0, /* 36 */ '2', '2', '-', /* 37 */ '3', '3', '+', /* 38 */ 0, 0, 0, /* 39 alt */ 'z', 'Z', '~', /* 40 */ 'x', 'X', '`', /* 41 */ 'c', 'C', '\', /* 42 */ 'v', 'V', '[', /* 43 */ 'b', 'B', ']', /* 44 */ 'n', 'N', ';', /* 45 */ 'm', 'M', '/', /* 46 */ ' ', ' ', ' ', /* 47 space */ ',', ',', '<', /* 48 */ '0', '0', '=', /* 49 */ '.', '.', '>') ; /* 50 */ DCL KEY_NAME (12) STRUCTURE (C (12) BYTE) DATA (' Home ',0, ' < ',0, ' > ',0, ' Find ',0, ' Zoom ',0, ' White ',0, ' Delete ',0, ' Tag ',0, ' Menu ',0, ' ISO ',0, ' Video ',0, ' On ',0); DCL KEY_STRING (12) STRUCTURE (C (10) BYTE) DATA (27,'[10C',27,'[1B',0, 27,'[25C',27,'[1B',0, 27,'[40C',27,'[1B',0, 27,'[55C',27,'[1B',0, 27,'[10C',27,'[3B',0, 27,'[25C',27,'[3B',0, 27,'[40C',27,'[3B',0, 27,'[55C',27,'[3B',0, 27,'[10C',27,'[5B',0, 27,'[25C',27,'[5B',0, 27,'[40C',27,'[5B',0, 27,'[55C',27,'[5B',0); /*------------------------------------------------------------*/ KEYBOARD_TASK: PROCEDURE PUBLIC; DCL LAST_KEY BYTE; CUR_SLOT,MY_SLOT = FIND_BOARD (BOARD_ID); SLOT = CUR_SLOT; IF MY_SLOT = 255 THEN CALL WAIT (NEVER); CALL DISP_LIGHT_ON; X = WAIT_FLAG (FLAG_RUN,TRUE,NEVER); CPTR = 0; KT = ASSIGN_TIMER; IF WAIT_FLAG (FLAG_COLD_START,TRUE,0) THEN DO; CALL DISP_INIT; LAST_KEY = 12; REPEAT_KEY = FALSE; KEY_REPEAT_TIME = 0; END; PNL_ATN_REG = 0000B; KB_LAST = 255; KB_KEY = 0; KB_MODE = 0; DO FOREVER; IF KEYPAD <> 0 THEN CURRENT_KEY = KEYPAD; ELSE CURRENT_KEY = KEYBOARD; IF CURRENT_KEY <> LAST_KEY THEN DO; REPEAT_KEY = FALSE; LAST_KEY = CURRENT_KEY; CALL SET_FLAG (FLAG_KEY_CHANGE,TRUE); END; ELSE IF REPEAT_KEY AND TIMEOUT (KT) THEN DO; CALL TIMER (KT,KEY_REPEAT_TIME); CALL SET_FLAG (FLAG_KEY_CHANGE,TRUE); END; X = WAIT_FLAG (FLAG_KEY_CHANGE,FALSE,NEVER); IF (CURRENT_KEY = 0) AND NOT KEYBOARD_PRESENT THEN CALL SLEEP (20000); ELSE CALL WAIT (20000); END; END; /*------------------------------------------------------------*/ KEY: PROCEDURE BYTE PUBLIC REENTRANT; RETURN CURRENT_KEY; END; /*------------------------------------------------------------*/ KEY_REPEAT: PROCEDURE (KDT,KRT) PUBLIC REENTRANT; DCL KDT DWORD, KRT DWORD; IF REPEAT_KEY THEN RETURN; REPEAT_KEY = TRUE; KEY_REPEAT_TIME = KRT; CALL TIMER (KT,KDT); END; /*------------------------------------------------------------*/ DISP_INIT: PROCEDURE; DCL ADDRS BYTE; LCD_CONTROL = ((LCD_CONTROL AND 00001B) OR 00010B); /* Initialize display module */ CALL WAIT (20000); LCD_INSTRUCTION = NOT (00111000B); CALL WAIT (10000); LCD_INSTRUCTION = NOT (00111000B); CALL WAIT (5000); LCD_INSTRUCTION = NOT (00111000B); CALL WAIT (1000); LCD_INSTRUCTION = NOT (00111000B); CALL WAIT (50); LCD_INSTRUCTION = NOT (00000001B); CALL WAIT (1700); LCD_INSTRUCTION = NOT (00000110B); CALL WAIT (50); /* Load CG ram */ LCD_INSTRUCTION = NOT (01000000B); CALL WAIT (50); DO ADDRS = 0 TO 63; LCD_DATA = NOT (CHAR(ADDRS)); CALL WAIT (50); END; LCD_INSTRUCTION = NOT (00001110B); CALL WAIT (50); LCD_INSTRUCTION = NOT (11010000B); END; /*------------------------------------------------------------*/ RESET_KEY: PROCEDURE BYTE PUBLIC REENTRANT; DCL OLD_SLOT BYTE, RST BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; RST = ((LCD_CONTROL AND 10000B) > 0); CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; RETURN RST; END; /*------------------------------------------------------------*/ POWER_ON_KEY: PROCEDURE BYTE PUBLIC REENTRANT; RETURN (KEYPAD = 12); END; /*------------------------------------------------------------*/ TEST_KEY: PROCEDURE BYTE PUBLIC REENTRANT; CUR_SLOT = 0; SLOT = 0; RETURN (COL_SENSE_2 = 0001100B); END; /*------------------------------------------------------------*/ KEYBOARD: PROCEDURE BYTE REENTRANT; DCL K BYTE; DO FOREVER; K = KEYBOARD_CODE; IF K <> 255 THEN DO; CODES(CPTR) = K; CPTR = CPTR + 1; END; IF K = 255 THEN RETURN KB_KEY; IF K >= 128 THEN DO; K = K - 128; KB_LAST = K; IF K = 39 THEN DO; KB_MODE = 2; KB_KEY = 0; END; ELSE IF K = 25 THEN DO; KB_MODE = 1; KB_KEY = 0; END; ELSE DO; KB_KEY = KEY_TABLE(K).CODE(KB_MODE); RETURN KB_KEY; END; END; ELSE DO; IF (K = 39) OR (K = 25) THEN KB_KEY,KB_MODE = 0; IF KB_LAST = K THEN DO; KB_KEY = 0; RETURN KB_KEY; END; END; END; END; /*------------------------------------------------------------*/ KEYPAD: PROCEDURE BYTE REENTRANT; DCL OLD_SLOT BYTE, KEY BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; KEY = KP; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; RETURN KEY; END; /*------------------------------------------------------------*/ KP: PROCEDURE BYTE REENTRANT; DCL COL0 BYTE, COL1 BYTE, COL2 BYTE, ROW BYTE; ROW = ROW_SENSE; IF ROW = 0 THEN RETURN 0; COL0 = COL_SENSE_0; COL1 = COL_SENSE_1; COL2 = COL_SENSE_2; IF ROW = 0001B THEN DO; IF COL0 = 0000001B THEN RETURN 1; IF COL0 = 0000010B THEN RETURN 2; IF COL0 = 0000100B THEN RETURN 3; IF COL0 = 0001000B THEN RETURN 4; END; IF ROW = 0010B THEN DO; IF COL1 = 0000001B THEN RETURN 5; IF COL1 = 0000010B THEN RETURN 6; IF COL1 = 0000100B THEN RETURN 7; IF COL1 = 0001000B THEN RETURN 8; END; IF ROW = 0100B THEN DO; IF COL2 = 0000001B THEN RETURN 9; IF COL2 = 0000010B THEN RETURN 10; IF COL2 = 0000100B THEN RETURN 11; IF COL2 = 0001000B THEN RETURN 12; IF COL2 = 0000110B THEN RETURN 13; END; RETURN 0; END; /*------------------------------------------------------------*/ DISP_IS_OFF: PROCEDURE BYTE PUBLIC REENTRANT; DCL OLD_SLOT BYTE, D_OFF BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; D_OFF = ((LCD_CONTROL AND 00010B) = 00000B); CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; RETURN D_OFF; END; /*------------------------------------------------------------*/ DISP_OFF: PROCEDURE PUBLIC REENTRANT; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; LCD_INSTRUCTION = NOT (00000001B); CALL WAIT (1700); LCD_CONTROL = LCD_CONTROL AND 10000B; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ DISP_LIGHT_ON: PROCEDURE PUBLIC REENTRANT; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; LCD_CONTROL = LCD_CONTROL OR 00001B; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ DISP_LIGHT_OFF: PROCEDURE REENTRANT; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; LCD_CONTROL = LCD_CONTROL AND 11110B; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ VIDEO_PWR_ON: PROCEDURE PUBLIC REENTRANT; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; LCD_CONTROL = (LCD_CONTROL AND 010011B) OR 100000B OR (C.VIDEO_BRIGHTNESS * 4); CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ VIDEO_PWR_OFF: PROCEDURE PUBLIC REENTRANT; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; LCD_CONTROL = LCD_CONTROL AND 011111B; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ DISP_TEXT: PROCEDURE (POS,LEN,TXT) PUBLIC REENTRANT; DCL POS BYTE, TXT POINTER, LEN BYTE; DCL (TEXT BASED TXT) (*) BYTE; DCL CHR BYTE; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; IF POS <= 15 THEN LCD_INSTRUCTION = NOT (POS + 10000000B); ELSE LCD_INSTRUCTION = NOT ((POS - 16) + 11000000B); CALL WAIT (50); DO CHR = 0 TO LEN - 1; LCD_DATA = NOT (TEXT(CHR)); CALL WAIT (50); END; LCD_INSTRUCTION = NOT (11010000B); CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ DISP_NUMBER: PROCEDURE (POS,LEN,VAL) PUBLIC REENTRANT; DCL POS BYTE, VAL WORD, LEN BYTE; DCL POSITION BYTE, DIGIT BYTE; DCL STRING (5) BYTE; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; IF POS <= 15 THEN LCD_INSTRUCTION = NOT (POS + 10000000B); ELSE LCD_INSTRUCTION = NOT ((POS - 16) + 11000000B); CALL TO_DECIMAL (@STRING,LEN,VAL); DO DIGIT = 0 TO LEN - 1; LCD_DATA = NOT (STRING(DIGIT)); CALL WAIT (50); END; LCD_INSTRUCTION = NOT (11010000B); CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ DISP_HEX: PROCEDURE (POS,LEN,VAL) PUBLIC REENTRANT; DCL POS BYTE, VAL WORD, LEN BYTE; DCL POSITION BYTE, DIGIT BYTE; DCL STRING (4) BYTE; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; IF POS <= 15 THEN LCD_INSTRUCTION = NOT (POS + 10000000B); ELSE LCD_INSTRUCTION = NOT ((POS - 16) + 11000000B); CALL TO_HEX (@STRING,VAL); DO DIGIT = (4 - LEN) TO 3; LCD_DATA = NOT (STRING(DIGIT)); CALL WAIT (50); END; LCD_INSTRUCTION = NOT (11010000B); CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ TO_DECIMAL: PROCEDURE (STR,LEN,VAL) PUBLIC REENTRANT; DCL VAL DWORD; DCL STR POINTER, LEN BYTE; DCL (STRING BASED STR) (10) BYTE; IF (LEN = 0) OR (LEN > 10) THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW ((VAL MOD 10) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW (((VAL MOD 100) / 10) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW (((VAL MOD 1000) / 100) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW (((VAL MOD 10000) / 1000) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW (((VAL MOD 100000) / 10000) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW (((VAL MOD 1000000) / 100000) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW (((VAL MOD 10000000) / 1000000) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW (((VAL MOD 100000000) / 10000000) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW (((VAL MOD 1000000000) / 100000000) + '0'); IF LEN = 0 THEN RETURN; LEN = LEN - 1; STRING(LEN) = LOW ((VAL / 1000000000) + '0'); END; /*------------------------------------------------------------*/ TO_HEX: PROCEDURE (STR,VAL) PUBLIC REENTRANT; DCL VAL WORD; DCL DIGIT BYTE; DCL STR POINTER; DCL (STRING BASED STR) (4) BYTE; DIGIT = LOW (VAL / 4096); IF DIGIT <= 9 THEN STRING(0) = DIGIT + 48; ELSE STRING(0) = DIGIT + 55; DIGIT = LOW ((VAL MOD 4096) / 256); IF DIGIT <= 9 THEN STRING(1) = DIGIT + 48; ELSE STRING(1) = DIGIT + 55; DIGIT = LOW ((VAL MOD 256) / 16); IF DIGIT <= 9 THEN STRING(2) = DIGIT + 48; ELSE STRING(2) = DIGIT + 55; DIGIT = LOW (VAL MOD 16); IF DIGIT <= 9 THEN STRING(3) = DIGIT + 48; ELSE STRING(3) = DIGIT + 55; END; /*------------------------------------------------------------*/ TEST_PANEL: PROCEDURE PUBLIC; DCL K BYTE, STRING (16) BYTE, H BYTE, V BYTE, N BYTE; CALL SEND_CHAR (13); CUR_SLOT,MY_SLOT = FIND_BOARD (BOARD_ID); SLOT = CUR_SLOT; IF MY_SLOT = 255 THEN DO; CALL TEST_FAIL (@('Control Panel board not found',0)); RETURN; END; CALL DISP_INIT; CALL SEND_STRING (@('-- Control Panel Board Test --',13)); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL SEND_STRING (@('Press each control panel key, Press SPACE BAR to continue',7,13)); /* Display key names */ CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_STRING (@(27,'[6A',0)); CALL SEND_STRING (@(27,'[s',0)); DO K = 0 TO 11; CALL SEND_STRING (@KEY_STRING(K)); CALL SEND_STRING (@KEY_NAME(K)); CALL SEND_STRING (@(27,'[u',0)); END; DO WHILE KP <> 0; END; DO WHILE NOT DIAGNOSTIC_INT; K = KP; IF K <> 0 THEN DO; K = K - 1; /* Highlight key name */ CALL SEND_STRING (@KEY_STRING(K)); CALL SEND_ATR (0); CALL SEND_STRING (@KEY_NAME(K)); CALL SEND_ATR (7); CALL SEND_STRING (@(27,'[u',0)); DO WHILE KP <> 0; END; CALL SEND_STRING (@KEY_STRING(K)); CALL SEND_STRING (@KEY_NAME(K)); CALL SEND_STRING (@(27,'[u',0)); END; END; CALL WAIT (100000); CALL SEND_CHAR (0); CALL SEND_STRING (@(27,'[6B',0)); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL SEND_STRING (@('Text display backlight blink, Press SPACE BAR if OK',7,13)); DO N = 1 TO 10; CALL DISP_LIGHT_ON; CALL WAIT (250000); CALL DISP_LIGHT_OFF; CALL WAIT (250000); IF DIAGNOSTIC_INT THEN N = -1; END; IF N <> 0 THEN CALL TEST_FAIL (@('Text display backlight',0)); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL SEND_STRING (@('Text display character patterns, Press SPACE BAR if OK',7,13)); CALL SETB (255,@STRING,16); CALL DISP_LIGHT_ON; DO N = 1 TO 10; CALL DISP_TEXT ( 0,16,@('ABCDEFGHIJKLMNOP')); CALL DISP_TEXT (16,16,@STRING); CALL WAIT (250000); CALL DISP_TEXT ( 0,16,@STRING); CALL DISP_TEXT (16,16,@('abcdefghijklmnop')); CALL WAIT (250000); IF DIAGNOSTIC_INT THEN N = -1; END; CALL DISP_LIGHT_OFF; IF N <> 0 THEN CALL TEST_FAIL (@('Text display characters',0)); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL SEND_STRING (@('Video display backlight blink, Press SPACE BAR if OK',7,13)); DO N = 1 TO 10; CALL VIDEO_PWR_ON; CALL WAIT (250000); CALL VIDEO_PWR_OFF; CALL WAIT (250000); IF DIAGNOSTIC_INT THEN N = -1; END; IF N <> 0 THEN CALL TEST_FAIL (@('Video display power',0)); END; /*------------------------------------------------------------*/ TEST_KEYBOARD: PROCEDURE PUBLIC; DCL K BYTE; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL SEND_STRING (@('Press each keyboard key, Press SPACE BAR when done',7,13)); /* Display key names */ CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_CHAR (13); CALL SEND_STRING (@(27,'[6A',0)); CALL SEND_STRING (@(27,'[s',0)); DO K = 0 TO 11; CALL SEND_STRING (@KEY_STRING(K)); CALL SEND_STRING (@KEY_NAME(K)); CALL SEND_STRING (@(27,'[u',0)); END; DO WHILE KP <> 0; END; DO WHILE NOT DIAGNOSTIC_INT; K = KP; IF K <> 0 THEN DO; K = K - 1; /* Highlight key name */ CALL SEND_STRING (@KEY_STRING(K)); CALL SEND_ATR (0); CALL SEND_STRING (@KEY_NAME(K)); CALL SEND_ATR (7); CALL SEND_STRING (@(27,'[u',0)); DO WHILE KP <> 0; END; CALL SEND_STRING (@KEY_STRING(K)); CALL SEND_STRING (@KEY_NAME(K)); CALL SEND_STRING (@(27,'[u',0)); END; END; CALL WAIT (100000); CALL SEND_CHAR (0); CALL SEND_STRING (@(27,'[6B',0)); END; /*------------------------------------------------------------*/ END;