Subversion Repositories Kolibri OS

Rev

Rev 109 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;                                                           ;
3
;    Audio CD player; code by Dmitry Yushko - dma@bn.by     ;
4
;                                                           ;
5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
 
147 diamond 7
include "macros.inc"
31 halyavin 8
include "lang.inc"
9
 
10
FALSE  equ 0
11
TRUE   equ 1
12
 
13
ESC_KEY   equ 27
14
LEFT_KEY  equ 176
15
RIGHT_KEY equ 179
16
 
17
NORMAL_PLAY  equ 0
18
REPEAT_TRACK equ 1
19
REPEAT_DISK  equ 2
20
SHUFFLE_DISK equ 3
21
 
22
COLOR_FUNC_BUTS equ 0x00dddddd
23
 
24
use32
25
 
26
                  org    0x0
27
                  db     'MENUET01'              ; 8 byte id
28
                  dd     0x01                      ; required os
29
                  dd     START                   ; program start
30
                  dd     I_END                   ; program image size
31
                  dd     0x2000                  ; required amount of memory
32
                  dd     0x2000                  ; esp = 0x7fff0
33
                  dd     0x0, 0x0              ; reserved=no extended header
34
 
35
START:
36
    call chk_cdrom                      ; start of execution
37
    call read_cd
38
    call draw_window            ; at first, draw the window
39
still:
40
 
41
    mov  eax,23
42
    mov  ebx,10                 ; wait here for event
43
    int  0x40
44
 
45
    cmp  eax,1                  ; redraw request ?
46
    jz   red
47
    cmp  eax,2                  ; key in buffer ?
48
    jz   key
49
    cmp  eax,3                  ; button in buffer ?
50
    jz   button
51
 
52
    call draw_info
53
    cmp  [curr_trk],0
54
    je   @f
55
    call current_trk_time
56
   @@:
57
    jmp  still
58
 
59
  red:                          ; redraw
60
    call draw_window
61
 
62
    jmp  still
63
 
64
  key:                          ; key
65
    mov  eax,2                  ; just read it and ignore
66
    int  0x40
67
 
68
;======  hotkeys:
69
    cmp  ah,0x61
70
    jb   @f
71
    cmp  ah,0x7a
72
    ja   @f
73
    and  ah,11011111b
74
   @@:
75
 
76
    cmp  ah,'P' ;PLAY
77
    jne  no_key_play
78
    call play_acd
79
    jmp still
80
 no_key_play:
81
 
82
    cmp ah,'S' ;STOP
83
    jne no_key_stop
84
    mov [if_paused],FALSE
85
    call stop_playing
86
    jmp still
87
 no_key_stop:
88
 
89
    cmp ah,'N' ;NEXT
90
    jne no_key_next
91
    call play_next_trk
92
    jmp still
93
 no_key_next:
94
 
95
    cmp ah,'B' ;BACK
96
    jne no_key_back
97
    call play_back_trk
98
    jmp still
99
 no_key_back:
100
 
101
    cmp  ah,'F' ;FORWARD
102
    jne  no_key_fwd
103
    call fast_forward
104
    jmp still
105
 no_key_fwd:
106
 
107
    cmp ah,'R' ;REWIND
108
    jne no_key_rewind
109
    call fast_rewind
110
    jmp still
111
 no_key_rewind:
112
 
113
    cmp ah,'M' ;MODE
114
    jne no_key_mode
115
    call change_mode
116
    jmp still
117
 no_key_mode:
118
 
119
 
120
    cmp ah,'L' ;READ PLAYLIST
121
    jne no_key_list
122
    mov [if_paused],FALSE
123
    mov [curr_trk],0
124
    call stop_playing
125
    call chk_cdrom
126
    call read_cd
127
    jmp still
128
 no_key_list:
129
 
130
    cmp ah,50      ;F1 key
131
    jz  itsahelpkey
132
 
133
    cmp ah,'H' ;HELP
134
    jne no_key_help
135
   itsahelpkey:
136
    cmp [flag],4
137
    je  still
138
    cmp [flag],1
139
    jne was_it_ok_false
140
    mov [was_it_ok],TRUE
141
    jmp flag4_done
142
   was_it_ok_false:
143
    mov [was_it_ok],FALSE
144
   flag4_done:
145
    mov [flag],4
146
    mov [help_screen],1
147
    call draw_window
148
    jmp still
149
 no_key_help:
150
 
151
 
152
    cmp ah,ESC_KEY
153
    jne no_esc_key
154
    cmp [flag],4
155
    jne still
156
    cmp [was_it_ok],FALSE
157
    jne was_it_ok_true
158
    mov [flag],0
159
    jmp end_esc_key
160
   was_it_ok_true:
161
    mov [flag],1
162
   end_esc_key:
163
    call draw_window
164
 no_esc_key:
165
 
166
    cmp ah,LEFT_KEY
167
    jne no_left_key
168
    cmp [flag],4
169
    jne still
170
    cmp [help_screen],1
171
    jz  still
172
    dec [help_screen]
173
    call draw_window
174
   no_left_key:
175
 
176
    cmp ah,RIGHT_KEY
177
    jne no_right_key
178
    cmp [flag],4
179
    jne still
180
    cmp [help_screen],3
