;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; NNTP CLIENT v 0.1 ;; ;; (C) Ville Turjanmaa ;; version equ '0.1' include "lang.inc" include "..\..\..\macros.inc" use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd I_END ; size of image dd 0x80000 ; memory for app dd 0x80000 ; esp dd 0x0 , 0x0 ; I_Param , I_Icon connect_state db 0,0,'Disconnected' db 1,3,'Trying.. ' db 4,4,'Connected ' db 5,9,'Closing.. ' prev_state dd -1 space dd 0x0 text_start dd 0x0 text_current dd 0x0 status dd 0x0 server_ip db 192,168,0,96 socket dd 0x0 xpos dd 0x0 ypos dd 0x0 ;; group db 'GROUP alt.test',13,10 db ' ' grouplen dd 16 stat db 'STAT ' statlen dd 0x0 article db 'ARTICLE',13,10 articlelen: ;; quit db 'QUIT',13,10 quitlen: xwait dd 0x0 ywait dd 0x0 article_n dd 0x0 article_l dd 0x0 article_start dd 0x0 article_last dd 0x0 article_all dd 0x0 article_fetch dd 0x0 xpost dd 0x0 edisave dd 0x0 connection_status: pusha mov eax,53 mov ebx,6 mov ecx,[socket] mcall cmp eax,[prev_state] je no_cos mov [prev_state],eax mov eax,13 mov ebx,435*65536+12*6 mov ecx,42*65536+10 mov edx,0xffffff mcall mov ecx,-14 mov eax,[prev_state] next_test: add ecx,14 cmp ecx,14*4 je no_cos cmp al,[connect_state+ecx+0] jb next_test cmp al,[connect_state+ecx+1] jg next_test mov edx,ecx add edx,2 add edx,connect_state mov eax,4 mov ebx,435*65536+42 mov ecx,0x000000 mov esi,12 mcall no_cos: popa ret text_input: pusha mov ecx,25 mov eax,32 cld rep stosb popa mov [edisave],edi ti0: mov [edi],byte ' ' call draw_entries mov eax,10 mcall cmp eax,2 jne no_more_text mov eax,2 mcall cmp ah,8 jne no_bg cmp edi,[edisave] je ti0 dec edi jmp ti0 no_bg: cmp ah,13 je no_more_text mov [edi],ah inc edi call draw_entries jmp ti0 no_more_text: mov [xpost],edi ret convert_text_to_ip: pusha mov edi,server_ip mov esi,text+10 mov eax,0 mov edx,[xpost] newsip: cmp [esi],byte '.' je sipn cmp esi,edx jge sipn movzx ebx,byte [esi] inc esi imul eax,10 sub ebx,48 add eax,ebx jmp newsip sipn: mov [edi],al xor eax,eax inc esi cmp esi,text+50 jg sipnn inc edi cmp edi,server_ip+3 jbe newsip sipnn: popa ret send_group: mov eax,53 mov ebx,7 mov ecx,[socket] mov edx,[grouplen] mov esi,group mcall mov [status],3 call clear_text call save_coordinates ret convert_number_to_text: pusha mov eax,[esi] mov ecx,0 newch: inc ecx xor edx,edx mov ebx,10 div ebx cmp eax,0 jne newch add edi,ecx dec edi mov [article_l],ecx mov eax,[esi] newdiv: xor edx,edx mov ebx,10 div ebx add edx,48 mov [edi],dl dec edi loop newdiv popa ret convert_text_to_number: pusha mov edx,0 newdigit: movzx eax,byte [esi] cmp eax,'0' jb cend cmp eax,'9' jg cend imul edx,10 add edx,eax sub edx,48 inc esi jmp newdigit cend: mov [edi],edx popa ret clear_text: mov [text_start],0 mov [xpos],0 mov [ypos],0 mov [xwait],0 mov [ywait],0 mov edi,nntp_text mov ecx,0x50000 mov eax,32 cld rep stosb ret state_machine_write: cmp [status],2 jne no_22 call send_group ret no_22: cmp [status],4 jne no_4 mov eax,53 mov ebx,7 mov ecx,[socket] mov edx,[statlen] ; -stat mov esi,stat mcall mov [status],5 call save_coordinates ret no_4: cmp [status],6 jne no_6 mov eax,53 mov ebx,7 mov ecx,[socket] mov edx,articlelen-article mov esi,article mcall mov [status],7 call save_coordinates ret no_6: ret save_coordinates: mov eax,[xpos] mov ebx,[ypos] mov [xwait],eax mov [ywait],ebx ret state_machine_read: cmp [status],1 jne no_1 mov eax,'200 ' call wait_for_string ret no_1: cmp [status],3 ;; responce to group jne no_3 mov eax,'211 ' call wait_for_string ret no_3: cmp [status],5 ;; responce to stat jne no_5 mov eax,'223 ' call wait_for_string ret no_5: ;; after 'article' request - no wait cmp [status],9 jne no_9 mov eax,'222 ' call wait_for_string ret no_9: ret wait_for_string: mov ecx,[ywait] imul ecx,80 add ecx,[xwait] mov ecx,[nntp_text+ecx] cmp eax,ecx jne no_match cmp [status],3 jne no_stat_ret mov esi,[ywait] imul esi,80 add esi,[xwait] new32s: inc esi movzx eax,byte [esi+nntp_text] cmp eax,47 jge new32s new32s2: inc esi movzx eax,byte [esi+nntp_text] cmp eax,47 jge new32s2 inc esi add esi,nntp_text ; mov [esi-1],byte '.' mov edi,article_n call convert_text_to_number mov eax,[article_n] mov [article_start],eax new32s3: inc esi movzx eax,byte [esi] cmp eax,47 jge new32s3 inc esi mov edi,article_last call convert_text_to_number mov eax,[text_current] add [article_n],eax mov esi,article_n mov edi,nntp_text+71 call convert_number_to_text mov esi,article_n mov edi,stat+5 call convert_number_to_text mov eax,[article_l] mov [stat+5+eax],byte 13 mov [stat+6+eax],byte 10 add eax,5+2 mov [statlen],eax pusha mov edi,text+10+66*2 mov ecx,25 mov eax,32 cld rep stosb mov esi,text_current mov edi,text+10+66*2 call convert_number_to_text mov eax,32 mov ecx,20 mov edi,text+10+66*3 cld rep stosb mov eax,[article_last] sub eax,[article_start] mov [article_all],eax mov esi,article_all mov edi,text+10+66*3 call convert_number_to_text call draw_entries popa call draw_text no_stat_ret: inc [status] mov eax,5 mov ebx,10 mcall call check_for_incoming_data no_match: ret START: ; start of execution mov eax,40 mov ebx,10000111b mcall call clear_text call draw_window still: call state_machine_write call state_machine_read mov eax,23 ; wait here for event mov ebx,5 mcall cmp eax,1 ; redraw request ? je red cmp eax,2 ; key in buffer ? je key cmp eax,3 ; button in buffer ? je button call check_for_incoming_data call connection_status jmp still red: ; redraw call draw_window jmp still key: ; key mov eax,2 ; just read it and ignore mcall cmp ah,' ' jne no_space mov eax,[space] dec eax add [text_start],eax call draw_text jmp still no_space: cmp ah,177 jne no_plus inc [text_start] call draw_text jmp still no_plus: cmp ah,178 jne no_minus cmp [text_start],0 je no_minus dec [text_start] call draw_text jmp still no_minus: cmp ah,179 jne no_next inc [text_current] call send_group jmp still no_next: cmp ah,176 jne no_prev cmp [text_current],0 je still dec [text_current] call send_group jmp still no_prev: jmp still button: ; button mov eax,17 ; get id mcall shr eax,8 cmp eax,11 jne no_11 mov edi,text+10 call text_input call convert_text_to_ip jmp still no_11: cmp eax,12 jne no_12 mov edi,text+66+10 call text_input mov esi,text+66+10 mov edi,group+6 mov ecx,[xpost] sub ecx,text+66+10 mov eax,ecx cld rep movsb mov [group+6+eax],byte 13 mov [group+7+eax],byte 10 add eax,6+2 mov [grouplen],eax mov [text_current],0 jmp still no_12: cmp eax,13 jne no_13 mov edi,text+10+66*2 call text_input mov esi,text+10+66*2 mov edi,text_current call convert_text_to_number call send_group jmp still no_13: cmp eax,14 jne no_start call clear_text mov eax,3 mcall mov ecx,eax mov eax,53 mov ebx,5 mov edx,119 mov esi,dword [server_ip] mov edi,1 mcall mov [socket],eax mov [status],1 jmp still no_start: cmp eax,15 jne no_end mov eax,53 mov ebx,7 mov ecx,[socket] mov edx,quitlen-quit mov esi,quit mcall mov eax,5 mov ebx,10 mcall call check_for_incoming_data mov eax,53 mov ebx,8 mov ecx,[socket] mcall mov eax,5 mov ebx,5 mcall mov eax,53 mov ebx,8 mov ecx,[socket] mcall mov [status],0 jmp still no_end: cmp eax,1 ; button id=1 ? jne noclose mov eax,-1 ; close this program mcall noclose: jmp still check_for_incoming_data: cmp [status],0 jne go_on ret go_on: mov eax,53 mov ebx,2 mov ecx,[socket] mcall cmp eax,0 je ch_ret mov eax,53 mov ebx,3 mov ecx,[socket] mcall and ebx,0xff cmp ebx,13 jb no_print cmp bl,13 jne char mov [xpos],0 inc [ypos] jmp no_print char: cmp ebx,128 jbe char_ok mov ebx,'?' char_ok: mov ecx,[ypos] imul ecx,80 add ecx,[xpos] mov [nntp_text+ecx],bl cmp [xpos],78 jg noxinc inc [xpos] noxinc: no_print: mov eax,53 mov ebx,2 mov ecx,[socket] mcall cmp eax,0 jne check_for_incoming_data call draw_text ch_ret: ret ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: pusha mov [prev_state],-1 mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall ; DRAW WINDOW mov eax,0 ; function 0 : define and draw window mov ebx,100*65536+520 ; [x start] *65536 + [x size] mov ecx,5*65536+470 ; [y start] *65536 + [y size] mov edx,0x13ffffff ; color of work area RRGGBB,8->color gl mov edi,title ; WINDOW LABEL mcall mov eax,38 mov ebx,5*65536+515 mov ecx,101*65536+101 mov edx,0x99bbff mcall mov ecx,102*65536+102 mov edx,0x3366aa mcall mov eax,8 mov ebx,238*65536+8 mov ecx,30*65536+8 mov edx,11 mov esi,0x88aadd mcall mov ecx,41*65536+8 mov edx,12 mcall mov ecx,52*65536+8 mov edx,13 mcall mov ebx,265*65536+75 mov ecx,39*65536+13 mov edx,14 mcall mov ebx,351*65536+75 mov edx,15 mcall call draw_entries call draw_text mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw mcall popa ret draw_entries: pusha mov eax,13 mov ebx,30*65536+200 mov ecx,30*65536+44 mov edx,0xffffff mcall mov eax,4 mov ebx,30*65536+31 ; draw info text with function 4 mov ecx,0x000000 mov edx,text mov esi,66 mov edi,6 newline2: mcall add ebx,11 add edx,66 dec edi jnz newline2 popa ret draw_text: pusha mov eax,9 mov ebx,0x70000 mov ecx,-1 mcall mov eax,[0x70000+46] cmp eax,150 jbe dtret sub eax,111 mov ebx,10 xor edx,edx div ebx mov edi,eax dec edi mov [space],edi mov eax,4 mov ebx,20*65536+111 ; draw info text with function 4 mov ecx,0x000000 mov edx,[text_start] imul edx,80 add edx,nntp_text mov esi,80 newline: pusha mov ecx,ebx shl ecx,16 mov eax,13 mov ebx,20*65536+80*6 mov cx,10 mov edx,0xffffff mcall popa mcall add ebx,10 add edx,80 dec edi jnz newline dtret: popa ret ; DATA AREA text: db 'NNTP IP : 192.168.0.96 < ' db 'Group : alt.test < Connect Disconnect ' db 'Article : 0 < ' db 'Art.max : ? ' db ' ' db 'Arrow left/rigth: fetch prev/next - Arrow up/down & space: scroll ' textl: title db 'NNTP client v',version,0 nntp_text: db 'a' I_END: ;;;