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
;    TFTP Wave Player
3
;
4
;    Compile with FASM for Menuet
5
;
6
;
7
;    12.7.2002 - Audio system calls by VT
8
;
9
 
10
use32
331 heavyiron 11
 org	0x0
12
 db	'MENUET01'    ; header
13
 dd	0x01	      ; header version
14
 dd	START	      ; entry point
15
 dd	I_END	      ; image size
16
 dd	I_END+0x10000 ; required memory
17
 dd	I_END+0x10000 ; esp
18
 dd	0x0 , 0x0     ; I_Param , I_Path
31 halyavin 19
 
20
include 'lang.inc'
21
include 'macros.inc'
22
 
331 heavyiron 23
delay	   dd  145
31 halyavin 24
wait_for   dd  0x0
25
 
331 heavyiron 26
START:				; start of execution
31 halyavin 27
 
28
    mov  dword [prompt], p9
29
    mov  dword [promptlen], p9len - p9
30
 
331 heavyiron 31
    call draw_window		; at first, draw the window
31 halyavin 32
 
33
still:
34
 
331 heavyiron 35
    mov  eax,10 		; wait here for event
31 halyavin 36
    int  0x40
37
 
331 heavyiron 38
    cmp  eax,1			; redraw request ?
39
    jz	 red
40
    cmp  eax,2			; key in buffer ?
41
    jz	 key
42
    cmp  eax,3			; button in buffer ?
43
    jz	 button
31 halyavin 44
 
45
    jmp  still
46
 
331 heavyiron 47
red:			       ; redraw
31 halyavin 48
    call draw_window
49
    jmp  still
50
 
331 heavyiron 51
key:			       ; Keys are not valid at this part of the
52
    mov  eax,2			; loop. Just read it and ignore
31 halyavin 53
    int  0x40
54
    jmp  still
55
 
331 heavyiron 56
button: 		       ; button
57
    mov  eax,17 		; get id
31 halyavin 58
    int  0x40
59
 
331 heavyiron 60
    cmp  ah,1			; button id=1 ?
31 halyavin 61
    jnz  noclose
62
 
63
 
64
    ; close socket before exiting
65
 mov  eax, 53
66
 mov  ebx, 1
67
 mov  ecx, [socketNum]
68
    int   0x40
69
 
70
 mov  [socketNum], dword 0
71
 
72
 
331 heavyiron 73
    mov  eax,0xffffffff 	; close this program
31 halyavin 74
    int  0x40
75
 
76
noclose:
331 heavyiron 77
    cmp  ah,2			; copy file to local machine?
31 halyavin 78
    jnz  nocopyl
79
 
80
    mov   dword [prompt], p5
81
    mov  dword [promptlen], p5len - p5
331 heavyiron 82
    call  draw_window		 ;
31 halyavin 83
 
84
    ; Copy File from Remote Host to this machine
331 heavyiron 85
    call translateData	; Convert Filename & IP address
31 halyavin 86
    mov  edi, tftp_filename + 1
87
    mov  [edi], byte 0x01 ; setup tftp msg
88
    call copyFromRemote
89
 
90
    jmp  still
91
 
92
nocopyl:
93
 
94
 
95
    cmp  ah,4
331 heavyiron 96
    jz	 f1
31 halyavin 97
    cmp  ah,5
331 heavyiron 98
    jz	 f2
31 halyavin 99
    jmp  nof12
100
 
101
  f1:
102
    mov  [addr],dword source
103
    mov  [ya],dword 35
104
    jmp  rk
105
 
106
  f2:
107
    mov  [addr],dword destination
108
    mov  [ya],dword 35+16
109
 
110
  rk:
111
    mov  ecx,15
112
    mov  edi,[addr]
113
    mov  al,' '
114
    rep  stosb
115
 
116
    call print_text
117
 
118
    mov  edi,[addr]
119
 
120
  f11:
121
    mov  eax,10
122
    int  0x40
123
    cmp  eax,2
331 heavyiron 124
    jz	 fbu
31 halyavin 125
    jmp  still
126
  fbu:
127
    mov  eax,2
128
    int  0x40  ; get key
129
    shr  eax,8
130
    cmp  eax,8
131
    jnz  nobs
132
    cmp  edi,[addr]
331 heavyiron 133
    jz	 f11
31 halyavin 134
    sub  edi,1
135
    mov  [edi],byte ' '
136
    call print_text
137
    jmp  f11
138
  nobs:
139
    cmp  eax,dword 31
140
    jbe  f11
141
    cmp  eax,dword 95
331 heavyiron 142
    jb	 keyok
31 halyavin 143
    sub  eax,32
144
  keyok:
145
    mov  [edi],al
146
 
147
    call print_text
148
 
149
    add  edi,1
150
    mov  esi,[addr]
151
    add  esi,15
152
    cmp  esi,edi
153
    jnz  f11
154
 
155
    jmp  still
156
 
157
print_text:
158
 
159
    mov  eax,13
160
    mov  ebx,103*65536+15*6
161
    mov  ecx,[ya]
162
    shl  ecx,16
163
    mov  cx,8
164
    mov  edx,0x224466
165
    int  0x40
166
 
167
    mov  eax,4
168
    mov  ebx,103*65536
169
    add  ebx,[ya]
170
    mov  ecx,0xffffff
171
    mov  edx,[addr]
172
    mov  esi,15
173
    int  0x40
174
 
175
    ret
176
 
177
 
178
  nof12:
179
    jmp  still
180
 
181
 
182
;***************************************************************************
183
;   Function
184
;      translateData
185
;
186
;   Description
187
;      Coverts the filename and IP address typed in by the user into
188
;      a format suitable for the IP layer.
189
;
190
;    The filename, in source, is converted and stored in tftp_filename
191
;      The host ip, in destination, is converted and stored in tftp_IP
192
;
193
;***************************************************************************
194
translateData:
195
 
196
 ; first, build up the tftp command string. This includes the filename
197
 ; and the transfer protocol
198
 
199
 
200
 ; First, write 0,0
201
 mov  al, 0
202
 mov  edi, tftp_filename
203
 mov  [edi], al
204
 inc  edi
205
 mov  [edi], al
206
 inc  edi
207
 
208
 ; Now, write the file name itself, and null terminate it
209
 mov  ecx, 15
210
 mov  ah, ' '
211
 mov  esi, source
212
 
213
td001:
214
 lodsb
215
 stosb
216
 cmp  al, ah
217
 loopnz td001
218
 
219
 cmp  al,ah  ; Was the entire buffer full of characters?
220
 jne  td002
221
 dec  edi   ; No - so remove ' ' character
222
 
223
td002:
224
 mov  [edi], byte 0
225
 inc  edi
226
 mov  [edi], byte 'O'
227
 inc  edi
228
 mov  [edi], byte 'C'
229
 inc  edi
230
 mov  [edi], byte 'T'
231
 inc  edi
232
 mov  [edi], byte 'E'
233
 inc  edi
234
 mov  [edi], byte 'T'
235
 inc  edi
236
 mov  [edi], byte 0
237
 
238
 mov  esi, tftp_filename
239
 sub  edi, esi
240
 mov  [tftp_len], edi
241
 
242
 
243
 ; Now, convert the typed IP address into a real address
244
 ; No validation is done on the number entered
245
 ; ip addresses must be typed in normally, eg
246
 ; 192.1.45.24
247
 
248
 xor  eax, eax
249
 mov  dh, 10
250
 mov  dl, al
251
 mov  [tftp_IP], eax
252
 
253
 ; 192.168.24.1   1.1.1.1       1. 9.2.3.
254
 
255
 mov  esi, destination
256
 mov  edi, tftp_IP
257
 
258
 mov  ecx, 4
259
 
260
td003:
261
 lodsb
262
 sub  al, '0'
263
 add  dl, al
264
 lodsb
265
 cmp  al, '.'
266
 je  ipNext
267
 cmp  al, ' '
268
 je  ipNext
269
 mov  dh, al
270
 sub  dh, '0'
271
 mov  al, 10
272
 mul  dl
273
 add  al, dh
274
 mov  dl, al
275
 lodsb
276
 cmp  al, '.'
277
 je  ipNext
278
 cmp  al, ' '
279
 je  ipNext
280
 mov  dh, al
281
 sub  dh, '0'
282
 mov  al, 10
283
 mul  dl
284
 add  al, dh
285
 mov  dl, al
286
 lodsb
287
 
288
ipNext:
289
 mov  [edi], dl
290
 inc  edi
291
 mov  dl, 0
292
 loop td003
293
 
294
 ret
295
 
296
 
297
 
298
;***************************************************************************
299
;   Function
300
;      copyFromRemote
301
;
302
;   Description
303
;
304
;***************************************************************************
305
copyFromRemote:
306
 
307
 mov  eax,0x20000-512
308
 mov  [fileposition], eax
309
 
310
 ; Get a random # for the local socket port #
311
 mov  eax, 3
312
 int  0x40
