Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;
3
;;   NNTP CLIENT v 0.1
4
;;
5
;;   (C) Ville Turjanmaa
6
;;
7
 
8
version equ '0.1'
9
 
10
include "lang.inc"
11
include "macros.inc"
12
 
13
  use32
14
  org    0x0
15
 
16
  db     'MENUET01'              ; 8 byte id
17
  dd     0x01                    ; header version
18
  dd     START                   ; start of code
19
  dd     I_END                   ; size of image
20
  dd     0x80000                 ; memory for app
21
  dd     0x80000                 ; esp
22
  dd     0x0 , 0x0               ; I_Param , I_Icon
23
 
24
 
25
connect_state  db  0,0,'Disconnected'
26
               db  1,3,'Trying..    '
27
               db  4,4,'Connected   '
28
               db  5,9,'Closing..   '
29
 
30
prev_state     dd  -1
31
 
32
space          dd  0x0
33
 
34
text_start     dd  0x0
35
 
36
text_current   dd  0x0
37
 
38
status     dd  0x0
39
 
40
server_ip  db  192,168,0,96
41
 
42
socket     dd  0x0
43
 
44
xpos       dd  0x0
45
ypos       dd  0x0
46
 
47
;;
48
 
49
group      db  'GROUP alt.test',13,10
50
           db  '                              '
51
 
52
grouplen   dd  16
53
 
54
stat       db  'STAT                          '
55
 
56
statlen    dd  0x0
57
 
58
article    db  'ARTICLE',13,10
59
articlelen:
60
 
61
;;
62
 
63
quit       db  'QUIT',13,10
64
quitlen:
65
 
66
xwait      dd  0x0
67
ywait      dd  0x0
68
 
69
article_n  dd  0x0
70
article_l  dd  0x0
71
 
72
article_start dd 0x0
73
article_last dd 0x0
74
article_all  dd 0x0
75
 
76
article_fetch dd 0x0
77
 
78
xpost      dd  0x0
79
 
80
edisave    dd  0x0
81
 
82
 
83
connection_status:
84
 
85
    pusha
86
 
87
    mov  eax,53
88
    mov  ebx,6
89
    mov  ecx,[socket]
90
    int  0x40
91
 
92
    cmp  eax,[prev_state]
93
    je   no_cos
94
 
95
    mov  [prev_state],eax
96
 
97
    mov  eax,13
98
    mov  ebx,435*65536+12*6
99
    mov  ecx,42*65536+10
100
    mov  edx,0xffffff
101
    int  0x40
102
 
103
    mov  ecx,-14
104
    mov  eax,[prev_state]
105
 
106
  next_test:
107
 
108
    add  ecx,14
109
 
110
    cmp  ecx,14*4
111
    je   no_cos
112
 
113
    cmp  al,[connect_state+ecx+0]
114
    jb   next_test
115
    cmp  al,[connect_state+ecx+1]
116
    jg   next_test
117
 
118
    mov  edx,ecx
119
    add  edx,2
120
    add  edx,connect_state
121
 
122
    mov  eax,4
123
    mov  ebx,435*65536+42
124
    mov  ecx,0x000000
125
    mov  esi,12
126
    int  0x40
127
 
128
  no_cos:
129
 
130
    popa
131
 
132
    ret
133
 
134
 
135
 
136
text_input:
137
 
138
    pusha
139
    mov  ecx,25
140
    mov  eax,32
141
    cld
142
    rep  stosb
143
    popa
144
 
145
    mov  [edisave],edi
146
 
147
  ti0:
148
 
149
    mov  [edi],byte ' '
150
    call draw_entries
151
 
152
    mov  eax,10
153
    int  0x40
154
 
155
    cmp  eax,2
156
    jne  no_more_text
157
 
158
    mov  eax,2
159
    int  0x40
160
 
161
    cmp   ah,8
162
    jne   no_bg
163
    cmp   edi,[edisave]
164
    je    ti0
165
    dec   edi
166
    jmp   ti0
167
   no_bg:
168
 
169
    cmp  ah,13
170
    je   no_more_text
171
 
172
    mov  [edi],ah
173
    inc  edi
174
 
175
    call draw_entries
176
 
177
    jmp  ti0
178
 
179
  no_more_text:
180
 
181
    mov  [xpost],edi
182
 
183
    ret
184
 
185
 
186
convert_text_to_ip:
187
 
188
    pusha
189
 
190
    mov   edi,server_ip
191
    mov   esi,text+10
192
    mov   eax,0
193
    mov   edx,[xpost]
194
  newsip:
195
    cmp   [esi],byte '.'
196
    je    sipn
197
    cmp   esi,edx
198
    jge   sipn
199
    movzx ebx,byte [esi]
200
    inc   esi
201
    imul  eax,10
202
    sub   ebx,48
203
    add   eax,ebx
204
    jmp   newsip
205
  sipn:
206
    mov   [edi],al
207
    xor   eax,eax
208
    inc   esi
209
    cmp   esi,text+50
210
    jg    sipnn
211
    inc   edi
212
    cmp   edi,server_ip+3
213
    jbe   newsip
214
  sipnn:
215
 
216
    popa
217
 
218
    ret
219
 
220
 
221
send_group:
222
 
223
    mov  eax,53
224
    mov  ebx,7
225
    mov  ecx,[socket]
226
    mov  edx,[grouplen]
227
    mov  esi,group
228
    int  0x40
229
    mov  [status],3
230
    call clear_text
231
    call save_coordinates
232
 
233
    ret
234
 
235
 
236
convert_number_to_text:
237
 
238
    pusha
239
 
240
    mov  eax,[esi]
241
    mov  ecx,0
242
  newch:
243
    inc  ecx
244
    xor  edx,edx
245
    mov  ebx,10
246
    div  ebx
247
    cmp  eax,0
248
    jne  newch
249
 
250
    add  edi,ecx
251
    dec  edi
252
    mov  [article_l],ecx
253
 
254
    mov  eax,[esi]
255
  newdiv:
256
    xor  edx,edx
257
    mov  ebx,10
258
    div  ebx
259
    add  edx,48
260
    mov  [edi],dl
261
    dec  edi
262
    loop newdiv
263
 
264
    popa
265
 
266
    ret
267
 
268
 
269
convert_text_to_number:
270
 
271
    pusha
272
 
273
    mov   edx,0
274
  newdigit:
275
    movzx eax,byte [esi]
276
    cmp   eax,'0'
277
    jb    cend
278
    cmp   eax,'9'
279
    jg    cend
280
    imul  edx,10
281
    add   edx,eax
282
    sub   edx,48
283
    inc   esi
284
    jmp   newdigit
285
  cend:
286
    mov   [edi],edx
287
    popa
288
 
289
    ret
290
 
291
 
292
clear_text:
293
 
294
    mov  [text_start],0
295
    mov  [xpos],0
296
    mov  [ypos],0
297
    mov  [xwait],0
298
    mov  [ywait],0
299
    mov  edi,nntp_text
300
    mov  ecx,0x50000
301
    mov  eax,32
302
    cld
303
    rep  stosb
304
    ret
305
 
306
 
307
state_machine_write:
308
 
309
 
310
    cmp  [status],2
311
    jne  no_22
312
    call send_group
313
    ret
314
  no_22:
315
 
316
    cmp  [status],4
317
    jne  no_4
318
    mov  eax,53
319
    mov  ebx,7
320
    mov  ecx,[socket]
321
    mov  edx,[statlen] ; -stat
322
    mov  esi,stat
323
    int  0x40
324
    mov  [status],5
325
    call save_coordinates
326
    ret
327
  no_4:
328
 
329
    cmp  [status],6
330
    jne  no_6
331
    mov  eax,53
332
    mov  ebx,7
333
    mov  ecx,[socket]
334
    mov  edx,articlelen-article
335
    mov  esi,article
336
    int  0x40
337
    mov  [status],7
338
    call save_coordinates
339
    ret
340
  no_6:
341
 
342
 
343
    ret
344
 
345
save_coordinates:
346
 
347
    mov  eax,[xpos]
348
    mov  ebx,[ypos]
349
    mov  [xwait],eax
350
    mov  [ywait],ebx
351
 
352
    ret
353
 
354
 
355
state_machine_read:
356
 
357
    cmp  [status],1
358
    jne  no_1
359
    mov  eax,'200 '
360
    call wait_for_string
361
    ret
362
  no_1:
363
 
364
    cmp  [status],3   ;; responce to group
365
    jne  no_3
366
    mov  eax,'211 '
367
    call wait_for_string
368
    ret
369
  no_3:
370
 
371
    cmp  [status],5   ;; responce to stat
372
    jne  no_5
373
    mov  eax,'223 '
374
    call wait_for_string
375
    ret
376
  no_5:
377
 
378
    ;; after 'article' request - no wait
379
 
380
    cmp  [status],9
381
    jne  no_9
382
    mov  eax,'222 '
383
    call wait_for_string
384
    ret
385
  no_9:
386
 
387
 
388
 
389
    ret
390
 
391
 
392
 
393
wait_for_string:
394
 
395
    mov  ecx,[ywait]
396
    imul ecx,80
397
    add  ecx,[xwait]
398
 
399
    mov  ecx,[nntp_text+ecx]
400
 
401
    cmp  eax,ecx
402
    jne  no_match
403
 
404
    cmp  [status],3
405
    jne  no_stat_ret
406
 
407
    mov  esi,[ywait]
408
    imul esi,80
409
    add  esi,[xwait]
410
 
411
  new32s:
412
    inc  esi
413
    movzx eax,byte [esi+nntp_text]
414
    cmp  eax,47
415
    jge  new32s
416
  new32s2:
417
    inc  esi
418
    movzx eax,byte [esi+nntp_text]
419
    cmp  eax,47
420
    jge  new32s2
421
    inc  esi
422
    add  esi,nntp_text
423
;    mov  [esi-1],byte '.'
424
 
425
    mov  edi,article_n
426
    call convert_text_to_number
427
    mov  eax,[article_n]
428
    mov  [article_start],eax
429
 
430
  new32s3:
431
    inc  esi
432
    movzx eax,byte [esi]
433
    cmp  eax,47
434
    jge  new32s3
435
    inc  esi
436
 
437
    mov  edi,article_last
438
    call convert_text_to_number
439
 
440
    mov  eax,[text_current]
441
    add  [article_n],eax
442
 
443
    mov  esi,article_n
444
    mov  edi,nntp_text+71
445
    call convert_number_to_text
446
 
447
    mov  esi,article_n
448
    mov  edi,stat+5
449
    call convert_number_to_text
450
 
451
    mov  eax,[article_l]
452
    mov  [stat+5+eax],byte 13
453
    mov  [stat+6+eax],byte 10
454
    add  eax,5+2
455
    mov  [statlen],eax
456
 
457
    pusha
458
    mov  edi,text+10+66*2
459
    mov  ecx,25
460
    mov  eax,32
461
    cld
462
    rep  stosb
463
    mov  esi,text_current
464
    mov  edi,text+10+66*2
465
    call convert_number_to_text
466
    mov  eax,32
467
    mov  ecx,20
468
    mov  edi,text+10+66*3
469
    cld
470
    rep  stosb
471
    mov  eax,[article_last]
472
    sub  eax,[article_start]
473
    mov  [article_all],eax
474
    mov  esi,article_all
475
    mov  edi,text+10+66*3
476
    call convert_number_to_text
477
    call draw_entries
478
    popa
479
 
480
    call draw_text
481
 
482
  no_stat_ret:
483
 
484
    inc  [status]
485
 
486
    mov  eax,5
487
    mov  ebx,10
488
    int  0x40
489
 
490
    call check_for_incoming_data
491
 
492
  no_match:
493
 
494
    ret
495
 
496
 
497
 
498
START:                          ; start of execution
499
 
500
     mov  eax,40
501
     mov  ebx,10000111b
502
     int  0x40
503
 
504
     call clear_text
505
 
506
     call draw_window
507
 
508
still:
509
 
510
    call state_machine_write
511
    call state_machine_read
512
 
513
    mov  eax,23                 ; wait here for event
514
    mov  ebx,5
515
    int  0x40
516
 
517
    cmp  eax,1                  ; redraw request ?
518
    je   red
519
    cmp  eax,2                  ; key in buffer ?
520
    je   key
521
    cmp  eax,3                  ; button in buffer ?
522
    je   button
523
 
524
    call check_for_incoming_data
525
 
526
    call connection_status
527
 
528
    jmp  still
529
 
530
  red:                          ; redraw
531
    call draw_window
532
    jmp  still
533
 
534
  key:                          ; key
535
    mov  eax,2                  ; just read it and ignore
536
    int  0x40
537
 
538
    cmp  ah,' '
539
    jne  no_space
540
    mov  eax,[space]
541
    dec  eax
542
    add  [text_start],eax
543
    call draw_text
544
    jmp  still
545
  no_space:
546
 
547
    cmp  ah,177
548
    jne  no_plus
549
    inc  [text_start]
550
    call draw_text
551
    jmp  still
552
  no_plus:
553
 
554
    cmp  ah,178
555
    jne  no_minus
556
    cmp  [text_start],0
557
    je   no_minus
558
    dec  [text_start]
559
    call draw_text
560
    jmp  still
561
  no_minus:
562
 
563
    cmp  ah,179
564
    jne  no_next
565
    inc  [text_current]
566
    call send_group
567
    jmp  still
568
  no_next:
569
 
570
    cmp  ah,176
571
    jne  no_prev
572
    cmp  [text_current],0
573
    je   still
574
    dec  [text_current]
575
    call send_group
576
    jmp  still
577
  no_prev:
578
 
579
    jmp  still
580
 
581
 
582
  button:                       ; button
583
    mov  eax,17                 ; get id
584
    int  0x40
585
 
586
    shr  eax,8
587
 
588
    cmp  eax,11
589
    jne  no_11
590
    mov  edi,text+10
591
    call text_input
592
    call convert_text_to_ip
593
    jmp  still
594
   no_11:
595
 
596
    cmp  eax,12
597
    jne  no_12
598
    mov  edi,text+66+10
599
    call text_input
600
    mov  esi,text+66+10
601
    mov  edi,group+6
602
    mov  ecx,[xpost]
603
    sub  ecx,text+66+10
604
    mov  eax,ecx
605
    cld
606
    rep  movsb
607
    mov  [group+6+eax],byte 13
608
    mov  [group+7+eax],byte 10
609
    add  eax,6+2
610
    mov  [grouplen],eax
611
    mov  [text_current],0
612
    jmp  still
613
   no_12:
614
 
615
    cmp  eax,13
616
    jne  no_13
617
    mov  edi,text+10+66*2
618
    call text_input
619
    mov  esi,text+10+66*2
620
    mov  edi,text_current
621
    call convert_text_to_number
622
    call send_group
623
    jmp  still
624
   no_13:
625
 
626
 
627
    cmp  eax,14
628
    jne  no_start
629
    call clear_text
630
    mov  eax,3
631
    int  0x40
632
    mov  ecx,eax
633
    mov  eax,53
634
    mov  ebx,5
635
    mov  edx,119
636
    mov  esi,dword [server_ip]
637
    mov  edi,1
638
    int  0x40
639
    mov  [socket],eax
640
    mov  [status],1
641
    jmp  still
642
  no_start:
643
 
644
    cmp  eax,15
645
    jne  no_end
646
    mov  eax,53
647
    mov  ebx,7
648
    mov  ecx,[socket]
649
    mov  edx,quitlen-quit
650
    mov  esi,quit
651
    int  0x40
652
    mov  eax,5
653
    mov  ebx,10
654
    int  0x40
655
    call check_for_incoming_data
656
    mov  eax,53
657
    mov  ebx,8
658
    mov  ecx,[socket]
659
    int  0x40
660
    mov  eax,5
661
    mov  ebx,5
662
    int  0x40
663
    mov  eax,53
664
    mov  ebx,8
665
    mov  ecx,[socket]
666
    int  0x40
667
    mov  [status],0
668
    jmp  still
669
  no_end:
670
 
671
    cmp  eax,1                   ; button id=1 ?
672
    jne  noclose
673
    mov  eax,-1                 ; close this program
674
    int  0x40
675
  noclose:
676
 
677
    jmp  still
678
 
679
 
680
check_for_incoming_data:
681
 
682
    cmp  [status],0
683
    jne  go_on
684
    ret
685
  go_on:
686
 
687
    mov  eax,53
688
    mov  ebx,2
689
    mov  ecx,[socket]
690
    int  0x40
691
 
692
    cmp  eax,0
693
    je   ch_ret
694
 
695
    mov  eax,53
696
    mov  ebx,3
697
    mov  ecx,[socket]
698
    int  0x40
699
 
700
    and  ebx,0xff
701
 
702
    cmp  ebx,13
703
    jb   no_print
704
 
705
    cmp  bl,13
706
    jne  char
707
    mov  [xpos],0
708
    inc  [ypos]
709
    jmp  no_print
710
  char:
711
 
712
    cmp  ebx,128
713
    jbe  char_ok
714
    mov  ebx,'?'
715
  char_ok:
716
 
717
    mov  ecx,[ypos]
718
    imul ecx,80
719
    add  ecx,[xpos]
720
    mov  [nntp_text+ecx],bl
721
    cmp  [xpos],78
722
    jg   noxinc
723
    inc  [xpos]
724
  noxinc:
725
 
726
  no_print:
727
 
728
    mov  eax,53
729
    mov  ebx,2
730
    mov  ecx,[socket]
731
    int  0x40
732
 
733
    cmp  eax,0
734
    jne  check_for_incoming_data
735
 
736
    call draw_text
737
 
738
  ch_ret:
739
 
740
    ret
741
 
742
 
743
 
744
;   *********************************************
745
;   *******  WINDOW DEFINITIONS AND DRAW ********
746
;   *********************************************
747
 
748
 
749
draw_window:
750
 
751
    pusha
752
 
753
    mov  [prev_state],-1
754
 
755
    mov  eax,12                    ; function 12:tell os about windowdraw
756
    mov  ebx,1                     ; 1, start of draw
757
    int  0x40
758
 
759
                                   ; DRAW WINDOW
760
    mov  eax,0                     ; function 0 : define and draw window
761
    mov  ebx,100*65536+520         ; [x start] *65536 + [x size]
762
    mov  ecx,5*65536+470           ; [y start] *65536 + [y size]
763
    mov  edx,0x03ffffff            ; color of work area RRGGBB,8->color gl
764
    mov  esi,0x805080d0            ; color of grab bar  RRGGBB,8->color gl
765
    mov  edi,0x005080d0            ; color of frames    RRGGBB
766
    int  0x40
767
 
768
    mov  eax,38
769
    mov  ebx,5*65536+515
770
    mov  ecx,101*65536+101
771
    mov  edx,0x99bbff
772
    int  0x40
773
    mov  eax,38
774
    mov  ebx,5*65536+515
775
    mov  ecx,102*65536+102
776
    mov  edx,0x3366aa
777
    int  0x40
778
 
779
                                   ; WINDOW LABEL
780
    mov  eax,4                     ; function 4 : write text to window
781
    mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
782
    mov  ecx,0x10ddeeff            ; font 1 & color ( 0xF0RRGGBB )
