Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
134 diamond 1
; MIDI PLAYER FOR MENUET v1.0
2
; Written in pure assembler by Ivushkin Andrey aka Willow
3
;
4
;
5
; Created:      December 7, 2004
6
; Last changed: July 29, 2005
7
;
8
; COMPILE WITH FASM
9
 
141 diamond 10
PLAYLIST_PATH equ '/HD0/1/PLAYLIST.TXT'
134 diamond 11
APP_MEM   equ 150*1024
12
 
13
IPC_PLAY  equ 0xa1
14
IPC_PAUS  equ 0xa2
15
IPC_TRIG  equ 0xa3
16
IPC_UPDT  equ 0xb1
17
IPC_NEXT  equ 0xb2
18
 
19
LISTITEMS equ 40
20
WND_BACK  equ 0x24263c
21
PLY	  equ 63
22
WND_HEIGHT equ (PLY+9*LISTITEMS+10)+25
23
 
24
BTNS_XY   equ 14 shl 16+42
25
BTNS_SIZE equ 222 shl 16+17
26
 
27
BROWSE_X  equ 10 shl 16+8
28
BROWSE_Y  equ 26 shl 16+8
29
FN_XY	  equ 12 shl 16+15
30
BAR_WIDTH equ 251
31
BAR_X	  equ 10 shl 16
32
BAR_Y	  equ 29 shl 16+5
33
TOTALTIME_XY equ 124 shl 16+28
34
CURTIME_X equ 225 shl 16+40
35
CURTIME_Y equ 15 shl 16+11
36
CURTIME_XY equ 236 shl 16+15
37
 
38
NONCRITICAL_MSG equ 0
39
SOUND equ ON;OFF
40
OUTDUMP equ 0
41
OUTLINE equ 8
42
FL_SHUFFLE equ 0x01
43
FL_REPEAT  equ 0x02
44
FL_HIDDEN  equ 0x04
45
FL_MUTE    equ 0x08
46
FL_REVERSE equ 0x10
47
FL_ADD	   equ 0x20
48
FL_PLAY    equ 0x40
49
FL_LOCK    equ 0x80
50
FL_BOTTRED equ 0x100
51
FL_MULSEL  equ 0x8000
52
 
53
use32
54
  org	 0x0
55
 
56
  db	 'MENUET01'
57
  dd	 0x01
58
  dd	 START
59
  dd	 I_END
60
  dd	 APP_MEM
205 heavyiron 61
  dd	 APP_MEM - 1024
134 diamond 62
  dd	 I_PARAM
63
listsel    dd 0
64
channel dd 0
65
COLOR_ORDER equ MENUETOS
485 heavyiron 66
include '..\..\..\macros.inc' ; decrease code size (optional)
134 diamond 67
lang fix en
68
;purge mov
69
include 'debug.inc'
70
include 'dlg.inc'
71
include 'playlist.inc'
72
include 'gif_lite.inc'
73
bottom:
74
    file 'bottom.gif'
75
hdrimg:
76
    file 'hdr.gif'
77
btns:
78
    file 'buttons.gif'
79
START:
80
    or	 [flag],FL_BOTTRED;+FL_MUTE
81
    mov  ecx,ipcarea
82
    call init_ipc
83
    mcall 40,1000111b
84
    mov  esi,btns
85
    mov  edi,btn_raw
86
    mov  eax,hash_table
87
    call ReadGIF
88
    mov  esi,hdrimg
89
    mov  edi,hdr_raw
90
    mov  eax,hash_table
91
    call ReadGIF
92
    mov  esi,bottom
93
    mov  edi,bottom_raw
94
    mov  eax,hash_table
95
    call ReadGIF
96
    call respawn
97
    mcall 9,prcinfo,-1
98
    mov  edx,[ebx+30]
99
    mov  [parentPID],edx
100
    mov  esi,I_PARAM
101
    cmp  dword[esi],0
102
    jnz  .yesparam
103
    call PL_load
104
    cmp  [list_count],0
105
    je	 noparam
106
    mov  eax,[pl_ptr]
107
    or	 word[eax],FL_MULSEL
108
    jmp  auto_load
109
  .yesparam:
110
    mov  al,byte[esi]
111
    cmp  al,'/'
112
    je	 .defact
113
    mov  [param],al
114
    inc  esi
115
  .defact:
116
    mov  edi,filename;fnbuf
117
    mov  ecx,64
118
    rep  movsd
119
    jmp  open_file
120
clearpath:
121
    newline
122
    mov  [fname_len],0
123
  noparam:
124
    mov  [param],'W'
125
    or	 [flag],FL_ADD
126
    call fopen
127
  get_path:
128
    cmp  byte[filename],0
129
    jz	 still
130
  open_file:
131
    cmp  [param],'W'
132
    je	 .noplay
133
    cmp  [param],'H'
134
    jne  .nohidd
135
;    or   [flag],FL_PLAY
136
    or	 [flag],FL_HIDDEN
137
    call draw_window
138
    and  [flag],not FL_HIDDEN
139
    call Shade
140
;    jmp  .noplay
141
 
142
  .nohidd:
143
    or	 [flag],FL_PLAY
144
  .noplay:
145
    xor  eax,eax
146
    mov  [play_area],ax
147
    mov  [tick_count],eax
148
    mov  [delta],eax
149
    mov  [curnote],0x80
150
    mov  ecx,64
151
    mov  esi,filename
152
    mov  edi,I_PARAM
153
    rep  movsd
141 diamond 154
    mov  eax,70
134 diamond 155
    mov  ebx,file_info
485 heavyiron 156
    mcall
134 diamond 157
    add  ebx,workarea
158
    mov  [midi_limit],ebx
159
    mov  edi,I_PARAM
160
    call find_slash
161
    mov  [fn_ptr],edi
162
    mov  edi,filename
163
    call str_len
164
    mov  [fname_len],eax
165
midi_kill:
166
    call kill
167
include 'midilite.inc'
168
 
169
decode_end:
170
;    dpd  edi
171
;    dps  <13,10,'Notes='>
172
;    sub  edi,[midi_limit]
173
;    shr  edi,1
174
;    dpd  edi
175
    dps ' Notes: max='
176
    movzx eax,[max_note]
177
    dpd  eax
178
    dps 'min='
179
    movzx eax,[min_note]
180
    dpd  eax
181
    newline
182
;    sub  esi,workarea
183
;    jmp  _close
184
  .play:
185
    call kill
186
    call respawn
187
    xor  edx,edx
188
    mov  esi,[midi_limit]
189
    mov  [cur_ptr],esi
190
    mov  [cur_tick],edx
191
    mov  [delta],edx
192
  .count_ticks:
193
    lodsw
194
    test eax,eax
195
    jz	 .eof
196
    and  eax,0x7f
197
    add  edx,eax
198
    jmp  .count_ticks
199
  .eof:
200
    mov  [tick_count],edx
201
  if OUTDUMP eq 1
202
    mov  esi,[midi_limit]
203
    call out_dump
204
  end if
205
    and  [flag],not FL_LOCK
206
    test [flag],FL_PLAY
207
    jz	 .noplay
208
    call draw_window
209
    mcall 5,100
210
    mov  eax,IPC_PLAY
211
    call ipc_send
212
  .noplay:
213
    test [flag],FL_ADD
214
    jz	 red
215
    mov  esi,filename
216
    mov  ecx,[fname_len]
217
    movzx eax,[list_count]
218
    mov  [play_num],eax
219
 add_song:
220
    call PL_add
221
    and  [flag],not FL_ADD
222
red:
223
    call draw_window
224
still:
225
    mov  ecx,ipcarea
226
    call init_ipc
227
    mov  eax,10
485 heavyiron 228
    mcall
134 diamond 229
prc_event:
230
    test eax,eax
231
    jz	 still
232
  .evt:
233
    cmp  eax,1
234
    je	 red
235
    cmp  eax,2
236
    je	 key
237
    cmp  eax,3
238
    je	 button
239
    cmp  eax,7
240
    jne  still
241
    movzx eax,byte[ipcarea+16]
242
    cmp  eax,IPC_UPDT
243
    jne  .noupdt
244
    call draw_bar
245
    jmp  still
246
  .noupdt:
247
    cmp  eax,IPC_NEXT
248
    jne  still
249
    cmp  [param],'H'
250
    je	 _close
251
    xor  edx,edx
252
    test [flag],FL_SHUFFLE
253
    jz	 .noshuf
254
    mcall 26,9
255
    movzx ebx,byte[list_count]
256
    div  ebx
257
    mov  eax,edx
258
    jmp  play_
259
  .noshuf:
