Subversion Repositories Kolibri OS

Rev

Rev 4943 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4943 eAndrew 1
VERSION equ "0.5"
4939 eAndrew 2
 
4865 eAndrew 3
    use32
4
    org     0
5
    db	    'MENUET01'
6
    dd	    1, main, dataend, memory, stacktop, 0, 0
7
 
8
    include "../../proc32.inc"
9
    include "../../macros.inc"
10
    include "../../dll.inc"
11
    include "../../develop/libraries/box_lib/trunk/box_lib.mac"
4943 eAndrew 12
  ;  include "../../debug.inc"
4865 eAndrew 13
    include "parser.inc"
14
 
15
 ;===============================
16
 
4943 eAndrew 17
    LIST_ITEM_SIZE   equ 16
18
    LIST_ITEM_COUNT  equ 6
19
    LIST_SIZE	     equ LIST_ITEM_SIZE * LIST_ITEM_COUNT
20
    LIST_ITEM_COLOR1 equ dword [scn.btn_face]
21
    LIST_ITEM_COLOR2 equ dword [scn.win_face]
22
    LIST_ITEM_TEXT1  equ dword [scn.btn_text]
23
    LIST_ITEM_TEXT2  equ dword [scn.win_text]
24
    LIST_ITEM_Y      equ LIST_ITEM_SIZE / 2 - 3
25
 
26
    KEYB_SIZE	     equ 140
27
 
28
    sz_cont db "Keyboard ", 0x10
6163 leency 29
    sz_head db "Calc+ v", VERSION, 0
4943 eAndrew 30
    btn_clr db ""
31
    buttons db "|%^*/-+)(=7894561230"
32
    edb1    edit_box 0, 8, 12, 0, 0, 0, 0, 0, 480, \
4865 eAndrew 33
		     exp, group, ed_always_focus + ed_focus, 0, 0
34
 
35
 imports:
36
    library gui, "box_lib.obj"
37
    import  gui, editbox.draw,	"edit_box",	\
38
		 editbox.key,	"edit_box_key", \
39
		 editbox.mouse, "edit_box_mouse"
40
 
41
 ;===============================
42
 
43
 main:
4939 eAndrew 44
    mov     [ans.buffer], dword "= 0"
45
    mov     [ans.size], 3 * 6 + 9
4865 eAndrew 46
 
47
    mcall   40, 100111b
6163 leency 48
    ; mcall   48, 3, scn, 192
4865 eAndrew 49
 
4939 eAndrew 50
 
4865 eAndrew 51
    m2m     [edb1.color],	       [scn.gui_face]
52
    m2m     [edb1.shift_color],        [scn.gui_select]
53
    m2m     [edb1.focus_border_color], [scn.gui_face]
4939 eAndrew 54
    m2m     [edb1.text_color],	       [scn.gui_text]
4865 eAndrew 55
 
56
    mcall   68, 11
57
    stdcall dll.Load, imports
58
 
59
 ;----------------------
60
 
61
 update:
4875 eAndrew 62
    mcall   23, 5
4865 eAndrew 63
 
64
    cmp     eax, EV_REDRAW
65
    je	    ev_redraw
66
    cmp     eax, EV_KEY
67
    je	    ev_key
68
    cmp     eax, EV_BUTTON
69
    je	    ev_button
70
    cmp     eax, EV_MOUSE
71
    je	    ev_mouse
72
 
73
    jmp     update
74
 
75
 ;----------------------
76
 
77
 ev_redraw:
4943 eAndrew 78
    mcall   12, 1
79
 
80
 ; WINDOW
81
    mov     edx, [scn.win_face]
4865 eAndrew 82
    or	    edx, 0x34 shl 24
4943 eAndrew 83
    mcall   0, <100, 236 + 100 - 50 - 25>, <100, 66 + LIST_SIZE>, , , sz_head
4865 eAndrew 84
 
4943 eAndrew 85
 ; TOOLBAR
6163 leency 86
    mov     ebx, 120 shl 16 + 64
4943 eAndrew 87
    mcall   8, , <-17, 12>, 2 + 1 shl 30
88
    add     ebx, 4 shl 16 - (64 + 14)
89
    mcall   4, , [scn.win_title], sz_cont, 10
4939 eAndrew 90
 
4943 eAndrew 91
 ; CONTENT
4875 eAndrew 92
    call    draw_textbox
4943 eAndrew 93
    call    draw_keyb
94
    call    draw_list
4865 eAndrew 95
 
4943 eAndrew 96
    mcall   12, 2
4865 eAndrew 97
 
98
    jmp     update
99
 
100
 ;----------------------
101
 
102
 ev_key:
103
    mcall   2
104
    cmp     ah, 27
105
    je	    exit
4939 eAndrew 106
    cmp     ah, 13
107
    je	    calc
4865 eAndrew 108
    invoke  editbox.key, edb1
109
    jmp     update
110
 
111
 ;----------------------
112
 
113
 ev_button:
114
    mcall   17
115
 
4943 eAndrew 116
 ; EXIT
4865 eAndrew 117
    cmp     ah, 1
118
    je	    exit
119
 
4943 eAndrew 120
 ; DELETE
121
    cmp     ah, 4
4865 eAndrew 122
    jne     .not_del
123
    cmp     [edb1.pos], 0
124
    je	    update
125
    mov     eax, exp
126
    add     eax, [edb1.pos]
127
    dec     eax
128
    mov     ebx, exp
129
    add     ebx, [edb1.size]
130
    inc     ebx
131
  @@:
132
    cmp     eax, ebx
133
    je	    @f
134
    mov     cl, [eax + 1]
135
    mov     [eax], cl
136
    inc     eax
137
    jmp     @b
138
  @@:
139
    dec     [edb1.pos]
140
    dec     [edb1.size]
141
    m2m     [edb1.shift], [edb1.pos]
4875 eAndrew 142
    jmp     .redraw
4865 eAndrew 143
 .not_del:
144
 
4943 eAndrew 145
 ; SHOW/HIDE KEYBOARD
146
    cmp     ah, 2
147
    jne     .not_keyb
4865 eAndrew 148
 
4943 eAndrew 149
    cmp     [keyb], byte 0
150
    je	    .open
151
 
152
    mov     [keyb], 0
153
    mov     [sz_cont + 9], byte 0x10
6163 leency 154
    mcall   67, -1, -1, 286 - 25, -1
155
    jmp     update
4943 eAndrew 156
 
157
 .open:
158
    mov     [keyb], 1
159
    mov     [sz_cont + 9], byte 0x11
6163 leency 160
    mcall   67, -1, -1, 286 - 25 + KEYB_SIZE, -1
4943 eAndrew 161
    jmp     update
162
 .not_keyb:
163
 
164
 ; CALCULATE
165
    cmp     ah, 19
166
    je	    calc
167
 
168
 ; LIST
169
    cmp     ah, 0x60
170
    jl	    .not_list
171
 
172
    sub     ah, 0x60
173
    movzx   ebx, ah
174
    imul    ebx, 512
175
    add     ebx, history
176
    add     ebx, 482
177
    stdcall str_len, ebx
178
 
179
    mov     edx, exp
180
    add     edx, [edb1.size]
181
    add     edx, eax
182
    mov     edi, exp
183
    add     edi, [edb1.pos]
184
  @@:
185
    cmp     edx, edi
186
    je	    @f
187
    mov     esi, edx
188
    sub     esi, eax
189
    push    eax
190
    mov     al, [esi]
191
    mov     [edx], al
192
    pop     eax
193
    dec     edx
194
    jmp     @b
195
  @@:
196
    add     [edb1.size], eax
197
 
198
  @@:
199
    cmp     eax, 0
200
    je	    @f
201
    mov     cl, [ebx]
202
    mov     [edi], cl
203
    inc     edi
204
    inc     ebx
205
    dec     eax
206
    inc     [edb1.pos]
207
    jmp     @b
208
  @@:
209
 
210
    jmp     .redraw
211
 .not_list:
212
 
213
 ; KEYBOARD
214
    cmp     ah, 10
215
    jl	    update
216
    cmp     ah, 50
217
    jg	    update
218
    mov     dh, ah
219
 
220
    mov     ebx, exp
221
    add     ebx, [edb1.size]
222
    mov     ecx, exp
223
    add     ecx, [edb1.pos]
224
    cmp     dh, 30
225
    jl	    @f
226
    add     ebx, 2
227
  @@:
228
    cmp     ebx, ecx
229
    je	    @f
230
    mov     dl, [ebx - 1]
231
    mov     [ebx], dl
232
    dec     ebx
233
    jmp     @b
234
  @@:
235
 
236
    movzx   eax, dh
237
    add     eax, buttons
238
    sub     eax, 10
239
    mov     al, [eax]
240
 
241
    mov     [ebx], al
242
    inc     [edb1.size]
243
    inc     [edb1.pos]
244
    cmp     dh, 30
245
    jl	    @f
246
    add     [edb1.size], 2
247
    add     [edb1.pos], 2
248
  @@:
4875 eAndrew 249
 .redraw:
250
    call    draw_textbox
251
    jmp     update
4865 eAndrew 252
 
253
 ;----------------------
254
 
255
 ev_mouse:
256
    mcall   2
257
 
258
    invoke  editbox.mouse, edb1
259
    jmp     update
260
 
261
 ;----------------------
262
 
263
 exit:
264
    mcall   -1
265
 
266
 ;----------------------
267
 
268
 calc:
269
    stdcall parse
270
    cmp     [error_n], 0
271
    jne     .error
272
 
4939 eAndrew 273
    mov     [ans.buffer], word "= "
274
 
275
    stdcall convert_to_str, eax, ans.buffer + 2
276
    add     eax, 2
4943 eAndrew 277
    mov     edi, eax
4865 eAndrew 278
    imul    eax, 6
279
    add     eax, 9
280
    mov     [ans.size], eax
4943 eAndrew 281
 
282
 ; HISTORY
283
    mov     ecx, LIST_ITEM_COUNT - 1
284
    mov     eax, history
285
    add     eax, (LIST_ITEM_COUNT - 1) * 512
286
  @@:
287
    mov     ebx, eax
288
    sub     ebx, 512
289
    stdcall str_cpy, ebx, eax
290
    add     ebx, 480
291
    add     eax, 480
292
    stdcall str_cpy, ebx, eax
293
    sub     ebx, 480
294
    sub     eax, 480
295
    mov     esi, [ebx + 508]
296
    mov     [eax + 508], esi
297
    sub     eax, 512
298
    loop    @b
299
 
300
    stdcall str_cpy, exp, history
301
    stdcall str_cpy, ans.buffer, history + 480
302
    mov     esi, [ans.size]
303
    mov     dword[history + 508], esi
304
    not     [his_even]
305
 
306
 ; Check length
307
    mov     esi, 37
308
    sub     esi, edi
309
    stdcall str_len, exp
310
    sub     esi, eax
311
    cmp     esi, 0
312
    jg	    .redraw
313
 
314
    mov     ebx, history
315
    add     ebx, eax
316
    add     ebx, esi
317
    mov     [ebx], dword ".."
318
 
4875 eAndrew 319
    jmp     .redraw
4865 eAndrew 320
 
4943 eAndrew 321
 ; ERRORS
322
 
4865 eAndrew 323
 .error:
324
    cmp     [error_n], 1
325
    je	    .err_1
4875 eAndrew 326
    cmp     [error_n], 4
327
    je	    .err_4
328
 
329
    mov     [ans.buffer +  0], dword "Expe"
330
    mov     [ans.buffer +  4], dword "cted"
331
    mov     [ans.buffer +  8], dword " ')'"
332
    mov     [ans.buffer + 12], byte 0
333
    mov     [ans.size], 81
334
 
335
    cmp     [error_n], 2
336
    je	    .redraw
337
    cmp     [error_n], 3
338
    je	    .err_3
4943 eAndrew 339
    cmp     [error_n], 5
340
    je	    .err_5
4865 eAndrew 341
 .err_1:
342
    mov     [ans.buffer +  0], dword "Div."
343
    mov     [ans.buffer +  4], dword " by "
4875 eAndrew 344
    mov     [ans.buffer +  8], byte  "0"
345
    mov     [ans.buffer +  9], byte 0
346
    mov     [ans.size], 63
347
    jmp     .redraw
348
 .err_4:
349
    mov     [ans.buffer +  0], dword "Inpu"
350
    mov     [ans.buffer +  4], dword "t er"
351
    mov     [ans.buffer +  8], dword "rror"
4865 eAndrew 352
    mov     [ans.buffer + 12], byte 0
353
    mov     [ans.size], 81
4875 eAndrew 354
    jmp     .redraw
355
 .err_3:
356
    mov     [ans.buffer + 10], byte "("
357
    jmp     .redraw
4943 eAndrew 358
 .err_5:
359
    mov     [ans.buffer + 10], byte "|"
360
    jmp     .redraw
4865 eAndrew 361
 
4875 eAndrew 362
 .redraw:
363
    call    draw_textbox
4943 eAndrew 364
    call    draw_list
4875 eAndrew 365
    jmp     update
366
 
4865 eAndrew 367
 ;----------------------
368
 
4943 eAndrew 369
 proc draw_button, x, y
370
    mcall   8, <[x], 30>, <[y], 21>, [but_id], [but_c]
4865 eAndrew 371
 
4943 eAndrew 372
    mov     ebx, [x]
373
    mov     esi, [txt_size]
374
    imul    esi, 3
375
    mov     edi, 16
376
    sub     edi, esi
377
    add     ebx, edi
378
    shl     ebx, 16
379
    add     ebx, [y]
380
    add     ebx, 7
381
    mcall   4, , [but_tc], [txt_id], [txt_size]
382
 
383
    mov     eax, [txt_size]
384
    add     [txt_id], eax
385
    inc     dword [but_id]
386
 
387
    ret
388
 endp
389
 
4865 eAndrew 390
 ;----------------------
391
 
4875 eAndrew 392
 proc draw_textbox
4943 eAndrew 393
    mcall   13, <4, 320 - 50 - 25>, <  8,  23>, [scn.gui_frame]
4875 eAndrew 394
    mov     edx, [scn.gui_face]
395
    cmp     [error_n], 0
396
    je	    @f
397
    mov     edx, 0xFFAAAA
398
  @@:
4943 eAndrew 399
    mcall   13, <  5, 318 - 50 - 25>, <  9, 21>
400
    mcall     , <  5, 318 - 50 - 25>, <  9,  1>, [scn.3d_face]
4875 eAndrew 401
    mcall     , <  5,	1>, < 10, 20>
4943 eAndrew 402
    mcall     , <  5, 318 - 50 - 25>, < 31,  1>, [scn.3d_light]
4875 eAndrew 403
 
4943 eAndrew 404
    mov      ebx, 328 - 16 - 50 - 25
4939 eAndrew 405
    sub      ebx, [ans.size]
406
    shl      ebx, 16
407
    add      ebx, 16
408
    mov      ecx, [scn.gui_intext]
409
    or	     ecx, 1 shl 31
410
    mcall    4, , , ans.buffer
4875 eAndrew 411
 
4943 eAndrew 412
    mov      ecx, [scn.gui_text]
413
    mcall     , <310 - 50 - 25, 16>, , btn_clr, 1
414
    add      ebx, 1 shl 16
415
    mcall
416
 
417
    mcall    8, <305 - 50 - 25, 17>, <9, 20>, 0x40000004
418
 
4875 eAndrew 419
    mcall    1,   4,  8, [scn.win_body]
4943 eAndrew 420
    mcall     , 323 - 50 - 25
4875 eAndrew 421
    mcall     ,    , 30, [scn.3d_light]
422
    mcall     ,   4
423
 
4943 eAndrew 424
    mov     ebx, 318 - 16 - 50 - 25
4875 eAndrew 425
    sub     ebx, [ans.size]
426
    cmp     ebx, 24
427
    jg	    @f
428
    mov     ebx, 24
429
  @@:
430
    mov     [edb1.width], ebx
431
    m2m     [edb1.color],	       [scn.gui_face]
432
    m2m     [edb1.focus_border_color], [scn.gui_face]
433
    cmp     [error_n],	0
434
    je	    @f
435
    mov     [edb1.color],	       0xFFAAAA
436
    mov     [edb1.focus_border_color], 0xFFAAAA
437
  @@:
438
    invoke  editbox.draw, edb1
439
 
440
    ret
441
 endp
442
 
443
 ;----------------------
444
 
4943 eAndrew 445
 proc draw_keyb
446
    cmp     [keyb], byte 0
447
    je	    @f
448
 
449
    mov     [txt_size], 1
450
    mov     [but_id], 0x0000000A
451
    mov     [txt_id], buttons
452
 
453
    mov     eax, [scn.win_face]
454
    mov     [but_c], eax
455
    mov     eax, [scn.win_text]
456
    mov     [but_tc], eax
457
    stdcall draw_button,   4 + 278 - 25,  42 - 25 - 8
458
    stdcall draw_button,  37 + 278 - 25,  42 - 25 - 8
459
    stdcall draw_button,  70 + 278 - 25,  42 - 25 - 8
460
    stdcall draw_button, 103 + 278 - 25,  42 - 25 - 8
461
    stdcall draw_button, 103 + 278 - 25,  66 - 25 - 8
462
    stdcall draw_button, 103 + 278 - 25,  90 - 25 - 8
463
    stdcall draw_button, 103 + 278 - 25, 114 - 25 - 8
464
    stdcall draw_button,  70 + 278 - 25, 139 - 25 - 8
465
    stdcall draw_button,  37 + 278 - 25, 139 - 25 - 8
466
 
467
    mov     eax, [scn.btn_inface]
468
    mov     [but_c], eax
469
    mov     eax, [scn.btn_intext]
470
    mov     [but_tc], eax
471
    stdcall draw_button, 103 + 278 - 25, 139 - 25 - 8
472
 
473
    mov     eax, [scn.btn_face]
474
    mov     [but_c], eax
475
    mov     eax, [scn.btn_text]
476
    mov     [but_tc], eax
477
    stdcall draw_button,   4 + 278 - 25,  66 - 25 - 8
478
    stdcall draw_button,  37 + 278 - 25,  66 - 25 - 8
479
    stdcall draw_button,  70 + 278 - 25,  66 - 25 - 8
480
    stdcall draw_button,   4 + 278 - 25,  90 - 25 - 8
481
    stdcall draw_button,  37 + 278 - 25,  90 - 25 - 8
482
    stdcall draw_button,  70 + 278 - 25,  90 - 25 - 8
483
    stdcall draw_button,   4 + 278 - 25, 114 - 25 - 8
484
    stdcall draw_button,  37 + 278 - 25, 114 - 25 - 8
485
    stdcall draw_button,  70 + 278 - 25, 114 - 25 - 8
486
    stdcall draw_button,   4 + 278 - 25, 139 - 25 - 8
487
 
488
  @@:
489
    ret
490
 endp
491
 
492
 ;----------------------
493
 
494
 proc draw_list
495
  ; BACKGROUND
496
    mov     edi, LIST_ITEM_COUNT
497
    mov     eax, 13
498
    mov     ebx, 4 shl 16 + 320 - 50 - 25
499
    mov     ecx, 37 shl 16 + LIST_ITEM_SIZE
500
    mov     edx, LIST_ITEM_COLOR1
501
    cmp     [his_even], byte 0
502
    je	    @f
503
    mov     edx, LIST_ITEM_COLOR2
504
  @@:
505
    mcall
506
    add     ecx, LIST_ITEM_SIZE shl 16
507
    cmp     edx, LIST_ITEM_COLOR1
508
    je	    .set_color_to_2
509
    mov     edx, LIST_ITEM_COLOR1
510
    jmp     .next
511
 .set_color_to_2:
512
    mov     edx, LIST_ITEM_COLOR2
513
 .next:
514
    dec     edi
515
    cmp     edi, 0
516
    jne     @b
517
 
518
  ; BUTTONS
519
    mov     edi, LIST_ITEM_COUNT
520
    mov     eax, 8
521
    mov     ebx, 4 shl 16 + 320 - 50 - 25
522
    mov     ecx, 37 shl 16 + LIST_ITEM_SIZE
523
    mov     edx, 0x40000060
524
  @@:
525
    mcall
526
    add     ecx, LIST_ITEM_SIZE shl 16
527
    inc     edx
528
    dec     edi
529
    cmp     edi, 0
530
    jne     @b
531
 
532
  ; TEXT
533
    mov     edi, LIST_ITEM_COUNT
534
    mov     eax, 4
535
    mov     ebx, 8 shl 16 + 37 + LIST_ITEM_Y
536
    mov     ecx, LIST_ITEM_TEXT1
537
    cmp     [his_even], byte 0
538
    je	    @f
539
    mov     ecx, LIST_ITEM_TEXT2
540
  @@:
541
    or	    ecx, 1 shl 31
542
    mov     edx, history
543
  @@:
544
    mcall
545
 
546
    push    ebx
547
    add     ebx, (320 - 50 - 25) shl 16
548
    mov     esi, [edx + 508]
549
    shl     esi, 16
550
    sub     ebx, esi
551
    add     edx, 480
552
    mcall
553
    pop     ebx
554
 
555
    add     edx, 32
556
    add     ebx, LIST_ITEM_SIZE
557
 
558
    and     ecx, 0xFFFFFF
559
    cmp     ecx, LIST_ITEM_TEXT2
560
    je	    .set_color_to_2_txt
561
    mov     ecx, LIST_ITEM_TEXT2
562
    jmp     .next_txt
563
 .set_color_to_2_txt:
564
    mov     ecx, LIST_ITEM_TEXT1
565
 .next_txt:
566
    or	    ecx, 1 shl 31
567
 
568
    dec     edi
569
    cmp     edi, 0
570
    jne     @b
571
 
572
    ret
573
 endp
574
 
575
 ;----------------------
576
 
577
 proc str_len uses ebx, str
578
    xor     eax, eax
579
    mov     ebx, [str]
580
  @@:
581
    cmp     [ebx], byte 0
582
    je	    @f
583
    inc     eax
584
    inc     ebx
585
    jmp     @b
586
  @@:
587
 
588
    ret
589
 endp
590
 
591
 ;----------------------
592
 
593
 proc str_cpy uses eax ebx ecx, from, to
594
    mov     eax, [from]
595
    mov     ebx, [to]
596
  @@:
597
    cmp     [eax], byte 0
598
    je	    @f
599
    mov     cl, [eax]
600
    mov     [ebx], cl
601
    inc     eax
602
    inc     ebx
603
    jmp     @b
604
  @@:
605
    mov     [ebx], byte 0
606
    ret
607
 endp
608
 
609
 ;----------------------
610
 
4865 eAndrew 611
 dataend:
612
 
613
 ;===============================
614
 
615
	    rb 2048
616
 stacktop:
617
 
4943 eAndrew 618
 exp	    rb 480
4865 eAndrew 619
 exp_pos    rd 1
620
 exp_lvl    rd 1
4943 eAndrew 621
 abs_lvl    rd 1
4865 eAndrew 622
 group	    rd 1
623
 
4943 eAndrew 624
 ans.buffer:rb 480
4865 eAndrew 625
 ans.size   rd 1
626
 error_n    rd 1
627
 
628
 timer	    rd 1
629
 but_id     rd 1
4943 eAndrew 630
 but_c	    rd 1
631
 but_tc     rd 1
4875 eAndrew 632
 txt_id     rd 1
4943 eAndrew 633
 txt_size   rd 1
634
 keyb	    rb 1
4865 eAndrew 635
 
4943 eAndrew 636
 his_even   rb 1
637
 history    rb 512 * LIST_ITEM_COUNT
638
	    rb 512
6163 leency 639
 
640
struc system_colors_internal {
641
  .3d_face        dd 0xCED0D0
642
  .3d_dark        dd 0xD7D7D7
643
  .3d_light       dd 0xFEFEFE
644
  .win_title      dd 0x2F2F2F
645
  .win_body       dd 0xE4DFE1
646
  .btn_face       dd 0xEFEBEF
647
  .btn_text       dd 0x373C42
648
  .win_text       dd 0x000000
649
  .panel_frame    dd 0x94AECE
650
  .win_face       dd 0xE1E1E1
651
  .win_inface     dd 0xE1E1E1
652
  .win_frame      dd 0x204962
653
  .btn_inface     dd 0xEFEBEF
654
  .btn_intext     dd 0xD0D9E8
655
  .btn_fctext     dd 0x2D3135
656
  .gui_shadow     dd 0xFFFFFF
657
  .gui_face       dd 0xFAF8FA
658
  .gui_inface     dd 0xF6F3F6
659
  .gui_fcface     dd 0xFAF8FA
660
  .gui_frame      dd 0x7698C0
661
  .gui_text       dd 0x373C42
662
  .gui_intext     dd 0x5F5F5F
663
  .gui_select     dd 0xC7C9C9
664
}
4943 eAndrew 665
 
6163 leency 666
 scn system_colors_internal
667
 
4939 eAndrew 668
 memory: