LEX 'KEYCHRLX' * * * Copyright (c) 1987 * Graham Fraser * 25 Octantis Street * Doncaster East, Vic. 3109. * AUSTRALIA * +61 3 842-4586 * * 29 March 1987 Version 3.0 * * KEYCHR$ * Put the HP-71 in light sleep, and wait for a key to be pressed. * Return a single ASCII character (or optional string) * representing the key(s) pressed. * * SYNTAX: * KEYCHR$ or KEYCHR$(key count) * * Key count (n) - 1<=n<=15 * Optional numeric expression rounded to an integer * * Related keywords - KEY$, KEYWAIT$ * * ID #E1 * 225 MSG 0 * No messages POLL 0 * No Poll Handler * * SLEEP EQU #006C2 * Scan keyboard, do LSLEEP if key buffer empty CKSREQ EQU #00721 * Handle service requests (external keyboard) POPBUF EQU #010EE * Pop a key from keyboard buffer into B(A) ARGERR EQU #0BF19 * Report "INVALID ARG" Error RNDAHX EQU #136CB * Pop, test, round and convert real number to HEX ADHEAD EQU #181B7 * Add string header STKCHR EQU #18504 * Add a character to a stack item D1=AVE EQU #18651 * Set D1 to (AVMEME) AVE=D1 EQU #18BB8 * Update AVMEME from D1 D=AVMS EQU #1A460 * Set D(A) to AVMEMS KEYCOD EQU #1FD22 * System keycode map * * ENTRY keychr CHAR #F * Function * KEY 'KEYCHR$' TOKEN #FD * 253 * ENDTXT * * NIBHEX 8 * Numeric parameter NIBHEX 01 * One optional parameter * keychr A=0 A ?C=0 S * If no parameters, then default = 1 GOYES onekey * GOSBVL RNDAHX * Get parameter and check validity GONC argerr * Valid range: 1<=n<=15 C=0 A LC(1) #F * Arbitrary upper limit ?A>C A GOYES argerr A=A-1 A GONC parmOK argerr GOVLNG ARGERR * Report error * parmOK D1=D1+ 16 * Move D1 past parameter on math stack * onekey R2=A * Save key count CD0EX * Save D0 in R3 R3=C CD1EX * Save string start in R1 D1=C R1=C nxtkey GOSBVL AVE=D1 * Update AVMEME * sleep GOSBVL SLEEP * Wait for a key press GONC key GOSBVL CKSREQ * Check for KEYBOARD IS key GOTO sleep * * * key GOSBVL POPBUF * Get keycode NIBHEX C5 * B=B+B A LC(5) KEYCOD * Get ASCII from keycode table C=C+B A CD1EX A=DAT1 B * Read character GOSBVL D=AVMS GOSBVL D1=AVE C=A A GOSBVL STKCHR * Put character on stack A=R2 * Decrement key count A=A-1 A R2=A GONC nxtkey * Wait for more keys * C=R3 * Restore D0 CD0EX ST=0 0 GOVLNG ADHEAD * Add header and exit via EXPR * END