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 |