Subversion Repositories Kolibri OS

Rev

Rev 485 | 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
;    TERMINAL
4
;
5
;    Compile with FASM for Menuet
6
;
7
 
8
use32
661 ataualpa 9
 org    0x0
10
 db     'MENUET01'    ; header
11
 dd     0x01          ; header version
12
 dd     START         ; entry point
13
 dd     I_END         ; image size
14
 dd     I_END+0x10000 ; required memory
15
 dd     I_END+0x10000 ; esp
16
 dd     0x0 , 0x0     ; I_Param , I_Path
31 halyavin 17
 
18
 
19
include 'lang.inc'
661 ataualpa 20
include 'macros.inc'
31 halyavin 21
 
661 ataualpa 22
START:                          ; start of execution
31 halyavin 23
 
24
    ; Clear the screen memory
25
    mov     eax, '    '
26
    mov     edi,text
27
    mov     ecx,80*30 /4
28
    cld
29
    rep     stosd
30
 
31
 
32
    call draw_window
33
 
34
 
35
still:
36
    ; check connection status
37
    mov  eax,53
38
    mov  ebx,6
39
    mov  ecx,[socket]
485 heavyiron 40
    mcall
31 halyavin 41
 
42
    mov     ebx, [socket_status]
43
    mov     [socket_status], eax
44
 
45
    cmp     eax, ebx
661 ataualpa 46
    je      waitev
31 halyavin 47
 
485 heavyiron 48
red:
31 halyavin 49
    call    draw_window
50
 
51
waitev:
661 ataualpa 52
    mov  eax,23                 ; wait here for event
31 halyavin 53
    mov  ebx,20
485 heavyiron 54
    mcall
31 halyavin 55
 
661 ataualpa 56
    cmp  eax,1                  ; redraw request ?
57
    je   red
58
    cmp  eax,2                  ; key in buffer ?
59
    je   key
60
    cmp  eax,3                  ; button in buffer ?
61
    je   button
31 halyavin 62
 
63
    ; any data from the socket?
64
 
65
    mov     eax, 53
66
    mov     ebx, 2
67
    mov     ecx, [socket]
485 heavyiron 68
    mcall
31 halyavin 69
    cmp     eax, 0
70
    jne      read_input
71
 
72
    jmp  still
73
 
74
 
75
read_input:
76
 
77
    push ecx
78
    mov     eax, 53
79
    mov     ebx, 3
80
    mov     ecx, [socket]
485 heavyiron 81
    mcall
31 halyavin 82
    pop  ecx
83
 
84
    call    handle_data
85
 
86
    push    ecx
87
    mov     eax, 53
88
    mov     ebx, 2
89
    mov     ecx, [socket]
485 heavyiron 90
    mcall
31 halyavin 91
    pop     ecx
92
    cmp     eax, 0
93
 
94
 
95
    jne   read_input
96
    call draw_text
97
    jmp  still
98
 
99
 
100
 
101
handle_data:
102
    ; Telnet servers will want to negotiate options about our terminal window
103
    ; just reject them all.
104
    ; Telnet options start with the byte 0xff and are 3 bytes long.
105
 
106
    mov     al, [telnetstate]
107
    cmp     al, 0
661 ataualpa 108
    je      state0
31 halyavin 109
    cmp     al, 1
661 ataualpa 110
    je      state1
31 halyavin 111
    cmp     al, 2
661 ataualpa 112
    je      state2
31 halyavin 113
    jmp     hd001
114
 
115
state0:
116
    cmp     bl, 255
117
    jne     hd001
118
    mov     al, 1
119
    mov     [telnetstate], al
120
    ret
121
 
122
state1:
123
    mov     al, 2
124
    mov     [telnetstate], al
125
    ret
126
 
127
state2:
128
    mov     al, 0
129
    mov     [telnetstate], al
130
    mov     [telnetrep+2], bl
131
 
132
    mov     edx, 3
133
    mov     eax,53
134
    mov     ebx,7
135
    mov     ecx,[socket]
136
    mov     esi, telnetrep
485 heavyiron 137
    mcall
31 halyavin 138
    ret
139
 
140
hd001:
661 ataualpa 141
    cmp  bl,13                          ; BEGINNING OF LINE
