-- keyboard type-in routines for silicon (pretty picture) program DIRECTORY StringDefs, InlineDefs, ppdefs, ppdddefs,ppddefs, multiGraphicsDefs; ppkb: PROGRAM IMPORTS StringDefs, ppddefs, InlineDefs EXPORTS ppdefs = BEGIN OPEN StringDefs, ppdefs, ppdddefs,ppddefs, InlineDefs; ss: STRING ← [200]; currentNumber: INTEGER ← 1; -- NOTE: all numbers are Octal ! --key encodings (k field of keyEvent): -- 0-11: "0" to "9" (add 60 for ascii) -- 12-43: "A" to "Z" (add 67 for ascii upper case) -- 44: ";" key -- 45: "=" key -- 46: "," key -- 47: "-" key -- 50: "." key -- 51: "/" key -- 52: "'" key -- 53: "[" key -- 54: "\" key -- 55: "]" key -- 56: "DONE" key (blank one below DEL)(UNdo) -- 57: "←" key -- 60: CR key -- 61: LF key -- 62: BS key -- 63: DEL key -- 64: space bar -- 65: ESC -- 66: blank to right of RET (not used) -- 67: swat key (not used) -- 70: TAB (not used, - a ctrl key instead) -- 71: ??? -- 72: ??? -- 73: yellow mouse button up (release) -- 74: ??? -- 75: ??? -- 76: ??? -- 77: No key (for use with mouse buttons) --ctrl key encodings (ctl field of keyEvent): -- 1,2: Mouse buttons: 0-none, 1-red, 2-yellow, 3-blue -- 4: CTRL -- 10: TAB -- 20: Shift (either) lcAr:ARRAY[44B..77B] OF CHARACTER = [';,'=,',,'-,'.,'/,'', '[,'\,'],'?,'←,15C,'?,'?,'?,' ,'?,'?,'?,'?,'?,'?,'?,'?,'?,'?,'?]; ucAr:ARRAY[44B..77B] OF CHARACTER = [':,'+,'<,'`,'>,'?,'", '{,'|,'},'?,'↑,15C,'?,'?,'?,' ,'?,'?,'?,'?,'?,'?,'?,'?,'?,'?,'?]; digAr:ARRAY[0..9] OF CHARACTER = ['),'!,'@,'#,'$,'%,'~,'&,'*,'(]; getchr: PUBLIC PROCEDURE RETURNS [ke: keyEvent] = BEGIN ke ← getKchr[]; IF ke.ctl = 0 AND ke.k < 12B THEN currentNumber ← 0 ELSE currentNumber ← 1; WHILE ke.ctl = 0 AND ke.k < 12B DO currentNumber ← currentNumber*10 + ke.k; ke ← getKchr[]; ENDLOOP; RETURN; END; getNumber: PUBLIC PROCEDURE RETURNS [INTEGER] = BEGIN RETURN[currentNumber]; END; getstr: PUBLIC PROCEDURE [x, y: CARDINAL] RETURNS [BOOLEAN, STRING, keyEvent] = BEGIN s: STRING ← [200]; k: keyEvent; flg: BOOLEAN; t: CARDINAL; flg ← FALSE; s.length ← 0; ss.length ← 0; UNTIL flg DO k ← getKchr[]; t ← k.k; IF t < 12B THEN {IF BITAND[k.ctl,20B]=0 THEN AppendChar[s, t + '0] ELSE AppendChar[s, digAr[t]];} ELSE IF t < 44B THEN AppendChar[s, t + '7] ELSE IF t = 60B OR t = 65B OR t = 61B THEN flg ← TRUE ELSE IF t = 56B THEN RETURN[FALSE, ss, k] ELSE IF t = 63B THEN s.length ← 0 ELSE IF t = 62B THEN BEGIN IF s.length > 0 THEN s.length ← s.length - 1; END ELSE IF t<65B THEN BEGIN IF BITAND[k.ctl,20B]=0 THEN AppendChar[s, lcAr[t]] ELSE AppendChar[s, ucAr[t]]; END; drawString[s, x, y]; ENDLOOP; AppendString[ss, s]; RETURN[TRUE, ss, k]; END; END.