181
    jz  still
182
    inc [help_screen]
183
    call draw_window
184
   no_right_key:
185
 
186
 
187
    jmp  still
188
 
189
 
190
  button:                       ; button
191
    mov  eax,17
192
    int  0x40
193
 
194
    cmp  ah,1                   ; button id=1 ?
195
    jnz  no_but_close
196
    mov  eax,24
197
    mov  ebx,3
198
    int 0x40
199
    mov  eax,0xffffffff         ; close this program
200
    int  0x40
201
  no_but_close:
202
 
203
    cmp  ah,2
204
    jne  no_but_play
205
    call play_acd
206
    jmp still
207
 no_but_play:
208
 
209
    cmp ah,3
210
    jne no_but_stop
211
    mov [if_paused],FALSE
212
    call stop_playing
213
    jmp still
214
 no_but_stop:
215
 
216
    cmp ah,4
217
    jne no_but_reread
218
    mov [curr_trk],0
219
    call chk_cdrom
220
    call read_cd
221
    mov [if_paused],FALSE
222
    call stop_playing
223
    jmp still
224
 no_but_reread:
225
 
226
    cmp ah,5
227
    jne no_but_next
228
    call play_next_trk
229
    jmp still
230
   no_but_next:
231
 
232
    cmp ah,6
233
    jne no_but_back
234
    call play_back_trk
235
    jmp still
236
   no_but_back:
237
 
238
    cmp ah,7
239
    jne no_but_mode
240
    call change_mode
241
    jmp still
242
   no_but_mode:
243
 
244
    cmp ah,8
245
    jne no_but_frew
246
    call fast_rewind
247
    jmp still
248
   no_but_frew:
249
 
250
    cmp ah,9
251
    jne no_but_ffwd
252
    call fast_forward
253
    jmp still
254
   no_but_ffwd:
255
 
256
    cmp  ah,10
257
    jb   no_but_track
258
    cmp  ah,40
259
    ja   no_but_track
260
    call read_cd
261
    cmp  [flag],1
262
    jne  no_but_track
263
    mov  cl,ah
264
    sub  cl,10
265
    mov  [curr_trk],cl
266
    mov  cl,[max_trk]
267
    mov  [shuftab],cl
268
    call stop_playing
269
    call renew_shuftab
270
    call play_n_track
271
    call rem_time_trk
272
    jmp still
273
  no_but_track:
274
 
275
    jmp  still
276
 
277
 
278
change_mode:
279
    cmp [mode],3
280
    jne inc_mode
281
    mov [mode],0
282
    jmp end_but_mode
283
   inc_mode:
284
    inc [mode]
285
   end_but_mode:
286
    call draw_info
287
ret
288
 
289
play_next_trk:
290
    cmp [curr_trk],0
291
    je  @play_next_trk
292
    cmp [if_paused],TRUE
293
    je  @play_next_trk
294
    cmp [mode],NORMAL_PLAY
295
    jne play_next_mode1
296
    xor eax,eax
297
    mov al,[curr_trk]
298
    cmp [max_trk],al
299
    je  @play_next_trk
300
    inc [curr_trk]
301
    cmp [if_stopped],TRUE
302
    je @play_next_trk
303
    call play_n_track
304
    jmp  @play_next_trk
305
   play_next_mode1:
306
    cmp [mode],REPEAT_TRACK
307
    jne play_next_mode2
308
    cmp [if_stopped],TRUE
309
    je @play_next_trk
310
    call play_n_track
311
    jmp  @play_next_trk
312
   play_next_mode2:
313
    cmp [mode],REPEAT_DISK
314
    jne play_next_mode3
315
    xor eax,eax
316
    mov al,[curr_trk]
317
    cmp [max_trk],al
318
    jne  play_next_mode2_go
319
    mov [curr_trk],1
320
    cmp [if_stopped],TRUE
321
    je @play_next_trk
322
    call play_n_track
323
    jmp  @play_next_trk
324
   play_next_mode2_go:
325
    inc  [curr_trk]
326
    cmp [if_stopped],TRUE
327
    je @play_next_trk
328
    call play_n_track
329
    jmp  @play_next_trk
330
   play_next_mode3:
331
    cmp  [mode],SHUFFLE_DISK
332
    jne  @play_next_trk
333
   call shuffle_track
334
   @play_next_trk:
335
ret
336
 
337
play_back_trk:
338
    cmp [curr_trk],0
339
    je  @play_back_trk
340
    cmp [if_paused],TRUE
341
    je  @play_back_trk
342
    cmp [mode],NORMAL_PLAY
343
    jne play_back_mode1
344
    xor eax,eax
345
    mov al,[curr_trk]
346
    cmp al,1
347
    je  @play_back_trk
348
    dec [curr_trk]
349
    cmp [if_stopped],TRUE
350
    je @play_next_trk
351
    call play_n_track
352
    jmp  @play_back_trk
353
   play_back_mode1:
354
    cmp [mode],REPEAT_TRACK
355
    jne play_back_mode2
356
    cmp [if_stopped],TRUE
357
    je @play_next_trk
358
    call play_n_track
359
    jmp  @play_back_trk
360
   play_back_mode2:
361
    cmp [mode],REPEAT_DISK
362
    jne play_back_mode3
363
    xor eax,eax
364
    mov al,[curr_trk]
365
    cmp al,1
366
    jne  play_back_mode2_go
367
    mov al,[max_trk]
368
    mov [curr_trk],al
369
    cmp [if_stopped],TRUE
370
    je @play_next_trk
371
    call play_n_track
372
    jmp  @play_back_trk
373
   play_back_mode2_go:
374
    dec  [curr_trk]
375
    cmp [if_stopped],TRUE
376
    je @play_next_trk
377
    call play_n_track
378
    jmp  @play_back_trk
379
   play_back_mode3: ;(shuffle)
380
;   call shuffle_track
381
   @play_back_trk:
382
ret
383
 
384
 
385
current_trk_time:
386
    cmp [if_stopped],TRUE
387
    je  menshe
388
    call get_uptime
389
    mov ebx,[stimtrk]
390
    sub eax,ebx
391
   ; eax now is seconds from track start * 100
392
    xor edx,edx
393
    mov ecx,100
394
    div ecx
395
    mov [curr_trk_pg_time],eax
396
    mov ebx,[curr_trk_length]
397
;    add eax,1 ;{inc curr time on 1 sec)
398
    cmp eax,ebx
399
    jb  menshe
400
    call stop_playing
401
    cmp [mode],SHUFFLE_DISK
402
    jne @f
403
    call shuffle_track
404
   @@:
405
    cmp [mode],REPEAT_TRACK
406
    je  @@mode_repeat_1
407
    mov al,[max_trk]
408
    cmp [curr_trk],al
409
    jb  @@next_trk_ok
410
    cmp [mode],REPEAT_DISK
411
    jne menshe
412
    mov [curr_trk],0
413
   @@next_trk_ok:
414
    inc [curr_trk]
415
   @@mode_repeat_1:
416
    call play_n_track
417
   menshe:
418
ret
419
 
420
 
421
rem_time_trk:
422
    call get_uptime
423
    mov  [stimtrk],eax
424
    ret
425
 
426
fast_forward:
427
    cmp [if_stopped],TRUE
428
    je end_ffwd
429
    mov eax,[curr_trk_pg_time]
430
    add eax,5
431
    cmp eax,[curr_trk_length]
432
    jae end_ffwd
433
    cmp [stimtrk],500
434
    jbe end_ffwd
435
    sub [stimtrk],500
436
    call current_trk_time
437
    call play_from_x_time
438
   end_ffwd:
439
ret
440
 
441
fast_rewind:
442
    cmp [if_stopped],TRUE
443
    je end_frew
444
    cmp [curr_trk_pg_time],5
445
    jbe end_frew
446
    add [stimtrk],500
447
    call current_trk_time
448
    call play_from_x_time
449
   end_frew:
450
ret
451
 
452
renew_shuftab:
453
    mov  ecx,40
454
   @rn:
455
    mov  [shuftab+ecx],cl
456
    loop @rn
457
    mov  cl,[max_trk]
458
    mov  [shuftab],cl
459
ret
460
 
461
 
462
shuffle_track:
463
   call get_uptime
464
   ror  eax,16
465
   cmp  eax,0
466
   je   shuffle_track
467
   xor  ecx,ecx
468
   mov  cl,[shuftab]
469
   cmp  ecx,1
470
   je   @enddsk
471
   xor  edx,edx
472
   div  ecx
473
   cmp  edx,0
474
   je   shuffle_track
475
   xor  ecx,ecx
476
   mov  cl,[max_trk]
477
 @main_loop:
478
   xor  eax,eax
479
   mov  al,[shuftab+ecx]
480
   cmp  al,0
481
   je   @f
482
   dec  edx
483
   cmp  edx,0
484
   jne  @f
485
   mov  cl,[shuftab]
486
   dec  cl
487
   mov  [shuftab],cl
488
   mov  [shuftab+eax],0
489
   mov  [curr_trk],al
490
   call play_n_track
491
   jmp  @endofshuffle
492
 @@:
493
   loop @main_loop
494
   jmp  @endofshuffle
495
 @enddsk:
496
   call stop_playing
497
 @endofshuffle:
498
 
499
ret
500
 
501
 
502
 
503
 
504
play_from_x_time:
505
    xor  ecx,ecx
506
    mov  cl,[curr_trk]
507
    shl  cl,3
508
    add  cl,1
509
    add  ecx,cdp
510
    mov  ebx,[ecx]
511
    mov  ecx,ebx
512
    and  ecx,0x00ffffff
513
 
514
    mov  eax,[curr_trk_pg_time]
515
    xor  edx,edx
516
    mov  ebx,60
517
    div  ebx
518
    add  cl,al ;mins
519
    add  dl,ch
520
    xor eax,eax
521
    mov al,dl
522
    xor edx,edx
523
    div ebx
524
    add cl,al   ;real min
525
    mov ch,dl   ;real sec
526
 
527
    mov  eax,24
528
    mov  ebx,1
529
    int  0x40
530
    ret
531
 
532
play_n_track:
533
    mov  [if_paused],FALSE
534
    mov  [if_stopped],FALSE
535
    mov  [curr_trk_pg_time],0
536
    call draw_window
537
;    mov  eax,26
538
;    mov  ebx,9
539
;    int  0x40
540
    call get_uptime
541
    mov  [stimtrk],eax
542
    xor  ebx,ebx
543
    xor  ecx,ecx
544
    mov  cl,[curr_trk]
545
    inc  cl
546
    shl  cl,3
547
    add  cl,1
548
    add  ecx,cdp
549
    mov  ebx,[ecx]
550
    and  ecx,0x00ffffff
551
    mov  ecx,ebx
552
   ;get_minutes:
553
   and  ecx,0x000000ff
554
   mov  eax,ecx
555
   imul eax,60
556
   ;get_seconds:
557
   mov ecx,ebx
558
   and ecx,0x0000ff00
559
   shr ecx,8
560
   add eax,ecx
561
   ;eax now is next pos in secs
562
   mov [next_pos_sec],eax
563
 ;eax now is current pos in secs
564
    xor  ebx,ebx
565
    xor  ecx,ecx
566
    mov  cl,[curr_trk]
567
    shl  cl,3
568
    add  cl,1
569
    add  ecx,cdp
570
    mov  ebx,[ecx]
571
    and  ecx,0x00ffffff
572
    mov  ecx,ebx
573
   ;get_minutes:
574
   and  ecx,0x000000ff
575
   mov  eax,ecx
576
   imul eax,60
577
   ;get_seconds:
578
   mov ecx,ebx
579
   and ecx,0x0000ff00
580
   shr ecx,8
581
   add eax,ecx
582
   ;eax now is current pos in secs
583
   mov ecx,[next_pos_sec]
584
   sub ecx,eax
585
   ;eax now is length of trk in sec
586
   mov [curr_trk_length],ecx
587
;now play that!
588
    mov ecx,ebx
589
    mov  eax,24
590
    mov  ebx,1
591
    int  0x40
592
    ret
593
 
594
 
595
play_acd:
596
    call chk_cdrom
597
    call read_cd
598
    call draw_window
599
    call renew_shuftab
600
    mov  cl,[curr_trk]
601
    cmp  cl,0
602
    jnz  play_acd_trk_ok
603
    mov  cl,[max_trk]
604
    mov  [shuftab],cl
605
    mov  [curr_trk],1
606
    jmp  playing_no_pause
607
   play_acd_trk_ok:
608
;   start_chk_on_pause:
609
    cmp  [if_paused],TRUE
610
    jne   pause_playing
611
    mov  [if_stopped],FALSE
612
    mov  [if_paused],FALSE
613
    call current_trk_time
614
    mov  eax,[curr_trk_pg_time]
615
    mov  ebx,[paused_time]
616
    sub  eax,ebx
617
    imul eax,100
618
    add  [stimtrk],eax
619
    call current_trk_time
620
    call play_from_x_time
621
    call draw_window
622
    jmp  end_play_acd
623
   pause_playing:
624
    cmp  [curr_trk_pg_time],0
625
    je   playing_no_pause
626
    mov  eax,[curr_trk_pg_time]
627
    mov  [paused_time],eax
628
    mov  [if_paused],TRUE
629
    call stop_playing
630
    call draw_window
631
    jmp  end_play_acd
632
   playing_no_pause:
633
    mov  [if_paused],FALSE
634
    call rem_time_trk
635
    call  play_n_track
636
    call  draw_window
637
   end_play_acd:
638
    ret
639
 
640
stop_playing:
641
    mov eax, 24
642
    mov ebx,3
643
    int 0x40
644
    mov  cl,[max_trk]
645
    mov  [shuftab],cl
646
    mov [if_stopped],TRUE
647
    cmp [if_paused],TRUE
648
    je  end_stop_playing
649
    mov [curr_trk_pg_time],0
650
   end_stop_playing:
651
    call draw_window
652
ret
653
 
654
;   *********************************************
655
;   *******  WINDOW DEFINITIONS AND DRAW ********
656
;   *********************************************
657
 
658
draw_info:
659
    ;bar->
660
    mov eax,13
661
    mov ebx, 10 shl 16 + 41
662
    mov ecx,120 shl 16 + 9
663
    mov edx,0x00ffffff
664
    int 0x40
665
    mov ebx, 96 shl 16 + 11
666
    int 0x40
667
    mov ebx, 185 shl 16 + 11
668
    int 0x40
669
    mov ebx, 200 shl 16 + 11
670
    int 0x40
671
    mov ebx, 150 shl 16 + 11
672
    int 0x40
673
    mov ebx, 165 shl 16 + 11
674
    int 0x40
675
   ;bar<-
676
 
677
    mov  eax,4
678
    mov  ebx,10 shl 16 +120
679
    mov  ecx,0x00111111
680
    cmp  [mode],NORMAL_PLAY
681
    jne  info_mode_1
682
    mov  edx,mode_normal
683
    jmp  info_mode_end
684
   info_mode_1:
685
    cmp  [mode],REPEAT_TRACK
686
    jne  info_mode_2
687
    mov  edx,mode_repeat_1
688
    jmp  info_mode_end
689
   info_mode_2:
690
    cmp  [mode],REPEAT_DISK
691
    jne  info_mode_3
692
    mov  edx,mode_repeat_all
693
    jmp  info_mode_end
694
   info_mode_3:
695
    cmp  [mode],SHUFFLE_DISK
696
    jne  info_mode_end
697
    mov  edx,mode_shuffle
698
;    mov  ecx,0x00aaaaaa
699
;    mov  cl,[max_trk]
700
;    mov  [shuftab],cl
701
    jmp  info_mode_end
702
   info_mode_end:
703
    mov  esi,7
704
    int 0x40
705
 
706
  ;num info ->
707
    mov  eax,47
708
    xor  ebx,ebx
709
    mov  bl,0
710
    mov  bh,0
711
    or   ebx,0x20000            ;X0000 - number of digits to draw
712
    xor  ecx,ecx
713
    mov  cl, [curr_trk]            ;number to draw
714
    mov  edx,96 shl 16 + 120
715
    mov  esi,0x111111
716
    int 0x40
717
    mov  eax,[curr_trk_pg_time]
718
    xor  edx,edx
719
    mov  ecx,60
720
    div  ecx
721
    push edx
722
    mov  ecx,eax
723
    mov  eax,47
724
    mov  edx,150 shl 16 + 120
725
    int  0x40
726
    pop ecx
727
    mov  edx,165 shl 16 + 120
728
    int 0x40
729
    mov  eax,[curr_trk_length]
730
    xor  edx,edx
731
    mov  ecx,60
732
    div  ecx
733
    push edx
734
    mov  ecx,eax
735
    mov  eax,47
736
    mov  edx,185 shl 16 + 120
737
    int  0x40
738
    pop  ecx
739
    mov  edx,200 shl 16 + 120
740
    int  0x40
741
   ;num info <-
742
ret
743
 
744
 
745
draw_window:
746
 
747
    mov  eax,12                    ; function 12:tell os about windowdraw
748
    mov  ebx,1                     ; 1, start of draw
749
    int  0x40
750
                                   ; DRAW WINDOW
751
    mov  eax,0                     ; function 0 : define and draw window
752
    mov  ebx, 50*65536+219         ; [x start] *65536 + [x size]
753
    mov  ecx,100*65536+168         ; [y start] *65536 + [y size]
754
    mov  edx,0x03ffffff            ; color of work area RRGGBB
755
    mov  esi,0x8099bbff            ; color of grab bar  RRGGBB,8->color glide
756
    mov  edi,0x0099bbee            ; color of frames    RRGGBB
757
    int  0x40
758
                                   ; WINDOW LABEL
759
    mov  eax,4                     ; function 4 : write text to window
760
    mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
147 diamond 761
    mov  ecx,0x1000ffff            ; color of text RRGGBB
31 halyavin 762
    mov  edx,labelt                ; pointer to text beginning
763
    mov  esi,labellen-labelt       ; text length
764
    int  0x40
765
 
766
    mov  eax,13                    ;bar
767
    mov  ebx,8 shl 16 + 204
768
    mov  ecx,28 shl 16 + 84
769
    mov  edx,0x000fe6f5
770
    int  0x40
771
 
772
    ;info ->
773
    mov  eax,4
774
    mov  ebx,63 shl 16 + 120
775
    mov  ecx,0x00111111
776
    mov  edx,playing_trk_info
777
    mov  esi,6
778
    int 0x40
779
    mov  ebx,120 shl 16 + 120
780
    mov  edx,playing_time_info
781
;    mov  esi,5
782
    dec  esi
783
    int 0x40
784
    mov  ebx,178 shl 16 + 120
785
    mov  edx,slash
786
    mov  esi,1
787
    int 0x40
788
    mov  ebx,196 shl 16 + 120
789
    mov  edx,column
790
;    mov  esi,1
791
    int 0x40
792
    mov  ebx,161 shl 16 + 120
793
    mov  edx,column
794
;    mov  esi,1
795
    int 0x40
796
    ;info <-
797
 
798
; button  MODE
799
    mov  eax,8
800
    mov  ebx,12*65536+20
801
    mov  ecx,135*65536+20
802
    mov  edx,7
803
    mov  esi,COLOR_FUNC_BUTS
804
    int 0x40
805
   ; text
806
    mov  eax,4
807
    mov  ebx,19*65536+142
147 diamond 808
    mov  ecx,0x100f73f5;ffff0f
31 halyavin 809
    mov  edx,but_mode_lab
810
    mov  esi,1
811
    int  0x40
812
 
813
; button  BACK
814
    mov  eax,8
815
    mov  ebx,37*65536+20
816
    mov  ecx,135*65536+20
817
    mov  edx,6
818
    mov  esi,COLOR_FUNC_BUTS
819
    int 0x40
820
    mov [coord_x],51
821
    mov [coord_y],141
822
    call draw_left_triangle
823
    mov [coord_x],44
824
    call draw_vertical_line
825
 
826
; button  NEXT
827
    mov  eax,8
828
    mov  ebx,62*65536+20
829
    mov  ecx,135*65536+20
830
    mov  edx,5
831
    mov  esi,COLOR_FUNC_BUTS
832
    int 0x40
833
    mov [coord_x],68
834
    mov [coord_y],141
835
    call draw_right_triangle
836
    mov [coord_x],74
837
    call draw_vertical_line
838
 
839
; button  REWIND
840
    mov  eax,8
841
    mov  ebx,87*65536+20
842
    mov  ecx,135*65536+20
843
    mov  edx,8
844
    mov  esi,COLOR_FUNC_BUTS
845
    int 0x40
846
    mov [coord_x],102
847
    mov [coord_y],141
848
    call draw_left_triangle
849
    mov [coord_x],97
850
    call draw_left_triangle
851
 
852
; button   STOP
853
    mov  eax,8
854
    mov  ebx,112*65536+20
855
    mov  ecx,135*65536+20
856
    mov  edx,3
857
    mov  esi,COLOR_FUNC_BUTS
858
    int 0x40
859
    mov [coord_x],118
860
    mov [coord_y],142
861
    call draw_square
862
 
863
 
864
; button  PLAY
865
    mov  eax,8
866
    mov  ebx,137*65536+20
867
    mov  ecx,135*65536+20
868
    mov  edx,2
869
    mov  esi,COLOR_FUNC_BUTS
870
    int 0x40
871
    cmp [if_stopped],TRUE
872
    je  playing_paused
873
    cmp [if_paused],TRUE
874
    je  playing_paused
875
    mov [coord_x],144
876
    mov [coord_y],141
877
    call draw_vertical_line
878
    mov [coord_x],149
879
    call draw_vertical_line
880
    jmp end_draw_play
881
   playing_paused:
882
    mov [coord_x],144
883
    mov [coord_y],141
884
    call draw_right_triangle
885
   end_draw_play:
886
 
887
 
888
; button   FORWARD
889
    mov  eax,8
890
    mov  ebx,162*65536+20
891
    mov  ecx,135*65536+20
892
    mov  edx,9
893
    mov  esi,COLOR_FUNC_BUTS
894
    int 0x40
895
    mov [coord_x],167
896
    mov [coord_y],141
897
    call draw_right_triangle
898
    mov [coord_x],172
899
    call draw_right_triangle
900
 
901
; button  RE-READ PLAYLIST
902
    mov  eax,8
903
    mov  ebx,187*65536+20
904
    mov  ecx,135*65536+20
905
    mov  edx,4
906
    mov  esi,COLOR_FUNC_BUTS
907
    int 0x40
908
    mov  [coord_x],192
909
    mov  [coord_y],140
910
    call draw_vert_list_line
911
    dec  [coord_y]
912
    call draw_hor_list_line
913
    mov  [coord_y], 151
914
    call draw_hor_list_line
915
    mov  [coord_x],202
916
    mov  [coord_y],140
917
    call draw_vert_list_line
918
    mov  [coord_x],195
919
    mov  [coord_y], 142
920
    call draw_str_list_line
921
    mov  [coord_y],145
922
    call draw_str_list_line
923
    mov  [coord_y],148
924
    call draw_str_list_line
925
 
926
    cmp  [flag],1
927
    jne  flag2
928
;Draw tracs buttons
929
    xor  eax,eax
930
    xor  ebx,ebx
931
    mov  ecx,10
932
    mov  al,[cdp+3]
933
    mov  [max_trk],al
934
    xor  edi,edi
935
    mov  di,ax
936
    mov  [posx],12
937
    mov  [posy],32
938
    mov  [tracs],1
939
 draw_tracs_buttons:
940
    mov  eax,8
941
    xor  ebx,ebx
942
    mov  bl,[posx]
943
    shl  ebx,16
944
    add  ebx,15
945
    xor  ecx,ecx
946
    mov  cl,[posy]
947
    shl  ecx,16
948
    add  ecx,15
949
    xor  edx,edx
950
    mov  dx,[tracs]
951
    add  edx,10
952
    mov  esi,0xaaaaaa
953
    add  esi,edi
954
    int  0x40
955
   ;---draw tracs numbers
956
    mov  eax,47
957
    xor  ebx,ebx
958
    mov  bl,0
959
    or   ebx,0x20000            ;number of digits to draw
960
    xor  ecx,ecx
961
    mov  cx, [tracs]            ;number to draw
962
    xor  edx,edx
963
    mov  dl,[posx]
964
    add  dl,3
965
    shl  edx,16
966
    add  dl,[posy]
967
    add  dl,5
968
    mov  esi,0xffffff
969
    int 0x40
970
   ;---
971
    mov  al,[posx]
972
    add  al,20
973
    mov  [posx],al
974
    xor  eax,eax
975
    mov  ax,[tracs]
976
    mov  bl,10
977
    div  bl
978
    cmp  ah,0
979
    jnz  no_new_str
980
    mov  al,[posxstart]
981
    mov  [posx], al
982
    mov  al,[posy]
983
    add  al,20
984
    mov  [posy],al
985
  no_new_str:
986
    inc  [tracs]
987
    cmp  [tracs],41
988
    je   flag2
989
    dec  edi
990
    cmp  edi,0
991
    jnz  draw_tracs_buttons
992
 
993
  flag2:
994
    cmp [flag],2
995
    jne flag3
996
    mov eax,4
997
    mov ebx, 20 shl 16 +67
147 diamond 998
    mov ecx,0x10ffff00
31 halyavin 999
    mov edx,define_cdrom
1000
    mov esi,define_cdrom_len-define_cdrom
1001
    int 0x40
1002
  flag3:
1003
    cmp [flag],3
1004
    jne flag4
1005
    mov eax,4
1006
    mov ebx, 47 shl 16 +67
147 diamond 1007
    mov ecx,0x10ffff00
31 halyavin 1008
    mov edx,no_cda
1009
    mov esi,no_cda_len-no_cda
1010
    int 0x40
1011
  flag4:
1012
    cmp [flag],4
1013
    jne flag5
1014
   ;help screen
1015
   cmp [help_screen],1
1016
   jnz @hs2
1017
   mov edx,help1
1018
   jmp @ehs
1019
  @hs2:
1020
   cmp [help_screen],2
1021
   jnz @hs3
1022
   mov edx,help2
1023
   jmp @ehs
1024
  @hs3:
1025
   mov edx,help3
1026
  @ehs:
1027
   xor edi,edi
1028
   mov ebx,25*65536+30
1029
  new_line:
1030
   mov eax,4
1031
   mov ecx,0x111111
1032
   mov esi,31
1033
   int 0x40
1034
  noline:
1035
   add ebx,10
1036
   add edx,31
1037
   inc edi
1038
   cmp [edx],byte 'x'
1039
   jnz new_line
1040
  flag5:
1041
  call draw_info
1042
 
1043
    mov  eax,12                    ; function 12:tell os about windowdraw
1044
    mov  ebx,2                     ; 2, end of draw
1045
    int  0x40
1046
 
1047
ret
1048
 
1049
draw_right_triangle:
1050
    mov ebx,[coord_x]
1051
    mov ecx,[coord_y]
1052
    mov edx,0x00111111
1053
    mov esi,5
1054
    mov eax,9
1055
   start_draw_pixel:
1056
    push ebx
1057
    cmp  eax,5
1058
    jb   y_menshe_5
1059
    mov  esi,10
1060
    sub  esi,eax
1061
    jmp  draw_pixel
1062
   y_menshe_5:
1063
    mov  esi,eax
1064
   draw_pixel:
1065
    dec  esi
1066
    inc  ebx
1067
    push eax
1068
    mov  eax,1
1069
    int  0x40
1070
    pop  eax
1071
    cmp  esi,0
1072
    jne  draw_pixel
1073
    pop  ebx
1074
    dec  eax
1075
    inc  ecx
1076
    cmp  eax,0
1077
    jne  start_draw_pixel
1078
ret
1079
 
1080
draw_square:
1081
    mov ebx,[coord_x]
1082
    mov ecx,[coord_y]
1083
    mov edx,0x00111111
1084
    mov eax,7
1085
   q_start_draw_pixel:
1086
    push ebx
1087
    mov  esi,7
1088
   q_draw_pixel:
1089
    dec  esi
1090
    inc  ebx
1091
    push eax
1092
    mov  eax,1
1093
    int  0x40
1094
    pop  eax
1095
    cmp  esi,0
1096
    jne  q_draw_pixel
1097
    pop  ebx
1098
    dec  eax
1099
    inc  ecx
1100
    cmp  eax,0
1101
    jne  q_start_draw_pixel
1102
ret
1103
 
1104
draw_left_triangle:
1105
    mov ebx,[coord_x]
1106
    mov ecx,[coord_y]
1107
    mov edx,0x00111111
1108
    mov esi,5
1109
    mov eax,9
1110
   l_start_draw_pixel:
1111
    push ebx
1112
    cmp  eax,5
1113
    jb   l_y_menshe_5
1114
    mov  esi,10
1115
    sub  esi,eax
1116
    jmp  l_draw_pixel
1117
   l_y_menshe_5:
1118
    mov  esi,eax
1119
   l_draw_pixel:
1120
    dec  esi
1121
    dec  ebx
1122
    push eax
1123
    mov  eax,1
1124
    int  0x40
1125
    pop  eax
1126
    cmp  esi,0
1127
    jne  l_draw_pixel
1128
    pop  ebx
1129
    dec  eax
1130
    inc  ecx
1131
    cmp  eax,0
1132
    jne  l_start_draw_pixel
1133
ret
1134
 
1135
draw_vertical_line:
1136
    mov  eax,2
1137
    mov  ebx,[coord_x]
1138
    mov  edx,0x00111111
1139
  @@draw_2_line:
1140
    mov  ecx,[coord_y]
1141
    dec  ecx
1142
    mov  esi,9
1143
   start_draw_vline:
1144
    inc  ecx
1145
    push eax
1146
    mov  eax,1
1147
    int  0x40
1148
    pop  eax
1149
    dec  esi
1150
    cmp  esi,0
1151
    jne  start_draw_vline
1152
    dec  eax
1153
    inc ebx
1154
    cmp  eax,0
1155
    jne  @@draw_2_line
1156
ret
1157
 
1158
draw_vert_list_line:
1159
    mov  eax,1
1160
    mov  ebx,[coord_x]
1161
    mov  edx,0x00111111
1162
    mov  ecx,[coord_y]
1163
    dec  ecx
1164
    mov  esi,11
1165
   vlstart_draw_vline:
1166
    inc  ecx
1167
    int  0x40
1168
    dec  esi
1169
    cmp  esi,0
1170
    jne  vlstart_draw_vline
1171
    dec  eax
1172
    inc ebx
1173
ret
1174
 
1175
draw_hor_list_line:
1176
    mov  eax,1
1177
    mov  ebx,[coord_x]
1178
    mov  edx,0x00111111
1179
    mov  ecx,[coord_y]
1180
    dec  ebx
1181
    mov  esi,11
1182
   hlstart_draw_vline:
1183
    inc  ebx
1184
    int  0x40
1185
    dec  esi
1186
    cmp  esi,0
1187
    jne  hlstart_draw_vline
1188
    dec  eax
1189
    inc ebx
1190
ret
1191
 
1192
draw_str_list_line:
1193
    mov  eax,1
1194
    mov  ebx,[coord_x]
1195
    mov  edx,0x00111111
1196
    mov  ecx,[coord_y]
1197
    dec  ebx
1198
    mov  esi,5
1199
   slstart_draw_vline:
1200
    inc  ebx
1201
    int  0x40
1202
    dec  esi
1203
    cmp  esi,0
1204
    jne  slstart_draw_vline
1205
    dec  eax
1206
    inc ebx
1207
ret
1208
 
1209
 
1210
 chk_cdrom:
1211
    mov eax,24
1212
    mov ebx,1
1213
    int 0x40
1214
    cmp eax,0
1215
    je chk_cdrom_ok
1216
    mov [flag],2
1217
    call draw_window
1218
    jmp  chk_cdrom_end
1219
   chk_cdrom_ok:
1220
    mov [flag],0
1221
   chk_cdrom_end:
1222
ret
1223
 
1224
read_cd:
1225
    mov [if_stopped],TRUE
1226
    push ax
1227
    cmp [flag],2
1228
    je  read_cd_end
1229
    mov al,101
1230
    mov [cdp+3],al
1231
    mov eax,24
1232
    mov ebx,2
1233
    mov ecx, cdp
1234
    mov edx,321
1235
    int 0x40
1236
    mov [flag],1
1237
    mov al,100
1238
    cmp [cdp+3],al
1239
    jb  read_cd_end
1240
    mov [flag],3
1241
    call draw_window
1242
 read_cd_end:
1243
    pop ax
1244
ret
1245
 
1246
get_uptime:
1247
    push ebx
1248
    mov  eax,26
1249
    mov  ebx,9
1250
    int  0x40
1251
    pop  ebx
1252
ret
1253
 
1254
; DATA AREA
1255
 
1256
paused_time dd 0
1257
if_paused db FALSE
1258
coord_x dd 0
1259
coord_y dd 0
1260
flag db 0
1261
tracs dw 1
1262
posx db 12
1263
posy db 32
1264
posxstart db 12
1265
curr_trk db 0
1266
max_trk db 0
1267
stimtrk dd 0
1268
help_screen db 0
1269
next_pos_sec dd 0
1270
curr_trk_length dd 0
1271
curr_trk_pg_time dd 0
1272
was_it_ok db FALSE
1273
if_stopped db FALSE
1274
mode db NORMAL_PLAY
1275
 
1276
shuftab  db 00,01,02,03,04,05,06,07,08,09
1277
         db 10,11,12,13,14,15,16,17,18,19
1278
         db 20,21,22,23,24,25,26,27,28,29
1279
         db 30,31,32,33,34,35,36,37,38,39
1280
         db 40
1281
 
1282
but_mode_lab: db 'M'
1283
 
1284
playing_time_info: db 'Time '
1285
slash  db '/'
1286
column db ':'
1287
mode_normal db     'Normal '
1288
mode_repeat_1 db   'Rep trk'
1289
mode_repeat_all db 'Rep all'
1290
mode_shuffle db    'Shuffle'
1291
playing_trk_info: db 'Track '
1292
 
1293
define_cdrom: db 'Please, define your CD-ROM'
1294
define_cdrom_len:
1295
 
1296
no_cda: db 'Audio CD not found'
1297
no_cda_len:
1298
 
1299
labelt:
1300
   db   'CD player'
1301
labellen:
1302
 
1303
help1: db 'HotKeys:                       '
1304
       db 'H - this screen (Help)         '
1305
       db 'P - Play/Pause current track   '
1306
       db 'S - Stop playing               '
1307
       db 'L - re-read playList           '
1308
       db 'N - play Next track            '
1309
       db 'B - play previous track (Back) '
1310
       db '                        next ->'
1311
       db 'x'
1312
help2: db 'HotKeys:                       '
1313
       db 'F - fast Forward track         '
1314
       db 'R - fast Rewind track          '
1315
       db 'M - change Mode                '
1316
       db '                               '
1317
       db '                               '
1318
       db '                               '
1319
       db '<- prev                 next ->'
1320
       db 'x'
1321
help3: db 'About:                         '
1322
       db 'Audio CD Player ver 1.1beta-2  '
1323
       db 'All questions, wishes and      '
1324
       db 'advices please send to:        '
1325
       db '       E-mail:  dma@bn.by      '
1326
       db '       FidoNet: 2:450/258.75   '
1327
       db '                               '
1328
       db '<- prev                        '
1329
       db 'x'
1330
cdp:
1331
 
1332
 I_END: