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