Subversion Repositories Kolibri OS

Rev

Rev 551 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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