📄 airc.asm
字号:
pusha
mov [text_start],I_END
mov ecx,[rxs]
imul ecx,11
mov [pos],ecx
mov bl,13
call print_character
mov bl,10
call print_character
mov ecx,[cmd]
sub ecx,2
mov esi,command
newcmdc2:
mov bl,[esi]
call print_character
inc esi
loop newcmdc2
mov edx,I_END
call draw_channel_text
popa
ret
print_text:
pusha
mov ecx,command-2
add ecx,[cmd]
ptr2:
mov bl,[eax]
cmp bl,dl
je ptr_ret
cmp bl,0
je ptr_ret
call print_character
inc eax
cmp eax,ecx
jbe ptr2
ptr_ret:
mov eax,[text_start]
mov [eax+120*60],byte 1
popa
ret
print_character:
pusha
cmp bl,13 ; line beginning
jne nobol
mov ecx,[pos]
add ecx,1
boll1:
sub ecx,1
mov eax,ecx
xor edx,edx
mov ebx,[rxs]
div ebx
cmp edx,0
jne boll1
mov [pos],ecx
jmp newdata
nobol:
cmp bl,10 ; line down
jne nolf
addx1:
add [pos],dword 1
mov eax,[pos]
xor edx,edx
mov ecx,[rxs]
div ecx
cmp edx,0
jnz addx1
mov eax,[pos]
jmp cm1
nolf:
no_lf_ret:
cmp bl,15 ; character
jbe newdata
mov eax,[irc_data]
shl eax,8
mov al,bl
mov [irc_data],eax
mov eax,[pos]
call draw_data
mov eax,[pos]
add eax,1
cm1:
mov ebx,[scroll+4]
imul ebx,[rxs]
cmp eax,ebx
jb noeaxz
mov esi,[text_start]
add esi,[rxs]
mov edi,[text_start]
mov ecx,ebx
cld
rep movsb
mov esi,[text_start]
mov ecx,[rxs]
imul ecx,61
add esi,ecx
mov edi,[text_start]
mov ecx,[rxs]
imul ecx,60
add edi,ecx
mov ecx,ebx
cld
rep movsb
mov eax,ebx
sub eax,[rxs]
noeaxz:
mov [pos],eax
newdata:
mov eax,[text_start]
mov [eax+120*60],byte 1
popa
ret
draw_data:
pusha
and ebx,0xff
cmp bl,0xe4 ; finnish a
jne noe4
mov bl,0xc1
noe4:
cmp bl,0xc4 ; ?
jne noc4
mov bl,0xc9
noc4:
cmp ebx,229 ; swedish a
jne no_swedish_a
mov bl,192
no_swedish_a:
add eax,[text_start]
mov [eax],bl
popa
ret
read_incoming_byte:
mov eax, 53
mov ebx, 2
mov ecx, [socket]
int 0x40
mov ecx,-1
cmp eax,0
je no_more_data
mov eax, 53
mov ebx, 3
mov ecx, [socket]
int 0x40
mov ecx,0
no_more_data:
ret
draw_window:
pusha
mov eax,12
mov ebx,1
int 0x40
mov [old_status],300
mov eax,0 ; draw window
mov ebx,5*65536+499
mov ecx,5*65536+345
mov edx,[wcolor]
add edx,0x03ffffff
mov esi,0x80555599
mov edi,0x00ffffff
int 0x40
mov eax,4 ; label
mov ebx,9*65536+8
mov ecx,0x10ffffff
mov edx,labelt
mov esi,labellen-labelt
int 0x40
mov eax,8 ; button: open socket
mov ebx,43*65536+22
mov ecx,229*65536+10
mov edx,22
mov esi,[main_button]
int 0x40
mov eax,8 ; button: send userinfo
mov ebx,180*65536+22
mov ecx,229*65536+10
mov edx,23
int 0x40
mov eax,8 ; button: close socket
mov ebx,317*65536+22
mov ecx,229*65536+10
mov edx,24
int 0x40
mov eax,38 ; line
mov ebx,5*65536+494
mov ecx,148*65536+148
mov edx,[main_line]
int 0x40
add ecx,1*65536+1
; mov edx,0x5555cc
; int 0x40
mov eax,38 ; line
mov ebx,5*65536+494
mov ecx,166*65536+166
int 0x40
add ecx,1*65536+1
; mov edx,0x5555cc
; int 0x40
mov eax,38 ; line
mov ebx,410*65536+410
mov ecx,22*65536+148
int 0x40
add ebx,1*65536+1
; mov edx,0x5555cc
; int 0x40
mov ebx,25*65536+183 ; info text
mov ecx,0x000000
mov edx,text
mov esi,70
newline:
mov eax,4
int 0x40
add ebx,12
add edx,70
cmp [edx],byte 'x'
jne newline
mov edx,I_END ; text from server
call draw_channel_text
mov eax,12
mov ebx,2
int 0x40
popa
ret
main_line dd 0x000000
main_button dd 0x6565cc
text:
db ' Real name : Joe User - change with eg /areal Jill User '
db ' Nick : AIRC - change with eg /anick Jill '
db ' Server : 192.168.1.1 - change with eg /aserv 192.168.1.24 '
db ' '
db ' 1) Open socket 2) Send userinfo Close socket '
db ' '
db ' Commands after established connection: '
db ' '
db ' /join #ChannelName - eg /join #menuet '
db ' /part #ChannelName - eg /part #linux '
db ' /query Nickname - eg /query Mary '
db ' /quit - Quit server and Close socket '
db 'x <- END MARKER, DONT DELETE '
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; CHANNEL THREADS
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
channel_thread:
mov ebp,[thread_nro]
mov eax,ebp
shl eax,14
add eax,0x80000
mov esp,eax
mov edi,ebp ; clear thread memory
imul edi,120*80
add edi,I_END
mov ecx,120*80
mov eax,32
cld
; rep stosb
mov edx,[thread_screen]
call thread_draw_window
w_t:
mov esi,ebp
imul esi,120*80
add esi,I_END
cmp [esi+120*60+4],byte 1
jne no_channel_leave
mov [esi+120*60+4],byte 0
mov edi,ebp
shl edi,5
mov dword [channel_list+edi],dword ' '
mov byte [channel_list+edi+31],byte 1
mov eax,-1
int 0x40
no_channel_leave:
call check_mouse
mov eax,23
mov ebx,1
int 0x40
cmp eax,1
jne no_draw_window
call thread_draw_window
call draw_channel_text
call print_user_list
no_draw_window:
cmp eax,2
je thread_key
cmp eax,3
jne no_end
mov eax,17
int 0x40
mov eax,ebp
imul eax,120*80
add eax,I_END
cmp [eax+120*60+8],byte 0 ; channel window
je not_close
mov eax,ebp
shl eax,5
add eax,channel_list
mov [eax],dword ' '
mov [eax+31],byte 1
mov eax,-1
int 0x40
not_close:
mov [text_start],eax
mov eax,nocl
newcc:
mov bl,[eax]
call print_character
inc eax
cmp [eax],byte 0
jne newcc
call draw_channel_text
jmp w_t
nocl: db 13,10,'To exit channel, use PART or QUIT command.',0
no_end:
cmp [edx+120*60],byte 1
jne no_update
mov [edx+120*60],byte 0
call draw_channel_text
no_update:
test [cursor_on_off],0x3f
jnz nopri2
call blink_cursor
call print_user_list
nopri2:
jmp w_t
check_mouse:
pusha
mov eax,37
mov ebx,1
int 0x40
mov ebx,eax
shr eax,16
and ebx,0xffff
cmp eax,420
jb no_mouse
cmp eax,494
jg no_mouse
cmp ebx,145
jg no_mouse
cmp ebx,23
jb no_mouse
cmp ebx,100
jb no_plus
mov eax,ebp
imul eax,120*80
add eax,120*70+I_END
inc dword [eax-8]
call print_user_list
mov eax,5
mov ebx,8
int 0x40
jmp no_mouse
no_plus:
cmp ebx,80
jg no_mouse
mov eax,ebp
imul eax,120*80
add eax,120*70+I_END
cmp dword [eax-8],dword 0
je no_mouse
dec dword [eax-8]
call print_user_list
mov eax,5
mov ebx,8
int 0x40
no_minus:
no_mouse:
popa
ret
thread_key:
mov eax,2
int 0x40
shr eax,8
cmp eax,8
jne no_bks
cmp [xpos],0
je w_t
dec [xpos]
call print_entry
jmp w_t
no_bks:
cmp eax,20
jbe no_character
mov ebx,[xpos]
mov [send_string+ebx],al
inc [xpos]
cmp [xpos],80
jb xpok
mov [xpos],79
xpok:
call print_entry
jmp w_t
no_character:
cmp eax,13
jne no_send
cmp [xpos],0
je no_send
mov dword [send_to_channel],ebp
mov [send_to_server],1
wait_for_sending:
mov eax,5
mov ebx,1
int 0x40
cmp [send_to_server],1
je wait_for_sending
call draw_channel_text
call print_entry
jmp w_t
no_send:
jmp w_t
draw_channel_text:
pusha
mov eax,4
mov ebx,10*65536+26
mov ecx,12
mov esi,[rxs]
dct:
pusha
mov cx,bx
shl ecx,16
mov cx,9
mov eax,13
mov ebx,10*65536
mov bx,word [rxs]
imul bx,6
mov edx,0xffffff
int 0x40
popa
push ecx
mov eax,4
mov ecx,0
cmp [edx],word '* '
jne no_red
mov ecx,0x0000ff
no_red:
cmp [edx],word '**'
jne no_light_blue
cmp [edx+2],byte '*'
jne no_light_blue
mov ecx,0x0000ff
no_light_blue:
cmp [edx],byte '#'
jne no_blue
mov ecx,0x0000ff
no_blue:
int 0x40
add edx,[rxs]
add ebx,10
pop ecx
loop dct
popa
ret
thread_draw_window:
pusha
mov eax,12
mov ebx,1
int 0x40
mov ebx,ebp ; draw window
shl ebx,16+4
mov eax,0
mov ecx,ebx
mov bx,499
mov cx,170
; mov edx,ebp ; draw window
; imul edx,120*80
; add edx,I_END+120*60+8
; movzx edx,byte [edx]
; imul edx,88
; sub bx,dx
mov edx,[wcolor]
add edx,0x03ffffff
mov esi,0x80555599
mov edi,0x00ffffff
int 0x40
mov eax,ebp ; label
add eax,48
mov [labelc+14],al
mov eax,ebp
shl eax,5
add eax,channel_list
mov esi,eax
mov edi,labelc+17
movzx ecx,byte [eax+31]
cld
rep movsb
mov esi,17 ; print label
movzx ebx,byte [eax+31]
add esi,ebx
mov eax,4
mov ebx,9*65536+8
mov ecx,0x00ffffff
mov edx,labelc
int 0x40
mov eax,38 ; line
mov ebx,5*65536+494
mov ecx,148*65536+148
mov edx,[channel_line_sun]
int 0x40
add ecx,1*65536+1
mov edx,[channel_line_shadow]
int 0x40
mov eax,38 ; line
mov ebx,410*65536+410
mov ecx,22*65536+148
mov edx,[channel_line_sun]
int 0x40
add ebx,1*65536+1
mov edx,[channel_line_shadow]
int 0x40
mov eax,12
mov ebx,2
int 0x40
popa
ret
; DATA AREA
socket dd 0x0
bgc dd 0x000000
dd 0x000000
dd 0x00ff00
dd 0x0000ff
dd 0x005500
dd 0xff00ff
dd 0x00ffff
dd 0x770077
tc dd 0xffffff
dd 0xff00ff
dd 0xffffff
dd 0xffffff
dd 0xffffff
dd 0xffffff
dd 0xffffff
dd 0xffffff
channel_line_sun dd 0x9999ff
channel_line_shadow dd 0x666699
cursor_on_off dd 0x0
max_windows dd 20
thread_stack dd 0x9fff0
thread_nro dd 1
thread_screen dd I_END+120*80*1
action_header_blue db 10,'*** ',0
action_header_red db 10,'*** ',0
action_header_short db 10,'* ',0
has_left_channel db ' left channel ',0
joins_channel db ' joined channel ',0
is_now_known_as db ' is now known as ',0
has_quit_irc db ' has quit irc',0
sets_mode db ' sets mode ',0
kicked db ' kicked from ',0
index_list_1 dd 0x0000bb
index_list_2 dd 0x0000ff
posx dd 0x0
incoming_pos dd 0x0
incoming_string: times 128 db 0
pos dd 0x0
text_start dd I_END
irc_data dd 0x0
print db 0x0
cmd dd 0x0
rxs dd 66
res: db 0,0
command: times 600 db 0x0
nick dd 0,0,0
irc_command dd 0,0
command_position dd 0x0
counter dd 0
send_to_server db 0
channel_list: times 32*20 db 32
send_to_channel dd 0x0
send_string_header: db 'privmsg #eax :'
times 100 db 0x0
send_string: times 100 db 0x0
xpos dd 0
string0: db 'USER guest ser1 ser2 :'
string0l:
string1: db 'nick '
string1l:
attribute dd 0
scroll dd 1
dd 12
numtext db ' '
wcolor dd 0x000000
labelc db 'AIRC - WINDOW X: #xxx '
labelt db 'IRC client ',version
labellen:
;;
;; Channel data at I_END
;;
;; 120*80 * channel window (1+)
;;
;; At Size
;;
;; 00 , 120*60 window text 120 characters per row
;; 120*60 , 1 text is updated
;; 120*60+4 , 1 close yourself
;; 120*60+8 , 1 0 = channel window : 1 = private chat
;; 120*61 , 256 channel name
;; 120*61+254 , 254 channel entry text from user
;; 120*61+255 , 1 length of entry text
;; 120*69+248 , 4 display names from n:th name
;; 120*69+252 , 4 length of names string
;; 120*70 , 1200 names separated with space
;;
I_END: ;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -