⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 airc.asm

📁 menuet os应用程序源代码,很多汇编写的应用程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
    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 + -