313
 mov  ecx, eax
331 heavyiron 314
 shr  ecx, 8	; Set up the local port # with a random #
31 halyavin 315
 
316
   ; open socket
317
 mov  eax, 53
318
 mov  ebx, 0
331 heavyiron 319
 mov  edx, 69	 ; remote port
31 halyavin 320
 mov  esi, [tftp_IP]  ; remote IP ( in intenet format )
321
 int  0x40
322
 
323
 mov  [socketNum], eax
324
 
325
 ; make sure there is no data in the socket - there shouldn't be..
326
 
327
cfr001:
328
 mov  eax, 53
329
 mov  ebx, 3
330
 mov  ecx, [socketNum]
331
 int  0x40    ; read byte
332
 
333
 mov  eax, 53
334
 mov  ebx, 2
335
 mov  ecx, [socketNum]
336
 int  0x40    ; any more data?
337
 
338
 cmp  eax, 0
331 heavyiron 339
 jne  cfr001	; yes, so get it
31 halyavin 340
 
341
 ; Now, request the file
342
 mov  eax, 53
343
 mov  ebx, 4
344
 mov  ecx, [socketNum]
345
 mov  edx, [tftp_len]
346
 mov  esi, tftp_filename
347
 int  0x40
348
 
349
cfr002:
350
 
331 heavyiron 351
    mov  eax,23 		; wait here for event
352
    mov  ebx,1			; Time out after 10ms
31 halyavin 353
    int  0x40
354
 
331 heavyiron 355
    cmp  eax,1			; redraw request ?
356
    je	 cfr003
357
    cmp  eax,2			; key in buffer ?
358
    je	 cfr004
359
    cmp  eax,3			; button in buffer ?
360
    je	 cfr005
31 halyavin 361
 
362
    ; Any data to fetch?
363
 mov  eax, 53
364
 mov  ebx, 2
365
 mov  ecx, [socketNum]
366
 int   0x40
367
 
368
 cmp  eax, 0
369
 je  cfr002
370
 
371
 push eax     ; eax holds # chars
372
 
373
 ; Update the text on the display - once
374
 mov  eax, [prompt]
375
 cmp  eax, p3
376
 je  cfr008
377
 mov   dword [prompt], p3
378
 mov  dword [promptlen], p3len - p3
331 heavyiron 379
 call  draw_window	      ;
31 halyavin 380
 
381
cfr008:
382
 ; we have data - this will be a tftp frame
383
 
384
 ; read first two bytes - opcode
385
 mov  eax, 53
386
 mov  ebx, 3
387
 mov  ecx, [socketNum]
388
 int  0x40   ; read byte
389
 
390
 mov  eax, 53
391
 mov  ebx, 3
392
 mov  ecx, [socketNum]
393
 int  0x40   ; read byte
394
 
395
 pop  eax
396
 ; bl holds tftp opcode. Can only be 3 (data) or 5 ( error )
397
 
398
 cmp  bl, 3
399
 jne  cfrerr
400
 
401
 push eax
402
 
403
 ; do data stuff. Read block #. Read data. Send Ack.
404
 mov  eax, 53
405
 mov  ebx, 3
406
 mov  ecx, [socketNum]
407
 int  0x40   ; read byte
408
 
409
 mov  [blockNumber], bl
410
 
411
 mov  eax, 53
412
 mov  ebx, 3
413
 mov  ecx, [socketNum]
414
 int  0x40   ; read byte
415
 
416
 mov  [blockNumber+1], bl
417
 
418
cfr007:
419
 mov  eax, 53
420
 mov  ebx, 3
421
 mov  ecx, [socketNum]
422
 int  0x40   ; read byte
423
 
424
 mov  esi, [fileposition]
425
 mov  [esi], bl
426
 mov  [esi+1],bl
427
 add  dword [fileposition],2
428
 
429
 mov  eax, 53
430
 mov  ebx, 2
431
 mov  ecx, [socketNum]
432
 int  0x40   ; any more data?
433
 
434
 cmp  eax, 0
435
 jne  cfr007  ; yes, so get it
436
 
437
 cmp  [fileposition],0x20000+0xffff
438
 jb   get_more_stream
439
 
440
wait_more:
441
 
442
 mov  eax,5    ; wait for correct timer position
331 heavyiron 443
	       ; to trigger new play block
31 halyavin 444
 mov  ebx,1
445
 int  0x40
446
 
447
 mov  eax,26
448
 mov  ebx,9
449
 int  0x40
450
 
451
 cmp  eax,[wait_for]
452
 jb   wait_more
453
 
454
 add  eax,[delay]
455
 mov  [wait_for],eax
456
 
457
 mov  esi,0x20000
458
 mov  edi,0x10000
459
 mov  ecx,65536
460
 cld
461
 rep  movsb
462
 
463
 mov  eax,55
464
 mov  ebx,0
465
 mov  ecx,0x10000
466
 int  0x40
467
 
468
 mov  eax,55
469
 mov  ebx,1
470
 int  0x40
471
 
472
 mov  [fileposition],0x20000
473
 
474
get_more_stream:
475
 
476
 ; write the block number into the ack
477
 mov  al, [blockNumber]
478
 mov  [ack + 2], al
479
 
480
 mov  al, [blockNumber+1]
481
 mov  [ack + 3], al
482
 
483
 ; send an 'ack'
484
 mov  eax, 53
485
 mov  ebx, 4
486
 mov  ecx, [socketNum]
487
 mov  edx, ackLen - ack
488
 mov  esi, ack
489
 int   0x40
490
 
491
 ; If # of chars in the frame is less that 516,
492
 ; this frame is the last
493
 pop  eax
494
 cmp  eax, 516
495
 je  cfr002
496
 
497
 ; Write the file
498
 mov  eax, 33
499
 mov  ebx, source
500
 mov  edx, [filesize]
501
 mov  ecx, I_END + 512
502
 mov  esi, 0
503
 int  0x40
504
 
505
 jmp  cfrexit
506
 
507
cfrerr:
508
 ; simple implementation on error - just read all data, and return
509
 mov  eax, 53
510
 mov  ebx, 3
511
 mov  ecx, [socketNum]
331 heavyiron 512
    int   0x40	  ; read byte
31 halyavin 513
 
514
 mov  eax, 53
515
 mov  ebx, 2
516
 mov  ecx, [socketNum]
331 heavyiron 517
    int   0x40	  ; any more data?
31 halyavin 518
 
519
 cmp  eax, 0
331 heavyiron 520
 jne  cfrerr	; yes, so get it
31 halyavin 521
 
331 heavyiron 522
 jmp  cfr006	; close socket and close app
31 halyavin 523
 
331 heavyiron 524
cfr003: 			; redraw request
31 halyavin 525
    call draw_window
526
    jmp  cfr002
527
 
331 heavyiron 528
cfr004: 			; key pressed
529
    mov  eax,2			; just read it and ignore
31 halyavin 530
    int  0x40
531
    jmp  cfr002
532
 
331 heavyiron 533
cfr005: 		       ; button
534
    mov  eax,17 		; get id
31 halyavin 535
    int  0x40
536
 
331 heavyiron 537
    cmp  ah,1			; button id=1 ?
31 halyavin 538
    jne  cfr002     ; If not, ignore.
539
 
540
cfr006:
541
    ; close socket
542
 mov  eax, 53
543
 mov  ebx, 1
544
 mov  ecx, [socketNum]
545
    int   0x40
546
 
547
 mov  [socketNum], dword 0
548
 
331 heavyiron 549
    mov  eax,-1 		; close this program
31 halyavin 550
    int  0x40
551
 
552
    jmp $
553
 
554
cfrexit:
555
    ; close socket
556
 mov  eax, 53
557
 mov  ebx, 1
558
 mov  ecx, [socketNum]
559
    int   0x40
560
 
561
 mov  [socketNum], dword 0
562
 
563
    mov   dword [prompt], p4
564
    mov  dword [promptlen], p4len - p4
331 heavyiron 565
    call  draw_window		 ;
31 halyavin 566
 
567
 ret
568
 
569
 
570
 
571
 
572
;   *********************************************
573
;   *******  WINDOW DEFINITIONS AND DRAW ********
574
;   *********************************************
575
 
576
 
577
draw_window:
578
 
331 heavyiron 579
    mov  eax,12 		   ; function 12:tell os about windowdraw
580
    mov  ebx,1			   ; 1, start of draw
31 halyavin 581
    int  0x40
582
 
331 heavyiron 583
				   ; DRAW WINDOW
584
    mov  eax,0			   ; function 0 : define and draw window
585
    mov  ebx,100*65536+230	   ; [x start] *65536 + [x size]
586
    mov  ecx,100*65536+170	   ; [y start] *65536 + [y size]
587
    mov  edx,0x13224466 	   ; color of work area RRGGBB
588
    mov  edi,labelt
31 halyavin 589
    int  0x40
590
 
331 heavyiron 591
 
592
    mov  eax,8		    ; COPY BUTTON
31 halyavin 593
    mov  ebx,20*65536+190
594
    mov  ecx,79*65536+15
595
    mov  edx,3
596
    mov  esi,0x557799
597
;    int  0x40
598
 
331 heavyiron 599
    mov  eax,8		    ; DELETE BUTTON
31 halyavin 600
    mov  ebx,20*65536+190
601
    mov  ecx,111*65536+15
602
    mov  edx,2
603
    mov  esi,0x557799
604
    int  0x40
605
 
606
    mov  eax,8
607
    mov  ebx,200*65536+10
608
    mov  ecx,34*65536+10
609
    mov  edx,4
610
    mov  esi,0x557799
611
    int  0x40
612
 
613
    mov  eax,8
614
    mov  ebx,200*65536+10
615
    mov  ecx,50*65536+10
616
    mov  edx,5
617
    mov  esi,0x557799
618
    int  0x40
619
 
620
 
621
 ; Copy the file name to the screen buffer
622
 ; file name is same length as IP address, to
623
 ; make the math easier later.
624
    cld
625
    mov  esi,source
626
    mov  edi,text+13
627
    mov  ecx,15
628
    rep  movsb
629
 
630
 
631
 ; copy the IP address to the screen buffer
632
    mov  esi,destination
633
    mov  edi,text+40+13
634
    mov  ecx,15
635
    rep  movsb
636
 
637
  ; copy the prompt to the screen buffer
638
    mov  esi,[prompt]
639
    mov  edi,text+280
640
    mov  ecx,[promptlen]
641
    rep  movsb
642
 
643
    ; Re-draw the screen text
644
    cld
331 heavyiron 645
    mov  ebx,25*65536+35	   ; draw info text with function 4
31 halyavin 646
    mov  ecx,0xffffff
647
    mov  edx,text
648
    mov  esi,40
649
  newline:
650
    mov  eax,4
651
    int  0x40
652
    add  ebx,16
653
    add  edx,40
654
    cmp  [edx],byte 'x'
655
    jnz  newline
656
 
657
 
331 heavyiron 658
    mov  eax,12 		   ; function 12:tell os about windowdraw
659
    mov  ebx,2			   ; 2, end of draw
31 halyavin 660
    int  0x40
661
 
662
    ret
663
 
664
 
665
; DATA AREA
666
 
331 heavyiron 667
source	     db  'HEAT8M22.WAV   '
31 halyavin 668
destination  db  '192.168.1.24   '
669
 
670
 
331 heavyiron 671
tftp_filename:	times 15 + 9 db 0
31 halyavin 672
tftp_IP:   dd 0
673
tftp_len:   dd 0
674
 
675
addr  dd  0x0
676
ya    dd  0x0
677
 
678
fileposition dd 0 ; Points to the current point in the file
679
filesize  dd 0 ; The number of bytes written / left to write
680
fileblocksize dw 0 ; The number of bytes to send in this frame
681
 
682
text:
683
    db 'SOURCE FILE: xxxxxxxxxxxxxxx            '
684
    db 'HOST IP ADD: xxx.xxx.xxx.xxx            '
685
    db '                                        '
686
    db 'WAVE FORMAT: 8 BIT,MONO,22050HZ         '
687
    db '                                        '
688
    db '     SERVER -> PLAY FILE                '
689
    db '                                        '
690
    db '                                        '
331 heavyiron 691
    db 'x' ; <- END MARKER, DONT DELETE
31 halyavin 692
 
693
 
331 heavyiron 694
labelt	db   'TFTP Wave Player',0
31 halyavin 695
 
696
prompt: dd 0
697
promptlen: dd 0
698
 
699
 
700
p1:  db 'Waiting for Command '
701
p1len:
702
 
703
p9:  db 'Define SB with setup'
704
p9len:
705
 
706
p2:  db 'Sending File        '
707
p2len:
708
 
709
p3:  db 'Playing File        '
710
p3len:
711
 
712
p4:  db 'Complete            '
713
p4len:
714
 
715
p5:  db 'Contacting Host...  '
716
p5len:
717
 
718
p6:  db 'File not found.     '
719
p6len:
720
 
721
ack:
722
 db 00,04,0,1
723
ackLen:
724
 
725
socketNum:
726
 dd 0
727
 
728
blockNumber:
729
 dw 0
730
 
731
; This must be the last part of the file, because the blockBuffer
732
; continues at I_END.
733
blockBuffer:
734
 db 00, 03, 00, 01
735
I_END:
736