KeyTable:
ARRAY [lowestInterestingKey..highestInterestingKey]
OF KeyItem = [
-- [bit number: KeyStation] KeyName Ascii codes
-- [0: ]
-- [1: ]
-- [2: ]
-- [3: ]
-- [4: ]
-- [5: ]
-- [6: ]
-- [7: ]
-- [8: KS1] Keyset1
-- [9: KS2] Keyset2
-- [10: KS3] Keyset3
-- [11: KS4] Keyset4
-- [12: KS5] Keyset5
-- [13: M1] Red
-- [14: M3] Blue
-- [15: M2] Yellow
[FALSE, 45C, 65C], -- [16: k16] Five %,5
[FALSE, 44C, 64C], -- [17: k12] Four $,4
[FALSE, 176C, 66C], -- [18: k20] Six ~,6
[TRUE, 105C, 145C], -- [19: k10] E E,e
[FALSE, 46C, 67C], -- [20: k24] Seven &,7
[TRUE, 104C, 144C], -- [21: k11] D D,d
[TRUE, 125C, 165C], -- [22: k26] U U,u
[TRUE, 126C, 166C], -- [23: k17] V V,v
[FALSE, 51C, 60C], -- [24: k36] Zero ),0
[TRUE, 113C, 153C], -- [25: k31] K K,k
[FALSE, 30C, 55C], -- [26: k40] Dash `,-
[TRUE, 120C, 160C], -- [27: k38] P P,p
[FALSE, 77C, 57C], -- [28: k41] Slash ?,/
[FALSE, 174C, 134C], -- [29: T9] BackSlash |,\
[FALSE, 12C, 12C], -- [30: L6] LF LF
[FALSE, 10C, 10C], -- [31: A2] BS BS
[FALSE, 43C, 63C], -- [32: k8] Three #,3
[FALSE, 100C, 62C], -- [33: k4] Two @,2
[TRUE, 127C, 167C], -- [34: k6] W W,w
[TRUE, 121C, 161C], -- [35: k2] Q Q,q
[TRUE, 123C, 163C], -- [36: k7] S S,s
[TRUE, 101C, 141C], -- [37: k3] A A,a
[FALSE, 50C, 71C], -- [38: k32] Nine (,9
[TRUE, 111C, 151C], -- [39: k30] I I,i
[TRUE, 130C, 170C], -- [40: k9] X X,x
[TRUE, 117C, 157C], -- [41: k34] O O,o
[TRUE, 114C, 154C], -- [42: k35] L L,l
[FALSE, 74C, 54C], -- [43: k33] Comma <,,
[FALSE, 42C, 47C], -- [44: k43] Quote ",'
[FALSE, 175C, 135C], -- [45: k45] RightBracket },]
[FALSE, 0C, 0C], -- [46: R11] Spare2
[FALSE, 0C, 0C], -- [47: R6] Spare1
[FALSE, 41C, 61C], -- [48: k1] One !,1
[FALSE, 33C, 33C], -- [49: T2] ESC ESC
[FALSE, 11C, 11C], -- [50: A1] TAB TAB
[TRUE, 106C, 146C], -- [51: k15] F F,f
[FALSE, 0C, 0C], -- [52: L11] Ctrl
[TRUE, 103C, 143C], -- [53: k13] C C,c
[TRUE, 112C, 152C], -- [54: k27] J J,j
[TRUE, 102C, 142C], -- [55: k21] B B,b
[TRUE, 132C, 172C], -- [56: k5] Z Z,z
[FALSE, 0C, 0C], -- [57: A5] LeftShift
[FALSE, 76C, 56C], -- [58: k37] Period >,.
[FALSE, 72C, 73C], -- [59: k39] SemiColon :,;
[FALSE, 15C, 15C], -- [60: A4] RETURN CR
[FALSE, 136C, 137C], -- [61: k46] Arrow ^,←
[FALSE, 177C, 177C], -- [62: L3] DEL DEL
[FALSE, 0C, 0C], -- [63: L9] FL3
[TRUE, 122C, 162C], -- [64: k14] R R,r
[TRUE, 124C, 164C], -- [65: k18] T T,t
[TRUE, 107C, 147C], -- [66: k19] G G,g
[TRUE, 131C, 171C], -- [67: k22] Y Y,y
[TRUE, 110C, 150C], -- [68: k23] H H,h
[FALSE, 52C, 70C], -- [69: k28] Eight *,8
[TRUE, 116C, 156C], -- [70: k25] N N,n
[TRUE, 115C, 155C], -- [71: k29] M M,m
[FALSE, 0C, 0C], -- [72: A3] Lock
[FALSE, 40C, 40C], -- [73: A7] Space SP
[FALSE, 173C, 133C], -- [74: k42] LeftBracket {,[
[FALSE, 53C, 75C]]; -- [75: k44] Equal +,=
-- [76: A6] RightShift
-- [77: R12] Spare3
-- [78: L12] FL4
-- [79: R1] FR5
-- [80: R5] R5
-- [81: R9] R9
-- [82: L10] L10
-- [83: L7] L7
-- [84: L4] L4
-- [85: L1] L1
-- [86: A9] A9
-- [87: R10] R10
-- [88: A8] A8
-- [89: L8] L8
-- [90: L5] L5
-- [91: L2] L2
-- [92: R2] R2
-- [93: R7] R7
-- [94: R4] R4
-- [95: D2] D2
-- [96: D1] D1
-- [97: k48] Key48
-- [98: T1] T1
-- [99: T3] T3
-- [100: T4] T4
-- [101: T5] T5
-- [102: T6] T6
-- [103: T7] T7
-- [104: T8] T8
-- [105: T10] T10
-- [106: R3] R3
-- [107: k47] Key47
-- [108: A10] A10
-- [109: R8] R8
-- [110: A11]
-- [111: A12]
GetFont:
PROC
RETURNS [
LONG
POINTER] = {
Note: Even though it doesn't say so in its strike header, this is a fixed-width
font. Bitter experience has shown that not all Gacha10.strike font files are, in
fact, fixed width. You need to painstakingly examine the xInSegment table for
the truth.
Gacha10Strike: ARRAY [0..1142B) OF WORD = [
-- 0-- 100000B, 000040B, 000176B, 000007B, 001136B, 000010B, 000004B, 000000B,
-- 10-- 000052B, 000000B, 000001B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 20-- 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 30-- 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 40-- 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 50-- 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 60-- 000000B, 000000B, 017000B, 000040B, 120243B, 106204B, 004010B, 040100B,
-- 70-- 000000B, 000002B, 034040B, 160701B, 107616B, 037070B, 070000B, 000200B,
-- 100-- 010034B, 034041B, 140707B, 107637B, 016104B, 070162B, 022010B, 110434B,
-- 110-- 074161B, 160707B, 144221B, 021104B, 104761B, 141007B, 000000B, 000200B,
-- 120-- 000040B, 001600B, 020010B, 010401B, 140000B, 000000B, 000000B, 000000B,
-- 130-- 000000B, 000000B, 000060B, 103000B, 017000B, 000040B, 120245B, 052412B,
-- 140-- 004020B, 020520B, 000000B, 000002B, 042141B, 011042B, 104021B, 001104B,
-- 150-- 104000B, 000400B, 004042B, 042121B, 021044B, 044020B, 021104B, 020022B,
-- 160-- 042015B, 114442B, 042211B, 011041B, 004221B, 021104B, 104021B, 001001B,
-- 170-- 000000B, 000200B, 000040B, 002000B, 020000B, 000400B, 040000B, 000000B,
-- 200-- 000000B, 000400B, 000000B, 000000B, 000100B, 100400B, 017000B, 000040B,
-- 210-- 121765B, 054412B, 004020B, 020340B, 100000B, 000004B, 046241B, 010042B,
-- 220-- 104020B, 002104B, 104100B, 101000B, 002042B, 056121B, 021044B, 044020B,
-- 230-- 021104B, 020022B, 102015B, 114442B, 042211B, 011041B, 004221B, 025050B,
-- 240-- 050041B, 000401B, 002010B, 034260B, 160643B, 107415B, 026070B, 070440B,
-- 250-- 043313B, 007054B, 032260B, 161704B, 044221B, 021104B, 174100B, 100400B,
-- 260-- 017000B, 000040B, 000503B, 001004B, 000040B, 010520B, 100000B, 000004B,
-- 270-- 052040B, 020704B, 107436B, 002070B, 104100B, 102017B, 101004B, 052121B,
-- 300-- 161004B, 047436B, 020174B, 020023B, 102012B, 112442B, 042211B, 160601B,
-- 310-- 004212B, 025020B, 050101B, 000401B, 007020B, 002311B, 011144B, 042023B,
-- 320-- 031010B, 010500B, 042514B, 110462B, 046311B, 010404B, 044221B, 012104B,
-- 330-- 010100B, 100406B, 057000B, 000040B, 000501B, 101012B, 100040B, 010103B,
-- 340-- 160017B, 100010B, 052040B, 040044B, 104221B, 004104B, 074000B, 002000B,
-- 350-- 001010B, 052211B, 011004B, 044020B, 027104B, 020022B, 042012B, 112442B,
-- 360-- 074211B, 040101B, 004212B, 025020B, 020101B, 000201B, 012476B, 036211B,
-- 370-- 001047B, 142021B, 021010B, 010600B, 042510B, 110442B, 042200B, 140404B,
-- 400-- 042425B, 004104B, 020100B, 100411B, 117000B, 000000B, 003745B, 042321B,
-- 410-- 000040B, 010000B, 100000B, 000010B, 062040B, 100047B, 140221B, 004104B,
-- 420-- 004000B, 001017B, 102000B, 056371B, 011044B, 044020B, 021104B, 020422B,
-- 430-- 042012B, 111442B, 040211B, 021041B, 004212B, 012050B, 020201B, 000201B,
-- 440-- 002020B, 042211B, 001044B, 002021B, 021010B, 010500B, 042510B, 110442B,
-- 450-- 042200B, 020404B, 042425B, 004050B, 020600B, 100300B, 017000B, 000040B,
-- 460-- 001205B, 042521B, 000040B, 010000B, 101400B, 002020B, 042041B, 001040B,
-- 470-- 104221B, 010104B, 104101B, 100400B, 004010B, 040211B, 011044B, 044020B,
-- 500-- 021104B, 020422B, 022012B, 111442B, 040211B, 011041B, 004204B, 012104B,
-- 510-- 020401B, 000101B, 002010B, 042311B, 011144B, 042023B, 021010B, 010440B,
-- 520-- 042510B, 110462B, 046201B, 010444B, 141012B, 012050B, 040100B, 100400B,
-- 530-- 017000B, 000040B, 001203B, 104616B, 100040B, 010000B, 000400B, 002020B,
-- 540-- 034371B, 170700B, 103416B, 010070B, 070100B, 100200B, 010010B, 036211B,
-- 550-- 160707B, 107620B, 016104B, 070342B, 023710B, 110434B, 040161B, 010701B,
-- 560-- 003404B, 012104B, 020761B, 000101B, 002000B, 036260B, 160643B, 102015B,
-- 570-- 021010B, 010420B, 042510B, 107054B, 032200B, 160303B, 041012B, 021020B,
-- 600-- 174100B, 100400B, 000000B, 000000B, 000001B, 000000B, 000020B, 020000B,
-- 610-- 000400B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 100000B,
-- 620-- 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 630-- 000040B, 000000B, 000000B, 000000B, 000001B, 000001B, 000000B, 000000B,
-- 640-- 000000B, 000001B, 000000B, 110000B, 000000B, 000040B, 002000B, 000000B,
-- 650-- 000000B, 000020B, 000100B, 100400B, 000000B, 000000B, 000000B, 000000B,
-- 660-- 000020B, 020000B, 001000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 670-- 000001B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 700-- 000000B, 000000B, 000030B, 000000B, 000000B, 000000B, 000001B, 000001B,
-- 710-- 000000B, 000000B, 000000B, 000016B, 000000B, 060000B, 000000B, 000040B,
-- 720-- 002000B, 000000B, 000000B, 000140B, 000100B, 100400B, 000000B, 000000B,
-- 730-- 000000B, 000000B, 000010B, 040000B, 000000B, 000000B, 000000B, 000000B,
-- 740-- 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 750-- 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 760-- 000001B, 140007B, 000000B, 000000B, 000000B, 000000B, 000000B, 000000B,
-- 770-- 000000B, 000000B, 000000B, 000000B, 000000B, 000000B, 000060B, 103000B,
--1000-- 012602B, 000000B, 000007B, 000016B, 000025B, 000034B, 000043B, 000052B,
--1010-- 000061B, 000070B, 000077B, 000106B, 000115B, 000124B, 000133B, 000142B,
--1020-- 000151B, 000160B, 000167B, 000176B, 000205B, 000214B, 000223B, 000232B,
--1030-- 000241B, 000250B, 000257B, 000266B, 000275B, 000304B, 000313B, 000322B,
--1040-- 000331B, 000340B, 000347B, 000356B, 000365B, 000374B, 000403B, 000412B,
--1050-- 000421B, 000430B, 000437B, 000446B, 000455B, 000464B, 000473B, 000502B,
--1060-- 000511B, 000520B, 000527B, 000536B, 000545B, 000554B, 000563B, 000572B,
--1070-- 000601B, 000610B, 000617B, 000626B, 000635B, 000644B, 000653B, 000662B,
--1100-- 000671B, 000700B, 000700B, 000707B, 000716B, 000725B, 000734B, 000743B,
--1110-- 000752B, 000761B, 000770B, 000777B, 001006B, 001015B, 001024B, 001033B,
--1120-- 001042B, 001051B, 001060B, 001067B, 001076B, 001105B, 001114B, 001123B,
--1130-- 001132B, 001141B, 001150B, 001157B, 001166B, 001175B, 001204B, 001213B,
--1140-- 001222B, 001230B];
The following hack finds the address of constant array Gacha10Strike in the code segment and returns it. This is slightly unethical, but it saves duplicate allocation.
p:
LONG
POINTER
TO
ARRAY [0..1142B)
OF
WORD ←
PrincOpsUtils.Codebase[PrincOpsUtils.MyGlobalFrame[]];
DO
IF p[0] = Gacha10Strike[0] AND p^ = Gacha10Strike THEN RETURN[p];
p ← p+1;
ENDLOOP;
};