260
    test [flag],FL_REPEAT
261
    jnz  decode_end.play
262
    mov  eax,[play_num]
263
    inc  eax
264
    cmp  al,[list_count]
265
    jb	 bList.next
266
    mov  eax,IPC_PAUS
267
    call ipc_send
268
    jmp  red
269
 
270
if OUTDUMP eq 1
271
out_dump:
272
    mov  ecx,OUTLINE
273
  .next_byte:
274
    lodsd
275
    bswap eax
276
    dph  eax
277
    dps  ' '
278
    lodsd
279
    bswap eax
280
    dph  eax
281
    dps  <13,10>
282
    loop .next_byte
283
    ret
284
end if
285
 
286
str_len:
287
; in: edi-str ptr
288
; out: eax-str length
289
    push ecx edi
290
    xor  eax,eax
291
    mov  ecx,256
292
    repne scasb
293
    jecxz .nofn
294
    sub  edi,[esp]
295
    mov  eax,edi
296
  .nofn:
297
    pop  edi ecx
298
    ret
299
 
300
fopen:
301
    or	 [flag],FL_LOCK
302
    opendialog draw_window, ret_path, ret_path, filename
303
ret_path:
304
    and  [flag],not FL_LOCK
305
    ret
306
 
307
include 'event.inc'
308
include "thread.inc"
309
include "draw.inc"
310
; Здесь находятся данные программы:
311
 
312
     dd -2 shl 16+4,251,12 shl 16,29 shl 16+5
313
     dd 21,16
314
main_coo:
315
     dd 14 shl 16, 42 shl 16,23 shl 16
316
     dd 228 shl 16+38
317
     dd 14 shl 16+10
318
     dd 236 shl 16+15
319
btncoords:
320
     dd 120 shl 16+20, 1 shl 16+15
321
     dd 149 shl 16+44, 2 shl 16+12
322
     dd 195 shl 16+26, 2 shl 16+12
323
 
324
     dd -2 shl 16+4,54,63 shl 16,6 shl 16+4
325
     dd 6,6
326
main_coo2:
327
     dd 169 shl 16, 4 shl 16,9 shl 16
328
     dd 121 shl 16+40
329
     dd 3 shl 16+9
330
     dd 130 shl 16+4
331
btncoords2:
332
     dd 48 shl 16+6, 6
333
     dd 2000 shl 16+44, 2 shl 16+12
334
     dd 2000 shl 16+26, 2 shl 16+12
335
ipcarea    rb 20
336
ipcarea2   rb 20
337
 
338
dots	   db ':-'
339
text	   db 'tone>     chnl>  
340
text_end:
341
coo	   dd main_coo
342
play_limit dd playlist
343
pl_ptr	   dd playlist
344
param	   db 'W'
345
curnote    db 0x80
346
tick_count dd 0
141 diamond 347
dir_info:
348
        dd      1
349
        dd      0
350
        dd      0
351
        dd      1
352
        dd      dir_table
353
        db      0
354
        dd      filename
134 diamond 355
play_area  dw ?
356
file_info:
357
	   dd 0
358
	   dd 0
141 diamond 359
	   dd 0
205 heavyiron 360
fsize	   dd APP_MEM-2048-workarea     ; max size
134 diamond 361
	   dd workarea
362
I_END:	; конец программы
363
filename:
364
	   rb 1024+16
365
prcinfo    process_information
366
I_PARAM    rb 256
367
childPID   dd ?
368
parentPID  dd ?
369
play_num   dd ?
370
counter    dd ?
371
flag	   dd ?
372
fname_len  dd ?
373
fn_ptr	   dd ?
374
delta	   dd ?
375
cur_ptr    dd ?
376
cur_tick   dd ?
377
quarter    dd ?
378
octave	   db ?
379
tempo	   dd ?
380
midi_limit dd ?
381
track_len  dd ?
382
list_count db ?
383
cur_track  db ?
384
sel_track  db ?
385
ipcmsg	   db ?
386
fnbuf:
141 diamond 387
	   rb 1024
134 diamond 388
btn_raw    rb 222*17*3+12
389
hdr_raw    rb 275*29*3+12
390
bottom_raw rb 25*378*3+12
391
	   rb 4
392
playlist   rb 256*LISTITEMS
393
hash_table:
394
	   rd 4096
141 diamond 395
dir_table  rb 32+304
134 diamond 396
workarea: