-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstringctrl.asm
490 lines (388 loc) · 5.69 KB
/
stringctrl.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
!
! StringControl
! This is similar to a Static Text Control; but
! 1. uses a pString/rPString instead of rLETextBox2
! 2. therefore doesn't need to set the value to the text length
! 3. uses a color table for foreground/background
! (instead of rLETextBox inline codes)
! 4. uses DrawStringWidth() to draw
!
! (So, static text with fBlast + fSquish, but more control over colors and drawing)
! (and a more human API for changing the text)
!
! load the string into ptr
!
copy 13:AInclude:E16.Control
copy 13:AInclude:E16.Resources
mcopy M16.SmartStacks
mcopy stringctrl.mac
case on
dummy private
end
records privdata
! control fields
Record $28
oDrawStringFlags word
! EndRecord
end
control_entry private
DefineStack
&gequ setb 1 ; dirty hack to make these global.
ptr longword
control longword
EndLocals
FixStack
BegParms
handle longword
param longword
code word
EndParms
rv word
BeginStack
; lock resource
! pha
! pha
! ~FindHandle #control_entry
! _HLock
stz <rv
stz <rv+2
lda <code
cmp #(TableEnd-TableStart)/2
bcs exit
asl a
tax
lda TableStart,x
beq exit
lda [handle]
sta control
ldy #2
lda [handle],y
sta control+2
! x still valid.
jsr (TableStart,x)
stax <rv
exit anop
; unlock resource
! pha
! pha
! ~FindHandle #control_entry
! _HUnlock
EndStack
rtl
rts anop
lda #0
ldx #0
TableStart anop
dc a2'control_draw' ; draw control
dc a2'0' ; calc control rect
dc a2'control_test' ; test control
dc a2'control_init' ; init control
dc a2'control_dispose' ; dispose control
dc a2'0' ; position control
dc a2'0' ; thumb
dc a2'0' ; drag
dc a2'0' ; auto track
dc a2'control_draw' ; new value
dc a2'0' ; set params
dc a2'0' ; move control
dc a2'control_size' ; record size
TableEnd anop
end
end
control_init private
!
! ID, rectangle, flag, moreflag, refcon, proc, are already set by NewControl / NewControl2.
! All other fields are zero.
!
using records
DSect
tPCount word
tID longword
tRect block 8
tProc longword
tFlag word ;4
tMoreFlags word ; 5
tRefCon longword ; 6
tTextRef longword ; 7
tDrawStringFlags word ; 8
tColorRef longword ; 9
tValue word ; 10 ; 0 / 1 to choose color
!tSize EndDSect
! optional fields
lda [param]
cmp #11
bcc ok
lda #10
ok asl a
tax
jmp (table,x)
table dc a2'p0,p1,p2,p3,p4'
dc a2'p5,p6,p7,p8,p9'
dc a2'p10'
p10 anop ; value
ldy #tValue
lda [param],y
ldy #octlValue
sta [control],y
p9 anop ; color ref
ldy #tColorRef
lda [param],y
tax
iny
iny
lda [param],y
ldy #octlColor+2
sta [control],y
dey
dey
txa
sta [control],y
p8 anop ; draw string flags
ldy #tDrawStringFlags
lda [param],y
ldy #oDrawStringFlags
and #%1111111111111100 ; must be p-string.
sta [control],y
p7 anop
ldy #tTextRef
lda [param],y
tax
iny
iny
lda [param],y
ldy #octlData+2
sta [control],y
dey
dey
txa
sta [control],y
p6 anop
p5 anop
p4 anop
p3 anop
p2 anop
p1 anop
p0 anop
rts
end
control_size private
ldax #$40
rts
end
control_test private
! return the part code
! control manager has already checked that we are enabled
! and visible and that the point is within the rect.
ldax #1
rts
end
control_dispose private
!
! if the string or color table are resources, release them.
!
ct anop
ldy #octlColor
lda [control],y
sta ptr
iny
iny
lda [control],y
sta ptr+2
ora ptr
beq str
ldy #octlMoreFlags
lda [control],y
and #%1100
cmp #%1000
bne str
~ReleaseResource #3,#rCtlColorTbl,<ptr
str anop
ldy #octlData
lda [control],y
sta ptr
iny
iny
lda [control],y
sta ptr+2
ora ptr
beq rts
ldy #octlMoreFlags
lda [control],y
and #%0011
cmp #%0010
bne rts
~ReleaseResource #3,#rPString,<ptr
rts rts
end
control_draw private
!
! Draw the control. (Also called for new value)
!
using records
pha
_GetFontFlags
pha
_GetForeColor
pha
_GetBackColor
! set up the colors, etc.
_PenNormal
~SetFontFlags #4 ; 16 dithered colors.
jsr load_ct
lda ptr
ora ptr+2
beq def_ct
ldy #octlValue
lda [control],y
and #1
asl a
asl a
tay
lda [ptr],y
pha
iny
iny
lda [ptr],y
pha
_SetBackColor
_SetForeColor
bra erase
def_ct anop
~SetForeColor #$0000
~SetBackColor #$ffff
erase anop
! erase the previous data
lda #octlRect
clc
adc control
tax
lda #0
adc control+2
pha
phx
_EraseRect
str anop
! draw the string
jsr load_string
lda ptr
ora ptr+2
beq exit
! left edge
ldy #octlRect+2
lda [control],y
pha
! top
dey
dey
lda [control],y
clc
adc #8
pha
_MoveTo
ldy #oDrawStringFlags
lda [control],y
pha
ph4 <ptr
ldy #octlRect+6
lda [control],y
sec
ldy #octlRect+2
sbc [control],y
pha
_DrawStringWidth
exit anop
! ~SetBackColor #$ffff
! ~SetForeColor #$0000
_SetBackColor
_SetForeColor
_SetFontFlags
rts
end
!
! load the string into ptr.
!
load_string private
ldy #octlData
lda [control],y
sta ptr
iny
iny
lda [control],y
sta ptr+2
ldy #octlMoreFlags
lda [control],y
and #%0011
asl a
tax
jmp (table,x)
table anop
dc a2'is_ptr'
dc a2'is_handle'
dc a2'is_resource'
dc a2'is_invalid'
is_invalid anop
stz ptr
stz ptr+2
is_ptr anop
rts
is_resource anop
pha
pha
~LoadResource #rPString,<ptr
plax
bcs is_invalid
stax <ptr
is_handle anop
~HLock <ptr
ldy #2
lda [ptr],y
tax
lda [ptr]
sta ptr
stx ptr+2
rts
end
!
! load the color table into ptr.
!
load_ct private
ldy #octlColor
lda [control],y
sta ptr
iny
iny
lda [control],y
sta ptr+2
ldy #octlMoreFlags
lda [control],y
and #%1100
lsr a
tax
jmp (table,x)
table anop
dc a2'is_ptr'
dc a2'is_handle'
dc a2'is_resource'
dc a2'is_invalid'
is_invalid anop
stz ptr
stz ptr+2
is_ptr anop
rts
is_resource anop
pha
pha
~LoadResource #rCtlColorTbl,<ptr
plax
bcs is_invalid
stax <ptr
is_handle anop
~HLock <ptr
ldy #2
lda [ptr],y
tax
lda [ptr]
sta ptr
stx ptr+2
rts
end