;
; à¨á®¢ âì ¯àאַ㣮«ì¨ª
; 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