commit 72aa355

zzo38  ·  2023-09-11 04:13:16 +0000 UTC
parent d241ce1
Add prg/timer.tal
2 files changed,  +618, -0
+615, -0
  1@@ -0,0 +1,615 @@
  2+\\ Timer program
  3+
  4+|0000
  5+  @Alarm &h $1 &m $1 ( hours, minutes )
  6+  @CountDir $1 ( 0=down, 1=up )
  7+  @TimerOn $1 ( 0=stop, 1=go )
  8+  @Timer &h $1 &m $1 &s $1 &f $1 \:Timer \_:+ \@2xTimer
  9+  @AlarmOn $1 ( 1=off, 0=on )
 10+  @ChimeSet $1 ( 0=off, 1=60min, 2=30min, 3=15min, 4=Westminster )
 11+  @Clock24 $1 ( 1 for 24-hour clock, 0 for 12-hour clock )
 12+  @Mode $1 ( 0=clock, 2=alarm-set, 4=timer, 6=sound-set )
 13+  @Cursor $1 ( must come next after Mode )
 14+  @Mark $1 ( timer mark address; must come next after Cursor )
 15+  @Volume $1 ( volume times seventeen; the next one must be SoundState )
 16+  @SoundState $1 ( 0=none, else MIDI note number; even=once, odd=repeating )
 17+  @SoundFrame $1 ( frame number; comes next after SoundState )
 18+  @LastSec $1 ( last observed value for seconds )
 19+  @Frame $1
 20+  @MissFrame $1 ( keep track of missed frames for timer mode )
 21+  @MouseX &hi $1 &lo $1
 22+  @MouseY &hi $1 &lo $1
 23+  @MouseState $1
 24+  @MusicAddr $2
 25+  @MusicState $1
 26+  @HourBells $1
 27+
 28+|0100
 29+  \\ Set up
 30+  #8090 #08 DEO2k INC INC DEO2k INC INC DEO2
 31+  #00a0 #24 DEO2
 32+  #00c0 #22 DEO2
 33+  #0126 DEO
 34+  ;ScreenVec #20 DEO2
 35+  ;KeyVec #80 DEO2
 36+  ;MouseVec #90 DEO2
 37+  #0000 #38 DEO2
 38+  #0002 #3a DEO2
 39+  ;SqWave #3c DEO2
 40+  LIT2 cc -Volume STZ
 41+  redraw-screen
 42+  BRK
 43+
 44+@locate ( x y -- )
 45+  #0005 SFT2 #2a DEO2
 46+  #0005 SFT2 #28 DEO2
 47+  JMP2r
 48+
 49+@drawnum ( number -- )
 50+  LDArk STHr INC2r
 51+  SWP #0a DIVk STHk MUL SUB OVR STHr [& ]@
 52+  ( row digit )
 53+  DUP ADD ADD #00 SWP ;Digits ADD2 LDA2 printc
 54+  \\ fall through
 55+@printc ( ch -- )
 56+  #0005 SFT2 ;Font ADD2 #2c DEO2
 57+  #012f DEO
 58+  JMP2r
 59+
 60+@printat ( x y -- )
 61+  locate !&0 [@ printc &0 LDArk STHr INC2r DUP ]? POP JMP2r
 62+
 63+@redraw-clock0 ( -- )
 64+  .AlarmOn LDZ [? #0102 printat 8400 ]@
 65+  #0110 printat 8920 "ALARM 2020 2020 8a20 "12/24 00
 66+@redraw-clock ( -- )
 67+  \\ Day of week
 68+  #0101 locate
 69+  #00c7 DEI #03 MUL ;Weekday ADD2
 70+  LDAk printc INC2 LDAk printc INC2 LDA printc
 71+  #2020 printc printc
 72+  \\ Time of day
 73+  #c4 DEI2 SWP ( minutes hours )
 74+  .Clock24 LDZ [?
 75+    #0c LTHk
 76+    DUP #f1 MUL #50 ADD
 77+    #1502 locate printc #4d printc #0601 locate
 78+    #01 EOR MUL SUB
 79+    DUP [? POP #0c ]@
 80+  ]@
 81+  DUP drawnum 00 #83 printc
 82+  OVR drawnum 00 #83 printc
 83+  .LastSec LDZ STHk drawnum 00
 84+  #0602 locate
 85+  DUP drawnum 14 #83 printc
 86+  OVR drawnum 14 #83 printc
 87+  STHrk drawnum 14
 88+  #0603 locate
 89+  drawnum 28 #20 printc
 90+  drawnum 28 #20 printc
 91+  STHr drawnum 28
 92+  JMP2r
 93+
 94+@redraw-alarm0 ( -- )
 95+  #0110 printat 8920 "ON 20 2020 2020 2020 8a20 "OFF 00
 96+  cursor-adjust
 97+  #0101 printat "SET 00
 98+  #0102 printat 8400
 99+  draw-cursor
100+@redraw-alarm ( -- )
101+  .Alarm LDZ2 SWP ( minutes hours )
102+  .Clock24 LDZ [?
103+    #0c LTHk
104+    DUP #f1 MUL #50 ADD
105+    #1502 locate printc #4d printc
106+    #01 EOR MUL SUB
107+    DUP [? POP #0c ]@
108+  ]@
109+  #0601 locate
110+  DUP drawnum 00 #83 printc
111+  OVR drawnum 00
112+  #0602 locate
113+  DUP drawnum 14 #83 printc
114+  OVR drawnum 14
115+  #0603 locate
116+  drawnum 28 #20 printc
117+  drawnum 28
118+  JMP2r
119+
120+@redraw-timer0 ( -- )
121+  #0110 .TimerOn LDZ [?
122+    printat 8920 "GO 20 2020 2020 2020 8a20 "RESET 00
123+    draw-cursor
124+  ][
125+    #0202 locate
126+    LIT2 2d -CountDir LDZ DUP ADD SUB printc
127+    printat 8920 "MARK 20 2020 2020 8a20 "STOP 00
128+  ]@
129+  cursor-adjust
130+  LITr 06 .Mark LDZ [@
131+    DUP [? POP POPr !redraw-timer ]@
132+    #06 STHrk locate INCr
133+    draw-marked-time
134+  ]!
135+@redraw-timer ( -- )
136+  #8300 INC2k #2002
137+  LIT2r [: DUP2r ]@
138+  DUP #14 MUL ,&x STR
139+  INC ,&y STR ,&z STR
140+  LIT2 06 &y $1 locate
141+  .Timer/h
142+  &loop
143+    DUP LDZ drawnum &x $1
144+    INC DUP .Timer/f EQU [? LIT &z $1 printc !&loop ]@
145+  POP JMP2r
146+
147+@redraw-sound0 ( -- )
148+  #060c printat 8520 "CHIME 20 2086 00
149+  #060e printat 8820 "VOLUME 2087 00
150+  #0110 printat 8920 "TEST 00
151+@redraw-sound ( -- )
152+  #0204 locate
153+  .Volume LDZ [@ #7f printc #11 SUB DUP ]? POP
154+  LIT2 f0 -Volume LDZ ORA [@ LIT "_ printc INC DUP ]? POP
155+  #1104 printat 2000
156+  #0202 locate
157+  LIT2r :ChimeSet LDZr STHrk [?
158+    POP2r printat/0 "OFF 2020 2020 2020 2020 00 JMP2r
159+  ]@
160+  #04 STHrk EQU [?
161+    [& ""631 ]@ OVR2r ADD2r LDAr STHr printc
162+    STHr POPr #03 EQU #05 MUL #30 ADD printc
163+    printat/0 20 "MINUTES 20 00 JMP2r
164+    JMP2r
165+  ]@
166+  POP2r printat/0 "WESTMINSTER 00 JMP2r
167+
168+@cursor-adjust ( -- )
169+  #060c printat 8520 "CURSOR 2086 00
170+  #060e printat 8820 "ADJUST 2087 00
171+  JMP2r
172+
173+@draw-cursor ( -- )
174+  LIT2 06 -Cursor LDZ STHk DUP ADD ADD STHr #01 SFT ADD
175+  #04 locate LIT "^ printc
176+  JMP2r
177+
178+@draw-marked-time ( addr -- addr )
179+  [& LIT ": printc ]@ [& LIT ": printc ]@ LDZk printc INC LDZk printc INC JMP2r
180+
181+@redraw-screen ( -- )
182+  DUP2rk EOR2r LITr 28 DEO2rk INCr INCr DEO2r #802e DEO
183+  #0112 printat 8b8d 8f20 "MODE 2020 20 8c8e 8f20 "SILENCE 00
184+  .Mode LDZ INC LDR2 JMP2 :redraw-clock0 :redraw-alarm0 :redraw-timer0 :redraw-sound0
185+
186+@ScreenVec
187+  .LastSec LDZ #c6 DEI EQU [?
188+    #c6 DEI .LastSec STZ ;Frame STZ
189+    .Mode LDZ [? redraw-clock ]@
190+    .LastSec LDZ [?
191+      .AlarmOn LDZ [?
192+        ;Alarm LDZ2 #c4 DEI2 NEQ2 [? #61 setsound ]@
193+      ]@
194+      ;ChimeSet LDZ EQU [?
195+        .SoundState LDZ [?
196+          #c5 DEI
197+          LIT2 04 -ChimeSet LDZ EQU [?
198+            LIT2 78 -ChimeSet LDZ SFT DIVk MUL SUB [?
199+              #5c setsound
200+            ]@
201+          ][
202+            #0f DIVk STHk MUL SUB [?
203+              STHrk [?
204+                fullhour
205+              ][
206+                ;quarters STHrk #0007 SFT2 ADD2 LDA2
207+                STHrk #fb MUL setchimes
208+              ]@
209+            ]@ POPr
210+          ]@
211+        ]@
212+      ]@
213+    ]@
214+    .MissFrame
215+  ][
216+    .Frame
217+  ]@ LDZk INC SWP STZ
218+  .TimerOn LDZ ?TimerVec
219+  &sound
220+  .SoundState LDZ [?
221+    \\ Westminster Quarters
222+    .MusicState LDZ [?
223+      .HourBells LDZ [? BRK ]@
224+      .SoundFrame LDZk INC DUP [?
225+        POP #7f
226+        #0f0f #38 DEO2
227+        #343f DEO
228+        .HourBells LDZk INC SWP STZ
229+      ]@ SWP STZ
230+      BRK
231+    ]@
232+    .SoundFrame LDZk INC DUP [?
233+      STH .MusicAddr LDZ2k
234+      LDAk DUP STHr EQU [? DUP #3f DEO ]@ POP
235+      INC2 DUP2 ;change6 NEQ2 [? POP2 ;change1 ]@
236+      ROT STZ2
237+      .MusicState LDZk INC SWP STZ
238+      #df
239+    ]@ SWP STZ
240+    BRK
241+  ]@
242+  .SoundFrame LDZk INC #0f AND STHk SWP STZ
243+  STHr #07 AND [?
244+    LIT2 08 -SoundFrame LDZ AND [?
245+      .Volume LDZ2
246+    ][
247+      LIT2 01 -SoundState LDZ AND [? ;SoundState STZ ]@
248+      #00ff
249+    ]@ #3e DEO2
250+  ]@
251+  BRK
252+
253+@TimerVec
254+  LIT2 01 -MissFrame LDZ LTH [?
255+    .Frame LDZ .Timer/f LDZ NEQ ?ScreenVec/sound
256+  ]@
257+  .CountDir LDZ [?
258+    ( down )
259+    .Timer/s downtime
260+    .Timer/m downtime
261+    .Timer/h downtime
262+    #5f setsound
263+    LIT2 01 -CountDir STZ
264+    #0202 printat "! 00
265+    #0000 .Timer/h STZk INC STZ2
266+  ][
267+    ( up )
268+    .Timer/s uptime
269+    .Timer/m uptime
270+    .Timer/h uptime
271+  ]@
272+  &done
273+  LIT2 04 -Mode LDZ NEQ [? redraw-timer ]@
274+  ;MissFrame STZ
275+  !ScreenVec/sound
276+
277+@uptime ( addr -- )
278+  LDZk INC DUP #3c LTH [? DUP EOR SWP STZ JMP2r ]@
279+  SWP STZ POP2r !TimerVec/done
280+
281+@downtime ( addr -- )
282+  LDZk [? #3b SWP STZ JMP2r ]@
283+  POP2r LDZk #01 SUB SWP STZ !TimerVec/done
284+
285+@setsound ( note -- )
286+  ;SoundState STZ2
287+  ;HourBells STZ
288+  #0000 #38 DEO2
289+  .Volume LDZ2 #3e DEO2
290+  JMP2r
291+
292+@setchimes ( address* 256-count -- )
293+  #00 setsound
294+  #0809 #38 DEO2
295+  .MusicState STZ
296+  .MusicAddr STZ2
297+  LIT2 ff -SoundFrame STZ
298+  JMP2r
299+
300+@change1 44 42 40 3b 00
301+@change2 40 44 42 3b 00
302+@change3 40 42 44 40 00
303+@change4 44 40 42 3b 00
304+@change5 3b 42 44 40 00
305+@change6 ( Big Ben: 34 )
306+
307+\_@2- \@quarters :change1 :change2 :change4
308+
309+@KeyVec
310+  ;Blank mousedraw 41
311+  #82 DEI [?
312+    #d083 DEI ADD #09 GTH [?
313+      \\ do numeric key command by mode
314+      #d083 DEI ADD .Cursor LDZ
315+      .Mode LDZ INC LDR2 JMP2
316+      :kNoD :kAlarmD :kTimerD :kNoD
317+    ]@
318+  ][
319+    #ff82 DEI ADDk AND NIP [?
320+      \\ do key command by mode
321+      #82 DEI LIT2r :KeyCodes [@
322+        #01 SFT DUP [?
323+          .Mode LDZ STH2r ADD2 LDA2 JMP2
324+        ]@
325+      LIT2r 0008 ADD2r ]!
326+    ]@
327+  ]@
328+  @kBrk BRK
329+
330+@KeyCodes
331+  ( A ) :kToggleAlarm :kAlarmOn :kGo :kTest
332+  ( B ) :kToggle24 :kAlarmOff :kStop :kBrk
333+  ( SELECT ) :kMode :kMode :kMode :kMode
334+  ( START ) :kNoSound :kNoSound :kNoSound :kNoSound
335+  ( UP ) :kBrk :kAlUp :kTimerAdj :kHighVolume
336+  ( DOWN ) :kBrk :kAlDown :kTimerAdj :kLowVolume
337+  ( LEFT ) :kBrk :kCursorL :kCursorL :kPrevChime
338+  ( RIGHT ) :kBrk :kCursorR :kCursorR :kNextChime
339+
340+@kToggleAlarm .AlarmOn LDZ ?kAlarmOn ( fallthrough )
341+@kAlarmOff LIT2 01 -AlarmOn STZ LIT2 61 -SoundState LDZ NEQ [? #60 setsound ]@ @kMode0 ;Mode STZ redraw-screen BRK
342+@kAlarmOn LIT2 00 -AlarmOn STZ #60 setsound !kMode0
343+@kNoSound ;SoundState STZ #00ff #3e DEO2 BRK
344+@kMode LIT2 06 -Mode LDZ INC INC AND ;Mode STZ2 redraw-screen BRK
345+@kToggle24 .Clock24 LDZk #01 EOR @kStore SWP STZ redraw-screen BRK
346+@kLowVolume .Volume LDZk #11 SUB @kVolume DUP #0f AND [? POP2 BRK ]@ SWP STZ redraw-sound #50 setsound BRK
347+@kHighVolume .Volume LDZk #11 ADD !kVolume
348+@kPrevChime .ChimeSet LDZk DUP [? POP #05 ]@ #01 SUB !kChimeSet
349+@kNextChime .ChimeSet LDZk INC DUP #05 NEQ MUL @kChimeSet SWP STZ redraw-sound BRK
350+@kTest LIT2 04 -ChimeSet LDZ EQU [? #5c setsound ][ fullhour ]@ BRK
351+@kCursorL .Cursor LDZ [? BRK ]@ .Cursor LDZk #01 SUB !kStore
352+@kCursorR .Mode LDZ2 LTH ?kBrk .Cursor LDZk INC !kStore
353+
354+@kAlUp
355+  LIT2 02 -Cursor LDZ AND [? .Alarm LDZk INC DUP #18 NEQ MUL @kAlSet SWP STZ redraw-alarm BRK ]@
356+  alarmAdjAmount SUB #3c DIVk MUL SUB !kAlSet
357+
358+@kAlDown
359+  LIT2 02 -Cursor LDZ AND [? .Alarm LDZk DUP [? POP #18 ]@ #01 SUB !kAlSet ]@
360+  alarmAdjAmount ADD #3c GTHk MUL ADD !kAlSet
361+
362+@alarmAdjAmount .Alarm/m LDZk LIT2 09 -Cursor LDZ MUL #1c SUB JMP2r
363+
364+@kTimerAdj
365+  .TimerOn LDZ ?kBrk
366+  LIT2 -Timer -Cursor LDZ #01 STH2k SFT ADD LDZk
367+  STH2r AND #09 MUL #f6 ADD
368+  #1082 DEI AND [? ADD #3c GTHk MUL ADD ][ SUB #3c DIVk MUL SUB ]@
369+  SWP STZ redraw-timer BRK
370+
371+@kNoD POP2 BRK
372+
373+@kAlarmD
374+  DUP INC #03 AND .Cursor STZ
375+  #01 SFTk SWP ROT AND [? SWP #0a MUL ][ LDZk ROT ADD ]@
376+  OVR #24 MUL #18 ADD OVR GTH ?kStore
377+  &wrong POP #00 ;Cursor STZ #38 setsound !kStore
378+
379+@kTimerD
380+  .TimerOn LDZ ?kNoD
381+  DUP INC DUP #06 NEQ MUL .Cursor STZ .2xTimer ADD
382+  #01 SFTk SWP ROT AND [? SWP #0a MUL ][ LDZk ROT ADD ]@
383+  DUP #3b GTH ?kAlarmD/wrong !kStore
384+
385+@write-mark ( value address -- )
386+  STH #0a DIVk STHk MUL SUB #30 STHk ADDr ADD STH ROTr STZ2r
387+  JMP2r
388+
389+@kGo
390+  #c6 setsound
391+  .TimerOn LDZ [?
392+    LIT2 01 -TimerOn STZ
393+    ;Timer LDZk SWP INC LDZ2 ORA ORA EQU .CountDir STZ
394+    .Frame LDZ .Timer/f STZ
395+    ;MissFrame STZ
396+  ][
397+    #d8 DUP .Mark LDZ EQU [? .Mark LDZk #08 SUB SWP STZ ]@
398+    [@ DUP #08 ADD LDZ OVR STZ INC DUP ]? POP
399+    .Timer LDZk #f8 write-mark
400+    INC LDZk #fa write-mark
401+    INC LDZ #fc write-mark
402+    .Frame LDZ .Timer/f LDZ SUB
403+    .CountDir LDZ [? #ff MUL ]@
404+    #3c DUP2 GTH MUL ADD #fe write-mark
405+  ]@
406+  redraw-screen BRK
407+
408+@kStop
409+  #c6 setsound
410+  .TimerOn LDZ [?
411+    ;Cursor STZk INC STZk POP ;Timer STZk INC STZ2
412+  ][
413+    ;TimerOn STZ
414+  ]@
415+  redraw-screen BRK
416+
417+@MouseVec
418+  ;Blank mousedraw 41
419+  #92 DEI2 .MouseX STZ2
420+  #94 DEI2 .MouseY STZ2
421+  ;mouseshape mousedraw c1
422+  #0196 DEI AND .MouseState STH2k LDZ STZr INC AND [? BRK ]@
423+  .MouseX LDZ2 #00bf GTH2 ?kBrk
424+  .MouseY LDZ2 #005a SUB2 #0066 GTH2 ?kBrk
425+  ;KeyCodes ;Mode LDZ ADD2 #00
426+  LIT2 57 -MouseX/lo LDZ GTH LIT2 c6 -MouseY/lo LDZ ADD #14 SFT ADD
427+  LDR ADD2 LDA2 JMP2 00 38 30 20 28 08 00 18 10
428+
429+@mousedraw ( picture* -- )
430+  .MouseX LDZ2 #28 DEO2
431+  .MouseY LDZ2 #2a DEO2
432+  #2c DEO2
433+  LDArk LITr 2f DEOr INC2r JMP2r
434+
435+@Weekday
436+  "SUN
437+  "MON
438+  "TUE
439+  "WED
440+  "THU
441+  "FRI
442+  "SAT
443+
444+@SqWave 00ff
445+
446+@fullhour ( -- )
447+  ;change2 #ec setchimes
448+  #00c4 DEI
449+  #0c LTHk #01 EOR MUL SUB DUP [? POP #0c ]@
450+  SUB .HourBells STZ
451+  JMP2r
452+
453+@Digits
454+  ( .0.. .1.. .2.. .3.. .4.. .5.. .6.. .7.. .8.. .9.. )
455+    8182 8120 8180 8180 8181 2082 2082 8180 8182 8182
456+    8181 8120 2082 8180 8180 8180 8182 8120 8182 8180
457+    2080 2020 2080 2080 2020 2080 2080 2020 2080 2080
458+  ( .0.. .1.. .2.. .3.. .4.. .5.. .6.. .7.. .8.. .9.. )
459+
460+\_@0100"- \@Font @Blank \~ascii.font
461+
462+( 80 )
463+  \-..111111
464+  \-..111111
465+  \-........
466+  \-........
467+  \-........
468+  \-........
469+  \-........
470+  \-........;
471+( 81 )
472+  \-........
473+  \-........
474+  \-11......
475+  \-11......
476+  \-11......
477+  \-11......
478+  \-11......
479+  \-11......;
480+( 82 )
481+  \-..111111
482+  \-..111111
483+  \-11......
484+  \-11......
485+  \-11......
486+  \-11......
487+  \-11......
488+  \-11......;
489+( 83 )
490+  \-........
491+  \-........
492+  \-........
493+  \-........
494+  \-.11.....
495+  \-.11.....
496+  \-........
497+  \-........;
498+( 84 )
499+  \-...11...
500+  \-..1..1..
501+  \-..1..1..
502+  \-.1....1.
503+  \-11111111
504+  \-...1....
505+  \-....1...
506+  \-........;
507+( 85 )
508+  \-....1...
509+  \-...11...
510+  \-..111...
511+  \-.1111...
512+  \-..111...
513+  \-...11...
514+  \-....1...
515+  \-........;
516+( 86 )
517+  \-..1.....
518+  \-..11....
519+  \-..111...
520+  \-..1111..
521+  \-..111...
522+  \-..11....
523+  \-..1.....
524+  \-........;
525+( 87 )
526+  \-........
527+  \-........
528+  \-...1....
529+  \-..111...
530+  \-.11111..
531+  \-1111111.
532+  \-........
533+  \-........;
534+( 88 )
535+  \-........
536+  \-........
537+  \-1111111.
538+  \-.11111..
539+  \-..111...
540+  \-...1....
541+  \-........
542+  \-........;
543+( 89 )
544+  \-.11111..
545+  \-111.111.
546+  \-11.1.11.
547+  \-1.111.1.
548+  \-1.....1.
549+  \-1.111.1.
550+  \-1.111.1.
551+  \-.11111..;
552+( 8a )
553+  \-.11111..
554+  \-1...111.
555+  \-1.11.11.
556+  \-1...111.
557+  \-1.11.11.
558+  \-1.11.11.
559+  \-1...111.
560+  \-.11111..;
561+( 8b )
562+  \-.1111111
563+  \-1..1..1.
564+  \-1.11.11.
565+  \-1..1..1.
566+  \-11.1.11.
567+  \-1..1..1.
568+  \-.1111111
569+  \-........;
570+( 8c )
571+  \-.1111111
572+  \-1..1...1
573+  \-1.111.11
574+  \-1..11.11
575+  \-11.11.11
576+  \-1..11.11
577+  \-.1111111
578+  \-........;
579+( 8d )
580+  \-11111111
581+  \-11..1..1
582+  \-11.11.11
583+  \-11..1.11
584+  \-11.11.11
585+  \-.1..1..1
586+  \-11111111
587+  \-........;
588+( 8e )
589+  \-11111111
590+  \-1.11..11
591+  \-.1.1.1.1
592+  \-...1..11
593+  \-.1.1.1.1
594+  \-.1.1.1.1
595+  \-11111111
596+  \-........;
597+( 8f )
598+  \-1111....
599+  \-...11...
600+  \-1.111...
601+  \-1.111...
602+  \-1.111...
603+  \-1.111...
604+  \-1111....
605+  \-........;
606+
607+@mouseshape
608+  \=2222222.
609+  \=2333332.
610+  \=2332222.
611+  \=23232...
612+  \=232232..
613+  \=232.232.
614+  \=222..232
615+  \=......22;
616+
+3, -0
 1@@ -259,6 +259,9 @@ character, as well as: backspace (0x08), tab (0x09), return (0x0D), escape
 2 The vector is called when the mouse is moved or if any mouse buttons are
 3 pushed or released.
 4 
 5+The buttons are: bit0 for the left button, bit1 for the middle button, and
 6+bit2 for the right button.
 7+
 8 The scroll amounts are signed 16-bit numbers.
 9 
10