Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1829 → Rev 1832

/programs/network/icq/trunk/2000.inc
0,0 → 1,160
; constants
FLAP_HEAD_SIZE = 6
SNAC_HEAD_SIZE = 10
 
;AUTH_MESSAGE = 0008h
;USER_ADDED_MESS = 000Ch
;AUTH_REQ_MESS = 0006h
;URL_MESS = 0004h
;WEB_MESS = 000dh
;EMAIL_MESS = 000eh
;MASS_MESS_MASK = 8000h
;MRURL_MESS = 8004h
;NORM_MESS = 0001h
;MRNORM_MESS = 8001h
;CONTACT_MESS = 0013h
;MRCONTACT_MESS = 8013h
;
;
;
;CAP_PRECAP = "\x09\x46\x13"
;CAP_PRERTF = "\x97\xb1\x27"
;CAP_POSCAP = "\x4c\x7f\x11\xd1\x82\x22\x44\x45\x53\x54\x00\x00"
;CAP_POSRTF = "\x24\x3c\x43\x34\xad\x22\xd6\xab\xf7\x3f\x14\x92"
 
;
;Fingerprinting Capabilities
;
;CAP_M2001 = "\x2e\x7a\x64" "\x75" "\xfa\xdf\x4d\xc8\x88\x6f\xea\x35\x95\xfd\xb6\xdf"
;CAP_M2001_2 = "\xa0\xe9\x3f" "\x37" "\x4f\xe9\xd3\x11\xbc\xd2\x00\x04\xac\x96\xdd\x96"
;CAP_M2002 = "\x10\xcf\x40" "\xd1" "\x4f\xe9\xd3\x11\xbc\xd2\x00\x04\xac\x96\xdd\x96"
;CAP_MLITE = "\x56\x3f\xc8" "\x09" "\x0b\x6f\x41\xbd\x9f\x79\x42\x26\x09\xdf\xa2\xf3"
;CAP_SIMICQ = "\x97\xb1\x27" "\x51" "\x24\x3c\x43\x34\xad\x22\xd6\xab\xf7\x3f\x14\x48"
;CAP_MICQ = "mICQ \xa9 R.K. \x00\x00\x00\x00"
;CAP_TRILL_NORM = "\x97\xb1\x27" "\x51" "\x24\x3c\x43\x34\xad\x22\xd6\xab\xf7\x3f\x14\x09"
;CAP_TRILL_CRYPT= "\xf2\xe7\xc7" "\xf4" "\xfe\xad\x4d\xfb\xb2\x35\x36\x79\x8b\xdf\x00\x00"
;CAP_LICQ = "\x09\x49\x13"
 
;
;DC Packet Types
;
;PEER_INIT = 0ffh
;PEER_INITACK = 01h
;PEER_MSG = 02h
;PEER_INIT2 = 03h
;PEER_FILE_INIT = 00h
;PEER_FILE_INIT_ACK = 01h
;PEER_FILE_START = 02h
;PEER_FILE_START_ACK = 03h
;PEER_FILE_STOP = 04h
;PEER_FILE_SPEED = 05h
;PEER_FILE_DATA = 06h
 
 
ICQ_PORT = 5190
;
; FLAP transport
;
FLAP_ID = 02ah
 
struc FLAP_head
{
.bId db FLAP_ID ;id byte
.bCh db ? ;channel
.wSn dw ? ;seq number
.wDs dw ? ;data size
}
;
; Channels ID
;
 
NEW_CONNECTION = 01h
SNAC_DATA = 02h
FLAP_ERROR = 03h
CLOSE_CONNECTION = 04h
KEEP_ALIVE = 05h
 
;
; SNAC
;
struc SNAC_head
{
.wFid dw ?; Family id
.wSid dw ?; subtype id
.wDf dw ?; SNAC flags
.dRi dd ?; SNAC Request id
}
 
;
;
; Familes/SNACs list
;
 
GENERIC_SN = 0001h
LOCATION_SN = 0002h
BUDDY_LIST_SN = 0003h
ICBM_SN = 0004h
PRIVACY_SN = 0009h
BUDDY_ICONS_SN = 0010h
SSI_SN = 0013h
AUTH_REG_SN = 0017h
 
;
; TLV
;
struc TLV_head
{
.wTn dw ?; TLV type number
.wLv dw ?; TLV length value
}
 
;
; userinfo block
;
struc UI_head
{
.bUinLength db 0 ; UIN/screenname length
.bUin db 11 dup 0 ; string
.wWl dw 0 ; Warning level
.dUserClass dd 0
.dCreateTime dd 0
.dSignonTime dd 0
.wIdleTime dw 0
.dCreationTime dd 0
.dUserStatus dd 0
.dIpAddress dd 0
.dOnlineTime dd 0
 
}
 
;
;Roasting array
;
ROASTING_ARRAY db 0F3h, 026h, 081h, 0C4h, 039h, 086h, 0DBh, 092h, 071h, 0A3h, 0B9h, 0E6h, 053h, 07Ah, 095h, 07Ch
 
;
; Status flags
;
;
STATUS_WEBAWARE = 0x0001 ;Status webaware flag
STATUS_SHOWIP = 0x0002 ;Status show ip flag
STATUS_BIRTHDAY = 0x0008 ;User birthday flag
STATUS_WEBFRONT = 0x0020 ;User active webfront flag
STATUS_DCDISABLED = 0x0100 ;Direct connection not supported
STATUS_DCAUTH = 0x1000 ;Direct connection upon authorization
STATUS_DCCONT = 0x2000 ;DC only with contact users
 
;
; Status
;
 
STATUS_ONLINE = 0x0000 ;Status is online
STATUS_AWAY = 0x0001 ;Status is away
STATUS_DND = 0x0002 ;Status is no not disturb (DND)
STATUS_NA = 0x0004 ;Status is not available (N/A)
STATUS_OCCUPIED = 0x0010 ;Status is occupied (BISY)
STATUS_FREE4CHAT = 0x0020 ;Status is free for chat
STATUS_INVISIBLE = 0x0100 ;Status is invisible
 
 
/programs/network/icq/trunk/EDITBOX.INC
0,0 → 1,275
; SEE YOU File FAQ.txt and HISTORY. Good Like!
;;;;;;;;;;;;;;;;;;
include 'editbox.mac' ;¬ ªà®á ª®â®àë© ¤®«¦¥­ ®¡«¥£ç¨âì ¦¨§­ì :) ᯥ樠«ì­® ¤«ï editbox
;;;;;;;;;;;;;;;;;;
macro use_edit_box procinfo,scr_h,scr_w
{
edit_box:
ed_width equ [edi] ;è¨à¨­  ª®¬¯®­¥­â 
ed_left equ [edi+4] ;¯®«®¦¥­¨¥ ¯® ®á¨ å
ed_top equ [edi+8] ;¯®«®¦¥­¨¥ ¯® ®á¨ ã
ed_color equ [edi+12] ;梥â ä®­  ª®¬¯®­¥­â 
shift_color equ [edi+16] ;=0x6a9480
ed_focus_border_color equ [edi+20] ;梥â à ¬ª¨ ª®¬¯®­¥­â 
ed_blur_border_color equ [edi+24] ;梥⠭¥  ªâ¨¢­®£® ª®¬¯®­¥­â 
ed_text_color equ [edi+28] ;梥â ⥪áâ 
ed_max equ [edi+32] ;ª®«-¢® ᨬ¢®«®¢ ª®â®àë¥ ¬®¦­® ¬ ªá¨¬ «ì­® ¢¢¥áâ¨
ed_text equ [edi+36] ;㪠§ â¥«ì ­  ¡ãä¥à
ed_flags equ [edi+40] ;ä« £¨
ed_size equ [edi+42] ;ª®«-¢® ᨬ¢®«®¢
ed_pos equ [edi+46] ;¯®§¨æ¨ï ªãàá®à 
ed_offset equ [edi+50] ;ᬥ饭¨¥
cl_curs_x equ [edi+54] ;¯à¥¤ë¤ã饥 ª®®à¤¨­ â  ªãàá®à  ¯® å
cl_curs_y equ [edi+58] ;¯à¥¤ë¤ã饥 ª®®à¤¨­ â  ªãàá®à  ¯® ã
ed_shift_pos equ [edi+62] ;¯®«®¦¥­¨¥ ªãàá®à 
ed_shift_pos_old equ [edi+66] ;áâ à®¥ ¯®«®¦¥­¨¥ ªãàá®à 
;==========================================================
;=== ¯à®æ¥¤ãà  ¯à®à¨á®¢ª¨ =================================
;==========================================================
.draw:
pusha
;--- à¨á㥬 à ¬ªã ---
call .draw_border ; ”ã­ªæ¨ï áâ ¡¨«ì­ 
.draw_bg_cursor_text:
;--- ¨§¬¥­ï¥¬ ᬥ饭¨¥, ¥á«¨ ­ ¤® ---
call .check_offset ;¢ëç¨á«¥­¨¥ ¯®§¨æ¨¨ ªãàá®à  áâ ¡¨«ì­ 
;--- à¨á㥬 ¢­ãâ७­îî ®¡« áâì ---
call .draw_bg ;­ à¨á®¢ âì ¯àאַ㣮«ì­¨ª à ¡®ç¥© ®¡« áâ¨
;---- à¨á㥬 ¢ë¤¥«¥­¨¥, ¯® shift ¥á«¨ ¥áâì
call .draw_shift
.draw_cursor_text:
;--- à¨á㥬 ªãàá®à ---
;--- ¬®¦¥â ¥£® ­¥ ­ ¤® à¨á®¢ âì ----
test word ed_flags,ed_focus
je @f
call .draw_cursor
@@:
call .draw_text
;;;;;;;;;;;;;;;;;;;;;;;;;;
;Ž¡é¨© ¢ë室 ¨§ editbox ¤«ï ¢á¥å ä㭪権 ¨ ¯®áâ ®¡à ¡®â稪®¢
;;;;;;;;;;;;;;;;;;;;;;;;;;
.editbox_exit:
edit_ex
;==========================================================
;=== ®¡à ¡®âª  ª« ¢¨ âãàë =================================
;==========================================================
.key:
pusha
test word ed_flags,ed_focus ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬
je .editbox_exit
;à®¢¥àª  ­ ¦ â shift ?
call .check_shift
;----------------------------------------------------------
;--- ¯à®¢¥à塞, çâ® ­ ¦ â® --------------------------------
;----------------------------------------------------------
use_key_process backspase,delete,left,right,home,end,insert
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;‡ £«ã誠 ­  ®¡à ¡®âªã ª« ¢¨è ¢¢¥àå ¨ ¢­¨§ â.¥. ¯à¨ ®¡­ à㦥­¨¨ íâ¨å ª®¤®¢ ¯à®¨á室¨â ¢ë室 ¨§ ®¡à ¡®â稪 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use_key_no_process up,down,esc
;--- ­ ¦ â  ¤àã£ ï ª« ¢¨è  ---
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;à®¢¥àª  ãáâ ­®¢«¥­ «¨ ä« £ ¯à¨ ª®â®à®¬ ­ã¦­® ¢ë¢®¤¨âì ⮫쪮 æ¨äàë ¢ ­ã¦­®¬ ¡®ªá¥ ¥á«¨ â ª®©­¥®¡å®¤¨¬®á⨠­¥â ­ã¦­® § ª®¬¥­â¨à®¢ âì ¬ ªà®á
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use_key_figures_only
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;¯à®¢¥àª  ­  shift ¡ë« «¨ ­ ¦ â
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
are_key_shift_press
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ¯à®¢¥à塞, ­ å®¤¨âáï «¨ ªãàá®à ¢ ª®­æ¥ + ¤ «ì­¥©è ï ®¡à ¡®âª 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
are_key_cur_end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Ž¡à ¡®âª  ª« ¢¨è insert,delete.backspase,home,end,left,right
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use_work_key
;==========================================================
;=== ®¡à ¡®âª  ¬ëè¨ =======================================
;==========================================================
.mouse:
pusha
;debug
;----------------------------------------------------------
;--- ¯®«ãç ¥¬ á®áâ®ï­¨¥ ª­®¯®ª ¬ëè¨ -----------------------
;----------------------------------------------------------
mcall 37,2
;----------------------------------------------------------
;--- ¯à®¢¥à塞 á®áâ®ï­¨¥ ----------------------------------
;----------------------------------------------------------
test eax,1
jnz .mouse_left_button
and word ed_flags,ed_mouse_on_off
xor ebx,ebx
mov dword [mouse_flag],ebx
jmp .editbox_exit
.mouse_left_button:
;----------------------------------------------------------
;--- ¡«®ª¨à®¢ª  ®â 䮪ãá¨à®¢ª¨ ¢ ¤àã£¨å ¡®ªá å ¯à¨ ¯®¯ ¤ ­¨¨ ­  ­¨å ªãàá®à 
;----------------------------------------------------------
mov eax,dword [mouse_flag]
test eax,eax
jz @f
cmp eax,edi
je @f
jmp ._blur
;----------------------------------------------------------
;--- ¯®«ãç ¥¬ ª®®à¤¨­ âë ¬ëè¨ ®â­®á¨â¥«ì­® 0 â.¥ ¢á¥© ®¡« á⨠íªà ­ 
;----------------------------------------------------------
@@: mcall 37,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;”ã­ªæ¨ï ®¡à ¡®âª¨ ¬ë誨 ¯®«ã祭¨¥ ª®®à¤¨­ â ¨ ¯à®¢¥àª  ¨å + ¢ë¤¥«¥­¨ï
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use_work_mause scr_h,scr_w
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Ž¡é¨¥ ä㭪樨 ®¡à ¡®âª¨
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use_general_func
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;”㭪樨 ¤«ï à ¡®âë á key
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use_key_func
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;”㭪樨 ¤«ï à ¡®âë á mouse
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use_mouse_func scr_w
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Bit mask from editbox
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ed_figure_only= 1000000000000000b ;®¤­¨ ᨬ¢®«ë
ed_always_focus= 100000000000000b
ed_focus= 10b ;䮪ãá ¯à¨«®¦¥­¨ï
ed_shift_on= 1000b ;¥á«¨ ­¥ ãáâ ­®¢«¥­ -§­ ç¨â ¢¯¥à¢ë¥ ­ ¦ â shift,¥á«¨ ¡ë« ãáâ ­®¢«¥­, §­ ç¨â ¬ë 㦥 çâ® - â® ¤¥« «¨ 㤥ন¢ ï shift
ed_shift_on_off=1111111111110111b
ed_shift= 100b ;¢ª«îç ¥âáï ¯à¨ ­ ¦ â¨¨ ­  shift â.¥. ¥á«¨ ­ ¦¨¬ î
ed_shift_off= 1111111111111011b
ed_shift_bac= 10000b ;¡¨â ¤«ï ®ç¨á⪨ ¢ë¤¥«¥­®£® shift â.¥. ¯à¨ ãáâ ­®¢ª¥ £®¢®à¨â çâ® ¥áâì ¢ë¤¥«¥­¨¥
ed_shift_bac_cl=1111111111101111b ;®ç¨á⪠ ¯à¨ 㤠«¥­¨¨ ¢ë¤¥«¥­¨ï
ed_shift_cl= 1111111111100011b
ed_shift_mcl= 1111111111111011b
ed_left_fl= 100000b
ed_right_fl= 1111111111011111b
ed_offset_fl= 1000000b
ed_offset_cl= 1111111110111111b
ed_insert= 10000000b
ed_insert_cl= 1111111101111111b
ed_mouse_on = 100000000b
ed_mous_adn_b= 100011000b
ed_mouse_on_off=1111111011111111b
ed_height=14 ; ¢ëá®â 
macro draw_edit_boxes start,_end,use_f9,procinfo
{
if use_f9 eq
else
mcall 9,procinfo,-1
end if
mov edi,start
mov ecx,((_end-start)/ed_struc_size)
@@:
call edit_box.draw
add edi,ed_struc_size
loop @b
}
 
macro mouse_edit_boxes start,_end
{
mov edi,start
mov ecx,((_end-start)/ed_struc_size)
@@:
call edit_box.mouse
add edi,ed_struc_size
loop @b
}
 
macro key_edit_boxes start,end
{
mov edi,start
mov ecx,((end-start)/ed_struc_size)
@@:
call edit_box.key
add edi,ed_struc_size
loop @b
}
ed_struc_size=70
struc edit_box width,left,top,color,shift_color,focus_border_color,\
blur_border_color,text_color,max,text,flags,size,pos
{
.width dd width
.left dd left
.top dd top
.color dd color
.shift_color dd shift_color
.focus_border_color dd focus_border_color
.blur_border_color dd blur_border_color
.text_color dd text_color
.max dd max
.text dd text
.flags dw flags+0
.size dd size+0
.pos dd pos+0
.offset dd 0
.cl_curs_x dd 0
.cl_curs_y dd 0
.shift dd 0
.shift_old dd 0
}
 
 
macro edit_boxes_set_sys_color start,end,color_table
{
mov edi,start
mov ecx,((end-start)/ed_struc_size)
mov esi,color_table
@@:
mov eax,[esi+36]
mov ebx,[esi+20]
mov ed_focus_border_color,eax
shr bh,1
shr bl,1
shr ah,1
shr al,1
add ah,bh
add al,bl
ror eax,16
ror ebx,16
shr bl,1
shr al,1
add al,bl
ror eax,16
mov ed_blur_border_color,eax
add edi,ed_struc_size
loop @b
}
 
macro draw_edit_box ed_ptr,use_f9,procinfo
{
if use_f9 eq
else
mcall 9,procinfo,-1
end if
mov edi,ed_ptr
call edit_box.draw
}
 
macro mouse_edit_box ed_ptr
{
mov edi,ed_ptr
call edit_box.mouse
}
 
macro key_edit_box ed_ptr
{
mov edi,ed_ptr
call edit_box.key
}
macro default_box ed_ptr
{
pusha
; xor eax,eax
; mov ed_shift_pos,eax
; mov ed_shift_pos_old,eax
and word ed_flags,ed_shift_cl
; mov ed_offset,eax
popa
}
/programs/network/icq/trunk/README.TXT
0,0 → 1,60
v 0.01
 
 
Âåðñèÿ òåñòîâàÿ, ïîýòîìó ìíîãî íåäîðàáîòîê
è âûâîäÿòñÿ îòëàäî÷íûå ñîîáùåíèÿ
 
Ïîääåðæèâàåòñÿ:
* Ëîêàëüíûé êîíòàêò-ëèñò, ïîêà æåñòêî çàøèò â êîä
* ïåðåäà÷à/ïðèåì ñîîáùåíèé plain-text
* Ïåðåêîäèðîâêà CP866<->CP1251
* Ïðèåì offline ñîîáùåíèé
* Îòïðàâêà ñîîáùåíèÿ ïîëüçîâàòåëþ íå â êîíòàêò-ëèñòå
/UIN Ñîîáùåíèå
 
Íåäîðàáîòêè: Ìíîãî :-)
* Îòêëþ÷åíî çàêðûòèå ñîêåòîâ - ìîÿ VM (Parallels) íàãëóõî âèñíåò, ïðè
ïîïûòêå çàêðûòü ñîêåò
 
* Âñå ñîîáùåíèÿ îò ðàçíûõ þçåðîâ â îäíîì ïîëå âûâîäà
* Íåëüçÿ ñìåíèòü ñòàòóñ
* Íåëüçÿ îòêëþ÷èòñÿ, îïÿòü æå èç-çà çàêðûòèÿ ñîêåòîâ
* Íå ïîääåðæèâàåòñÿ UTF-8 è RTF ñîîáùåíèÿ
* Èç èíôîðìàöèè î þçåðå äîñòóïåí òîëüêî íèê
* editbox èíîãäà âåäåò ñåáÿ ñòðàííî :-)
* ..........
 
Äëÿ èçìåíåíèÿ óèíà/ïàðîëÿ íàäî ïåðåêîìïèëèðîâàòü ïðîãðàììó
- ôàéë ki.asm, ïåðåìåííûå UIN è PASS
 
 
 
Äëÿ âíåñåíèÿ þçåðîâ â ÊË - ôàéë comp.inc, ôóíêöèÿ loaduin,
ïåðåìííûå U1, U2, U3 ....
(Ñêîðåå âñåãî, ïîòîì áóäåò ïåðåïèñàíî äëÿ çàãðóçêè èç ôàéëà)
 
Ò.ê. ÿ òåñòèðîâàë ïðîãðàììó òîëüêî ïîä VM, âîçìîæíî, ÷òî íè÷åãî è íå çàðàáîòàåò
Òåñòèðîâàíèå ïðîâîäèëîñü ñ ëîêàëüíûì ñåðâåðîì SIQ ïîä Windows, VM Parallels
è ñ îñíîâíûì ñåðâåðîì àñè ïîä Menuet, VM VMware (ò.ê. â parallels íåò ïîääåðæêè NAT,
à Kolibri íå ïîääåðæèâàåò ñåòåâóþ êàðòó â VMware, ìîæåò, ÿ è îøèáàþñü :-))
 
 
 
 
 
 
Âûðàæàþ áëàãîäàðíîñòü âñåì ðàçðàáîò÷èêàì OS Kolibri
çà ïðåêðàñíûå èíñòðóìåíòû è äîêóìåíòàöèþ, áåç êîòîðîé ÿ áû
íè÷åãî íå íàïèñàë :-)
 
 
 
 
 
 
 
 
 
Âñå ïîæåëàíèÿ î äàëüíåéøåé ñóäüáå ïðîåêòà (çàêðûòü, íàïðèìåð :-))øëèòå íà lv4evil@ya.ru
 
;Òîëüêî çà êðèâîé êîä è óæàñíûé àíãëèéñêèé íîãàìè íå áåéòå :-)
/programs/network/icq/trunk/build_ru.bat
0,0 → 1,2
@fasm ki.asm ki
 
/programs/network/icq/trunk/comp.inc
0,0 → 1,926
;
; ­ à¨á®¢ âì ¯àאַ㣮«ì­¨ª
; x1,y1 ---------|
; | |
; | |
; |-------------x2,y2
;
macro rect x1, y1, x2, y2, color
{
pushad
 
mov edx, color
; ------------
mov eax, 38
mov ebx, x1
shl ebx, 16
add ebx, x2
mov ecx, y1
shl ecx, 16
add ecx, y1
int 40h
 
; ------------
mov eax, 38
mov ebx, x1
shl ebx, 16
add ebx, x2
mov ecx, y2
shl ecx, 16
add ecx, y2
int 40h
; |
; |
; |
mov eax, 38
mov ebx, x1
shl ebx, 16
add ebx, x1
mov ecx, y1
shl ecx, 16
add ecx, y2
int 40h
; |
; |
; |
mov eax, 38
mov ebx, x2
shl ebx, 16
add ebx, x2
mov ecx, y1
shl ecx, 16
add ecx, y2
int 40h
 
popad
}
 
;
; ‚뢮¤ ­  íªà ­ ¡ãä¥à  á® áâப ¬¨
;
 
scbuff db 512*128 dup 0
; 512 - ¤«¨­  áâப¨
; 128 - ª®«¨ç¥á⢮ áâப
;
ind db 0 ; ’¥ªã騩 ¨­¤¥ªá
;
;
x_s dw 15 ; Š®®à¤¨­ âë «¥¢®£® ¢¥àå­¥£® 㣫  FIXIT
y_s dw 38 ;
 
; ‚ëá®â  áâப¨
SH = 10
xlen dw 512 ; ¤«¨­  áâப¨
;ylen dw 128 ; ª®«¨ç¥á⢮ áâப
ylen dw 40
 
;®á«¥¤­¨¥ 4 ¡ ©â  ¢ áâப¥ ®¡®§­ ç îâ 梥â
 
printbuff:
pushad
 
;
;  à¨á㥬 ¡¥«ë© ¯àאַ㣮«ì­¨ª
;
mov eax, 13
mov ebx, 15*65536+480
mov ecx, 31*65536+418
mov edx, 0FFFFFFh
int 40h
 
 
 
xor ecx, ecx ; ‘ç¥â稪
;xor eax, eax
xor ebx, ebx
;xor edx, edx
 
pb_loop:
xor edx, edx
xor eax, eax
mov dl, [ind] ; ˆ­¤¥ªá
mov ax, [ylen]
;mul edx
cmp ecx, eax
ja pr_end
;
;
add edx, ecx ;à¨¡ ¢¨¬ áç¥â稪
xor eax, eax
mov ax, [ylen]
cmp edx, eax ;ˆ­¤¥ªá ¬¥­ìè¥ ª®«¨ç¥á⢠ áâப
jna @f ;<=
sub edx, eax ;…᫨ ¡®«ìè¥, áç¨â ¥¬ á ­ ç « 
dec edx
@@:
;
mov bx, [x_s] ; Š®®à¤¨­ â  X
shl ebx, 16 ;
push ecx
mov eax, SH ; ‚ëç¨á«ï¥¬ ¬¥á⮯®«®¦¥­¨¥ áâப¨
imul eax, ecx ;
;mov ecx, eax
;xor eax, eax
 
;mov ax , [x_s]
xor ecx, ecx
mov cx, [y_s]
add ecx, eax
add ebx, ecx ; Š®®à¤¨­ â  Y
;
xor eax, eax
mov ax, [xlen] ;¤«¨­  áâப¨
imul edx, eax ;“¬­®¦ ¥¬ áç¥â稪 ­  ¤«¨­ã áâப¨, ¯®«ãç ¥¬ ᬥ饭¨¥ ®â­®á¨â¥«ì­® ­ ç «  ¡ãä¥à 
;mov edx, eax
add edx, scbuff
 
xor eax, eax
mov ax, [xlen]
sub eax, 4
xor ecx, ecx
mov ecx, dword [edx+eax] ; ®á«¥¤­¨¥ 4  ©â  á 梥⮬
or ecx, 0x80000000 ; ‚뢮¤¨âì ASCIIZ
mov eax, 4
mov esi, -1 ; For Menuet
int 40h
pop ecx
inc ecx
jmp pb_loop
 
 
pr_end:
popad
ret
 
;
; Žâ« ¤®ç­ë¥ á®®¡é¥­¨ï
;
macro write_debug str
{
local ..string, ..label, ..end, ..loop, ..fin
jmp ..label
 
..string db str, 0
 
..label:
pushad
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
 
mov bl, [ind]
mov ax, [xlen]
imul ebx, eax
add ebx, scbuff
 
..loop:
mov dl, [..string+ecx]
cmp dl, 0
jz ..end
mov [ebx+ecx], dl
inc ecx
jmp ..loop
..end:
mov [ebx+ecx], dl
xor ebx, ebx
mov bl, [ind]
cmp bx, [ylen]
jz @f
inc bl
jmp ..fin
@@:
xor bl, bl
 
..fin:
mov [ind], bl
call printbuff
;call draw_window
popad
}
 
;
; Š­®¯ª 
;
macro draw_button x, y, xlen, ylen, id, str
{
pushad
local ..string, ..label
jmp ..label
..string db str, 0
 
..label:
mov eax, 8
mov ebx, x*65536+xlen
mov ecx, y*65536+ylen
mov edx, id
mov esi, 0x4466aa
int 40h
 
mov eax, 4
mov ebx, (x+5)*65536+y+ylen/2-3
xor ecx, ecx
or ecx, 0x80FFFFFF
mov edx, ..string
int 40h
 
popad
}
 
;
; Žâ« ¤®ç­ë© ¢ë¢®¤ ¤ ­­ëå
;
macro data_debug str, rg
{
pushad
local ..string, ..end, ..loop, ..strend, ..fin, ..label
jmp ..label
..string db str, 20h, 0, 0, 0, 0, 0, 0, 0, 0, 0
..strend:
 
..label:
;xor eax, eax
;xor ebx, ebx
xor ecx, ecx
xor edx, edx
 
mov eax, rg
lea ebx, [..strend-9]
call int2str
 
xor eax, eax
xor ebx, ebx
 
mov bl, [ind]
mov ax, [xlen]
imul ebx, eax
add ebx, scbuff
 
..loop:
mov dl, [..string+ecx]
cmp dl, 0
jz ..end
mov [ebx+ecx], dl
inc ecx
jmp ..loop
..end:
mov [ebx+ecx], dl
xor ebx, ebx
mov bl, [ind]
cmp bx, [ylen]
jz @f
inc bl
jmp ..fin
@@:
xor bl, bl
 
..fin:
mov [ind], bl
 
 
 
call printbuff
;call draw_window
 
popad
}
 
; <--EAX
; -->[ebx]
;
int2str:
pushf
;push ebx
push ecx
push edx
push esi
 
;xor ebx, ebx
xor ecx, ecx
 
i_loop:
mov edx, eax
push ecx
shl ecx, 2
mov esi, 28
sub esi, ecx
mov ecx, esi
shr edx, cl
pop ecx
and dl, 0fh ;Žâ¤¥«¨âì ¬« ¤è¨¥ 4 ¡¨â 
cmp dl, 0Ah ;ãª¢ 
jnc @f
or dl, 0x30
jmp i_n1
 
@@:
sub dl, 9
or dl, 0x40
i_n1:
mov [ebx+ecx], dl
inc ecx
cmp ecx, 8
jnz i_loop
 
pop esi
pop edx
pop ecx
;pop ebx
popf
ret
 
;
;
CP866 db '€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯àáâãäåæçèéêëìíîï'
 
;
; ¥à¥ª®¤¨à®¢ª  ¨§ cp1251 ¢ cp866
;
; [eax] <-- Null-terminated string
;
 
win2dos:
pushad
pushf
 
xor ebx, ebx
xor ecx, ecx
;xor edx, edx
 
w2d_loop:
mov bl, [eax+ecx]
cmp bl, 0
jz w2d_end
cmp bl, 0A8h ; ð
jz w2d_yo1
cmp bl, 0B8h ; ñ
jz w2d_yo2
cmp bl, 0C0h ; ãááª ï ¡ãª¢ 
jnc w2d_rchar
inc ecx
jmp w2d_loop
 
w2d_yo1:
mov [eax+ecx], byte 0F0h
inc ecx
jmp w2d_loop
 
w2d_yo2:
mov [eax+ecx], byte 0F1h
inc ecx
jmp w2d_loop
 
w2d_rchar:
sub bl, 0C0h
mov bl, [CP866+ebx]
mov [eax+ecx], bl
inc ecx
jmp w2d_loop
 
 
w2d_end:
 
popf
popad
ret
 
 
CP1251 db 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
 
;
; ¥à¥ª®¤¨à®¢ª  ¨§ CP866 ¢ CP1251
; [eax] <-- Null termainated string
;
 
dos2win:
pushf
pushad
 
xor ebx, ebx
xor ecx, ecx
 
dec ecx
 
d2w_loop:
inc ecx
mov bl, [eax+ecx]
cmp bl, 0
jz d2w_end
cmp bl, 80h
jnc d2w_rchar
;inc ecx
jmp d2w_loop
 
d2w_yo1:
mov byte [eax+ecx], 0A8h
;inc ecx
jmp d2w_loop
 
d2w_yo2:
mov byte [eax+ecx], 0B8h
;inc ecx
jmp d2w_loop
 
d2w_rchar:
cmp bl, 0B0h
jnc d2w_rchar2
sub bl, 80h
mov bl, [CP1251+ebx]
mov [eax+ecx], bl
jmp d2w_loop
 
d2w_rchar2:
cmp bl, 0E0h
jc d2w_loop
cmp bl, 0F0h
jz d2w_yo1
cmp bl, 0F1h
jz d2w_yo2
cmp bl, 0F2h
jnc d2w_loop
add bl, 10h
mov [eax+ecx], bl
jmp d2w_loop
 
 
d2w_end:
 
popad
popf
ret
 
 
;
; „«ï ¢ë¢®¤  á®®¡é¥­¨©
; [eax] <-- null-terminated string
; ebx <-- color
;
writemsg:
pushad
push ebx
push eax
 
xor eax, eax
xor ebx, ebx
 
mov bl, [ind]
mov ax, [xlen]
imul ebx, eax
add ebx, scbuff
 
pop eax
mov edx, eax
call strlen
mov ecx, eax
mov eax, edx
call strcpy
 
mov [ebx+ecx], byte 0x00
 
xor eax, eax
mov ax, [xlen]
sub eax, 4
pop ecx
mov dword [ebx+eax], ecx ; ®á«¥¤­¨¥ 4  ©â  á 梥⮬
 
 
xor ebx, ebx
mov bl, [ind]
cmp bx, [ylen]
jz @f
inc bl
jmp ..fin
@@:
xor bl, bl
 
..fin:
mov [ind], bl
 
call printbuff
;call draw_window
 
popad
ret
 
;
;
 
 
 
; <--EAX ¥à¥¢®¤ ¨§ 16 ¢ 10 ä®à¬ã
; -->[ebx]
; --> eax ¤«¨­ 
int2strd:
pushf
;push ebx
push ecx
push edx
push esi
;push edi
 
;xor ebx, ebx
xor ecx, ecx
mov esi, 10
 
id_loop:
xor edx, edx
div esi
 
and dl, 0fh ;Žâ¤¥«¨âì ¬« ¤è¨¥ 4 ¡¨â 
or dl, 0x30
mov [ebx+ecx], dl
cmp eax, 10
inc ecx
jnc id_loop
 
and al, 0fh ;Žâ¤¥«¨âì ¬« ¤è¨¥ 4 ¡¨â 
or al, 0x30
 
mov [ebx+ecx], al
;mov [ebx+ecx+1], byte 0
inc ecx
mov eax, ecx
; ¯¥à¥¢¥à­ãâì ¯®«ã祭­ãî áâபã
;
;xor edx, edx
 
;mov esi, 2
;div esi
shr eax, 1
 
xor edx, edx
 
id_loop2:
cmp eax, 0
jz id_end
 
 
mov dl, [ebx+eax-1]
lea esi, [ebx+ecx]
sub esi, eax
mov dh, [esi]
 
mov [ebx+eax-1], dh
mov [esi], dl
 
dec eax
jmp id_loop2
 
 
 
 
id_end:
mov eax, ecx
 
;pop edi
pop esi
pop edx
pop ecx
;pop ebx
popf
ret
 
;
;
;
x_bb dw 550 ; Š®®à¤¨­ âë «¥¢®£® ¢¥àå­¥£® 㣫 
y_bb dw 30 ;
;
bb_width dw 100 ; ˜¨à¨­  ª­®¯®ª
bb_height dw 15 ; ¢ëá®â  ª­®¯®ª
;
bb_dist dw 10 ;  ááâ®ï­¨¥ ¬¥¦¤ã ª­®¯ª ¬¨
 
; ˆ¤¥­â¨ä¨ª â®àë ª­®¯®ª ­ ç¨­ ï á 100
;
; „«ï Š‹
;
;
buttonbox:
pushad
pushf
xor ecx, ecx
xor eax, eax
xor ebx, ebx
 
bb_loop:
 
; à®¢¥à塞 ¯¥à¢ë© ¡ ©â 㨭 , ¥á«¨ 0, ª­®¯ªã à¨á®¢ âì ­¥ ­ ¤®
mov ebx, NAME_LEN
imul ebx, ecx
 
mov al, [names+ebx]
cmp al, 0
jz bb_end
; à¨á㥬 ª­®¯ªã
; –¢¥â § ¢¨á¨â ®â áâ âãá  UIN
mov ebx, 4
imul ebx, ecx
mov eax, [stats+ebx] ; ‚ áâ à襬 á«®¢¥ ¤®¯®«­¨â¥«ì­ë© áâ âãá
cmp ax, -1
jz bb_offline
cmp ax, 1
jz bb_away
cmp ax, 2
jz bb_dnd
cmp ax, 4
jz bb_na
cmp ax, 10h
jz bb_bisy
cmp ax, 20h
jz bb_free4chat
cmp ax, 100h
jz bb_invis
; Online
mov esi, 0x4466AA
jmp bb_dr
 
bb_offline:
mov esi, 0xBEBEBE
jmp bb_dr
 
bb_away:
mov esi, 0x14dcc3
jmp bb_dr
 
bb_dnd:
mov esi, 0x14dcc3
jmp bb_dr
 
bb_na:
mov esi, 0x14dcc3
jmp bb_dr
 
bb_bisy:
mov esi, 0x14dcc3
jmp bb_dr
 
bb_free4chat:
mov esi, 0x2233FF
jmp bb_dr
 
bb_invis:
mov esi, 0xD0D0D0
 
bb_dr:
 
mov bx, [x_bb]
shl ebx, 16
mov bx, [bb_width]
;push ecx
mov edx, ecx
lea edx, [edx+100] ; ID
mov edi, ecx
mov cx, [y_bb]
movzx eax, [bb_height]
add ax, [bb_dist]
imul eax, edi
add ecx, eax
shl ecx, 16
mov cx, [bb_height]
mov eax, 8
int 40h
;
;  ¤¯¨áì ­  ª­®¯ª¥
;
add ebx, 50000h ; ‘¬¥é¥­¨¥ ®â «¥¢®£® ªà ï
shr ecx, 16
movzx eax, [bb_height]
shr eax, 1 ; /2
sub eax, 3 ; ᬥ饭¨¥ ¢¢¥àå ®â 業âà 
add ecx, eax ; + ¯®«®¢¨­  à §¬¥à  ª­®¯ª¨
mov bx, cx
mov ecx, 0x80FFFFFF ; –¢¥â
mov edx, names
mov esi, NAME_LEN
imul esi, edi
add edx, esi
;mov esi, -1
mov eax, 4
int 40h
 
mov ecx, edi
inc ecx
cmp ecx, UINS
ja bb_end
jmp bb_loop
 
 
bb_end:
popf
popad
ret
;
; Œ áᨢ á UIN
;
UIN_LEN = 11 ; „«¨­ 
UINS = 15 ; Š®«¨ç¥á⢮
;
uins db UIN_LEN*UINS dup 0
;
; ¬ áᨢ á® áâ âãá ¬¨
;
stats dd UINS dup -1
;
; Œ áᨢ á ¨¬¥­ ¬¨
;
NAME_LEN = 30
 
names db NAME_LEN*UINS dup 0
 
;
;
U1 db '123456789',0
U2 db '123456789',0
U3 db '123456789',0
;
; ‡ £à㧪  ¬ áᨢ  UIN
;
loaduin:
pushad
mov eax, U1
mov ebx, uins
mov ecx, 9
call strcpy
 
mov ebx, names
call strcpy
 
mov eax, U2
mov ebx, uins+UIN_LEN
mov ecx, 9
call strcpy
 
mov ebx, names+NAME_LEN
call strcpy
 
mov eax, U3
mov ebx, uins+UIN_LEN*2
mov ecx, 9
call strcpy
 
mov ebx, names+NAME_LEN*2
call strcpy
 
 
popad
ret
 
;
; ”ã­ªæ¨ï ¤«ï § £à㧪¨ Š‹ ­¨ª ¬¨ ¨ áâ âãá ¬¨
; eax <-- ®¬¥à 㨭  ¯® ¯®à浪㠢 ¬ áᨢ¥ uins, ­ ç¨­ ï á 0
; [ebx] <-- 㪠§ â¥«ì ­  null-terminated áâபã á ­®¢ë¬ ¨¬¥­¥¬
; ecx <-- ®¢ë© áâ âãá
;
loadbb:
pushad
pushf
;
; à®¢¥à塞 ­®¬¥à
;
cmp eax, UINS
jnc loadbb_end ;>=
 
 
;
; “¤ «ï¥¬ ª­®¯ªã
;
push ecx
push ebx
push eax
 
lea edx, [eax+100]
or edx, 0x80000000
mov eax, 8
int 40h
 
;
; ‘®å࠭塞 ­®¢ë© áâ âãá ¢ ¬ áᨢ¥ áâ âãᮢ
;
pop eax
mov edx, 4 ; DWORD
imul edx, eax
mov [stats+edx], ecx
;
; ‘®å࠭塞 ­®¢®¥ ¨¬ï
;
mov edi, eax ; edi <-- Uin number
pop eax ; <-- offset of string
mov ebx, eax
call strlen
mov ecx, eax ; Len
 
 
mov eax, ebx ;Source
mov edx, NAME_LEN
imul edx, edi
lea ebx, [names+edx] ; Dest
call strcpy
mov [names+edx+ecx], byte 0
 
xchg edi, eax ; eax - áç¥â¨ª, edi - 㪠§ â¥«ì ­  áâபã
pop ecx
push edi
; à¨á㥬 ª­®¯ªã
; –¢¥â § ¢¨á¨â ®â áâ âãá  UIN
cmp cx, -1
jz l_offline
cmp cx, 1
jz l_away
cmp cx, 2
jz l_dnd
cmp cx, 4
jz l_na
cmp cx, 10h
jz l_bisy
cmp cx, 20h
jz l_free4chat
cmp cx, 100h
jz l_invis
; Online
mov esi, 0x4466AA
jmp l_dr
 
l_offline:
mov esi, 0xBEBEBE
jmp l_dr
 
l_away:
mov esi, 0x14dcc3
jmp l_dr
 
l_dnd:
mov esi, 0x14dcc3
jmp l_dr
 
l_na:
mov esi, 0x14dcc3
jmp l_dr
 
l_bisy:
mov esi, 0x14dcc3
jmp l_dr
 
l_free4chat:
mov esi, 0x2233FF
jmp l_dr
 
l_invis:
mov esi, 0xD0D0D0
 
l_dr:
 
mov bx, [x_bb]
shl ebx, 16
mov bx, [bb_width]
;push ecx
mov edx, eax
lea edx, [edx+100] ; ID
mov edi, eax
mov cx, [y_bb]
movzx eax, [bb_height]
add ax, [bb_dist]
imul eax, edi
add ecx, eax
shl ecx, 16
mov cx, [bb_height]
mov eax, 8
int 40h
;
;  ¤¯¨áì ­  ª­®¯ª¥
;
add ebx, 50000h ; ‘¬¥é¥­¨¥ ®â «¥¢®£® ªà ï
shr ecx, 16
movzx eax, [bb_height]
shr eax, 1 ; /2
sub eax, 3 ; ᬥ饭¨¥ ¢¢¥àå ®â 業âà 
add ecx, eax ; + ¯®«®¢¨­  à §¬¥à  ª­®¯ª¨
mov bx, cx
mov ecx, 0x80FFFFFF ; –¢¥â
pop edx
mov esi, -1
mov eax, 4
int 40h
 
 
 
loadbb_end:
 
popf
popad
ret
/programs/network/icq/trunk/config.inc
0,0 → 1,0
__CPU_type fix p5
/programs/network/icq/trunk/editbox.mac
0,0 → 1,1078
;Œ ªà®á ¤«ï ¢ë¢®¤  ®á­®¢­ëå ä㭪権 ª®â®àë¥ ¨á¯«ì§ãîâáï ¡®ªá®¬
macro use_general_func
{
;debug_func
;----------------------------------------------------------
;--- ¯à®æ¥¤ãà  ¯à®à¨á®¢ª¨ ¢ë¤¥«¥­®© ç á⨠-----------------
;----------------------------------------------------------
.draw_shift:
test word ed_flags,ed_shift_bac ;ãáâ ­®¢ª  ä« £ , ¢ë¤¥«¥­­®© ®¡« áâ¨
jz @f
mov ebp,shift_color
mov ebx,dword ed_shift_pos
call .sh_cl_
@@: ret
;----------------------------------------------------------
;--- ¯à®æ¥¤ãà  ¯à®à¨á®¢ª¨ ⥪áâ  --------------------------
;----------------------------------------------------------
.draw_text:
;--- ¢ëç¨á«ï¥¬, ᪮«ìª® ¯®¬¥é ¥âáï ᨬ¢®«®¢ ---
;--- çâ®¡ë ¬ãá®à ­¥ à¨á®¢ âì ---
call .get_n
mov esi,ed_size
mov ebx,ed_offset
sub esi,ebx
cmp eax,esi
jae @F
mov esi,eax ;çâ®¡ë ­¥ ¢ë室¨âì §  ¯à¥¤¥«ë íªà ­ 
;--- à¨á㥬 ⥪áâ ---
@@: mov eax,4
mov ebx,ed_left
mov edx,ed_offset
add ebx,2
shl ebx,16
mov bx,ed_top
add ebx,4
mov ecx,ed_text_color
add edx,ed_text
mcall
ret
;----------------------------------------------------------
;--- ¯à®æ¥¤ãà  ¯à®à¨á®¢ª¨ ä®­  ----------------------------
;¢å®¤­ë¥ ¤ ­­ë¥
;eax
;edx - color
;----------------------------------------------------------
;¢å®¤ ⮫쪮 梥â edx
.draw_bg:
mov ebx,ed_left
add ebx,1
shl ebx,16
mov bx,ed_width
sub ebx,1
mov edx,ed_color
.draw_bg_eax:
mov ecx,ed_top
mov eax,13
add ecx,1
shl ecx,16
mov cx,ed_height
dec ecx
mcall
ret
 
;----------------------------------------------------------
;--- ¯à®æ¥¤ãà  ¯®«ã祭¨ï ª®«¨ç¥á⢠ ᨬ¢®«®¢ ¢ ⥪ã饩 é¨à¨­¥ ª®¬¯®­¥­â 
;----------------------------------------------------------
.get_n:
mov eax,ed_width ;¯®«ã祬 è¨à¨­ã ª®¬¯®­¥­â 
xor edx,edx ;१ã«ìâ â à á¯®«®£ ¥âáï ¢ ¯ à¥ edx:eax ¢ eax - ®áâ â®ª
sub eax,4 ;¢ëç⨬ 4
mov ebx,6 ;§ £à㧬¨ ¤¥«¨â¥«ì
div ebx ;à §¬¤¥«¨¬ ­  6
ret
;----------------------------------------------------------
;--- ¯à®æ¥¤ãà  à¨á®¢ ­¨ï ªãàá®à  --------------------------
;----------------------------------------------------------
;¢å®¤­ë¥ ebp- 梥â
.clear_cursor:
mov edx,ebp
mov ebx,cl_curs_x
mov ecx,cl_curs_y
jmp .draw_curs
.draw_cursor:
mov edx,ed_text_color
mov ebx,ed_pos
mov ecx,ed_offset
sub ebx,ecx
 
lea ebx,[ebx*2+ebx]
shl ebx,1
;imul ebx,6
add bx,ed_left
mov ecx,ed_top
inc ebx
add ecx,2
mov ebp,ebx
shl ebx,16
mov bx,bp
mov ebp,ecx
shl ecx,16
mov cx,bp
add cx,ed_height-4
mov cl_curs_x,ebx
mov cl_curs_y,ecx
.draw_curs:
mcall 38
ret
;----------------------------------------------------------
;--- ¯à®æ¥¤ãà  à¨á®¢ ­¨ï à ¬ª¨ ----------------------------
;----------------------------------------------------------
.draw_border:
;--- 梥â à ¬ª¨ ---
test word ed_flags,ed_focus
mov edx,ed_focus_border_color
jne @f
mov edx,ed_blur_border_color
@@:
;--- ᢥàåã ---
mov eax,38
mov ebx,ed_left
mov ecx,ebx
shl ebx,16
mov bx,cx
add bx,ed_width
mov ecx, ed_top
mov esi,ecx
shl ecx,16
mov cx,si
mcall
;--- á­¨§ã ---
mov esi,ecx
add ecx,ed_height
mov ebp,ecx
shl ecx,16
mov cx,bp
mcall
;--- á«¥¢  ---
mov cx,si
mov ebp,ebx
sub bx,ed_width
mcall
;--- á¯à ¢  ---
mov ebx,ebp
shl ebx,16
mov bx,bp
mcall
ret
;----------------------------------------------------------
;--- ¯à®¢¥àª , § è¥« «¨ ªãàá®à §  £à ­¨æë ¨, ¥á«¨ ­ ¤®, ---
;--- ¨§¬¥­ï¥¬ ᬥ饭¨¥ ------------------------------------
;--- ¥á«¨ ᬥ饭¨¥ ¡ë«® ãáâ ­®¢ª  ä« £  ed_offset_cl ¨­ ç¥
; ¥á«¨ ­¨ç¥£® ­¥ ¨§¬¥­¨«®áì â® ¢ëáâ ¢«¥­¨¥ ed_offset_fl
; ¢ ®¡é¥© ¡¨â®¢®© ¬ àà¨æ¥ á®áâ®ï­¨ï ª®¬¯®­¥­â®¢ word ed_flags
;----------------------------------------------------------
.check_offset:
pusha
mov ecx,ed_pos
mov ebx,ed_offset
cmp ebx,ecx
ja .sub_8
 
push ebx
call .get_n ;¯®«ã稬 ª®«-¢® ᨬ¢®«®¢ ¢ ¯ à¥ ॣ¨áâ஢ edx:eax
pop ebx
mov edx,ebx
add edx,eax ;ed_offset+width editbox
inc edx ;­¥®¡å®¤¨¬® ¤«ï ­®¬ «ì­®£® ¯®«®¦¥­¨ï ªãàá®à  ¢ ªà ©­¥© «¥¢®© ¯®§¨æ¨¨
cmp edx,ecx
ja @f
 
mov edx,ed_size
cmp edx,ecx
je .add_end
 
sub edx,ecx
cmp edx,8
jbe .add_8
add ebx,8
jmp .chk_d
 
.sub_8: cmp ecx,0
je .sub_min
cmp ebx,8
jbe .sub_min
sub ebx,8 ;ebx=ed_offset
jmp .chk_d
.sub_min:
xor ebx,ebx
jmp .chk_d
 
.add_end:sub edx,eax
mov ebx,edx
jmp .chk_d
.add_8: add ebx,edx
.chk_d: mov ed_offset,ebx
call .draw_bg
and word ed_flags,ed_offset_cl
edit_ex
@@:
or word ed_flags,ed_offset_fl
edit_ex
}
 
macro use_key_func
{
;Ž¡à ¡®âª  Shift ¤«ï á­ïâ¨ï ¢ë¤¥«¥­¨ï ­¥¨§¢¥áâ­®© ®¡« áâ¨
.shift: ;;;;;;;SHIFT
test word ed_flags,ed_shift
je .f_exit
 
@@: mov ebp,shift_color
or word ed_flags,ed_shift_bac ;ãáâ ­®¢ª  ä« £ , ¢ë¤¥«¥­­®© ®¡« áâ¨
mov ebx,dword ed_shift_pos
call .sh_cl_
jmp .draw_cursor_text
;;;;;;;;;;;;;;;;;;;;;
.f_exit:call .check_offset
and word ed_flags,ed_shift_cl
call .enable_null
jmp .draw_cursor_text
.sh_cl_:
;;;;;;SHIFT end
;®¡à ¡®âª  ®ç¨á⪨, ¯à¨ «¥¢®¬ - ¯à ¢®¬ ¤¢¨¦¥­¨¨ ¢ë¤¥«¥­¨ï
;¤«ï ®¡à ¡®âª¨ á­ïâ¨ï ¢ë¤¥«¥­¨ï
;¢å®¤­ë¥ ¯ à ¬¥âàë ebp=color ebx=ed_shift_pos
mov eax,dword ed_pos
cmp eax,ebx
 
jae .sh_n
push eax ;¬¥­ì襥 ¢ eax
push ebx ;¡®«ì襥
jmp .sh_n1
;¥á«¨ ¨­ ç¥
.sh_n: push ebx
push eax
.sh_n1:
call .check_offset
call .get_n
mov edx,eax ;size of ed_box
mov ecx,ed_offset
add eax,ecx ;eax = w_off= ed_offset+width
mov edx,eax ;save
pop ebx ;¡®«ì襥
pop eax ;¬¥­ì襥
 
cmp eax,ecx ;áà ¢­¥­¨¥ á ¬¥­ì襣® á offset.
jae .f_f ;¥á«¨ ¡®«ìè¥
xor eax,eax
cmp edx,ebx ;cà ¢­¨¬ à §¬¥à w_off á ¡®«ì訬
jb @f
sub ebx,ecx
jmp .nxt_f
@@: mov ebx,edx
sub ebx,ecx
jmp .nxt_f
.f_f:
sub eax,ecx
cmp edx,ebx ;cà ¢­¨¬ à §¬¥à w_off á ¡®«ì訬
jle @f
sub ebx,ecx
sub ebx,eax
jmp .nxt_f
@@:
mov ebx,edx
sub ebx,ecx
sub ebx,eax
.nxt_f:
mov edx,ebx
lea ebx,[eax*2+eax]
shl ebx,1
add ebx,ed_left
inc ebx
shl ebx,16
lea ecx,[edx*2+edx]
shl ecx,1
mov bx,cx
inc ebx
mov edx,ebp;shift_color
 
call .draw_bg_eax
@@: call .enable_null
ret
;;;;;;;;;;;;;;;;;;;;;
;“áâ ­®¢ª - á­ï⨥ ¢ë¤¥«¥­¨ï ¢ ®¤¨­ ᨬ¢®«
;;;;;;;;;;;;;;;;;;;;;
.drw_sim:
mov eax,dword ed_pos
call .draw_rectangle ;­ à¨á®¢ âì ¯àאַ㣮«ì­¨ª á § ¤ ­­ë¬ 梥⮬
jmp @b
;;;;;;;;;;;;;;;;;;;;;
;”ãªæ¨ï ãáâ ­®¢ª¨ ¢ë¤¥«¥­¨ï ¯à¨ ¤¢¨¦¥­¨ï ¢«¥¢® ¨ ¢¯à ¢® ¨ ­ ¦ â¨¨ shift
;‹®£¨ª :
;;;;;;;;;;
.draw_wigwag:
;äã­ªæ¨ï ãáâ ­®¢ª¨ ¯¥à¥¬¥­­ëå
mov ebp,shift_color
call .clear_cursor
 
or word ed_flags,ed_shift_bac ;ãáâ ­®¢ª  ä« £ , ¢ë¤¥«¥­­®© ®¡« áâ¨
mov ebp,shift_color
mov eax,dword ed_pos
test word ed_flags,ed_left_fl
jz .low
jmp @f
;;;;;;;;;;
;”ãªæ¨ï 㤠«¥­¨ï ¢ë¤¥«¥­¨ï ¯à¨ ¤¢¨¦¥­¨ï ¢«¥¢® ¨ ¢¯à ¢® ¨ ­ ¦ â¨¨ shift
;‹®£¨ª :
;;;;;;;;;;
.draw_wigwag_cl:
;äã­ªæ¨ï ãáâ ­®¢ª¨ ¯¥à¥¬¥­­ëå
mov ebp,ed_color
call .clear_cursor
 
mov ebp,ed_color
mov eax,dword ed_pos
test word ed_flags,ed_left_fl
jz .low
@@: call .draw_rectangle ;­ à¨á®¢ âì ¯àאַ㣮«ì­¨ª § ªà è¨¢ ¥¬®© ®¡« áâ¨
ret
.low: dec eax
jmp @b
;¢å®¤­®© ¯ à ¬¥âà ebx - ed_pos
.sh_first_sh:
test word ed_flags,ed_shift
je @f
mov dword ed_shift_pos_old,ebx
test word ed_flags,ed_shift_on
jne @f
mov dword ed_shift_pos,ebx
or word ed_flags,ed_shift_on
@@: ret
;Ž¡à ¡®âª  ªà ©­¨å ¯®«®¦¥­¨© ¢ editbox ¯à¨ ­ ¦ â®¬ shift
;¯à®¨§¢®¤¨â á­ï⨥ ¢ë¤¥«¥­¨¥, ¥á«¨ ­¥â shift
;¨­ ç¥ ¢®®¡é¥ ¢ë室¨â
.sh_st_of:
test word ed_flags,ed_shift
jne @f
test word ed_flags,ed_shift_bac
je @f
mov ebp,ed_color
mov ebx,dword ed_shift_pos
call .sh_cl_ ;®ç¨á⪠ ¢ë¤¥«¥­®£® äà £¬¥­â 
and word ed_flags,ed_shift_cl ; ®ç¨á⪠ ®â ⮣® çâ® ã¡à «¨ ¢ë¤¥«¥­¨¥
jmp .draw_cursor_text
@@:
and word ed_flags,ed_shift_off
edit_ex
;¯à®¢¥àª  á®áâ®ï­¨ï shift ¡ë« «¨ ®­ ­ ¦ â à ­ìè¥?
.sh_enable:
test word ed_flags,ed_shift
jne .sh_ext_en ;­ à¨á®¢ âì § ªà è¥­ë© ¯àאַ㣮«ì­¨ª
 
test word ed_flags,ed_shift_bac
je @f
call .check_offset
 
mov ebp,ed_color
mov ebx,dword ed_shift_pos
call .sh_cl_ ;®ç¨á⪠ ¢ë¤¥«¥­®£® äà £¬¥­â 
call .draw_wigwag_cl
and word ed_flags,ed_shift_cl ; 1¢ à ­¥ ­ã¦­®
ret
 
@@: mov ebp,ed_color
call .clear_cursor
call .check_offset
ret
.sh_ext_en:
call .check_offset
test word ed_flags,ed_offset_fl
je @f
;¨á®¢ ­¨¥ § ªà è¥­ëå ¯àאַ㣮«ì­¨ª®¢ ¨ ®ç¨á⪠ ¨å
mov eax,dword ed_shift_pos
mov ebx,dword ed_pos
mov ecx,dword ed_shift_pos_old
;¯à®¢¥àª  ¨ à¨á®¢ ­¨¥ § ªà è¥­ëå ®¡« á⥩
cmp eax,ecx
je .1_shem
jb .smaller
cmp ecx,ebx
ja .1_shem
call .draw_wigwag_cl ;clear
jmp .sh_e_end
.smaller:
cmp ecx,ebx
jb .1_shem
call .draw_wigwag_cl ;clear
jmp .sh_e_end
;alike =
.1_shem: call .draw_wigwag
.sh_e_end: and word ed_flags,ed_shift_off
ret
@@: mov ebp,shift_color
mov ebx,dword ed_shift_pos
call .sh_cl_
jmp .sh_e_end
;äã­ªæ¨ï ¤«ï ®¡à ¡®âª¨ shift ¯à¨ ­ ¦ â¨¨ home and end
.sh_home_end:
mov ebp,ed_color
call .clear_cursor
test word ed_flags,ed_shift_bac
je @f
mov ebp,ed_color
mov ebx,dword ed_shift_pos_old
call .sh_cl_
 
@@: test word ed_flags,ed_shift
je .sh_exit_ ;¢ë©â¨
mov ebp,shift_color
mov ebx,dword ed_shift_pos
call .sh_cl_
or word ed_flags,ed_shift_bac ;ãáâ ­®¢ª  ä« £ , ¢ë¤¥«¥­­®© ®¡« áâ¨
jmp .sh_e_end
.sh_exit_: call .check_offset
ret
;äã­ªæ¨ï ¢­¥á¥­¨ï 0 ¯®  ¤à¥áã ed_size+1
.enable_null:
pusha
mov eax,ed_size
mov ebx,ed_text
test eax,eax
add eax,ebx
jne @f
inc eax
@@: xor ebx,ebx
mov [eax],bl
edit_ex
;- 㤠«¥­¨¥ ᨬ¢®« 
;‚室­ë¥ ¤ ­­ë¥ edx=ed_size;ecx=ed_pos
.del_char:
mov esi,ed_text
test word ed_flags,ed_shift_on
je @f
mov eax,dword ed_shift_pos
mov ebx,esi
cmp eax,ecx
jae .dh_n
 
mov ed_pos,eax ;çâ® ¡ë ­¥ ¡ë«® ã¡¥£ ­¨ï ªãàá®à 
mov ebp,ecx
sub ebp,eax
add ebx,eax ;eax ¬¥­ìè¥
sub edx,ecx
add esi,ecx
 
mov dword ed_shift_pos,ebp
jmp .del_ch_sh
;¥á«¨ ¨­ ç¥
.dh_n:
mov ebp,eax
sub ebp,ecx
add ebx,ecx
sub edx,eax
add esi,eax
mov dword ed_shift_pos,ebp
jmp .del_ch_sh
 
@@: add esi,ecx ;㪠§ â¥«ì + ᬥ饭¨¥ ª ॠ«ì­®¬ã ¡ãää¥àã
mov ebx,esi
inc esi
cld
 
sub edx,ecx
.del_ch_sh:
 
push edi
mov edi,ebx
@@:
lodsb
stosb
dec edx
jns @b
pop edi
ret
;¢ëç¨á«¨âì § ªà è¨¢ ¥¬ãî ®¡« áâì
;ᮣ« è¥­¨¥ ¢ ebp - ¯¥à¥¤ ¥âáï ed_size
.clear_bg:
call .get_n ;¯®«ãç¨âì à §¬¥à ¢ ᨬ¢®« å è¨à¨­ë ª®¬¯®­¥­â 
push eax
mov ebx,ed_offset
add eax,ebx ;eax = w_off= ed_offset+width
mov ebx,ebp ;ed_size
cmp eax,ebx
jb @f
mov eax,ed_pos
sub ebx,eax
mov ecx,ed_offset
sub eax,ecx
jmp .nxt
@@: mov ebx,ed_pos
push ebx
sub eax,ebx
mov ebx,eax ;It is don't optimal
pop eax ;ed_pos
mov ecx,ed_offset
sub eax,ecx
.nxt:
mov ebp,eax ;¯à®¢¥àª  ­  ¢ë室 § ªà è¨¢ ¥¬®© ®¡« á⨠§  ¯à¥¤¥«ë ¤«¨­ë
add ebp,ebx
pop edx
cmp ebp,edx
je @f
inc ebx
 
@@: mov edx,ebx
lea ebx,[eax*2+eax]
shl ebx,1
add ebx,ed_left
inc ebx
shl ebx,16
lea ecx,[edx*2+edx]
shl ecx,1
mov bx,cx
mov edx,ed_color
call .draw_bg_eax
ret
;;;;;;;;;;;;;;;;;;;
;;; Ž¡à ¡®âª  ¯à¨¬¨â¨¢®¢
;;;;;;;;;;;;;;;;;;;;
; à¨á®¢ âì ¯àאַ㣮«ì­¨ª, 梥⠯¥à¥¤ ¥âáï ¢ ebp
;¢å®¤­ë¥ ¯ à ¬¥âàë:
;eax=dword ed_pos
;ebp=-梥â ed_color or shift_color
.draw_rectangle:
mov ecx,dword ed_offset
sub eax,ecx
lea ebx,[eax*2+eax]
shl ebx,1
inc ebx
add ebx,ed_left
shl ebx,16
mov bx,6
mov edx,ebp
call .draw_bg_eax
ret
;;;;;;;;;;;;;;;;;;
;;à®¢¥àª  ­ ¦ â «¨ shift
;;;;;;;;;;;;;;;;;;
.check_shift:
pusha ;á®åà ­¨¬ ¢á¥ ॣ¨áâàë
mcall 66,3,1
test al,0x03
je @f
or word ed_flags,ed_shift ;ãáâ ­®¢¨¬ ä« £
@@:edit_ex
}
;¬ ªà®á ª« ¢¨è ­  ª®â®àë¥ ¯à®¨á室¨â ॠªæ¨ï
macro use_key_process backspase,delete,left,right,home,end,insert
{
if backspase eq
else
cmp ah,8
jz .backspace
end if
if delete eq
else
cmp ah,0xb6
jz .delete
end if
if left eq
else
cmp ah,176
jz .left
end if
if right eq
else
cmp ah,179
jz .right
end if
if home eq
else
cmp ah,180
jz .home
end if
if home eq
else
cmp ah,181
jz .end
end if
if insert eq
else
cmp ah,185 ;insert
jz .insert
end if
}
macro use_key_no_process up,down,esc
{
if up eq
else
cmp ah,177
jz .editbox_exit
end if
if down eq
else
cmp ah,178
jz .editbox_exit
end if
if esc eq
else
cmp ah,27 ;ESC - ª« ¢¨è  ))
jz .editbox_exit
end if
}
 
macro use_key_figures_only
{
test word ed_flags,ed_figure_only ; ⮫쪮 æ¨äàë ?
jz @f
cmp ah,'0'
jb .editbox_exit
cmp ah,'9'
ja .editbox_exit
@@:
}
macro are_key_shift_press
{
test word ed_flags,ed_shift_on
je @f
;‚室­ë¥ ¤ ­­ë¥ edx=ed_size;ecx=ed_pos
push eax
mov edx,ed_size
mov ecx,ed_pos
pusha
;;;;;;;;;;;;;;;;;;;;;
mov ebp,ed_color
mov ebx,dword ed_shift_pos
call .sh_cl_
;;;;;;;;;;;;;;;;;;;;;
popa
call .del_char
;;;;
mov eax,dword ed_shift_pos
mov ebx,ed_size
sub ebx,eax
mov ed_size,ebx
pop eax
@@:
}
macro are_key_cur_end
{
mov ecx,ed_size
mov edx, ed_max
test word ed_flags,ed_insert
jne @f
cmp ecx,edx
jae .editbox_exit
@@: mov ebx, ed_pos
cmp ebx,edx
jl @f ; ¥á«¨ ¬¥­ìè¥ ¨«¨ à ¢­®
jmp .editbox_exit
 
@@: ; ᤢ¨£ ¥¬ ᨬ¢®«ë ¯®á«¥ ªãàá®à  ¢¯à ¢®
mov ecx,ed_size
push edi eax
mov ebp,edi
mov esi,ed_text ; “ª § â¥«ì ­  ¡ãä¥à
;ã¤¥¬ à ¡®â âì á® áâப®©
add esi,ecx ;add ed_size ¤®¡ ¢¨¬ max size
mov edi,esi
 
cmp ecx,ebx ;…᫨ ã ­ á ¯®§¨æ¨ï ªãàá®à  = ⥪ã饬ã à §¬¥àã ­ ¯¥ç â ­­ëå ᨬ¢®«®¢ â.¥. ªãàá®à á⮨⠢ ª®­æ¥
je .In_k
 
test word [ebp+40],ed_insert ;IF insert is enable â.ª. edi ¨§¬¥­¥­  ¤à¥á㥬 ç¥à¥§ ebp
jne .ins_v
;clear
pusha
mov edi,ebp
mov ebp,ed_size
call .clear_bg
popa
sub ecx,ebx ; ©¤¥¬ ª®«-¢® ᨬ¢®«®¢ ¤«ï ¯¥à¥¤¢¨¦¥­¨ï.
inc edi ;‘¬¥á⨬ ­ è¨ ᨬ¢®«ë ¢ ¯à ¢®
std
inc ecx
@@:
;--------
lodsb
stosb
;--------
loop @b
.In_k: cld
pop eax
mov al,ah
stosb
pop edi
; ¢áâ ¢«ï¥¬ ª®¤ ª« ¢¨è¨ â㤠, £¤¥ ªãàá®à
; 㢥«¨ç¨¢ ¥¬ §­ ç¥­¨¥ à §¬¥à  ¨ ¯®§¨æ¨¨
inc dword ed_size
inc dword ed_pos
call .draw_all2
jmp .shift
}
macro use_work_key
{
.insert: test word ed_flags,ed_insert ;not word ed_insert
je @f
and word ed_flags,ed_insert_cl
jmp .editbox_exit
@@:
or word ed_flags,ed_insert
jmp .editbox_exit
.ins_v:
dec dword [ebp+42];ed_size ;processing is insert
sub esi,ecx
add esi,ebx
mov edi,esi
;clear
pusha
mov edi,ebp
mov ebp,ed_pos
call .clear_bg
popa
jmp .In_k
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.delete:
mov edx,ed_size
mov ecx,ed_pos
cmp edx,ecx
jg .bac_del
test word ed_flags,ed_shift_on
jne .del_bac
edit_ex
.bac_del:
call .del_char
jmp .draw_all
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--- ­ ¦ â  ª« ¢¨è  backspace ---
.backspace:
; ¯à®¢¥à塞, ªãàá®à ã «¥¢®£® ªà ï ?
mov ecx,ed_pos
test ecx,ecx
jnz .del_bac
test word ed_flags,ed_shift_on
jne .bac_del
 
edit_ex
.del_bac:
mov edx,ed_size
cmp edx,ecx ;if ed_pos=ed_size
je @f
dec ecx
call .del_char
@@: test word ed_flags,ed_shift_on
jne .bac_del
dec dword ed_pos
.draw_all:
push .shift;.draw_cursor_text;eax
 
test word ed_flags,ed_shift_on
je @f
mov eax,dword ed_shift_pos
mov ebx,ed_size
sub ebx,eax
mov ed_size,ebx
 
mov ebp,ed_color
call .clear_cursor
call .check_offset
call .draw_bg
ret
@@: dec dword ed_size
 
.draw_all2:
and word ed_flags,ed_shift_cl
mov ebp,ed_color
call .clear_cursor
call .check_offset
mov ebp,ed_size
call .clear_bg
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--- ­ ¦ â  ª« ¢¨è  left ---
.left: mov ebx,ed_pos
test ebx,ebx
jz .sh_st_of
or word ed_flags,ed_left_fl
call .sh_first_sh
dec dword ed_pos
call .sh_enable
jmp .draw_cursor_text
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--- ­ ¦ â  ª« ¢¨è  right ---
.right: mov ebx,ed_pos
cmp ebx,ed_size
je .sh_st_of
and word ed_flags,ed_right_fl
call .sh_first_sh
inc dword ed_pos
call .sh_enable
jmp .draw_cursor_text
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.home:
mov ebx,ed_pos
test ebx,ebx
jz .sh_st_of
call .sh_first_sh
xor eax,eax
mov ed_pos,eax
call .sh_home_end
jmp .draw_cursor_text
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.end:
mov ebx,ed_pos
cmp ebx,dword ed_size
je .sh_st_of
call .sh_first_sh
mov eax,ed_size
mov ed_pos,eax
call .sh_home_end
jmp .draw_cursor_text
}
 
macro use_mouse_func scr_w
{
;----------------------------------------------------------
;--- Ž¡à ¡®âª  .mouse_wigwag
;----------------------------------------------------------
.mouse_wigwag:
shr eax,16
or word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
;;;;;;;;;;;;;;;;;;
;;¯à®æ¥¤ãà  ®¡à ¡®âª¨ ¯®«®¦¥­¨ï ¢ë¤¥«¥­­®£® ⥪áâ , ª®£¤  ¯à®¨á室¨â ¢ë室 §  ¯à¥¤¥«ë editbox
;;;;;;;;;;;;;;;;;;
mov ebx,[procinfo.box.left]
add ebx,ed_left
if scr_w eq
else
add ebx,dword scr_w
end if
cmp eax,ebx
jb .mleft
 
add ebx,ed_width
cmp eax,ebx
ja .mright
 
sub ebx,ed_width
 
xor edx,edx
sub eax,ebx ; ¢ëç⨬ ¨§ ª®®à¤¨­ â ¬ë誨 ¯® ®á¨ å ª®®à¤¨­ âë ¤® editbox ¯® ®á¨ å
mov ebx,6
div ebx
;;;;;;;;;;;;;;;;;;
;;¯à®æ¥¤ãà  ®¡à ¡®âª¨ ¯®«®¦¥­¨ï ¢ë¤¥«¥­­®£® ⥪áâ , ¢ ¯à¥¤¥« å ®¡« á⨠editbox
;;;;;;;;;;;;;;;;;;
;®«ã稫¨ ª®®à¤¨­ âë ¢ eax ¬ë誨, â.¥. ªã¤  ®­  ¯¥à¥¬¥á⨫ áì
;¨á®¢ ­¨¥ § ªà è¥­ëå ¯àאַ㣮«ì­¨ª®¢ ¨ ®ç¨á⪠ ¨å
add eax,ed_offset ;¤®¡ ¢¨¬ ᬥ饭¨¥
cmp eax,dword ed_size ;¥á«¨ ¢ë諨 §  ¯à¥¤¥«ë, â® ­¨ç¥£® ­¥ ¤¥« âì
ja .mwigvag
.mdraw:
mov dword ed_pos,eax ;á®åà ­¨¬ ­®¢®¥ §­ ç¥­¨¥
;¨á®¢ ­¨¥ § ªà è¥­ëå ¯àאַ㣮«ì­¨ª®¢ ¨ ®ç¨á⪠ ¨å
mov ecx,dword ed_shift_pos
mov ebx,dword ed_shift_pos_old
mov dword ed_shift_pos_old,eax ;¢­¥á¥¬ ­®¢®¥ §­ ç¥­¨¥ áâ à®© ¯®§¨æ¨¨ ªãàá®à 
;¯à®¢¥àª  ¨ à¨á®¢ ­¨¥ § ªà è¥­ëå ®¡« á⥩
cmp ecx,ebx ;¢ëïá­ï¥¬ ªã¤  ¡ë«® ¤¢¨¦¥­¨¥ ­  ®¤¨­ è £ ­ § ¤
je .m1_shem ;¤¢¨¦¥­¨ï ­¥ ¡ë«® à ­¥¥
jb .msmaller ;¤¢¨¦¥­¨¥ ¡ë«® ->
cmp ebx,eax ;¤¢¨¦¥­¨¥ ¡ë«® ¤® í⮣® <- ¨ âãâ ¬ë ¯à®¢¥à塞 ᥩç á ªã¤  ¤¢¨¦¥­¨¥ ¯à®¨á室¨â
ja .m1_shem ;¥á«¨ ¡ë«® ¤¢¨¦¥­¨¥ <- â® ­ã¦­® § ªà á¨âì ®¡« áâì
je .mwigvag ;¥á«¨ ¨§¬¥­¥­¨ï ­¥ ¡ë«®, â® ­¨ç¥£® ­¥ ¤¥« âì
mov ebp,ed_color ;âã⠭㦭® ®ç¨áâ¨âì ®¡« áâì c ed_pos ed_shift_pos_old
;¢å®¤­ë¥ ¯ à ¬¥âàë ebp=color ebx=ed_shift_pos
call .sh_cl_
jmp .mwigvag
.msmaller:
cmp ebx,eax
jb .m1_shem
mov ebp,ed_color
;¢å®¤­ë¥ ¯ à ¬¥âàë ebp=color ebx=ed_shift_pos
call .sh_cl_
jmp .mwigvag
;alike =
.m1_shem:
mov ebp,shift_color
;¢å®¤­ë¥ ¯ à ¬¥âàë ebp=color ebx=ed_shift_pos
mov ebx,ecx
call .sh_cl_
jmp .mwigvag
.mwigvag:
and word ed_flags,ed_shift_mcl
jmp .draw_cursor_text
; popa
; ret
.mleft:
mov eax,ed_pos
cmp eax,0
jbe .mwigvag
dec eax
call .check_offset
push eax
mov ebx,ed_shift_pos
mov ebp,shift_color
call .sh_cl_
pop eax
jmp .mdraw
.mright:
mov eax,ed_pos
mov ebx,ed_size
cmp eax,ebx
jae .mwigvag
inc eax
call .check_offset
mov ebx,ed_shift_pos
mov ebp,shift_color
push eax
call .sh_cl_
pop eax
jmp .mdraw
}
 
macro use_work_mause scr_h,scr_w
;----------------------------------------------------------
;--- € ­¥ 㤥ন¢ ¥¬ «¨ ¬ë ª« ¢¨èã ¬ë誨, ¯¥à¥¬¥é ï ªãàá®à, ¢® ¢á¥ à §­ë¥ áâ®à®­ë?
;----------------------------------------------------------
{
test word ed_flags,ed_mouse_on
jne .mouse_wigwag
;----------------------------------------------------------
;--- ¯à®¢¥à塞, ¯®¯ ¤ ¥â «¨ ªãàá®à ¢ edit box -------------
;----------------------------------------------------------
mov ebx,[procinfo.box.top]
add ebx,ed_top
if scr_h eq
else
add ebx,scr_h
end if
cmp ax,bx
jl ._blur;.mouse_end_no_focus
 
add ebx,ed_height
cmp ax,bx
jg ._blur;.mouse_end_no_focus
 
shr eax,16
 
mov ebx,[procinfo.box.left]
add ebx,ed_left
if scr_w eq
else
add ebx,scr_w
end if
cmp ax,bx
jl ._blur;.mouse_end_no_focus
 
add ebx,ed_width
cmp ax,bx
jg ._blur;.mouse_end_no_focus
;--- ¨§¬¥­ï¥¬ ¯®§¨æ¨î ªãàá®à  ---
push eax
mov ebp,ed_color
call .clear_cursor
pop eax
._mvpos:
mov ebx,dword [procinfo.box.left]
xor edx,edx
sub eax,ed_left
sub eax,ebx
if scr_w eq
else
add ebx,scr_w
sub eax,2
end if
mov ebx,6
div bx
add eax,ed_offset
cmp eax,ed_size
jna ._mshift
mov eax,ed_size
._mshift:
;;;;;;;
;;‘¥ªæ¨ï ®¡à ¡®âª¨ shift ¨ ¢ë¤¥«¥­¨ï ¯® shift
;;;;;;;
test word ed_flags,ed_shift_bac
je @f
mov ebp,dword ed_color
mov ebx,dword ed_shift_pos
push eax
call .sh_cl_
and word ed_flags,ed_shift_bac_cl
pop eax
@@:
test word ed_flags,ed_mouse_on
jne @f
mov dword ed_shift_pos,eax
or word ed_flags,ed_mouse_on
mov dword ed_pos,eax
mov dword [mouse_flag],edi ;ãáâ ­®¢¨¬ ¨¤¥­â¨ä¨ª â®à
bts word ed_flags,1 ;ãáâ ­®¢ª  䮪ãá 
jmp .m_sh
@@:
cmp eax,dword ed_shift_pos ;¥á«¨ ¯®§¨æ¨¨ ­¥ ¨§¬¥­¨«¨áì
je .editbox_exit
mov ed_pos,eax
mov ebp,dword shift_color
mov ebx,dword ed_shift_pos
call .sh_cl_
or word ed_flags,ed_mous_adn_b ;ãáâ ­®¢¨¬ ¡¨â çâ® ¬ë ¢ë¤¥«¨«¨ +shift_on +
.m_sh: call .draw_text
call .draw_cursor
;----------------------------------------------------------
;--- ¯à®æ¥¤ãà  ãáâ ­®¢ª¨ 䮪ãá  ---------------------------
;----------------------------------------------------------
jmp .drc
._blur:
test word ed_flags,ed_always_focus
jne .editbox_exit
btr word ed_flags,1 ; ¥á«¨ ­¥ ¢ 䮪ãá¥, ¢ë室¨¬
jnc .editbox_exit
 
mov ebp,ed_color
call .clear_cursor
.drc: call .draw_border
jmp .editbox_exit
}
 
 
; Œ ªà®á ¢ë室 
macro edit_ex
{
popa
ret
}
macro debug
{
;----------- ®â« ¤ª 
pushad
; mov dword [ed_buffer.2],0
; mov eax,edi
mov eax,dword [ed_buffer.2]
mov edi,ed_buffer.3
call .str
;à¨á®¢ ­¨¥ ä®­ 
mov eax,13
mov ebx,178*65536+70
mov ecx,28*65536+10
xor edx,edx
int 0x40
;¢ë¢®¤ §­ ç¥­¨ï ­  íªà ­
mov eax,4
mov ebx,180*65536+30
mov ecx,0x10DDBBCC
mov edx,ed_buffer.3
mov esi,8
int 0x40
popad
;----------- ®â« ¤ª 
}
macro debug_func
{
.str:
mov ecx,0x0a ;§ ¤ ¥âáï á¨á⥬  áç¨á«¥­¨ï ¨§¬¥­ïîâáï ॣ¨áâàë ebx,eax,ecx,edx ¢å®¤­ë¥ ¯ à ¬¥âàë eax - ç¨á«®
;¯à¥à¥¢®¤ ç¨á«  ¢ ASCII áâப㠢§®¤­ë¥ ¤ ­­ë¥ ecx=á¨á⥬  áç¨á«¥­ï edi  ¤à¥á ªã¤  § ¯¨á뢠âì, ¡ã¤¥¬ áâபã, ¯à¨ç¥¬ ª®­¥æ ¯¥à¥¬¥­­®©
cmp eax,ecx ;áà ¢­¨âì ¥á«¨ ¢ eax ¬¥­ìè¥ ç¥¬ ¢ ecx â® ¯¥à¥©â¨ ­  @@-1 â.¥. ­  pop eax
jb @f
xor edx,edx ;®ç¨áâ¨âì edx
div ecx ;à §¤¥«¨âì - ®áâ â®ª ¢ edx
push edx ;¯®«®¦¨âì ¢ á⥪
;dec edi ;ᬥ饭¨¥ ­¥®¡å®¤¨¬®¥ ¤«ï § ¯¨á¨ á ª®­æ  áâப¨
call .str;¯¥à¥©â¨ ­  á ¬ã ᥡï â.¥. ¢ë§¢ âì á ¬ã á¥¡ï ¨ â ª ¤® ⮣® ¬®¬¥­â  ¯®ª  ¢ eax ­¥ áâ ­¥â ¬¥­ìè¥ ç¥¬ ¢ ecx
pop eax
@@: ;cmp al,10 ;¯à®¢¥à¨âì ­¥ ¬¥­ìè¥ «¨ §­ ç¥­¨¥ ¢ al 祬 10 (¤«ï á¨á⥬ë áç¨á«¥­ï 10 ¤ ­­ ï ª®¬ ­¤  - «¨è­ ï))
;sbb al,$69 ;- ç¥áâ­® ¤ ­­ ï ¨­áâàãªæ¨ï ¬¥­ï § áâ ¢«ï¥â § ¤ã¬ âìáï â.¥. ï ­¥ §­ î ª ª íâ® à ¡®â ¥â
;das ;¯®á«¥ ¤ ­­®© ª®¬ ­¤ë ª ª ¡ë ¯à®¨á室¨â 㬥­ì襭¨¥ al ­  66h (¢ ª­¨£¥ ­ ¯¨á ­® ¤à㣮¥)
or al,0x30 ;¤ ­­ ï ª®¬ ­¤  ª®à®ç¥ 祬 ¤¢¥ ¢ëè¥
stosb ;§ ¯¨á âì í«¥¬¥­â ¨§ ॣ¨áâà  al ¢ ï祪㠯 ¬ï⨠es:edi
ret ;¢¥à­ãâìáï ç¥­ì ¨­â¥à¥á­ë© 室 â.ª. ¯®ª  ¢ á⥪¥ åà ­¨âìáï ª®«-¢® ¢ë§®¢®¢ â® á⮫쪮 à § ¬ë ¨ ¡ã¤¥¬ ¢ë§ë¢ âìáï
}
/programs/network/icq/trunk/ki.asm
0,0 → 1,3496
; <--- description --->
; compiler: FASM 1.67.21
; name: ICQ for Kolibri
; version: 0.01
; written by: LV
; e-mail: lv4evil@ya.ru
 
 
; <--- include all MeOS stuff --->
include "lang.inc"
include "MACROS.INC"
purge mov
;include "ASCL9/ascl.inc"
;include "debug.inc"
include "editbox.inc"
 
; <--- start of MenuetOS application --->
MEOS_APP_START
 
;include "debug.inc"
include "2000.inc"
include "comp.inc"
 
use_edit_box procinfo,22,5
 
; <--- start of code --->
CODE
;mov eax, 40
;mov ebx, 47h
;int 40h
call loaduin
call draw_window ; at first create and draw the window
;call buttonbox
 
wait_event: ; main cycle
mov eax, 23
mov ebx, 20
int 0x40
 
cmp eax, 1 ; if event == 1
je redraw ; jump to redraw handler
cmp eax, 2 ; else if event == 2
je key ; jump to key handler
cmp eax, 3 ; else if event == 3
je button ; jump to button handler
;
; †¤¥¬ ¤ ­­ëå
;
mov eax, 53
mov ebx, 2
push ecx
mov ecx, [socket]
int 0x40
pop ecx
cmp eax, 0
jnz read_socket
 
mouse_edit_box inputbox
;
; …᫨ ¥áâì ᮥ¤¨­¥­¨¥ á á¥à¢¥à®¬, ¯®áë« ¥¬ ¯ ª¥âë - ¯®¤â¢¥¦¤¥­¨ï ª ¦¤ë¥ 60 á
;
call sendkeep
jmp wait_event ; else return to the start of main cycle
 
 
redraw: ; redraw event handler
call draw_window
jmp wait_event
 
 
key: ; key event handler
mov eax, 2 ; get key code
int 0x40
 
cmp ah, 0Dh ; à®¡¥« - ®â¯à ¢¨âì á®®¡é¥­¨¥
jz send
 
 
key_edit_box inputbox
 
jmp wait_event
 
 
button: ; button event handler
mov eax, 17 ; get button identifier
int 0x40
 
cmp ah, 2
jz connect
 
cmp ah, 3
jz disconnect
 
cmp ah, 4
jz send
 
;
; à®¢¥à塞, ­¥ ­ ¦ â  «¨ ª­®¯ª  ¢ Š‹
; 100 <ID <= 100+UINS
cmp ah, UINS+100
jnc @f
cmp ah, 100
jc @f
;
;  ¦ â 
;
sub ah, 100
mov [curruser], ah
;
; ‚뢮¤¨¬ áâà®çªã, ª®¬ã
;
shr eax, 8
and eax, 000000FFh
push eax
mov eax, CUSER
call strlen
mov ecx, eax
mov eax, CUSER
mov ebx, buff
call strcpy
pop eax
mov ebx, NAME_LEN
imul ebx, eax
lea eax, [names+ebx]
mov [buff+ecx], ' ' ; à®¡¥«
lea ebx, [buff+ecx+1]
mov ecx, NAME_LEN
call strcpy
mov eax, buff
xor ebx, ebx
call writemsg
 
 
 
 
@@:
cmp ah, 1
jne wait_event ; return if button id != 1
 
or eax, -1 ; exit application
int 0x40
 
 
draw_window:
mov eax, 12 ; start drawing
mov ebx, 1
int 0x40
 
mov eax, 0 ; create and draw the window
mov ebx, 100*65536+700 ; (window_cx)*65536+(window_sx)
mov ecx, 100*65536+500 ; (window_cy)*65536+(window_sy)
mov edx, 0x03ffffff ; work area color & window type 3
; mov esi, 0 ; grab color (not used)
; mov edi, 0 ; frame color (not used)
int 0x40
 
mov eax, 4 ; window header
mov ebx, 8*65536+8 ; coordinates
mov ecx, 0x10ffffff ; color & font N1
mov edx, header ; address of text
mov esi, header.size ; length of text
int 0x40
 
draw_edit_box inputbox
 
rect 10, 30, 500, 450, 0
 
draw_button 600, 460, 60, 15, 2, 'CONNECT'
;draw_button 600, 460, 60, 15, 3, 'Disconnect'
draw_button 530, 460, 60, 15, 4, 'SEND'
 
call printbuff
call buttonbox
 
mov eax, 12 ; finish drawing
mov ebx, 2
int 0x40
 
ret
 
;
; ‘®¥¤¨­¥­¨¥
;
connect:
mov eax, ICQ_IP
mov ebx, ICQ_PORT
call srv_connect
;call srv_login
 
 
jmp wait_event
 
 
;
;
;
disconnect:
mov ecx, [socket]
call closesocket
 
jmp wait_event
 
 
;
;
;
send:
;
; Ž¯à¥¤¥«ï¥¬, ­¥ ᬥ­¥­ «¨ ⥪ã騩 “ˆ
;
; „«ï ᬥ­ë ¨á¯®«ì§ã¥âáï / ¢ ­ ç «¥ áâப¨ ¨ ­®¬¥à 㨭 
; ¯® ¯®à浪ã. …᫨ ¤«¨­  > 2 ᨬ¢®«®¢, áç¨â ¥âáï, çâ® ¯¥à¥¤ ­
; á ¬ 㨭 - ¤«ï ®â¯à ¢ª¨ á®®¡é¥­¨© ࠬ, ª®â®àëå ­¥â ¢ Š‹
;
mov al, [inputbuff]
cmp al, '/'
jnz sd_message
; ‘¬¥­  㨭 
;mov al, [inputbuff+2]
;cmp al, 20h
;jz sd_use_kl
mov al, [inputbuff+3]
cmp al, 20h ; à®¡¥«
jz sd_use_kl
;
; ˆé¥¬ ¯¥à¢ë© ¯à®¡¥«, ¨¬ ¤®«¦¥­ § ª®­ç¨âìáï 㨭
;
xor ecx, ecx
sd_loop:
mov al, [inputbuff+ecx]
cmp al, 20h
jz sd_space
cmp al, 0
jz wait_event
inc ecx
jmp sd_loop
 
sd_space:
;
; ‡ ¬¥­ï¥¬ ¯à®¡¥« ­  0, ®âáë« ¥¬ á®®¡é¥­¨¥
mov [inputbuff+ecx], byte 0
lea ebx, [inputbuff+1]
lea eax, [inputbuff+ecx+1]
call sendmsg
mov ebx, 0000FFh
call writemsg
jmp wait_event
 
 
 
sd_use_kl:
lea eax, [inputbuff+1]
mov [inputbuff+3], byte 0
call ascitoint
lea eax, [eax-1] ; ’.ª. ¢ Š‹ ®âáç¥â á 0
mov [curruser], al
 
sd_message:
;
; ‘®®¡é¥­¨¥
movzx eax, [curruser]
mov ebx, UIN_LEN
imul ebx, eax
lea ebx, [uins+ebx]
mov al, [inputbuff]
cmp al, '/'
jz @f
mov eax, inputbuff
jmp sd_send
@@:
;mov al, [inputbuff+2]
;cmp al, ' '
;jz @f
lea eax, [inputbuff+4]
;jmp sd_send
;@@: lea eax, [inputbuff+3]
sd_send:
call sendmsg
mov ebx, 0000FFh
call writemsg
 
 
jmp wait_event
 
 
;
; …áâì ¯à¨­ïâë¥ ¤ ­­ë¥
;
read_socket:
pushf
pushad
;write_debug 'Some data in socket'
;
; à®¢¥à塞, ­¥ ¡ë« «¨ ¯®«ã祭 § £®«®¢®ª ®â¤¥«ì­® ®â ¤ ­­ëå
; ¢ ¯à¥¤ë¤ã饬 横«¥
;
cmp [hrf], 1
jz rs_head_recived
 
 
mov eax, 53
mov ebx, 2
mov ecx, [socket]
int 40h
cmp eax, 6 ; Flap head size
jc r_end
;
; à¨­¨¬ ¥¬ § £®«®¢®ª
;
xor edx, edx
 
;mov ecx, [socket]
rs_loop:
mov eax, 53
mov ebx, 3
int 40h
 
mov [mbuff+edx], bl
inc edx
cmp edx, 6
 
jnz rs_loop
;
; ‡ ¯®«­ï¥¬ § £®«®¢®ª
;
;xor eax, eax
 
;
; ‡ £®«®¢®ª ¯à¨­ïâ!
;
mov [hrf], 1
 
mov bl, [mbuff]
mov [rflap.bId], bl
 
mov bl, [mbuff+1]
mov [rflap.bCh], bl
 
mov bh, [mbuff+2]
mov bl, [mbuff+3]
mov [rflap.wSn], bx
 
mov bh, [mbuff+4]
mov bl, [mbuff+5]
mov [rflap.wDs], bx
 
;
; à¨­¨¬ ¥¬ ¤ ­­ë¥
;
;xor edx, edx
cmp [rflap.bId], 2Ah
jnz rs_flap_error
;
; à®¢¥à塞, ¯®«ãç¥­ë «¨ ¤ ­­ë¥
;
rs_head_recived:
 
mov eax, 53
mov ebx, 2
;mov ecx, [socket]
int 40h
cmp ax, [rflap.wDs] ;  §¬¥à ¤ ­­ëå
jc r_end
;
;
mov ax, [rflap.wDs]
;
; à®¢¥à塞 à §¬¥à ¤ ­­ëå
;
cmp ax, MBUFF_SIZE+1
jnc rs_big_flap
 
xor esi, esi
mov esi, eax
xor edx, edx
 
;mov ecx, [socket]
 
rs_data_loop:
cmp edx, esi
jz rs_data_end
 
mov eax, 53
mov ebx, 3
int 40h
mov [mbuff+edx], bl
inc edx
jmp rs_data_loop
 
;
; „ ­­ë¥ ¯à¨­ïâë
;
rs_data_end:
mov [hrf], 0
write_debug 'Some data recived'
;
;
;
cmp [login], 0
jz rs_login
call main_loop
jmp r_end
 
 
rs_login:
call srv_login
;write_debug 'Exited srv_login'
jmp r_end
 
rs_flap_error:
write_debug 'Invalid Flap'
;
; FLAP.id ­¥¢¥à­ë©. ­ã¦­® § ªàëâì ᮪¥â
;
 
mov ecx, [socket]
;call closesocket
jmp r_end
 
;
; ‘«¨èª®¬ ¡®«ì让 ¯ ª¥â!
;
rs_big_flap:
 
write_debug 'Too BIG FLAP Recived'
mov [hrf], 0
 
mov ecx, [socket]
mov ax, [rflap.wDs]
xor esi, esi
mov esi, eax
xor edx, edx
 
rs_data_loop2:
cmp edx, esi
jz r_end
 
mov eax, 53
mov ebx, 3
int 40h
;mov [mbuff+edx], bl
inc edx
jmp rs_data_loop2
 
 
 
 
 
r_end:
popad
popf
jmp wait_event
 
; ‘®¥¤¨­¥­¨¥ á á¥à¢¥à®¬, ¢®§¢à é ¥â ¢ eax - åí­¤« ᮪¥â 
; ¯¥à¥¤ ¥¬ ¢ ¥ å IP  ¤à¥á á¥à¢¥à 
; ¢ ebx - ¯®àâ
srv_connect:
push ecx
push edx
push esi
push edi
push ebx
mov esi, eax ; IP - ¢ esi
; find free port
mov ecx, 1000 ; Ž¯à¥¤¥«ï¥¬ «®ª «ì­ë© ¯®àâ, ­ ç¨­ ¥¬ á 1000
 
getlp:
inc ecx
push ecx
mov eax, 53
mov ebx, 9
int 0x40
pop ecx
cmp eax, 0 ; íâ®â «®ª «ì­ë© ¯®à⠨ᯮ«ì§ã¥âáï?
jz getlp ; ¤  - ¯à®¤®«¦ ¥¬ ¯¥à¥¡¨à âì
;OK ecx = port number
;Open Socket
mov eax, 53
mov ebx, 5
xor edx, edx
;mov dx, ICQ_PORT
pop edx
;mov esi,ICQ_IP
mov edi, 1;SOCKET_ACTIVE
 
int 040h
;
mov [socket], eax
;
; †¤¥¬ ãáâ ­®¢ª¨ ᮥ¤¨¥­¨ï
mov ecx, eax
srv_loop:
mov eax, 53
mov ebx, 6
int 40h
cmp eax, TCB_ESTABLISHED
jz fin
cmp eax, 11
jae @f
;
mov eax, 5
mov ebx, 50
int 40h
jmp srv_loop
 
 
 
 
;cmp eax,-1
;jnz fin
;delay 100
write_debug 'CONNECTION FAILED' ;®¤ª«î祭¨¥ ­¥ 㤠«®áì
jmp @f
;connrcted:
;CONNECTED
fin:
write_debug 'Connected!!!!'
@@:
pop edi
pop esi
pop edx
pop ecx
;pop ebx
ret
 
;
; --> ecx socket handle
;
buff db 1024 dup 0
lbuff db 8 dup 0 ; „«ï 1 ¯ ª¥â  ®â á¥à¢¥à 
srv_login:
pushf
push eax
push ebx
;push ecx
push edx
 
;
; Ž¯à¥¤¥«ï¥¬ ⨯ ¯®«ã祭­ëå ¤ ­­ëå
;
movzx eax, [rflap.bCh]
cmp eax, 01
jz s_new_connection
cmp eax, 04
jz s_cookie ; cookie
jmp l_flap_err
 
s_new_connection:
;
; à®¢¥à塞 ¯®«ã祭­ë© ¯ ª¥â
;
movzx eax, [rflap.wDs]
cmp eax, 4
jnz l_len_err
mov eax, dword [mbuff]
cmp eax, 01000000h ; 00 00 00 01
jnz l_data_err
;
;”®à¬¨à㥬 ¯ ª¥â ¤«ï ᮥ¤¨­¥­¨ï
;
;mov [flap.bId], FLAP_ID
mov [flap.bCh], NEW_CONNECTION
mov eax, 26
mov ebx, 9
int 40h
mov [seq], ax
 
mov [flap.wSn], ax ; Sequence number
;mov [buff],0
;mov [buff+1],0
;mov [buff+2],0
mov dword [buff], 0x01000000 ;login Protokol version 00 00 00 01
;mov[buff+4],0
mov word [buff+4], 0x0100; TLV.TYPE = UIN 00 01
 
mov eax, UIN
call strlen
mov [buff+6], ah
mov [buff+7], al ; Length of UIN
mov edx, eax
add edx, 7 ; ¢ edx ¤«¨­  § ¯®«­¥­­®£® ¡ãä¥à 
mov ecx, eax ;„«¨­  áâப¨
 
mov eax, UIN
lea ebx, [buff+8] ; + à §¬¥à ¤ ­­ëå ¢ ¡ãä¥à¥ + 1
 
call strcpy
 
mov eax, PASS
call roast
mov [buff+edx+2], 2 ; TLV.TYPE - rosted password
call strlen
mov word [buff+edx+4], ax ; Length of pass
 
add edx, 4
mov ebx, buff
add ebx, edx ; ­ §­ ç¥­¨¥
add edx, eax ; ‘®å࠭塞 ¢ EDX ¤«¨­ã § ¯®«­¥­­®£® ¡ãä­à 
mov ecx, eax ; „«¨­  áâப¨
mov eax, PASS ; ˆáâ®ç­¨ª
inc ebx
call strcpy
mov [buff+edx+2], 3 ; TLV.TYPE - client id string
mov eax, ID_STRING
call strlen
mov word [buff+edx+4], ax
 
add edx, 4
mov ecx, eax
mov ebx, buff
add ebx, edx
add edx, eax
inc ebx
mov eax, ID_STRING
call strcpy
 
mov [buff+edx+2], 016h ; TLV.TYPE - Client id
mov [buff+edx+4], 2
mov word [buff+edx+6], ID_NUM
add edx, 6
 
mov [buff+edx+2], 017h ; Client major version
mov [buff+edx+4], 2
mov [buff+edx+6], MAJOR
add edx, 6
 
mov [buff+edx+2], 018h ; Client minor version
mov [buff+edx+4], 2
mov [buff+edx+6], MINOR
add edx, 6
 
mov [buff+edx+2], 019h ; Client lesser version
mov [buff+edx+4], 2
mov [buff+edx+6], LESSER
add edx, 6
 
mov [buff+edx+2], 01Ah ; Client build number
mov [buff+edx+4], 2
mov word [buff+edx+6], BUILD
add edx, 6
mov [buff+edx+2], 014h ; Client distribution number
mov [buff+edx+4], 4
mov [buff+edx+8], DISTR
add edx, 8
 
mov [buff+edx+2], 0Fh ; Client language
mov eax, CL_LANG
call strlen
mov word [buff+edx+4], ax
add edx, 4
mov ecx, eax
mov ebx, buff
add ebx, edx
inc ebx
add edx, eax
mov eax, CL_LANG
call strcpy
 
mov [buff+edx+2], 0Fh ; Client language
mov eax, CL_COUNTRY
call strlen
mov word [buff+edx+4], ax
add edx, 4
mov ecx, eax
mov ebx, buff
add ebx, edx
inc ebx
add edx, eax
mov eax, CL_COUNTRY
call strcpy
;write_debug 'Connect attemption'
; mov eax, ICQ_IP
; call srv_connect
; cmp eax, -1 ; ®¤ª«î祭¨¥ ­¥ 㤠«®áì
; jz l_fin
; mov ecx, eax
; mov eax, rflap
; mov ebx, lbuff
; call recvflap
; cmp eax, -1
; jz l_flap_err
; cmp [rflap.bCh], 01 ; AUTH channel
; jnz l_ch_err
; cmp eax, 4
; jnz l_len_err
; cmp dword [lbuff+3], dword 1
; jnz l_data_err
 
mov ecx, [socket]
inc dx
mov [flap.wDs], dx ; Data size
mov eax, flap
mov ebx, buff
call sendflap
cmp eax, 0
jnz l_fin ; ¥ãᯥå
jmp l_end
 
s_cookie:
;mov eax, rflap
;mov ebx, buff
;call recvflap
;cmp eax, -1
;jz l_flap_err
;cmp [rflap.bCh], 4
;jnz l_ch_err
 
;write_debug 'UIN'
xor ebx, ebx
 
uin_loop:
xor eax, eax
mov ax, word [mbuff+ebx]
cmp ax, 0100h ; 00 01 TLV.Type UIN
jz l_uin_ok ; ’¥¯¥àì á¥à¢¥à ¯¥à¥¤ ¥â ¥é¥ ¤ ­­ë¥ ¯à¨ ᮥ¤¨­¥­¨¨,   ¯®â®¬ ®¯ïâì
add ebx, 5 ; â®â ¦¥ TLV 1
cmp ebx, 5
ja l_tlvt_err
jmp uin_loop
 
 
 
 
 
l_uin_ok:
mov eax, ebx
xor ebx, ebx
mov bl, [mbuff+eax+3] ;
mov bh, [mbuff+eax+2] ; „«¨­  ¤ ­­ëå
;
; UIN ®ª  ­¥ ¯à®¢¥àï¥âáï
;
 
lea ebx, [ebx+eax+4]
mov ax, word [mbuff+ebx]
cmp ax, 0500h ; 00 05 Bos address
jz l_all_ok
cmp ax, 0400h ; UIN incorrect
jz l_uin_err
cmp ax, 0800h
jz l_pass_err
jmp l_tlvt_err
;
; ¥á«¨ ­¥¢¥à­ë© UIN/ ¯ à®«ì, ¯®«ãç ¥¬ TLV.TYPE 4/8
;
 
l_all_ok:
xor ecx, ecx
mov cl, [mbuff+ebx+3] ;length
mov ch, [mbuff+ebx+2] ;
lea eax, [mbuff+ebx+4]
push ebx
mov ebx, bos_address
call strcpy
pop ebx
add ebx, ecx
lea ebx, [ebx+4] ;  §¬¥à § £®«®¢ª 
;
; cookie
;
;write_debug 'Login Cookie'
 
xor eax, eax
mov ax, word [mbuff+ebx]
cmp ax, 0600h ; TLV.Type cookie
jnz l_tlvt_err
mov cl, [mbuff+ebx+3] ;
mov ch, [mbuff+ebx+2] ; Length
mov [cookie_len], cx
lea eax, [mbuff+ebx+4]
push ebx
mov ebx, srv_cookie
call strcpy
pop ebx
;
; ‘®¥¤¨­ï¥¬áï á BOS
;
;call srv_disconnect
mov ecx, [socket]
;write_debug 'Closing socket'
;call closesocket
;
;
;mov eax, 53
;mov ebx, 8
;int 40h
 
 
 
mov eax, bos_address
call ip_parser
call htonl
data_debug 'BOS Address: ', eax
data_debug 'BOS Port: ', ebx
mov [bos_ip], eax
mov [bos_port], ebx
call srv_connect
mov [login], 1 ; ‘®¥¤¨­¥­¨¥ á ®á­®¢­ë¬ á¥à¢¥à®¬ ãáâ ­®¢«¥­®
;mov [socket], eax
 
jmp l_end
;
;
;
l_pass_err:
write_debug 'PASSWORD INVALID'
jmp l_fin
 
l_uin_err:
write_debug 'UIN INVALID'
jmp l_fin
 
l_data_err:
write_debug 'LOGIN DATA MISMATCH'
jmp l_fin
 
l_len_err:
write_debug 'RECIVED DATA LENGTH MISMATCH'
jmp l_fin
 
l_tlvt_err:
write_debug 'TLV TYPE MISMATCH'
jmp l_fin
 
l_ch_err:
write_debug 'FLAP CHANNEL MISMATCH'
jmp l_fin
 
l_flap_err:
write_debug 'FLAP ID MISMATCH / RECIVE ERROR'
 
l_fin:
 
;
; ¥®¡å®¤¨¬® § ªàëâì ᮪¥â
;
;call srv_disconnect
;call closesocket
l_end:
pop edx
;pop ecx
pop ebx
pop eax
popf
ret
 
;
; Length of string
; input eax = offset string
; output eax = strlen
;
strlen:
push ebx
push ecx
pushf
xor ebx, ebx
xor ecx, ecx
 
loop_s:
mov cl, [eax+ebx]
cmp ecx,0
jz nl
inc ebx
jmp loop_s
 
nl:
mov eax, ebx
popf
pop ecx
pop ebx
ret
 
;
; Roasting password
; EAX = offset password
;
 
roast:
pushf
push ecx
push ebx
 
xor ecx, ecx
xor ebx, ebx
 
loop_r:
mov bl, [eax+ecx] ;‘¨¬¢®« ¨§ ¬ áᨢ  ¯ à®«ï
cmp bl, 0 ;Š®­¥æ áâப¨
jz r_fin
xor bl, [ROASTING_ARRAY+ecx]
mov [eax+ecx], bl
inc ecx
jmp loop_r
 
r_fin:
pop ebx
pop ecx
popf
ret
 
 
;
;Copy string of bytes
;‚ EAX =  ¤à¥á ¨á室­®© áâப¨
;‚ EBX =  ¤à¥á ­ §­ ç¥­¨ï
;‚ ECX = ¤«¨­  áâப¨
;
strcpy:
pushf
push esi
push edi
push ecx
 
cld ;Ž¡à ¡ â뢠¥¬ áâப㠮⠭ ç «  ª ª®­æã
mov esi, eax
mov edi, ebx
 
rep movsb
 
pop ecx
pop edi
pop esi
popf
ret
 
 
;
; ‡ ¯®«­ï¥â ¡ãä¥à, ¯®  ¤à¥áã ¢ ebx
; ¤ ­­ë¬¨, ¯®  ¤à¥áã eax, ¢
; cx - ’¨¯ TLV
; dx - ¤«¨­  ¤ ­­ëå
;
;
 
tlvstr:
;pushf
push edx
push ecx
push ebx
 
mov [ebx], ch ; Type
mov [ebx+1], cl
 
mov [ebx+2], dh ; Length
mov [ebx+3], dl
lea ebx, [ebx+4]
; EBX = offset of destination
mov ecx, edx
 
call strcpy
 
pop ebx
pop ecx
pop edx
;popf
ret
 
;
; eax - 㪠§ â¥«ì ­  FLAP_head
; ebx - 㪠§ â¥«ì ­  ¬ áᨢ, § ¯®«­¥­­ë© ¤ ­­ë¬¨
; ecx - 奭¤« ᮪¥â 
;
; ‚ eax ¢®§¢à é ¥â १ã«ìâ â § ¯¨á¨ ¢ ᮪¥â
;
sendflap:
pushf
push edx
;push ecx
push esi
push ebx
push ecx
 
xor edx, edx
 
mov dl, [eax] ; ID byte
mov [sbuff], dl
 
mov dl, [eax+1] ; FLAP channel
mov [sbuff+1], dl
 
mov dl, [eax+2] ; FLAP datagramm seq number
mov [sbuff+3], dl ; ¬¥­ï¥¬ ¬¥áâ ¬¨ ¡ ©âë ¤«ï ¯¥à¥¤ ç¨ ¯® á¥â¨
mov dl, [eax+3]
mov [sbuff+2], dl
 
mov dl, [eax+4] ; FLAP data size
mov [sbuff+5], dl
mov dl, [eax+5]
mov [sbuff+4], dl
mov dx, word [eax+4]
 
xchg ecx, edx ; ecx - size edx - handle
mov eax, ebx ; data
mov ebx, sbuff ; dest
add ebx, 6 ; + header size
call strcpy
 
xchg ecx, edx ; ecx - handle, edx - data size
 
s_wait:
mov eax, 53 ; à®¢¥à塞 á®áâ®ï­¨¥ ᮪¥â . …᫨ ᮥ¤¨¥­¨¥
mov ebx, 6 ; ãáâ ­®¢«¥­® - ¯®áë« ¥¬ ¡ãä¥à, ¥á«¨ ᮪¥â § ªàëâ, ã室¨¬
int 40h
cmp eax, TCB_ESTABLISHED ; ãáâ ­®¢«¥­®
jz s_est
cmp eax, TCB_CLOSED
jz s_fin
cmp eax, 12 ; “ ¬¥­ï â ª®¥ ¡ë«®, ª®£¤  ᮥ¤¨­¥­¨¥ ãáâ ­ ¢«¨¢ «®áì á ¯ãáâ®â®© :-)
jnc s_fin ;
 
mov eax, 5
mov ebx, 1
int 40h ; †¤¥¬
jmp s_wait
 
 
s_est:
mov eax, 53
mov ebx, 7 ; ¯¨á âì ¢ ᮪¥â
;xchg ecx, edx ; ecx - handle, edx - data length
add edx, 6 ; + size of header
mov esi, sbuff ; data
int 40h
s_fin:
pop ecx
pop ebx
pop esi
;pop ecx
pop edx
popf
ret
 
;
; à¨­¨¬ ¥â ¯ ª¥â ¨§ ᮪¥â 
; eax - 㪠§ â¥«ì ­  FLAP_head
; ebx - 㪠§ â¥«ì ­  ¬ áᨢ
; ecx - 奭¤« ᮪¥â 
; ‚®§¢à é ¥â ¢ eax ª®«¨ç¥á⢮ ¯à¨­ïâëå ¡ ©â ¢ ¬ áᨢ¥
;
; recvflap:
; pushf
;
; ;push eax
; push ebx
; push esi
; push edi
; push edx
; mov esi, eax
; mov edi, ebx
;
; r_fail:
; mov eax, 53 ; Ž¯à è¨¢  ¥¬ ᮪¥â
; mov ebx, 2 ; ¢ eax ª®«¨ç¥á⢮ ¯®«ã祭­ëå ¡ ©â
; int 40h ;
; cmp eax, 6 ; ¡ãä¥à ­¥ ¯ãá⮩
; jnc r_ok
;
; mov eax, 53 ; ®«ãç ¥¬ á®áâ®ï­¨¥ ᮪¥â 
; mov ebx, 6 ;
; int 40h ;
;
; cmp eax, TCB_CLOSED ; § ªàëâ - ã室¨¬
; jz r_err
;
;
; ;mov eax, 5 ; ¦¤¥¬
; ;mov ebx, 1
; ;int 40h
; ; ã室¨¬
;
; ;jmp r_fail
; jmp rf_fin
;
; r_ok: ; ‚ ¡ãä¥à¥ ¤ ­­ë¥
;
; mov eax, 53
; mov ebx, 3
; int 40h
; mov [esi], bl ; flap.bId
; cmp bl, FLAP_ID
; jnz r_err
;
; mov eax, 53
; mov ebx, 3
; int 40h
; mov [esi+1], bl ; flap.bCh
;
; mov eax, 53
; mov ebx, 3
; int 40h
; mov [esi+3], bl ; flap.wSn áâ à訩 ¡ ©â
;
; mov eax, 53
; mov ebx, 3
; int 40h
; mov [esi+2], bl ; flap.wSn ¬« ¤è¨© ¡ ©â
;
; mov eax, 53
; mov ebx, 3
; int 40h
; mov [esi+5], bl ; flap.wDs áâ à訩 ¡ ©â
;
; mov eax, 53
; mov ebx, 3
; int 40h
; mov [esi+4], bl ; flap.wDs ¬« ¤è¨© ¡ ©â
;
; r_check:
; mov eax, 53 ; à®¢¥à塞 ç¨á«® ¯®«ã祭­ëå ¡ ©â
; mov eax, 2
; int 40h
;
; xor ebx, ebx
; mov bx, word [esi+4] ; flap.wDs
; cmp eax, ebx
; jnc r_drr ;>=
;
; mov eax, 68 ; wait
; mov ebx, 1
; int 40h
; jmp r_check
;
; r_drr: ; ready for data recive
;
;
; xor edx, edx
; mov dx, word [esi+4] ; flap.wDs
; xor esi, esi
;
; rf_loop:
; mov eax, 53
; mov ebx, 3
; int 40h
; mov [edi+esi], bl
; inc esi
; cmp esi, edx
; jnz rf_loop
; mov eax, edx
; jmp rf_fin
;
; r_err:
; ;pop ebx
; ;pop eax
; mov eax, -1
; jmp rf_fin
;
;
; rf_fin:
; pop edx
; pop edi
; pop esi
; pop ebx
; ;pop eax
; popf
; ret
 
;
; eax - 㪠§ â¥«ì ­  ¡ãä¥à
; ebx - §­ ç¥­¨¥, ª®â®àë¬ ­¥®¡å®¤¨¬® § â®«­¨âì. ˆá¯®«ì§ã¥âáï ⮫쪮 bl
; ecx - à §¬¥à
;
 
memset:
pushf
push edi
push eax
push ebx
push ecx
 
cld
mov edi, eax
mov eax, ebx
rep stosb
 
pop ecx
pop ebx
pop eax
pop edi
popf
ret
 
;
;  àᨬ TLV
; <-- ¢ eax  ¤à¥á TLV
; <-- ¢ ebx  ¤à¥á ¡ãä¥à , ª®â®àë© ­ã¦­® § ¯®«­¨âì
; --> ¢ ebx ¤«¨­  ¯®«ã祭­ëå ¤ ­­ëå
; --> ¢ eax ⨯ TLV
;
 
tlvpar:
pushf
;push esi
;push edi
push ecx
xor ecx, ecx
 
mov cl, [eax+3] ;TLV.Length
mov ch, [eax+2]
call strcpy
 
xor eax, eax
mov al, [ebx+1] ;TLV.Type
mov ah, [ebx]
mov ebx, ecx
 
 
pop ecx
;pop edi
;pop esi
popf
ret
 
;
; <-- ECX - 奭¤« ᮪¥â , ª®â®àë© ­ã¦­® § ªàëâì
; --> ECX - ¥§ã«ìâ â (¥­ ¤¥¦­®)
;
closesocket:
push eax
push ebx
 
mov eax, 53
mov ebx, 8
int 40h
mov ecx, eax
 
pop ebx
pop eax
ret
 
;
; ecx <-- 奭¤« ᮪¥â 
;
;
 
srv_disconnect:
pushf
push eax
push ebx
mov [flap.bId], FLAP_ID
mov [flap.bCh], 4 ;Disconnect
xor eax, eax
mov ax, [seq]
mov [flap.wSn], ax
mov [flap.wDs], 0
mov eax, flap
mov ebx, buff
call sendflap
 
 
pop ebx
pop eax
popf
ret
 
;
; <-- eax [bos_address]
; --> eax = IP ADDRESS
; --> ebx = port number
;
par_buff db 9 dup 0
 
ip_parser:
pushf
push ecx
push edx
push esi
push edi
 
xor ecx, ecx
;xor eax, eax
xor ebx, ebx
xor edx, edx
xor esi, esi
xor edi, edi
ip_loop:
xor eax, eax
;xor edx, edx
mov al, [bos_address+ecx]
cmp al, '.'
jz ip_dot
cmp al, 0
jz ip_end_str
cmp al, ':'
jz ip_colon
;sub al, 30h
;cmp al, 9
;ja ip_err ; ¥ æ¨äà 
mov [par_buff+edx], al
inc ecx
inc edx
jmp ip_loop
 
ip_dot:
;xor eax, eax
mov [par_buff+edx], 0 ; Š®­¥æ áâப¨
mov eax, par_buff
call ascitoint
 
;data_debug 'Debug eax: ', eax
 
cmp ecx, 0 ; ¥ ¬®¦¥â ­ ç¨­ âìáï á â®çª¨
jz ip_err
shl esi, 8 ; ‘¤¢¨£ ¥¬ ¯à¥¤ë¤ã騩 ¡ ©â
add esi, eax
inc ecx
xor edx, edx ; ‘ç¥â稪 ¡ãä¥à  = 0
jmp ip_loop
 
 
ip_colon: ; : ‚ áâப¥  ¤à¥á 
inc edi ; ë«® :
jmp ip_dot
ip_end_str:
cmp edi, 1
jz @f
; : ¥ ¡ë«®
mov [par_buff+edx], 0 ; Š®­¥æ áâப¨
mov eax, par_buff
call ascitoint
shl esi, 8 ; ‘¤¢¨£ ¥¬ ¯à¥¤ë¤ã騩 ¡ ©â
add esi, eax
;mov eax, esi ; IP ¢ 16 à¨ç­®© ä®à¬¥
;xor ebx, ebx ; ®¬¥à  ¯®àâ  ­¥â
jmp ip_end
 
@@: ; ë«® :
mov [par_buff+edx], 0
mov eax, par_buff
call ascitoint
mov ebx, eax
jmp ip_end
 
ip_err:
xor esi, esi
 
ip_end:
mov eax, esi
 
pop edi
pop esi
pop edx
pop ecx
popf
ret
 
;
; <-- eax 㪠§ â¥«ì ­  asci
; --> eax int
;
ascitoint:
pushf
push ebx
push ecx
push edx
push esi
push edi
 
xor ebx, ebx
xor ecx, ecx
xor edx, edx
;xor esi, esi
xor edi, edi
ati_loop:
mov bl, [eax+ecx]
cmp bl, 0 ; Š®­¥æ áâப¨
jz ati_str_end
cmp bl, 39h
ja ati_err ; ¥ æ¨äà 
cmp bl, 30h
jb ati_err
 
inc ecx
jmp ati_loop
 
ati_str_end: ; ‚ ecx ¤«¨­  áâப¨
;dec ecx ; “áâ ­®¢¨¬ ­  ¯®á«¥¤­¨© ᨬ¢®«
add eax, ecx ; “ª § â¥«ì ­  áâபã + „«¨­  áâப¨
dec eax
ati_loop2:
cmp edx, ecx
jz ati_all
push eax
sub eax, edx ; ‚ëç¥áâì áç¥â稪
movzx ebx, byte [eax] ; ‚ bl ᨬ¢®«
;pop eax
sub bl, 30h ; ‚ëç¨á«ï¥¬ 10â¨ç­ãî æ¨äàã
 
;push eax
mov eax, ebx ; ‚ eax - æ¨äà 
mov ebx, 10 ; Œ­®¦¨â¥«ì
 
xor esi, esi
 
ati_mul:
 
cmp esi, edx ; “¬­®¦ ¥¬ ­  10 n à §
jz ati_mul_end
;push eax
;mov eax, ebx
imul eax, ebx
;mov ebx, eax
;pop eax
inc esi
jmp ati_mul
 
 
ati_mul_end:
mov ebx, eax ; ‚ ebx ¢ëç¨á«¥­­®¥ ç¨á«®
pop eax
 
add edi, ebx
inc edx
jmp ati_loop2
 
ati_all:
mov eax, edi
jmp ati_end
 
ati_err:
 
;ati_str_end:
xor eax, eax
 
ati_end:
pop edi
pop esi
pop edx
pop ecx
pop ebx
popf
ret
 
;
;
; <-- ecx 奭¤« ᮪¥â 
; <-- eax 㪠§ â¥«ì ­  áâàãªâãàã SNAC_head
; <-- ebx 㪠§ â¥«ì ­  ¤ ­­ë¥
; <-- edx à §¬¥à ¤ ­­ëå
; --> eax १ã«ìâ â § ¯¨á¨ ¢ ᮪¥â
;
 
snac_buff db 1024 dup 0
 
sendsnac:
pushf
push esi
push edi
push ebx
push edx
;xor ebx, ebx
mov esi, ecx ; 奭¤« ᮪¥â 
mov edi, ebx ; “ª § â¥«ì ­  ¤ ­­ë¥
 
xor ebx, ebx
mov bl, [eax] ;
mov [snac_buff+1], bl ; Family ID
mov bl, [eax+1] ; Š®­¢¥àâ¨àã¥âáï ¢ BigEndian
mov [snac_buff], bl ;
 
mov bl, [eax+2] ;
mov [snac_buff+3], bl ; Subtype ID
mov bl, [eax+3] ;
mov [snac_buff+2], bl ;
mov bl, [eax+4] ;
mov [snac_buff+5], bl ;
mov bl, [eax+5] ; Flags
mov [snac_buff+4], bl ;
 
mov bl, [eax+6] ;
mov [snac_buff+9], bl ;
mov bl, [eax+7] ;
mov [snac_buff+8], bl ;
mov bl, [eax+8] ; Reqest ID
mov [snac_buff+7], bl ;
mov bl, [eax+9] ;
mov [snac_buff+6], bl ;
 
lea ebx, [snac_buff+10]
mov eax, edi ; “ª § â¥«ì ­  ¤ ­­ë¥
;add ebx, 10 ; + à §¬¥à § £®«®¢ª  SNAC
mov ecx, edx ; à §¬¥à ¤ ­­ëå
call strcpy
 
 
mov ecx, esi ; •¥­¤« ᮪¥â 
mov [flap.bId], FLAP_ID
mov [flap.bCh], 2 ; Š ­ « ¤«ï ¯®á뫪¨ SNAC
xor ebx, ebx
inc [seq] ; seq “¢¥«¨ç¨¢ ¥âáï ­  1 ¯à¨ ª ¦¤®© ¯®á뫪¥
mov bx, [seq]
mov [flap.wSn], bx
add edx, 10 ; à §¬¥à ¤ ­­ëå + à §¬¥à § £®«®¢ª  SNAC
mov [flap.wDs], dx
mov eax, flap
mov ebx, snac_buff
call sendflap
 
pop edx
pop ebx
pop edi
pop esi
popf
ret
 
 
 
; Ž¡à ¡®âª  ¢á¥å ¯ ªâ®¢, ¯à¨å®¤ïé¨å ®â á¥à¢¥à 
; ECX <-- •¥­¤« ᮪¥â 
;
;
;
;
;
main_loop:
pushf
;push eax
;push ebx
;push edx
pushad
 
mov ecx, [socket]
;
; ¦¤¥¬ ¯ ª¥â
;
;m_loop:
;mov eax, 53
;mov ebx, 2
;int 40h
;cmp eax, 6 ; à §¬¥à § £®«® ª  FLAP
;jnc recived ; >=
;
; “室¨¬
;
;jmp m_fin
;mov eax, 5
;mov ebx, 5
;int 40h
;jmp m_loop
;
; ¥áâì ¯ ª¥â
;
;recived:
;mov eax, rflap
;mov ebx, rbuff
;call recvflap
;
; Ž¯à¥¤¥«ï¥¬ ⨯ ¯à¨­ï⮣® FLAP
;
xor ebx, ebx
mov bl, [rflap.bCh]
cmp bl, 1 ; “áâ ­®¢ª  ᮥ¤¨­¥­¨ï
jz m_login
cmp bl, 2
jz m_snac ; ®«ã祭 SNAC
cmp bl, 3
jz m_flap_err ; FLAP-level error
cmp bl, 4
jz m_close_conn ; ‡ ªàë⨥ ᮥ¤¨­¥­¨ï
cmp bl, 5
jz m_keep_alive ;
;
; Ž¡à ¡®âª  à áᮥ¤¨­¥­¨ï
;
m_close_conn:
write_debug 'Another Computer Use YOUR UIN!'
call srv_disconnect
call closesocket
jmp m_fin
;
; ®¡à ¡®âª  ᮥ¤¨­¥­¨ï
;
m_login:
;
; ¯à®¢¥à塞 ¢¥àá¨î ¯à®â®ª®« 
;
xor eax, eax
mov al, [mbuff+3]
cmp eax, 1
jnz m_login_other ; ¥ ¯®¤å®¤¨â
 
 
;
; £¥­¥à¨à㥬 á«ãç ©­ë© seq
; „«ï í⮣® ¡¥à¥¬ ¢à¥¬ï, ¯à®è¥¤è¥¥ á ¬®¬¥­â  § ¯ã᪠ á¨á⥬ë
;
mov eax, 26
mov ebx, 9
int 40h
mov [seq], ax
;
; Žâ¤ ¥¬ á¥à¢¥àã cookie
;
mov [flap.bCh], 1
mov [flap.wSn], ax
xor eax, eax
mov ax, [cookie_len]
add eax, 8 ; TLV len + protocol version len
mov [flap.wDs], ax
mov dword [buff], 01000000h ; 00 00 00 01 ®¬¥à ¯à®â®ª®« 
mov word [buff+4], 0600h ; 00 06 TLV.Type
 
mov ax, [cookie_len]
mov [buff+6], ah ;
mov [buff+7], al ; TLV.Length
 
mov edx, ecx ; edx <-- socket handle
 
mov ecx, eax ; ecx <-- cookie len
mov eax, srv_cookie ; Src
lea ebx, [buff+8]
call strcpy
mov ecx, edx ; ecx <-- socket handle
mov eax, flap
mov ebx, buff
call sendflap
jmp m_fin
 
m_login_other:
jmp m_fin
 
;
; Š ª ®¡à ¡®â âì ®è¨¡ªã, ï ­¥ §­ î
;
m_flap_err:
jmp m_fin
 
;
; ®ª  ­¥ ®¡à ¡ â뢠¥âáï
;
m_keep_alive:
jmp m_fin
 
 
;
; ®«ã祭 SNAC
;  á¯®§­ ¥¬ ¥£® ⨯
;
m_snac:
mov eax, rsnac
mov ebx, mbuff
call snacpar
xor ebx, ebx
xor edx, edx
mov bx, [rsnac.wFid]
mov dx, [rsnac.wSid]
 
cmp bx, 1
jz m_snac_1 ;Generic service controls
cmp bx, 2
jz m_snac_2 ;Location services
cmp bx, 3
jz m_snac_3 ;Buddy List management service
cmp bx, 4
jz m_snac_4 ;ICBM (messages) service
cmp bx, 9
jz m_snac_9 ;Privacy management service
cmp bx, 015h
jz m_snac_15 ;ICQ specific extensions service
cmp bx, 013h
jz m_snac_13 ;Server Side Information (SSI) service
jmp m_other_snac
;
; FAMILY 1
;
m_snac_1:
cmp dx, 7
jz m_snac_1_7
cmp dx, 3
jz m_snac_1_3
cmp dx, 018h
jz m_snac_1_18
cmp dx, 01Fh
jz m_snac_1_f
cmp dx, 13h
jz m_snac_13
cmp dx, 1
jz m_snac_1_1
jmp m_snac_1_other
;
; Rate limits information response
;
m_snac_1_7: ; Žâ¢¥ç ¥¬
mov [ssnac.wFid], 1 ; Family
mov [ssnac.wSid], 8 ; Subtype
mov [ssnac.dRi], 8
mov word [buff], 0100h ; 0001
mov word [buff+2], 0200h ; 0002
mov word [buff+4], 0300h ; 0003
mov word [buff+6], 0400h ; 0004
mov word [buff+8], 0500h ; 0005
mov eax, ssnac
mov ebx, buff
mov edx, 10 ;  §¬¥à ¤ ­­ëå
call sendsnac
;
; Client ask server location service limitations
;
mov [ssnac.wFid], 2 ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2
mov eax, ssnac
mov ebx, buff
xor edx, edx
call sendsnac
 
jmp m_fin
 
;
; Server supported snac families list
;
m_snac_1_3:
;
; Server sends supported services list
;
 
;
; SNAC(01,17)
; Client ask for services version numbers
;
mov [ssnac.wFid], 1 ; Family
mov [ssnac.wSid], 17h ; Subtype
mov [ssnac.dRi], 17h
;
; ‘¯¨á®ª á¥à¢¨á®¢, ª®â®àë¥ ­ ¬ ­ã¦­ë
;
; xx xx word family number #1
; xx xx word family version
; ... ... ...
;
 
;
; ®¯à ¢¨« ¨§ ¤ ¬¯  &RQ
;
mov word [buff], 0100h ; 0001
mov word [buff+2], 0300h ; 0003
 
mov word [buff+4], 1300h ; 0013
mov word [buff+6], 0200h ; 0002
 
mov word [buff+8], 0200h ; 0002
mov word [buff+10], 0100h ; 0001
 
mov word [buff+12], 0300h ; 0002
mov word [buff+14], 0100h ; 0001
 
mov word [buff+16], 1500h ; 0015
mov word [buff+18], 0100h ; 0001
 
mov word [buff+20], 0400h ; 0004
mov word [buff+22], 0100h ; 0001
 
mov word [buff+24], 0600h ; 0006
mov word [buff+26], 0100h ; 0001
 
mov word [buff+28], 0900h ; 0009
mov word [buff+30], 0100h ; 0001
 
mov word [buff+32], 1300h ; 0013
mov word [buff+34], 0400h ; 0004
 
mov word [buff+36], 1500h ; 0015
mov word [buff+38], 0400h ; 0004
 
mov word [buff+40], 1000h ; 0010
mov word [buff+42], 0100h ; 0001
 
 
 
mov eax, ssnac
mov ebx, buff
mov edx, 44
call sendsnac
 
jmp m_fin
 
 
;
; Server services versions
;
m_snac_1_18:
;
; Ž¡à ¡®âª¨ ¯®ª  ­¥â
;
 
;
; Client ask server for rate limits info
; SNAC(01,06)
;
mov [ssnac.wFid], 1 ; Family
mov [ssnac.wSid], 6 ; Subtype
mov [ssnac.dRi], 6
mov eax, ssnac
mov ebx, buff
xor edx, edx
call sendsnac
 
 
 
jmp m_fin
 
;
; Requested online info response
;
m_snac_1_f:
;
;’ãâ ¤®«¦­  ¡ëâì ­ è  ¨­ä®à¬ æ¨ï, ¯®ª  ®¡à ¡®âª¨ ­¥â
;
 
 
jmp m_fin
 
;
; Message of the day (MOTD)
;
m_snac_1_13:
;
; ¥ç¥£® ®¡à ¡ â뢠âì :-))
;
jmp m_fin
 
;
; ‘®®¡é¥­¨¥ ®¡ ®è¨¡ª¥
;
 
m_snac_1_1:
xor eax, eax
mov ax, word [mbuff+10]
call ntohs
data_debug 'SERVER SEND ERROR #', eax
 
 
jmp m_fin
 
 
m_snac_1_other:
data_debug 'Unknown SNAC Family 1 recived, type ', edx
jmp m_fin
 
 
 
;
; Family 2
;
m_snac_2:
cmp dx, 3
jz m_snac_2_3
jmp m_snac_2_other
;
; Server replies via location service limitations
;
m_snac_2_3:
;
; Ž¡à ¡®âª¨ ¯®ª  ­¥â
;
 
;
; ¯®áë« ¥¬ capabilities / profile
;
mov [ssnac.wFid], 2 ; Family
mov [ssnac.wSid], 4 ; Subtype
mov [ssnac.dRi], 4
 
;mov eax, CAPABILITIES
;mov ebx, buff
;push ecx
;mov ecx, 5 ; TLV.Type(0x05) - CLSID values
;mov edx, C_LEN
;call tlvstr
;pop ecx
mov word [buff], 0500h ; 00 05
mov eax, C_LEN
call htons
mov word [buff+2], ax
 
 
 
push ecx
 
mov eax, CAPABILITIES
lea ebx, [buff+4]
mov ecx, C_LEN
call strcpy
 
pop ecx
 
 
mov eax, ssnac
mov ebx, buff
mov edx, C_LEN+4 ; „«¨­  ¤ ­­ëå+à §¬¥à § £®«®¢ª  TLV
call sendsnac
 
;
; § ¯à è¨¢ ¥¬ server BLM service limitations
;
mov [ssnac.wFid], 3 ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2
mov eax, ssnac
mov ebx, buff
xor edx, edx
call sendsnac
 
 
jmp m_fin
 
m_snac_2_other:
write_debug 'Unknown SNAC Family 2 Recived'
jmp m_fin
 
 
 
;
; FAMILY 3
;
m_snac_3:
cmp dx, 3
jz m_snac_3_3
cmp dx, 0Bh
jz m_snac_3_b
cmp dx, 0Ch
jz m_snac_3_c
jmp m_snac_3_other
 
;
; Server replies via BLM service limitations
;
m_snac_3_3:
;
; Ž¡à ¡®âª¨ ¯®ª  ­¥â
;
 
;
; Client ask server for ICBM service parameters
;
mov [ssnac.wFid], 4 ; Family
mov [ssnac.wSid], 4 ; Subtype
mov [ssnac.dRi], 4 ; request-id
mov eax, ssnac
mov ebx, buff
xor edx, edx
call sendsnac
 
 
 
jmp m_fin
 
;
; User online notification
;
m_snac_3_b:
;
; ˆ§ ¢á¥© ¨­ä®à¬ æ¨¨ ¯®ª  ­ã¦¥­ ⮫쪮 áâ âãá
;
xor edx, edx ; ‘ç¥â稪
xor ecx, ecx
xor eax, eax
cld ; ‚ ­ ¯à ¢«¥­¨¨ 㢥«¨ç¥­¨ï  ¤à¥á®¢
 
dec edx
m_snac_3_b_loop:
inc edx
cmp edx, UINS
jnc m_snac_3_b_end ;>=
 
mov cl, [mbuff+10] ; „«¨­  “ˆ
mov eax, ecx
mov edi, UIN_LEN
imul edi ,edx
lea edi, [uins+edi]
lea esi, [mbuff+11]
repe cmpsb
jnz m_snac_3_b_loop
;
; UIN Ž¯à¥¤¥«¥­
;
 
lea ecx, [eax+10+11] ; +sizeof SNAC_head + offset #2 TLV
mov ax, word [mbuff+ecx] ;#2 TLV.Type
cmp ax, 0C00h ;dc info (optional)
jz m_snac_3_b_dc
cmp ax, 0A00h ;external ip address
jz m_snac_3_b_extip
jmp m_snac_3_b_bad_tlv
 
m_snac_3_b_dc:
;
; à®¯ã᪠¥¬ íâ®â TLV
;
lea ecx, [ecx+41]
m_snac_3_b_extip:
;
; ˆ íâ®â :-)
lea ecx, [ecx+8]
mov ax, word [mbuff+ecx]
cmp ax, 0600h ;TLV.Type(0x0A) - external ip address
jz m_snac_3_b_status
jmp m_snac_3_b_bad_tlv
 
m_snac_3_b_status:
;
; ­ ª®­¥æ-â® áâ âãá 8-)
;
mov eax, dword [mbuff+ecx+4]
call ntohl
;mov ebx, 4
;imul ebx, edx
;mov [stats+ebx], eax
mov ecx, eax
mov ebx, NAME_LEN
imul ebx, edx
lea ebx, [names+ebx]
mov eax, edx
call loadbb
jmp m_fin
 
 
m_snac_3_b_bad_tlv:
write_debug 'TLV Type Mismatch in SNAC(3,b)'
jmp m_fin
 
m_snac_3_b_end:
write_debug 'UIN not in local Contact List'
jmp m_fin
 
 
 
m_snac_3_c:
;
; User offline notification
;
xor edx, edx
xor ecx, ecx
 
dec edx
m_snac_3_c_loop:
inc edx
cmp edx, UINS
jnc m_snac_3_b_end ;>=
 
mov cl, [mbuff+10] ; „«¨­  “ˆ
mov edi, UIN_LEN
imul edi ,edx
lea edi, [uins+edi]
lea esi, [mbuff+11]
repe cmpsb
jnz m_snac_3_c_loop
;
; UIN Ž¯à¥¤¥«¥­
;
;mov eax, -1
;mov ebx, 4
;imul ebx, edx
;mov [stats+ebx], eax
mov ecx, -1
mov ebx, NAME_LEN
imul ebx, edx
lea ebx, [names+ebx]
mov eax, edx
call loadbb
jmp m_fin
 
 
 
 
 
 
m_snac_3_other:
write_debug 'Unknown SNAC Family 3 Recived'
jmp m_fin
 
 
;
; FAMILY 4
;
m_snac_4:
cmp dx, 5
jz m_snac_4_5
cmp dx, 7
jz m_snac_4_7
jmp m_snac_4_other
 
;
; Server sends ICBM service parameters to client
;
m_snac_4_5:
;
; Ž¡à ¡®âª¨ ¯®ª  ­¥â
;
 
;
; Client change default ICBM parameters command
;
mov [ssnac.wFid], 4 ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2 ; request-id
 
mov eax, ICBM_PARAMS
mov ebx, buff
push ecx
mov ecx, ICBMP_LEN
call strcpy
pop ecx
 
mov eax, ssnac
mov ebx, buff
mov edx, ICBMP_LEN
call sendsnac
 
;
; Client ask server PRM service limitations
;
mov [ssnac.wFid], 9 ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2 ; request-id
mov eax, ssnac
mov ebx, buff
xor edx, edx
call sendsnac
 
 
jmp m_fin
 
;
; Message for client from server
;
m_snac_4_7:
;
; Ž¯à¥¤¥«ï¥¬ ⨯ á®®¡é¥­¨ï ¯® ¯®«î message channel
;
xor eax, eax
mov ax, word [mbuff+10+8] ; +10 - à §¬¥à SNAC
; +8 ᬥ饭¨¥ ¤® message channel
cmp ax, 0100h ; 00 01
jz m_snac_ch1
cmp ax, 0200h
jz m_snac_ch2
cmp ax, 0400h
jz m_snac_ch4
jmp m_ch_other
;
; channel 1 plain text
;
m_snac_ch1:
;
; ’.ª ¢ ®ç¥à¥¤­®© à § ®¯¨á ­¨¥ ¯à®â®ª®«  ­¥ ᮢ¯ ¤ ¥â á ॠ«ì­®áâìî
; à §¡¨à ¥¬ ¢á¥ TLV ¯® ¯®à浪ã
 
mov eax, dword [mbuff+10] ; cookie
mov [msg_cookie1], eax
mov eax, dword [mbuff+10+4]
mov [msg_cookie2], eax ; ˆá¯®«ì§ãîâáï ¤«ï ¯®â¢¥à¦¤¥­¨ï ¯à¨¥¬  á®®¡é¥­¨©
 
mov al, [mbuff+10+10] ; Sender UIN length
mov [ui.bUinLength], al
 
push ecx
movzx ecx, al
 
lea eax, [mbuff+10+11] ; UIN string
lea ebx, [ui.bUin] ; Dest
call strcpy
 
lea ecx, [ecx+10+15] ; ¯¥à¢ë© TLV
 
m_snac_ch1_loop:
 
movzx eax, word [mbuff+ecx]
cmp eax, 0100h ;TLV.Type(0x01) - user class
jz m_snac_ch1_1
cmp eax, 0600h ;TLV.Type(0x06) - user status
jz m_snac_ch1_6
cmp eax, 0800h ; Unknown type
jz m_snac_ch1_8
cmp eax, 0500h ; Unknown type
jz m_snac_ch1_5
cmp eax, 0F00h ; TLV.Type(0x0f) - user idle time
jz m_snac_ch1_f
cmp eax, 0300h ; TLV.Type(0x03) - account creation time
jz m_snac_ch1_3
cmp eax, 0400h ; TLV.Type(0x04) - automated response flag
jz m_snac_ch1_4
cmp eax, 0200h ; TLV.Type(0x02) - message data
jz m_snac_ch1_mess
jmp m_snac_msg_tlv_err
 
;
; ‚®§¬®¦­®, ¤®¯®«­¨â¥«ì­ ï ¨¨ä®à¬ æ¨ï ¡ã¤¥â ®¡à ¡ â뢠âìáï
; ­® ¯®ª  ­¥â
 
m_snac_ch1_1:
movzx eax, word [mbuff+ecx+2] ; TLV.Length
call ntohs
lea ecx, [eax+ecx+4]
jmp m_snac_ch1_loop
 
m_snac_ch1_6:
 
mov eax, dword [mbuff+ecx+4] ; User status
call ntohl
mov [ui.dUserStatus], eax
 
 
movzx eax, word [mbuff+ecx+2] ; TLV.Length
call ntohs
lea ecx, [eax+ecx+4]
;
;
jmp m_snac_ch1_loop
 
m_snac_ch1_8:
movzx eax, word [mbuff+ecx+2] ; TLV.Length
call ntohs
lea ecx, [eax+ecx+4]
jmp m_snac_ch1_loop
 
m_snac_ch1_5:
movzx eax, word [mbuff+ecx+2] ; TLV.Length
call ntohs
lea ecx, [eax+ecx+4]
jmp m_snac_ch1_loop
 
m_snac_ch1_f:
movzx eax, word [mbuff+ecx+2] ; TLV.Length
call ntohs
lea ecx, [eax+ecx+4]
jmp m_snac_ch1_loop
 
m_snac_ch1_3:
movzx eax, word [mbuff+ecx+2] ; TLV.Length
call ntohs
lea ecx, [eax+ecx+4]
jmp m_snac_ch1_loop
 
 
m_snac_ch1_4:
;movzx eax, word [buff+ecx+2] ; TLV.Length
lea ecx, [ecx+4]
jmp m_snac_ch1_loop
 
 
 
m_snac_ch1_mess:
;
;
movzx eax, word [mbuff+ecx+4] ;
cmp eax, 0105h ; 05 fragment identifier (array of required capabilities)
jnz m_snac_ch1_fr_err ; 01 fragment version
 
movzx eax, word [mbuff+ecx+6] ; Length
call ntohs
 
lea ecx, [ecx+eax+8] ; à®¯ã᪠¥¬ byte array of required capabilities (1 - text)
 
movzx eax, word [mbuff+ecx] ; fragment identifier (message text)
cmp eax, 0101h ; fragment version
jnz m_snac_ch1_fr_err
 
movzx eax, word [mbuff+ecx+2] ; TLV Length
call ntohs
xchg eax, ecx
 
lea eax, [eax+8] ;  ç «® ⥪á⮢®£® á®®¡é¥­¨ï
lea ecx, [ecx-4] ; - sizeof Message charset number, Message charset subset
 
push eax
push ecx
 
;
; ‚뢮¤¨¬ Message From UIN
;
 
mov eax, MESS
call strlen
mov ecx, eax
 
mov eax, MESS
mov ebx, buff
call strcpy
 
lea ebx, [ebx+ecx]
lea eax, [ui.bUin]
movzx ecx, byte [ui.bUinLength]
call strcpy
 
mov [ebx+ecx], byte 0
 
mov eax, buff
xor ebx, ebx
 
call writemsg
;
; ‘ ¬® á®®¡é¥­¨¥
;
 
pop ecx
pop eax
lea eax, [mbuff+eax]
 
mov ebx, buff
call strcpy
mov [ebx+ecx], byte 0
mov eax, buff
call win2dos
mov ebx, 00FF0000h
call writemsg
 
;
; ®¤â¢¥à¦¤ ¥¬ ¯à¨¥¬
;
 
pop ecx
;
; ®ª  ­¥ ॠ«¨§®¢ ­®, â.ª. ­¥ ¬®£ã ­ ©â¨ ª«¨¥­â, ª®â®àë© íâ® ¨á¯®«ì§ã¥â :-)
;
 
jmp m_fin
 
m_snac_msg_tlv_err:
write_debug 'TLV TYPE MISMATCH'
pop ecx
jmp m_fin
 
m_snac_ch1_fr_err:
write_debug 'UNKNOWN FRAGMENT IDENTIFIER OR FRAGMENT VERSION'
 
;m_snac_ch1_end:
pop ecx
 
jmp m_fin
 
;
; Channel 2 message format (rtf messages, rendezvous)
;
m_snac_ch2:
;
; ®â¯à ¢¨¬ á®®¡é¥­¨¥, çâ® ª ­ « ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
; ­ã¦­ë ªãª¨ ¨ 㨭
mov eax, dword [mbuff+10]
mov [msg_cookie1], eax
mov eax, dword [mbuff+10+4]
mov [msg_cookie2], eax
 
mov al, [mbuff+10+10] ; Sender UIN length
mov [ui.bUinLength], al
 
push ecx
movzx ecx, al
 
lea eax, [mbuff+10+11] ; UIN string
lea ebx, [ui.bUin] ; Dest
call strcpy
 
 
mov [ssnac.wFid], 4 ; Family
mov [ssnac.wSid], 0Bh ; Subtype
mov [ssnac.dRi], 0Bh
 
mov eax, [msg_cookie1]
mov dword [buff], eax
mov eax, [msg_cookie2]
mov dword [buff+4], eax
mov word [buff+8], 0200h ; Channel 2
 
mov al, [ui.bUinLength]
mov [buff+10], al
lea eax, [ui.bUin]
lea ebx, [buff+11]
call strcpy
lea ecx, [ecx+11]
 
mov word [buff+ecx], 0100h ; reason code (1 - unsupported channel, 2 - busted payload, 3 - channel specific)
mov edx, ecx
 
pop ecx
mov eax, ssnac
mov ebx, buff
call sendsnac
 
 
jmp m_fin
 
;
; Channel 4 message format (typed old-style messages)
;
m_snac_ch4:
 
 
 
m_ch_other:
write_debug 'Unknown message channel'
 
jmp m_fin
 
 
m_snac_4_other:
write_debug 'Unknown SNAC Family 4 recived'
jmp m_fin
 
 
 
;
; FAMILY 9
;
m_snac_9:
cmp dx, 3
jz m_snac_9_3
jmp m_snac_9_other
 
;
; Server sends PRM service limitations to client
;
m_snac_9_3:
;
; Ž¡à ¡®âª¨ ¯®ª  ­¥â
;
 
 
; Žâª«î祭®, ⪠­¥ ¯®¤¤¥à¦¨¢ ¥âáï SIQ
;
 
;
; Client ask server for SSI service limitations
;
;mov [ssnac.wFid], 13h ; Family
;mov [ssnac.wSid], 2 ; Subtype
;mov [ssnac.dRi], 2 ; request-id
;mov eax, ssnac
;mov ebx, buff
;xor edx, edx
;call sendsnac
 
;
; ¯®á«¥¤­ïï áâ ¤¨ï ᮥ¤¨­¥­¨ï
;
 
;
; ‡ ¯à è¨¢ ¥¬ á¢®î ¨­ä®à¬ æ¨î
;
mov [ssnac.wFid], 1 ; Family
mov [ssnac.wSid], 0Eh ; Subtype
mov [ssnac.dRi], 0Eh ; request-id
 
mov eax, ssnac
mov ebx, buff
xor edx, edx ; TLV head len
call sendsnac
 
 
;
; Client sends its DC info and status to server
;
mov [ssnac.wFid], 1 ; Family
mov [ssnac.wSid], 1Eh ; Subtype
mov [ssnac.dRi], 1Eh ; request-id
 
mov [buff], 0 ; TLV type 06
mov [buff+1], 6h ;
mov [buff+2], 0 ; TLV data length
mov [buff+3], 4 ;
;
;
mov ax, STATUS_DCDISABLED ; DC disabled
call htons
mov word [buff+4], ax
mov ax, STATUS_ONLINE
mov [status], ax
mov word [buff+6], ax
 
mov eax, ssnac
mov ebx, buff
mov edx, 8 ; TLV head len+ data len
call sendsnac
 
 
;
; ‚ë£à㦠¥¬ ­  á¥à¢¥à Š‹
;
call uploadkl
 
;
; ‚ë£à㦠¥¬ ¨­¢¨§¨¡« «¨áâ, ¯®ª  ¯ãá⮩
;
mov [ssnac.wFid], 9 ; Family
mov [ssnac.wSid], 7 ; Subtype
mov [ssnac.dRi], 7
 
mov eax, ssnac
mov ebx, buff
xor edx, edx
call sendsnac
 
;
; ‚ &RQ …áâì ¯ ª¥â ãáâ ­®¢ª¨ à §à¥è¥­¨©. ï ¨á¯®«ì§ãî ¥£® ¡¥§ ¨§¬¥­¥­¨ï
; â.ª. ­¥ §­ î, çâ® ®­ ᮤ¥à¦¨â
;
 
mov [ssnac.wFid], 15 ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2
 
mov word [buff], 0100h ; 00 01 encapsulated META_DATA
mov word [buff+2], 1000h ; 00 10 Len
mov word [buff+4], 000Eh ; LE Len
mov word [buff+10], 07D0h ; META_DATA_REQ
 
 
mov eax, UIN
call ascitoint
mov dword [buff+6], eax
 
mov word [buff+12], 0102h ; request sequence number (incrementing)
mov word [buff+14], 0424h ; META_SET_PERMS_USERINFO
mov [buff+16], 1 ; authorization (1-required, 0-not required)
mov [buff+17], byte 0 ; webaware (0-no, 1-yes)
mov [buff+18], 1 ; dc_perms (0-any, 1-contact, 2-authorization)
mov [buff+19], 0 ;unknown
 
mov eax, ssnac
mov ebx, buff
mov edx, 20
 
 
;
; Client READY command
;
mov [ssnac.wFid], 1 ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2 ; request-id
 
mov eax, FAMILY_ARR
mov ebx, buff
push ecx
mov ecx, FA_LEN
call strcpy
pop ecx
 
mov eax, ssnac
mov ebx, buff
mov edx, FA_LEN
call sendsnac
 
 
;
; ‡ ¯à è¨¢ ¥¬ offline á®®¡é¥­¨ï
;
mov [ssnac.wFid], 15h ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2 ; request-id
 
mov word [buff], 0100h ; TLV type 01
mov word [buff+2], 0A00h ; 00 0a „«¨­ 
mov word [buff+4], 0008h ; 08 00
mov eax, UIN
call ascitoint
mov dword [buff+6], eax
 
mov [buff+10], 003Ch ; 3C 00 - ‡ ¯à®á ­  ®ää« ©­®¢ë¥ á®®¡é¥­¨ï
mov [buff+12], 0002 ; 02 00 - request sequence number
mov edx, 14 ; Ž¡é¨© à §¬¥à ¤ ­­ëå ¢ ¡ãä¥à¥
 
mov eax, ssnac
mov ebx, buff
call sendsnac
 
 
;
; ‡ ¯à è¨¢ ¥¬ ¨­ä®à¬ æ¨î ¢á¥å UIN
;
call getinfo
;
; § ¢¥à襭® ᮥ¤¨­¥­¨¥
;
mov [login], 2
 
jmp m_fin
 
m_snac_9_other:
write_debug 'Unknown SNAC Family 9 Recived'
jmp m_fin
 
 
;
; FAMILY 13
;
m_snac_13:
cmp dx, 3
jz m_snac_13_3
cmp dx, 0fh
jz m_snac_13_F
 
jmp m_snac_13_other
 
;
; Server sends SSI service limitations to client
;
m_snac_13_3:
;
; Ž¡à ¡®âª¨ ¯®ª  ­¥â
;
 
;
; SNAC(13,05) Client check if its local SSI copy is up-to-date
;
mov [ssnac.wFid], 13h ; Family
mov [ssnac.wSid], 5 ; Subtype
mov [ssnac.dRi], 5 ; request-id
mov eax, ssnac
; 3D E7 48 17
mov [buff], 03Dh ;
mov [buff+1], 0E7h ; modification date/time of client local SSI copy
mov [buff+2], 48h ;
mov [buff+3], 17h ;
; 00 10
mov [buff+4], 00 ;
mov [buff+5], 10h ; number of items in client local SSI copy
mov ebx, buff
mov edx, 5
call sendsnac
 
jmp m_fin
 
;
; Server tell client its local copy up-to-date
;
m_snac_13_F:
;
; Ž¡à ¡®âª¨ ­¥â
;
 
;
; Client activates server SSI data
;
mov [ssnac.wFid], 13h ; Family
mov [ssnac.wSid], 7 ; Subtype
mov [ssnac.dRi], 7 ; request-id
mov eax, ssnac
mov ebx, buff
xor edx, edx
call sendsnac
 
;
; ¯®á«¥¤­ïï áâ ¤¨ï ᮥ¤¨­¥­¨ï
;
 
;
; Client sends its DC info and status to server
;
mov [ssnac.wFid], 1 ; Family
mov [ssnac.wSid], 1Eh ; Subtype
mov [ssnac.dRi], 1Eh ; request-id
 
mov [buff], 0 ; TLV type 06
mov [buff+1], 6h ;
mov [buff+2], 0 ; TLV data length
mov [buff+3], 4 ;
;
;
mov ax, STATUS_DCDISABLED ; DC disabled
call htons
mov word [buff+4], ax
mov ax, STATUS_ONLINE
mov [status], ax
mov word [buff+6], ax
 
mov eax, ssnac
mov ebx, buff
mov edx, 8 ; TLV head len+ data len
call sendsnac
 
;
; Client READY command
;
mov [ssnac.wFid], 1 ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2 ; request-id
 
mov eax, FAMILY_ARR
mov ebx, buff
push ecx
mov ecx, FA_LEN
call strcpy
pop ecx
 
mov eax, ssnac
mov ebx, buff
mov edx, FA_LEN
call sendsnac
 
 
;
; ‡ ¯à è¨¢ ¥¬ offline á®®¡é¥­¨ï
;
mov [ssnac.wFid], 15h ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 2 ; request-id
 
mov word [buff], 0100h ; TLV type 01
mov word [buff+2], 0A00h ; 00 0a „«¨­ 
mov word [buff+4], 0008h ; 08 00
mov eax, UIN
call ascitoint
mov dword [buff+6], eax
 
mov [buff+10], 003Ch ; 3C 00 - ‡ ¯à®á ­  ®ää« ©­®¢ë¥ á®®¡é¥­¨ï
mov [buff+12], 0002 ; 02 00 - request sequence number
mov edx, 14 ; Ž¡é¨© à §¬¥à ¤ ­­ëå ¢ ¡ãä¥à¥
 
mov eax, ssnac
mov ebx, buff
call sendsnac
 
 
 
jmp m_fin
 
m_snac_13_other:
write_debug 'Unknown SNAC Family 13 Recived'
jmp m_fin
 
 
 
 
;
; Family 15
;
 
m_snac_15:
cmp dx, 3
jz m_snac_15_3
jmp m_snac_15_other
 
 
;
; Server sends message #N
;
m_snac_15_3:
;
; Ž¯à¥¤¥«ï¥¬ ¯®¤â¨¯ ¯à¨­ï⮣® ¯ ª¥â 
;
 
;write_debug 'SNAC 15, 3'
 
xor eax, eax
mov ax, word [mbuff+10] ; + SNAC.head size
cmp ax, 0100h ; 00 01 TLV type
jnz m_snac_tlv_err
 
mov ax, word [mbuff+10+10]
cmp ax, 0041h ; Offline Message
jz m_snac_offline_mes
cmp ax, 0042h ; End messages
jz m_snac_offline_end
cmp ax, 07DAh
jz m_snac_meta_data
 
 
write_debug 'Unknown Subtype SNAC (15,3)'
jmp m_fin
 
m_snac_offline_mes:
mov eax, MESS ;
call strlen ; ‚뢮¤¨¬ áâபã á á®®¡é¥­¨¥¬ ® ®â¯à ¢¨â¥«¥ ¨ ¢à¥¬¥­¨ ®â¯à ¢ª¨
push ecx ;
mov ecx, eax ;
mov eax, MESS
mov ebx, buff
call strcpy
 
mov eax, dword [mbuff+14+10] ; Sender UIN
lea ebx, [buff+ecx] ; ®á«¥ áâà®çª¨ ® á®®¡é¥­¨¨
call int2strd
 
lea ebx, [ebx+eax]
mov [ebx], byte ' '
inc ebx
 
; + „«¨­  UIN
movzx eax, byte [mbuff+21+10] ; Day
call int2strd
 
lea ebx, [ebx+eax]
mov [ebx], byte '.'
inc ebx
 
movzx eax, byte [mbuff+20+10] ;Mounth
call int2strd
 
lea ebx, [ebx+eax]
mov [ebx], byte ' '
inc ebx
 
movzx eax, [mbuff+22+10] ; Hour
call int2strd
 
lea ebx, [ebx+eax]
mov [ebx], byte ':'
inc ebx
 
movzx eax, [mbuff+23+10] ; Minute
call int2strd
 
lea ebx, [ebx+eax]
;mov [ebx], byte ' '
;inc ebx
 
mov [ebx], byte 0 ; Str end
mov eax, buff
xor ebx, ebx
 
call writemsg
 
movzx ecx, word [mbuff+26+10] ; „«¨­  á®®®¡é¥­¨ï
lea eax, [mbuff+28+10]
mov ebx, buff
call strcpy
 
mov [ebx+ecx], byte 0
 
mov eax, buff
call win2dos ;¯¥à¥ª®¤¨à㥬
 
mov ebx, 00FF0000h ;–¢¥â
 
call writemsg
 
 
pop ecx
 
jmp m_fin
 
 
m_snac_offline_end:
;
; “¤ «ï¥¬ á®®¡é¥­¨ï ­  á¥à¢¥à¥
;
mov [ssnac.wFid], 15h ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 0602h ; request-id
 
mov word [buff], 0100h ; 00 01 TLV.Type(1) - encapsulated META_DATA1
mov word [buff+2], 0A00h ; 00 0A TLV.Length
mov word [buff+4], 0008h ; 08 00 data chunk size (TLV.Length-2)
mov eax, UIN
call ascitoint
mov dword [buff+6], eax ; xx xx xx xx (LE) client uin
mov word [buff+10], 003Eh ; 3E 00 (LE) data type: delete offline msgs request cmd
mov word [buff+12], 0007h ; xx xx (LE) request sequence number
 
mov edx, 14 ;  §¬¥à ¤ ­­ëå
mov eax, ssnac
mov ebx, buff
call sendsnac
 
 
 
jmp m_fin
 
;
; Žâ¢¥â ­  § ¯à®á ® ¯®«ì§®¢ â¥«ïå
;
m_snac_meta_data:
;
; Ž¯à¥¤¥«ï¥¬ ®ç¥à¥¤­®© ¯®¤â¨¯ :-)
;
mov ax, word [mbuff+10+14]
cmp ax, 0104h ;data subtype: META_SHORT_USERINFO
jz m_snac_short_userinfo
cmp ax, 00C8h
jz m_snac_basic_userinfo ;data subtype: META_BASIC_USERINFO
write_debug 'Unknown META DATA subtype'
jmp m_fin
 
 
 
m_snac_short_userinfo:
;
; ˆ§ ¢á¥© ¨­ä®à¬ æ¨¨ ¯®ª  ­ã¦¥­ ⮫쪮 ­¨ª
;
mov al, [mbuff+10+16]
cmp al, 0Ah ;success byte
jnz m_fin
 
movzx eax, word [mbuff+10+12] ;request sequence number
;
; ‚ § ¯à®á¥ ï ¨á¯®«ì§®¢ « ¯®à浪®¢ë© ­®¬¥à î§¥à  ¢ Š‹
lea ebx, [mbuff+10+19] ;nickname string
; „«¨­  áâப¨ ­¥ ­ã¦­ , â.ª. áâப  Null-Terminated
;Ž¯à¥¤¥«ï¥¬ áâ âãá
mov ecx, 4
imul ecx, eax
mov ecx, [stats+ecx]
 
call loadbb
 
 
 
jmp m_fin
 
;
; ⪠SIQ ­  § ¯à®á ª®à®âª®© ¨­äë ®â¢¥ç ¥â
; ¯ ª¥â®¬ ¡ §®¢®© ¨­ä®à¬ æ¨¨, ॠ«¨§ãî ¯®ª  ⮫쪮 ¥£®
;
m_snac_basic_userinfo:
mov al, [mbuff+10+16]
cmp al, 0Ah ;success byte
jnz m_fin
 
movzx eax, word [mbuff+10+12] ;request sequence number
;
; ‚ § ¯à®á¥ ï ¨á¯®«ì§®¢ « ¯®à浪®¢ë© ­®¬¥à î§¥à  ¢ Š‹
lea ebx, [mbuff+10+19] ;nickname string
; „«¨­  áâப¨ ­¥ ­ã¦­ , â.ª. áâப  Null-Terminated
;Ž¯à¥¤¥«ï¥¬ áâ âãá
mov ecx, 4
imul ecx, eax
mov ecx, [stats+ecx]
 
call loadbb
 
 
jmp m_fin
 
m_snac_tlv_err:
write_debug 'TLV TYPE MISMATCH'
 
jmp m_fin
 
m_snac_15_other:
 
write_debug 'Unknown SNAC Family 15 Recived'
 
jmp m_fin
 
 
m_other_snac:
write_debug 'Unknown SNAC recived'
jmp m_fin
 
 
 
m_fin:
;pop edx
;pop ebx
;pop eax
popad
popf
ret
 
; „«ï ¯¥à¥¢®¤  DWORD ¨§ Little Endian ¢ Big Endian
; ¨ ­ ®¡®à®â :-)
; <--EAX DWORD
; -->EAX
;
ntohl:
htonl:
;pushf
push ebx
;push ecx
 
xor ebx, ebx
 
mov bl, ah
mov bh, al
shl ebx, 16
shr eax, 16
mov bl, ah
mov bh, al
mov eax, ebx
 
;pop ecx
pop ebx
;popf
ret
 
 
; „«ï ¯¥à¥¢®¤  WORD ¨§ Little Endian ¢ Big Endian
; <--AX WORD
; -->AX WORD
;
 
ntohs:
htons:
;pushf
push ebx
 
xor ebx, ebx
mov bl, ah
mov bh, al
mov eax, ebx
 
pop ebx
;popf
ret
 
;
; ¯ àá¨â SNAC
; <--EAX 㪠§ â¥«ì ­  SNAC_head
; <--EBX 㪠§ â¥«ì ­  ¡ãää¥à
; -->EAX 㪠§ â¥«ì ­ ç «® ¤ ­­ëå = buffer+sizeof SNAC_head
;
;
snacpar:
pushf
push ecx
;push edx
 
mov cl, [ebx+1] ; Family (service) id number ¬« ¤è¨© ¡ ©â
mov ch, [ebx] ; áâ à訩
mov word [eax], cx
 
mov cl, [ebx+3] ; Family subtype id number
mov ch, [ebx+2] ;
mov word [eax+2], cx
 
mov cl, [ebx+5] ; SNAC flags
mov ch, [ebx+4] ;
mov word [eax+4], cx ;
mov cl, [ebx+7] ;
mov ch, [ebx+6] ;
mov word [eax+8], cx ; SNAC request id
mov cl, [ebx+8] ;
mov ch, [ebx+7] ;
mov word [eax+6], cx ;
add ebx, 10 ; §¬¥à § £®«®¢ª 
mov eax, ebx
 
 
;pop edx
pop ecx
popf
ret
 
;
; ¯ àá¨â userinfo block
; FIXIT
;
 
; userinfopar:
; pushf
;
;
;
;
;
;
; popf
; ret
 
;
; ¯®á뫪  á®®¡é¥­¨ï
; [eax] <-- ⥪áâ®¢ë© ¡ãä¥à \
; [ebx] <-- UIN / Null-terminated
 
sendmsg:
pushf
pushad
push eax
push ebx
 
mov [ssnac.wFid], 4h ; Family
mov [ssnac.wSid], 6 ; Subtype
mov [ssnac.dRi], 106h ; request-id
;
; ®«ãç ¥¬ ¢à¥¬ï á § ¯ã᪠ á¨á⥬ë, ¤«ï cookie
;
mov eax, 26
mov ebx, 9
int 40h
 
mov dword [buff], eax ; Cookie 1
mov dword [buff+4], eax ; Cookie 2
 
mov word [buff+8], 0100h ; Message channel 00 01
 
 
pop ebx
mov eax, ebx
call strlen
 
mov [buff+10], al
mov ecx, eax
mov eax, ebx
lea ebx, [buff+11]
call strcpy
lea ecx, [ecx+11]
 
mov word [buff+ecx], 0200h ; TLV.Type(0x02) - message data
;push ecx ;
; TLV.Length
 
mov word [buff+ecx+4], 0105h ; 05 01 01 - fragment version, 05 - fragment identifier
mov word [buff+ecx+6], 0100h ; data length
mov [buff+ecx+8], 01 ; byte array of required capabilities (1 - text)
 
mov [buff+ecx+9], 01 ; fragment identifier (text message)
mov [buff+ecx+10], 01 ; fragment version
 
pop ebx
mov eax, ebx
call strlen
mov edx, eax
lea eax, [eax+4] ; „«¨­  á®®¡é¥­¨ï + Message charset number+ Message language number
call htons
mov word [buff+ecx+11], ax
 
mov eax, edx
lea eax, [eax+13] ; + ¤«¨­  á«ã¦¥¡­ëå ¤ ­­ëå
call htons
mov word [buff+ecx+2], ax
 
 
mov word [buff+ecx+13], 0700h ; Message charset number
mov word [buff+ecx+15], 0300h ; Message language number
 
mov eax, ecx
mov ecx, edx ; Len
lea edx, [eax+17]
 
mov eax, ebx ;Source
lea ebx, [buff+edx] ;Dest
call strcpy
lea ecx, [ecx+edx] ; +String length
mov [buff+ecx], byte 0
mov eax, ebx
call dos2win
 
 
mov word [buff+ecx], 0600h ; TLV.Type(0x06) - store message if recipient offline
mov word [buff+ecx+2], 0 ; TLV.Length
 
lea edx, [ecx+4] ; +TLV_head length
mov eax, ssnac
mov ebx, buff
mov ecx, [socket]
call sendsnac
 
 
popad
popf
ret
 
;
; ‡ ¯à®á ¨­ä®à¬ æ¨¨ UIN®¢
;
getinfo:
pushad
pushf
;
; SNAC (15,2) - Meta information request
;
 
mov [ssnac.wFid], 15h ; Family
mov [ssnac.wSid], 2 ; Subtype
mov [ssnac.dRi], 702h ; request-id
 
mov word [buff], 0100h ;TLV.Type(1) - encapsulated META_DATA
mov word [buff+2], 1000h ; 00 10 TLV.Length
mov word [buff+4], 000Eh ; (LE) data chunk size (TLV.Length-2)
mov eax, UIN
call ascitoint
mov dword [buff+6], eax ;(LE) request owner uin
mov word [buff+10], 07D0h ;data type: META_DATA_REQ
;mov word [buff+12], 0008h ; request sequence number <<<-- Œ®¦¥â ¬¥­ïâìáï FIXIT
mov word [buff+14], 04BAh ; data subtype: META_SHORTINFO_REQUEST
 
mov ecx, [socket]
mov edx, 20
 
xor esi, esi ; ‘ç¥â稪
xor eax, eax
 
gi_loop:
mov ebx, esi
mov word [buff+12], bx ; request sequence number
mov ebx, UIN_LEN
imul ebx, esi
mov al, [uins+ebx]
cmp al, 0
jz gi_end
 
lea eax, [uins+ebx]
call ascitoint
mov dword [buff+16], eax
 
mov eax, ssnac
mov ebx, buff
call sendsnac
inc esi
cmp esi, UINS
jnc gi_end
jmp gi_loop
 
 
 
 
 
 
gi_end:
popf
popad
ret
 
;
; ‡ £à㦠¥¬ «®ª «ì­ë© Š‹ ­  á¥à¢¥à ¤«ï ¯®«ã祭¨ï áâ âãá  î§¥à®¢
;
uploadkl:
pushf
pushad
;
; Add buddy(s) to contact list
;
mov [ssnac.wFid], 3 ; Family
mov [ssnac.wSid], 4 ; Subtype
mov [ssnac.dRi], 4 ; request-id
 
xor esi, esi ; ‘ç¥â稪
xor edx, edx ; ‡ ¯®«­¥­® ¡ ©â
 
ukk_loop:
mov ebx, UIN_LEN
imul ebx, esi
mov al, [uins+ebx]
cmp al, 0
jz ukk_end
lea eax, [uins+ebx]
call strlen
mov [buff+edx], al
inc edx
 
mov ecx, eax
lea eax, [uins+ebx] ; Source
lea ebx, [buff+edx]
call strcpy
add edx, ecx
inc esi
cmp esi, UINS
jz ukk_end
jmp ukk_loop
 
 
 
 
ukk_end:
mov eax, ssnac
mov ebx, buff
mov ecx, [socket]
call sendsnac
 
popad
popf
ret
 
;
;
;
sendkeep:
pushf
pushad
cmp [login], 2
jnz @f
mov ax, [timer]
cmp ax, 300 ;60 c
jb @f
mov [timer], 0
mov [flap.bId], FLAP_ID
mov [flap.bCh], 5 ;Keep alive
mov [flap.wDs], 0
inc [seq]
mov ax, [seq]
mov [flap.wSn], ax
mov eax, flap
mov ebx, buff
mov ecx, [socket]
call sendflap
 
 
@@:
popad
popf
ret
 
 
 
 
; <--- initialised data --->
DATA
lsz header,\
ru, "KI",\
en, "KI",\
fr, "KI"
 
 
;
MESS db 'Message from ', 0
CUSER db 'Current user: ', 0
 
;
 
;ICQ_IP = 0x0A00A8C0 ; 192.168.0.10
ICQ_IP = 0x99A10C40
;
flap FLAP_head
rflap FLAP_head
;
ssnac SNAC_head ; ¤«ï ¯¥à¥¤ ç¨ SNAC
rsnac SNAC_head ; ¤«ï ¯à¨­ï⮣® SNAC
;
ui UI_head ; User info
;
procinfo process_information
;
UIN db '123456789',0
PASS db 'coolpass',0
ID_STRING db 'ICQ Inc. - Product of ICQ (TM).2000b.4.65.1.3281.85',0
;ID_STRING db 'ICQ Inc. - Product of ICQ (TM).2001b.5.17.1.3642.85',0
CAPABILITIES db 053h, 054h, 0, 0, 097h, 0B1h, 027h, 051h, 024h, 03Ch, 043h, 034h, 0ADh, 022h, 0D6h, 0ABh,\
0F7h, 03Fh, 014h, 092h, 02Eh, 07Ah, 064h, 075h, 0FAh, 0DFh, 04Dh, 0C8h, 088h, 06Fh, 0EAh, 035h,\
095h, 0FDh, 0B6h, 0DFh, 09h, 046h, 013h, 044h, 04Ch, 07Fh, 011h, 0D1h, 082h, 022h, 044h, 045h,\
053h, 054h, 0, 0
;
; From &RQ
;
 
;CAPABILITIES db 0x09, 0x46, 0x13, 0x49, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45,\ ;...P.F.IL.T‚"DE
; 0x53, 0x54, 0x00, 0x00, 0x09, 0x46, 0x13, 0x44, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45,\ ;ST...F.DL.T‚"DE
; 0x53, 0x54, 0x00, 0x00, 0x09, 0x46, 0x13, 0x4E, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45,\ ;ST...F.NL.T‚"DE
; 0x53, 0x54, 0x00, 0x00, 0x09, 0x46, 0x00, 0x00, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45,\ ;ST...F..L.T‚"DE
; 0x53, 0x54, 0x00, 0x00, 0x26, 0x52, 0x51, 0x69, 0x6E, 0x73, 0x69, 0x64, 0x65, 0x02, 0x07, 0x09,\ ;ST..&RQinside...
; 0x00, 0x00, 0x00, 0x00
 
 
C_LEN = 40h
;C_LEN = 80
ICBM_PARAMS db 0, 0, 0, 0, 0, 0Bh, 01Fh, 040h, 3, 0E7h, 3, 0E7h, 0, 0, 0, 0
ICBMP_LEN = 16 ; ^^^ from &RQ
 
 
;
; from &rq
;
FAMILY_ARR db 0x00, 0x01, 0x00, 0x03, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x13, 0x00, 0x02, 0x01, 0x10, 0x04, 0x7B,\
0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x04, 0x7B, 0x00, 0x03, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\
0x00, 0x15, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x04, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\
0x00, 0x06, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x09, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\
0x00, 0x0A, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x06, 0x6A
 
 
 
 
FA_LEN = 50h
 
;
ID_NUM = 010Ah
MAJOR = 05h
;MAJOR = 04h
;MINOR = 041h
MINOR = 011h
LESSER = 01h
;BUILD = 0CD1h
BUILD = 0E3Ah
DISTR = 055h
TCB_ESTABLISHED = 4
TCB_CLOSED = 11
;
CL_LANG db 'en',0
CL_COUNTRY db 'us',0
 
sbuff db 1024 dup 0 ; ãä¥à ¤«ï ¯¥à¥¤ ç¨ ¨á¯®«ì§ã¥âáï ¢­ãâਠsendflap
 
rbuff db 1024 dup 0 ; à¨¥¬­ë© ¡ãä¥à
tbuff db 512 dup 0 ; „«ï TLV
srv_cookie db 512 dup 0 ; Šãª¨ ¤«ï  ¢â®à¨§ æ¨¨
bos_address db 128 dup 0 ; €¤à¥á BOS á¥à¢¥à 
cookie_len dw 0 ; „«¨­  ªãª¨
seq dw 0 ; Sequence number
bos_ip dd 0
bos_port dd 0
status dw 0 ; status
 
mbuff db 2048 dup 0 ; „«ï ¯à¨¥¬ 
MBUFF_SIZE = 2048
 
hrf db 0 ; ”« £ ¯à¨¥¬  § £®«®¢ª 
 
mouse_flag dd 0
socket dd 0
login db 0
 
msg_cookie1 dd 0 ; ˆá¯®«ì§ãîâáï ¤«ï ¯®â¢¥à¦¤¥­¨ï ¯à¨¥¬  á®®¡é¥­¨©
msg_cookie2 dd 0 ;
 
curruser db 0 ; ⥪ã騩 ¯®«ì§®¢ â¥«ì, ª®â®à®¬ã ¡ã¤ãâ ®â¯à ¢«ïâìáï á®®¡é¥­¨ï
; - ®¬¥à ¢ Š‹ ¯® ¯®à浪ã
 
 
timer dw 0
 
;ltest db "ADMIN",0
 
 
 
;
; EDITBOXES
;
inputbuff:
rb 512
 
inputbox edit_box 490,10,460,0xffffff,0x6a9480,0,0xAABBCC,0,511,inputbuff,ed_focus,0,0
 
 
; <--- uninitialised data --->
UDATA
 
 
MEOS_APP_END
; <--- end of MenuetOS application --->
/programs/network/icq/trunk/lang.inc
0,0 → 1,0
lang fix ru
/programs/network/icq/trunk/macros.inc
0,0 → 1,502
@^ fix macro comment {
^@ fix }
 
 
macro m2m dest,src {
push src
pop dest
}
 
 
macro iglobal {
IGlobals equ IGlobals,
macro __IGlobalBlock { }
macro uglobal {
UGlobals equ UGlobals,
macro __UGlobalBlock { }
 
endg fix } ; Use endg for ending iglobal and uglobal blocks.
 
 
macro IncludeIGlobals{
macro IGlobals dummy,[n] \{ __IGlobalBlock
purge __IGlobalBlock \}
match I, IGlobals \{ I \} }
 
macro IncludeUGlobals{
macro UGlobals dummy,[n] \{
\common
\local begin, size
begin = $
virtual at $
\forward
__UGlobalBlock
purge __UGlobalBlock
\common
size = $ - begin
end virtual
rb size
\}
match U, UGlobals \{ U \} }
 
uglobal
endg
iglobal
endg
 
 
; new application structure
macro meos_app_start
{
use32
org 0x0
 
db 'MENUET01'
dd 0x01
dd __start
dd __end
dd __memory
dd __stack
 
if used __params & ~defined __params
dd __params
else
dd 0x0
end if
 
dd 0x0
}
MEOS_APP_START fix meos_app_start
 
macro code
{
__start:
}
CODE fix code
 
macro data
{
__data:
IncludeIGlobals
}
DATA fix data
 
macro udata
{
if used __params & ~defined __params
__params:
db 0
__end:
rb 255
else
__end:
end if
__udata:
IncludeUGlobals
}
UDATA fix udata
 
macro meos_app_end
{
align 32
rb 2048
__stack:
__memory:
}
MEOS_APP_END fix meos_app_end
 
 
; macro for defining multiline text data
struc mstr [sstring]
{
forward
local ssize
virtual at 0
db sstring
ssize = $
end virtual
dd ssize
db sstring
common
dd -1
}
 
; macro for defining multiline text data
struc mls [sstring]
{
forward
local ssize
virtual at 0
db sstring ; mod
ssize = $
end virtual
db ssize
db sstring
common
db -1 ; mod
}
 
 
 
; strings
macro sz name,[data] { ; from MFAR [mike.dld]
common
if used name
name db data
.size = $-name
end if
}
 
macro lsz name,[lng,data] { ; from MFAR [mike.dld]
common
if used name
label name
forward
if lang eq lng
db data
end if
common
.size = $-name
end if
}
 
macro szc name,elsz,[data] { ; from MFAR [mike.dld]
common
local s,m
m = 0
if used name
label name
forward
virtual at 0
db data
s = $
end virtual
d#elsz s
if m < s
m = s
end if
db data
common
.size = $-name
.maxl = m
end if
}
 
macro lszc name,elsz,[lng,data] { ; from MFAR [mike.dld]
common
local s,m,c
m = 0
c = 0
if used name
label name
forward
if lang eq lng
virtual at 0
db data
s = $
end virtual
d#elsz s
if m < s
m = s
end if
db data
c = c+1
end if
common
.size = $-name
.maxl = m
.count = c
end if
}
 
 
; easy system call macro
macro mpack dest, hsrc, lsrc
{
if (hsrc eqtype 0) & (lsrc eqtype 0)
mov dest, (hsrc) shl 16 + lsrc
else
if (hsrc eqtype 0) & (~lsrc eqtype 0)
mov dest, (hsrc) shl 16
add dest, lsrc
else
mov dest, hsrc
shl dest, 16
add dest, lsrc
end if
end if
}
 
macro __mov reg,a,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b eq)
mov reg,a
end if
}
 
 
include 'config.inc'
;__CPU_type equ p5
SYSENTER_VAR equ 0
 
macro mcall a,b,c,d,e,f { ; mike.dld, updated by Ghost for Fast System Calls
local ..ret_point
__mov eax,a
__mov ebx,b
__mov ecx,c
__mov edx,d
__mov esi,e
__mov edi,f
 
if __CPU_type eq p5
int 0x40
else
if __CPU_type eq p6
push ebp
mov ebp, esp
push ..ret_point ; it may be 2 or 5 byte
sysenter
..ret_point:
pop edx
pop ecx
 
else
if __CPU_type eq k6
push ecx
syscall
pop ecx
else
display 'ERROR : unknown CPU type (set to p5)', 10, 13
__CPU_type equ p5
int 0x40
end if
end if
end if
}
 
 
; -------------------------
macro header a,[b] {
common
use32
org 0
db 'MENUET',a
forward
if b eq
dd 0
else
dd b
end if }
macro section name { align 16
label name }
macro func name {
if ~used name
display 'FUNC NOT USED: ',`name,13,10
else
align 4
name:
;diff16 `name,0,name
;pushad
;pushfd
;dps `name
;newline
;mcall 5,1
;popfd
;popad
}
macro endf { end if }
 
macro diff16 title,l1,l2
{
local s,d
s = l2-l1
display title,': 0x'
repeat 8
d = '0' + s shr ((8-%) shl 2) and $0F
if d > '9'
d = d + 'A'-'9'-1
end if
display d
end repeat
display 13,10
}
 
macro diff10 title,l1,l2
{
local s,d,z,m
s = l2-l1
z = 0
m = 1000000000
display title,': '
repeat 10
d = '0' + s / m
s = s - (s/m)*m
m = m / 10
if d <> '0'
z = 1
end if
if z <> 0
display d
end if
end repeat
display 13,10
}
 
; optimize the code for size
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
 
macro add arg1,arg2
{
if (arg2 eqtype 0)
if (arg2) = 1
inc arg1
else
add arg1,arg2
end if
else
add arg1,arg2
end if
}
 
macro sub arg1,arg2
{
if (arg2 eqtype 0)
if (arg2) = 1
dec arg1
else
sub arg1,arg2
end if
else
sub arg1,arg2
end if
}
 
macro mov arg1,arg2
{
if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
if (arg2) = 0
xor arg1,arg1
else if (arg2) = 1
xor arg1,arg1
inc arg1
else if (arg2) = -1
or arg1,-1
else if (arg2) > -128 & (arg2) < 128
push arg2
pop arg1
else
mov arg1,arg2
end if
else
mov arg1,arg2
end if
}
 
 
macro RGB [a] {
common
match (r=,g=,b),a \{
\dd ((r) shl 16) or ((g) shl 8) or (b)
\}
}
 
 
struc POINT _t,_dx,_dy {
.x _t _dx
.y _t _dy
}
 
; structure definition helper
include 'struct.inc'
 
struct RECT
left dd ?
top dd ?
right dd ?
bottom dd ?
ends
 
struct BOX
left dd ?
top dd ?
width dd ?
height dd ?
ends
 
; structures used in MeOS
struct process_information
cpu_usage dd ? ; +0
window_stack_position dw ? ; +4
window_stack_value dw ? ; +6
dw ? ; +8
process_name rb 12 ; +10
memory_start dd ? ; +22
used_memory dd ? ; +26
PID dd ? ; +30
box BOX ; +34
slot_state dw ? ; +50
dw ? ; +52
client_box BOX ; +54
wnd_state db ? ; +70
rb (1024-71)
ends
 
struct system_colors
frame dd ?
grab dd ?
grab_button dd ?
grab_button_text dd ?
grab_text dd ?
work dd ?
work_button dd ?
work_button_text dd ?
work_text dd ?
work_graph dd ?
ends
 
struct FILEDATE
Second db ?
Minute db ?
Hour db ?
db ?
Day db ?
Month db ?
Year dw ?
ends
 
struct FILEINFO
Attributes dd ?
IsUnicode db ?
db 3 dup(?)
DateCreate FILEDATE
DateAccess FILEDATE
DateModify FILEDATE
Size dq ?
ends
 
; constants
 
; events
EV_IDLE = 0
EV_TIMER = 0
EV_REDRAW = 1
EV_KEY = 2
EV_BUTTON = 3
EV_EXIT = 4
EV_BACKGROUND = 5
EV_MOUSE = 6
EV_IPC = 7
EV_STACK = 8
 
; event mask bits for function 40
EVM_REDRAW = 1b
EVM_KEY = 10b
EVM_BUTTON = 100b
EVM_EXIT = 1000b
EVM_BACKGROUND = 10000b
EVM_MOUSE = 100000b
EVM_IPC = 1000000b
EVM_STACK = 10000000b
/programs/network/icq/trunk/struct.inc
0,0 → 1,180
 
; Macroinstructions for defining data structures
 
macro struct name
{ fields@struct equ name
match child parent, name \{ fields@struct equ child,fields@\#parent \}
sub@struct equ
struc db [val] \{ \common fields@struct equ fields@struct,.,db,<val> \}
struc dw [val] \{ \common fields@struct equ fields@struct,.,dw,<val> \}
struc du [val] \{ \common fields@struct equ fields@struct,.,du,<val> \}
struc dd [val] \{ \common fields@struct equ fields@struct,.,dd,<val> \}
struc dp [val] \{ \common fields@struct equ fields@struct,.,dp,<val> \}
struc dq [val] \{ \common fields@struct equ fields@struct,.,dq,<val> \}
struc dt [val] \{ \common fields@struct equ fields@struct,.,dt,<val> \}
struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \}
struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \}
struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \}
struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \}
struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \}
struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \}
macro db [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,db,<val> \}
macro dw [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dw,<val> \}
macro du [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,du,<val> \}
macro dd [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dd,<val> \}
macro dp [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dp,<val> \}
macro dq [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dq,<val> \}
macro dt [val] \{ \common \local anonymous
fields@struct equ fields@struct,anonymous,dt,<val> \}
macro rb count \{ \local anonymous
fields@struct equ fields@struct,anonymous,db,count dup (?) \}
macro rw count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dw,count dup (?) \}
macro rd count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dd,count dup (?) \}
macro rp count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dp,count dup (?) \}
macro rq count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dq,count dup (?) \}
macro rt count \{ \local anonymous
fields@struct equ fields@struct,anonymous,dt,count dup (?) \}
macro union \{ fields@struct equ fields@struct,,union,<
sub@struct equ union \}
macro struct \{ fields@struct equ fields@struct,,substruct,<
sub@struct equ substruct \}
virtual at 0 }
 
macro ends
{ match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
restruc rb,rw,rd,rp,rq,rt
purge db,dw,du,dd,dp,dq,dt
purge rb,rw,rd,rp,rq,rt
purge union,struct
match name=,fields,fields@struct \\{ fields@struct equ
make@struct name,fields
fields@\\#name equ fields \\}
end virtual \}
match any, sub@struct \{ fields@struct equ fields@struct> \}
restore sub@struct }
 
macro make@struct name,[field,type,def]
{ common
if $
display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah
err
end if
local define
define equ name
forward
local sub
match , field \{ make@substruct type,name,sub def
define equ define,.,sub, \}
match any, field \{ define equ define,.#field,type,<def> \}
common
match fields, define \{ define@struct fields \} }
 
macro define@struct name,[field,type,def]
{ common
local list
list equ
forward
if ~ field eq .
name#field type def
sizeof.#name#field = $ - name#field
else
rb sizeof.#type
end if
local value
match any, list \{ list equ list, \}
list equ list <value>
common
sizeof.#name = $
restruc name
match values, list \{
struc name value \\{
match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
match , fields@struct \\\{ label .
forward
match , value \\\\{ field type def \\\\}
match any, value \\\\{ field type value
if ~ field eq .
rb sizeof.#name#field - ($-field)
end if \\\\}
common \\\} \\} \} }
 
macro enable@substruct
{ macro make@substruct substruct,parent,name,[field,type,def]
\{ \common
\local define
define equ parent,name
\forward
\local sub
match , field \\{ match any, type \\\{ enable@substruct
make@substruct type,name,sub def
purge make@substruct
define equ define,.,sub, \\\} \\}
match any, field \\{ define equ define,.\#field,type,<def> \\}
\common
match fields, define \\{ define@\#substruct fields \\} \} }
 
enable@substruct
 
macro define@union parent,name,[field,type,def]
{ common
virtual at 0
forward
if ~ field eq .
virtual at 0
parent#field type def
sizeof.#parent#field = $ - parent#field
end virtual
if sizeof.#parent#field > $
rb sizeof.#parent#field - $
end if
else if sizeof.#type > $
rb sizeof.#type - $
end if
common
sizeof.#name = $
end virtual
struc name [value] \{ \common
label .\#name
last@union equ
forward
match any, last@union \\{ virtual at .\#name
field type def
end virtual \\}
match , last@union \\{ match , value \\\{ field type def \\\}
match any, value \\\{ field type value \\\} \\}
last@union equ field
common rb sizeof.#name - ($ - .\#name) \} }
 
macro define@substruct parent,name,[field,type,def]
{ common
virtual at 0
forward
if ~ field eq .
parent#field type def
sizeof.#parent#field = $ - parent#field
else
rb sizeof.#type
end if
local value
common
sizeof.#name = $
end virtual
struc name value \{
label .\#name
forward
match , value \\{ field type def \\}
match any, value \\{ field type value
if ~ field eq .
rb sizeof.#parent#field - ($-field)
end if \\}
common \} }
/programs/network/icq/trunk
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/network/icq
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property