783
    mov  edx,labelt                ; pointer to text beginning
784
    mov  esi,labellen-labelt       ; text length
785
    int  0x40
786
 
787
    mov  eax,8
788
    mov  ebx,238*65536+8
789
    mov  ecx,30*65536+8
790
    mov  edx,11
791
    mov  esi,0x88aadd
792
    int  0x40
793
    mov  eax,8
794
    mov  ebx,238*65536+8
795
    mov  ecx,41*65536+8
796
    mov  edx,12
797
    int  0x40
798
    mov  eax,8
799
    mov  ebx,238*65536+8
800
    mov  ecx,52*65536+8
801
    mov  edx,13
802
    int  0x40
803
 
804
    mov  eax,8
805
    mov  ebx,265*65536+75
806
    mov  ecx,39*65536+13
807
    mov  edx,14
808
    int  0x40
809
    mov  eax,8
810
    mov  ebx,351*65536+75
811
    mov  ecx,39*65536+13
812
    mov  edx,15
813
    int  0x40
814
 
815
    call draw_entries
816
 
817
    call draw_text
818
 
819
    mov  eax,12                    ; function 12:tell os about windowdraw
820
    mov  ebx,2                     ; 2, end of draw
821
    int  0x40
822
 
823
    popa
824
 
825
    ret
826
 
827
 
828
draw_entries:
829
 
830
    pusha
831
 
832
    mov  eax,13
833
    mov  ebx,30*65536+200
834
    mov  ecx,30*65536+44
835
    mov  edx,0xffffff
836
    int  0x40
837
 
838
    mov  ebx,30*65536+31           ; draw info text with function 4
839
    mov  ecx,0x000000
840
    mov  edx,text
841
    mov  esi,66
842
    mov  edi,6
843
 
844
  newline2:
845
 
846
    mov  eax,4
847
    int  0x40
848
    add  ebx,11
849
    add  edx,66
850
    dec  edi
851
    jnz  newline2
852
 
853
    popa
854
 
855
    ret
856
 
857
 
858
draw_text:
859
 
860
    pusha
861
 
862
    mov  eax,9
863
    mov  ebx,0x70000
864
    mov  ecx,-1
865
    int  0x40
866
 
867
    mov  eax,[0x70000+46]
868
    cmp  eax,150
869
    jbe  dtret
870
 
871
    sub  eax,111
872
    mov  ebx,10
873
    xor  edx,edx
874
    div  ebx
875
    mov  edi,eax
876
    dec  edi
877
 
878
    mov  [space],edi
879
 
880
    mov  ebx,20*65536+111           ; draw info text with function 4
881
    mov  ecx,0x000000
882
    mov  edx,[text_start]
883
    imul edx,80
884
    add  edx,nntp_text
885
    mov  esi,80
886
  newline:
887
 
888
    pusha
889
    mov  ecx,ebx
890
    shl  ecx,16
891
    mov  eax,13
892
    mov  ebx,20*65536+80*6
893
    mov  cx,10
894
    mov  edx,0xffffff
895
    int  0x40
896
    popa
897
 
898
    mov  eax,4
899
    int  0x40
900
    add  ebx,10
901
    add  edx,80
902
    dec  edi
903
    jnz  newline
904
 
905
  dtret:
906
 
907
    popa
908
 
909
    ret
910
 
911
 
912
; DATA AREA
913
 
914
text:
915
 db 'NNTP IP : 192.168.0.96             <                              '
916
 db 'Group   : alt.test                 <      Connect      Disconnect '
917
 db 'Article : 0                        <                              '
918
 db 'Art.max : ?                                                       '
919
 db '                                                                  '
920
 db 'Arrow left/rigth: fetch prev/next - Arrow up/down & space: scroll '
921
 
922
textl:
923
 
924
 
925
labelt:
926
     db   'NNTP client v',version
927
labellen:
928
 
929
nntp_text:
930
 
931
     db 'a'
932
 
933
I_END:   ;;;