31 halyavin 142
    jne  nobol
143
    mov  ecx,[pos]
144
    add  ecx,1
145
  boll1:
146
    sub  ecx,1
147
    mov  eax,ecx
148
    xor  edx,edx
149
    mov  ebx,80
150
    div  ebx
151
    cmp  edx,0
152
    jne  boll1
153
    mov  [pos],ecx
154
    jmp  newdata
155
  nobol:
156
 
661 ataualpa 157
    cmp  bl,10                            ; LINE DOWN
31 halyavin 158
    jne  nolf
159
   addx1:
160
    add  [pos],dword 1
161
    mov  eax,[pos]
162
    xor  edx,edx
163
    mov  ecx,80
164
    div  ecx
165
    cmp  edx,0
166
    jnz  addx1
167
    mov  eax,[pos]
168
    jmp  cm1
169
  nolf:
170
 
661 ataualpa 171
    cmp  bl,8                            ; BACKSPACE
31 halyavin 172
    jne  nobasp
173
    mov  eax,[pos]
174
    dec  eax
175
    mov  [pos],eax
176
    mov  [eax+text],byte 32
177
    mov  [eax+text+60*80],byte 0
178
    jmp  newdata
179
   nobasp:
180
 
661 ataualpa 181
    cmp  bl,15                           ; CHARACTER
31 halyavin 182
    jbe  newdata
183
    mov  eax,[pos]
184
    mov  [eax+text],bl
185
    mov  eax,[pos]
186
    add  eax,1
187
  cm1:
188
    mov  ebx,[scroll+4]
189
    imul ebx,80
190
    cmp  eax,ebx
661 ataualpa 191
    jb   noeaxz
31 halyavin 192
    mov  esi,text+80
193
    mov  edi,text
194
    mov  ecx,ebx
195
    cld
196
    rep  movsb
197
    mov  eax,ebx
198
    sub  eax,80
199
  noeaxz:
200
    mov  [pos],eax
201
  newdata:
202
    ret
203
 
661 ataualpa 204
  key:                          ; KEY
205
    mov  eax,2                  ; send to modem
485 heavyiron 206
    mcall
31 halyavin 207
 
208
    mov     ebx, [socket_status]
661 ataualpa 209
    cmp     ebx, 4              ; connection open?
210
    jne     still               ; no, so ignore key
31 halyavin 211
 
212
    shr  eax,8
661 ataualpa 213
    cmp  eax,178                ; ARROW KEYS
31 halyavin 214
    jne  noaup
215
    mov  al,'A'
216
    call arrow
217
    jmp  still
218
  noaup:
219
    cmp  eax,177
220
    jne  noadown
221
    mov  al,'B'
222
    call arrow
223
    jmp  still
224
  noadown:
225
    cmp  eax,179
226
    jne  noaright
227
    mov  al,'C'
228
    call arrow
229
    jmp  still
230
  noaright:
231
    cmp  eax,176
232
    jne  noaleft
233
    mov  al,'D'
234
    call arrow
235
    jmp  still
236
  noaleft:
237
  modem_out:
238
 
239
    call    to_modem
240
 
241
    jmp  still
242
 
661 ataualpa 243
  button:                       ; BUTTON
31 halyavin 244
    mov  eax,17
485 heavyiron 245
    mcall
661 ataualpa 246
    cmp  ah,1                   ; CLOSE PROGRAM
31 halyavin 247
    jne  noclose
248
 
249
    mov  eax,53
250
    mov  ebx,8
251
    mov  ecx,[socket]
485 heavyiron 252
    mcall
31 halyavin 253
 
485 heavyiron 254
     or   eax,-1
255
     mcall
31 halyavin 256
  noclose:
661 ataualpa 257
    cmp     ah, 2               ; Set IP
31 halyavin 258
    jne     notip
259
 
260
    mov  [string_x], dword 78
261
    mov  [string_y], dword 276
262
    mov  [string_length], dword 15
263
    call read_string
264
    mov   esi,string-1
265
    mov   edi,ip_address
266
    xor   eax,eax
267
   ip1:
268
    inc   esi
269
    cmp   [esi],byte '0'
661 ataualpa 270
    jb    ip2
31 halyavin 271
    cmp   [esi],byte '9'
661 ataualpa 272
    jg    ip2
31 halyavin 273
    imul  eax,10
274
    movzx ebx,byte [esi]
275
    sub   ebx,48
276
    add   eax,ebx
277
    jmp   ip1
278
   ip2:
279
    mov   [edi],al
280
    xor   eax,eax
281
    inc   edi
282
    cmp   edi,ip_address+3
283
    jbe   ip1
284
    call draw_window
285
 
286
 
287
    jmp     still
288
 
289
notip:
661 ataualpa 290
    cmp     ah, 3               ; set port
31 halyavin 291
    jne     notport
292
 
293
    mov  [string_x], dword 215
294
    mov  [string_y], dword 276
295
    mov  [string_length], dword 4
296
    call read_string
297
    mov   esi,string-1
298
    mov   edi,port
299
    xor   eax,eax
300
   ip11:
301
    inc   esi
302
    cmp   [esi],byte '0'
661 ataualpa 303
    jb    ip21
31 halyavin 304
    cmp   [esi],byte '9'
661 ataualpa 305
    jg    ip21
31 halyavin 306
    imul  eax,10
307
    movzx ebx,byte [esi]
308
    sub   ebx,48
309
    add   eax,ebx
310
    jmp   ip11
311
   ip21:
312
    mov   [edi],al
313
    inc   edi
314
    mov   [edi],ah
315
    call draw_window
316
 
317
 
318
    jmp     still
319
 
320
notport:
661 ataualpa 321
    cmp     ah, 4               ; connect
31 halyavin 322
    jne     notcon
323
 
324
    mov     eax, [socket_status]
325
    cmp     eax, 4
661 ataualpa 326
    je     still
31 halyavin 327
    call    connect
328
 
329
    jmp     still
330
 
331
notcon:
661 ataualpa 332
    cmp     ah,5                ; disconnect
31 halyavin 333
    jne     notdiscon
334
 
335
    call    disconnect
336
    jmp  still
337
 
661 ataualpa 338
notdiscon:                      ; Echo Toggle
31 halyavin 339
    cmp     ah, 6
340
    jne     still
341
 
342
    mov     al, [echo]
343
    not     al
344
    mov     [echo], al
345
 
346
    call    draw_window
347
    jmp     still
348
 
349
arrow:
350
 
351
    push eax
352
    mov  al,27
353
    call to_modem
354
    mov  al,'['
355
    call to_modem
356
    pop  eax
357
    call to_modem
358
 
359
    ret
360
 
361
 
362
to_modem:
363
    pusha
364
    push    ax
365
    mov     [tx_buff], al
366
    mov     edx, 1
367
    cmp     al, 13
368
    jne     tm_000
369
    mov     edx, 2
370
tm_000:
371
    mov     eax,53
372
    mov     ebx,7
373
    mov     ecx,[socket]
374
    mov     esi, tx_buff
485 heavyiron 375
    mcall
31 halyavin 376
    pop     bx
377
    mov     al, [echo]
378
    cmp     al, 0
661 ataualpa 379
    je      tm_001
31 halyavin 380
 
381
    push    bx
382
    call    handle_data
383
    pop     bx
384
 
385
    cmp     bl, 13
386
    jne     tm_002
387
 
388
    mov     bl, 10
389
    call    handle_data
390
 
391
tm_002:
392
    call    draw_text
393
 
394
tm_001:
395
    popa
396
    ret
397
 
398
 
399
 
400
disconnect:
401
    mov  eax,53
402
    mov  ebx,8
403
    mov  ecx,[socket]
485 heavyiron 404
    mcall
31 halyavin 405
    ret
406
 
407
 
408
 
409
connect:
410
    pusha
411
 
661 ataualpa 412
 mov     ecx, 1000  ; local port starting at 1000
31 halyavin 413
 
414
getlp:
661 ataualpa 415
 inc     ecx
31 halyavin 416
 push ecx
661 ataualpa 417
 mov     eax, 53
418
 mov     ebx, 9
485 heavyiron 419
 mcall
661 ataualpa 420
 pop     ecx
421
 cmp     eax, 0   ; is this local port in use?
422
 jz  getlp      ; yes - so try next
31 halyavin 423
 
424
    mov     eax,53
425
    mov     ebx,5
426
    mov     dl, [ip_address + 3]
427
    shl     edx, 8
428
    mov     dl, [ip_address + 2]
429
    shl     edx, 8
430
    mov     dl, [ip_address + 1]
431
    shl     edx, 8
432
    mov     dl, [ip_address]
433
    mov     esi, edx
661 ataualpa 434
    movzx   edx, word [port]      ; telnet port id
31 halyavin 435
    mov     edi,1      ; active open
485 heavyiron 436
    mcall
31 halyavin 437
    mov     [socket], eax
438
 
439
    popa
440
 
441
    ret
442
 
443
 
444
 
445
;   *********************************************
446
;   *******  WINDOW DEFINITIONS AND DRAW ********
447
;   *********************************************
448
 
449
 
450
draw_window:
451
 
452
    pusha
453
 
454
    mov  eax,12
455
    mov  ebx,1
485 heavyiron 456
    mcall
31 halyavin 457
 
661 ataualpa 458
    xor  eax,eax                     ; DRAW WINDOW
31 halyavin 459
    mov  ebx,100*65536+491 + 8 +15
460
    mov  ecx,100*65536+270 + 20     ; 20 for status bar
661 ataualpa 461
    mov  edx,0x14000000
485 heavyiron 462
    mov  edi,title
463
    mcall
31 halyavin 464
 
465
    ; draw status bar
466
    mov     eax, 13
467
    mov     ebx, 4*65536+484 + 8 +15
468
    mov     ecx, 270*65536 + 3
469
    mov     edx, 0x00557799
485 heavyiron 470
    mcall
31 halyavin 471
 
661 ataualpa 472
    mov  eax,8                     ; BUTTON 2: SET IP
31 halyavin 473
    mov  ebx,4*65536+70
474
    mov  ecx,273*65536+12
475
    mov     esi, 0x00557799
476
    mov  edx,2
485 heavyiron 477
    mcall
31 halyavin 478
 
661 ataualpa 479
    mov  eax,4                     ; Button text
31 halyavin 480
    mov  ebx,6*65536+276
481
    mov  ecx,0x00ffffff
482
    mov  edx,setipt
483
    mov  esi,setiplen-setipt
485 heavyiron 484
    mcall
31 halyavin 485
 
486
 
485 heavyiron 487
    mov  eax,47
661 ataualpa 488
    mov  edi,ip_address             ; display IP address
31 halyavin 489
    mov  edx,78*65536+276
490
    mov  esi,0x00ffffff
491
    mov  ebx,3*65536
492
  ipdisplay:
493
    movzx ecx,byte [edi]
485 heavyiron 494
    mcall
31 halyavin 495
    add  edx,6*4*65536
496
    inc  edi
497
    cmp  edi,ip_address+4
661 ataualpa 498
    jb   ipdisplay
31 halyavin 499
 
661 ataualpa 500
    mov  eax,8                     ; BUTTON 3: SET PORT
31 halyavin 501
    mov  ebx,173*65536+38
502
    mov  ecx,273*65536+12
503
    mov  edx,3
504
    mov     esi, 0x00557799
485 heavyiron 505
    mcall
31 halyavin 506
 
661 ataualpa 507
    mov  eax,4                     ; Button text
31 halyavin 508
    mov  ebx,178*65536+276
509
    mov  ecx,0x00ffffff
510
    mov  edx,setportt
511
    mov  esi,setportlen-setportt
485 heavyiron 512
    mcall
31 halyavin 513
 
514
 
661 ataualpa 515
    mov  edx,216*65536+276           ; display port
31 halyavin 516
    mov  esi,0x00ffffff
517
    mov  ebx,4*65536
518
    mov  eax,47
519
    movzx  ecx,word [port]
485 heavyiron 520
    mcall
31 halyavin 521
 
661 ataualpa 522
    mov  eax,8                     ; BUTTON 4: Connect
31 halyavin 523
    mov  ebx,250*65536+50
524
    mov  ecx,273*65536+12
525
    mov     esi, 0x00557799
526
    mov  edx,4
485 heavyiron 527
    mcall
31 halyavin 528
 
661 ataualpa 529
    mov  eax,4                     ; Button text
31 halyavin 530
    mov  ebx,255*65536+276
531
    mov  ecx,0x00ffffff
532
    mov  edx,cont
533
    mov  esi,conlen-cont
485 heavyiron 534
    mcall
31 halyavin 535
 
536
 
661 ataualpa 537
    mov  eax,8                     ; BUTTON 5: disconnect
31 halyavin 538
    mov  ebx,303*65536+70
539
    mov  ecx,273*65536+12
540
    mov  edx,5
541
    mov     esi, 0x00557799
485 heavyiron 542
    mcall
31 halyavin 543
 
544
 
661 ataualpa 545
    mov  eax,4                     ; Button text
31 halyavin 546
    mov  ebx,307*65536+276
547
    mov  ecx,0x00ffffff
548
    mov  edx,dist
549
    mov  esi,dislen-dist
485 heavyiron 550
    mcall
31 halyavin 551
 
552
 
661 ataualpa 553
    mov  esi,contlen-contt          ; display connected status
31 halyavin 554
    mov     edx, contt
555
    mov     eax, [socket_status]
661 ataualpa 556
    cmp     eax, 4                  ; 4 is connected
557
    je      pcon
31 halyavin 558
    mov     esi,discontlen-discontt
559
    mov     edx, discontt
560
pcon:
561
 
661 ataualpa 562
    mov  eax,4                     ; status text
31 halyavin 563
    mov  ebx,380*65536+276
564
    mov  ecx,0x00ffffff
485 heavyiron 565
    mcall
31 halyavin 566
 
567
 
661 ataualpa 568
    mov  eax,8                     ; BUTTON 6: echo
31 halyavin 569
    mov  ebx,460*65536+50
570
    mov  ecx,273*65536+12
571
    mov  edx,6
572
    mov     esi, 0x00557799
485 heavyiron 573
    mcall
31 halyavin 574
 
575
    mov  edx,echot
576
    mov  esi,echolen-echot
577
    mov     al, [echo]
578
    cmp     al, 0
579
    jne     peo
580
    mov  edx,echoot
581
    mov  esi,echoolen-echoot
582
 
583
peo:
661 ataualpa 584
    mov  eax,4                     ; Button text
31 halyavin 585
    mov  ebx,463*65536+276
586
    mov  ecx,0x00ffffff
485 heavyiron 587
    mcall
31 halyavin 588
 
589
 
590
    xor  eax,eax
591
    mov  edi,text+80*30
592
    mov  ecx,80*30 /4
593
    cld
594
    rep  stosd
595
 
596
    call draw_text
597
 
598
    mov  eax,12
599
    mov  ebx,2
485 heavyiron 600
    mcall
31 halyavin 601
 
602
    popa
603
 
604
    ret
605
 
606
 
607
draw_text:
608
 
609
    pusha
610
 
611
    mov  esi,text
612
    mov  eax,0
613
    mov  ebx,0
614
  newletter:
615
    mov  cl,[esi]
616
    cmp  cl,[esi+30*80]
617
    jne  yesletter
618
    jmp  noletter
619
  yesletter:
620
    mov  [esi+30*80],cl
621
 
622
    ; erase character
623
 
624
    pusha
661 ataualpa 625
    mov     edx, 0                  ; bg colour
31 halyavin 626
    mov     ecx, ebx
627
    add     ecx, 26
628
    shl     ecx, 16
629
    mov     cx, 9
630
    mov     ebx, eax
631
    add     ebx, 6
632
    shl     ebx, 16
633
    mov     bx, 6
634
    mov     eax, 13
485 heavyiron 635
    mcall
31 halyavin 636
    popa
637
 
638
    ; draw character
639
 
640
    pusha
641
    mov     ecx, 0x00ffffff
642
    push bx
643
    mov  ebx,eax
644
    add  ebx,6
645
    shl  ebx,16
646
    pop  bx
647
    add  bx,26
648
    mov  eax,4
649
    mov  edx,esi
650
    mov  esi,1
485 heavyiron 651
    mcall
31 halyavin 652
    popa
653
 
654
  noletter:
655
 
656
    add  esi,1
657
    add  eax,6
658
    cmp  eax,80*6
661 ataualpa 659
    jb   newletter
31 halyavin 660
    mov  eax,0
661
    add  ebx,10
662
    cmp  ebx,24*10
661 ataualpa 663
    jb   newletter
31 halyavin 664
 
665
    popa
666
    ret
667
 
668
 
669
read_string:
670
 
671
    mov  edi,string
672
    mov  eax,'_'
673
    mov  ecx,[string_length]
674
    inc     ecx
675
    cld
676
    rep  stosb
677
    call print_text
678
 
679
    mov  edi,string
680
  f11:
681
    mov  eax,10
485 heavyiron 682
    mcall
31 halyavin 683
    cmp  eax,2
684
    jne  read_done
685
    mov  eax,2
485 heavyiron 686
    mcall
31 halyavin 687
    shr  eax,8
688
    cmp  eax,13
661 ataualpa 689
    je   read_done
31 halyavin 690
    cmp  eax,8
691
    jnz  nobsl
692
    cmp  edi,string
661 ataualpa 693
    jz   f11
31 halyavin 694
    sub  edi,1
695
    mov  [edi],byte '_'
696
    call print_text
697
    jmp  f11
698
  nobsl:
699
    cmp  eax,dword 31
700
    jbe  f11
701
    cmp  eax,dword 95
661 ataualpa 702
    jb   keyok
31 halyavin 703
    sub  eax,32
704
  keyok:
705
    mov  [edi],al
706
    call print_text
707
 
708
    inc  edi
709
    mov  esi,string
710
    add  esi,[string_length]
711
    cmp  esi,edi
712
    jnz  f11
713
 
714
  read_done:
715
 
716
    call print_text
717
 
718
    ret
719
 
720
 
721
print_text:
722
 
723
    pusha
724
 
725
    mov  eax,13
726
    mov  ebx,[string_x]
727
    shl  ebx,16
728
    add  ebx,[string_length]
729
    imul bx,6
730
    mov  ecx,[string_y]
731
    shl  ecx,16
732
    mov  cx,8
733
    mov  edx,0x00000000
485 heavyiron 734
    mcall
31 halyavin 735
 
736
    mov  eax,4
737
    mov  ebx,[string_x]
738
    shl  ebx,16
739
    add  ebx,[string_y]
740
    mov  ecx,0x00ffffff
741
    mov  edx,string
742
    mov  esi,[string_length]
485 heavyiron 743
    mcall
31 halyavin 744
 
745
    popa
746
    ret
747
 
748
 
749
 
750
 
751
; DATA AREA
752
 
661 ataualpa 753
telnetrep       db 0xff,0xfc,0x00
754
telnetstate     db 0
31 halyavin 755
 
756
string_length  dd    16
757
string_x       dd    200
758
string_y       dd    60
759
 
661 ataualpa 760
string         db    '________________'
31 halyavin 761
 
661 ataualpa 762
tx_buff         db  0, 10
763
ip_address      db  001,002,003,004
764
port            db  0,0
765
echo            db  0
766
socket          dd  0x0
767
socket_status   dd  0x0
768
pos             dd  80 * 1
769
scroll          dd  1
770
                dd  24
771
wcolor          dd  0x000000
772
title           db  'Telnet v0.1',0
773
setipt          db  'IP Address:    .   .   .'
31 halyavin 774
setiplen:
661 ataualpa 775
setportt        db  'Port:'
31 halyavin 776
setportlen:
661 ataualpa 777
cont            db  'Connect'
31 halyavin 778
conlen:
661 ataualpa 779
dist            db  'Disconnect'
31 halyavin 780
dislen:
661 ataualpa 781
contt           db  'Connected'
31 halyavin 782
contlen:
661 ataualpa 783
discontt        db  'Disconnected'
31 halyavin 784
discontlen:
661 ataualpa 785
echot        db  'Echo On'
31 halyavin 786
echolen:
661 ataualpa 787
echoot        db  'Echo Off'
31 halyavin 788
echoolen:
789
 
790
 
791
 
792
text:
793
I_END: