;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; Stack Configuration Tool ; ; ; ; Compile with FASM for Menuet ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd I_END ; size of image dd 0x100000 ; memory for app dd 0x7fff0 ; esp dd 0x0 , 0x0 ; I_Param , I_Icon include 'lang.inc' START: ; start of execution call draw_window ; at first, draw the window still: mov eax,10 ; wait here for event int 0x40 cmp eax,1 ; redraw request ? je red cmp eax,2 ; key in buffer ? je key cmp eax,3 ; button in buffer ? je button jmp still red: ; redraw call draw_window jmp still key: ; key mov eax,2 ; just read it and ignore int 0x40 jmp still button: ; button mov eax,17 ; get id int 0x40 shr eax,8 cmp eax,1 ; button id=1 ? jne noclose mov eax,-1 ; close this program int 0x40 noclose: cmp eax,2 je read_stack_setup cmp eax,3 je apply_stack_setup cmp eax,11 jb no_set_interface cmp eax,14 jg no_set_interface sub eax,11 mov [interface],eax call draw_window jmp still no_set_interface: cmp eax,21 jb no_ip_sf cmp eax,22 jg no_ip_sf sub eax,21 not eax and eax,1 mov [assigned],eax call draw_window jmp still no_ip_sf: cmp eax,7 ; GET IP jne no_read_ip mov [string_x],205 mov [string_y],80 mov [string_length],15 call read_string mov esi,string-1 mov edi,ip_address xor eax,eax ip1: inc esi cmp [esi],byte '0' jb ip2 cmp [esi],byte '9' jg ip2 imul eax,10 movzx ebx,byte [esi] sub ebx,48 add eax,ebx jmp ip1 ip2: mov [edi],al xor eax,eax inc edi cmp edi,ip_address+3 jbe ip1 call draw_window jmp still no_read_ip: cmp eax,5 ; GET COM PORT jne no_read_comport mov [string_x],272 mov [string_y],40 mov [string_length],3 call read_string movzx eax,byte [string] cmp eax,'A' jb gcp1 sub eax,'A'-'9'-1 gcp1: sub eax,48 shl eax,8 mov ebx,eax movzx eax,byte [string+1] cmp eax,'A' jb gcp2 sub eax,'A'-'9'-1 gcp2: sub eax,48 shl eax,4 add ebx,eax movzx eax,byte [string+2] cmp eax,'A' jb gcp3 sub eax,'A'-'9'-1 gcp3: sub eax,48 add ebx,eax mov [com_add],ebx call draw_window jmp still no_read_comport: cmp eax,6 ; GET COM IRQ jne no_read_comirq mov [string_x],284 mov [string_y],50 mov [string_length],1 call read_string movzx eax,byte [string] cmp eax,'A' jb gci1 sub eax,'A'-'9'-1 gci1: sub eax,48 mov [com_irq],eax call draw_window jmp still no_read_comirq: cmp eax, 8 ; set gateway ip jne no_set_gateway mov [string_x],205 mov [string_y],90 mov [string_length],15 call read_string mov esi,string-1 mov edi,gateway_ip xor eax,eax gip1: inc esi cmp [esi],byte '0' jb gip2 cmp [esi],byte '9' jg gip2 imul eax,10 movzx ebx,byte [esi] sub ebx,48 add eax,ebx jmp gip1 gip2: mov [edi],al xor eax,eax inc edi cmp edi,gateway_ip+3 jbe gip1 call draw_window jmp still no_set_gateway: cmp eax, 9 jne no_set_subnet mov [string_x],205 mov [string_y],100 mov [string_length],15 call read_string mov esi,string-1 mov edi,subnet_mask xor eax,eax sip1: inc esi cmp [esi],byte '0' jb sip2 cmp [esi],byte '9' jg sip2 imul eax,10 movzx ebx,byte [esi] sub ebx,48 add eax,ebx jmp sip1 sip2: mov [edi],al xor eax,eax inc edi cmp edi,subnet_mask+3 jbe sip1 call draw_window jmp still no_set_subnet: cmp eax, 10 jne no_set_dns mov [string_x],205 mov [string_y],110 mov [string_length],15 call read_string mov esi,string-1 mov edi,dns_ip xor eax,eax dip1: inc esi cmp [esi],byte '0' jb dip2 cmp [esi],byte '9' jg dip2 imul eax,10 movzx ebx,byte [esi] sub ebx,48 add eax,ebx jmp dip1 dip2: mov [edi],al xor eax,eax inc edi cmp edi,dns_ip+3 jbe dip1 call draw_window jmp still no_set_dns: jmp still read_stack_setup: mov eax,52 mov ebx,0 int 0x40 mov [config],eax mov eax,52 mov ebx,1 int 0x40 mov dword [ip_address],eax mov eax,52 mov ebx,9 int 0x40 mov dword [gateway_ip],eax mov eax,52 mov ebx,10 int 0x40 mov dword [subnet_mask],eax mov eax,52 mov ebx,13 int 0x40 mov dword [dns_ip],eax mov eax,[config] ; unwrap com IRQ shr eax,8 and eax,0xf mov [com_irq],eax mov eax,[config] ; unwrap com PORT shr eax,16 and eax,0xfff mov [com_add],eax mov eax,[config] ; unwrap IRQ and eax,0xf mov [interface],eax mov eax,[config] ; unwrap com PORT shr eax,7 and eax,1 mov [assigned],eax call draw_window jmp still apply_stack_setup: mov eax,[com_irq] shl eax,8 mov ebx,[com_add] shl ebx,16 add eax,ebx add eax,[interface] mov ebx,[assigned] shl ebx,7 add eax,ebx mov [config],eax mov eax,52 mov ebx,3 mov ecx,dword [ip_address] int 0x40 mov eax,52 mov ebx,11 mov ecx,dword [gateway_ip] int 0x40 mov eax,52 mov ebx,12 mov ecx,dword [subnet_mask] int 0x40 mov eax,52 mov ebx,14 mov ecx,dword [dns_ip] int 0x40 mov eax,52 mov ebx,2 mov ecx,[config] int 0x40 jmp still string_length dd 16 string_x dd 200 string_y dd 60 string db '________________' read_string: mov edi,string mov eax,'_' mov ecx,[string_length] cld rep stosb call print_text mov edi,string f11: mov eax,10 int 0x40 cmp eax,2 jne read_done mov eax,2 int 0x40 shr eax,8 cmp eax,13 je read_done cmp eax,8 jnz nobsl cmp edi,string jz f11 sub edi,1 mov [edi],byte '_' call print_text jmp f11 nobsl: cmp eax,dword 31 jbe f11 cmp eax,dword 95 jb keyok sub eax,32 keyok: mov [edi],al call print_text inc edi mov esi,string add esi,[string_length] cmp esi,edi jnz f11 read_done: call print_text ret print_text: pusha mov eax,13 mov ebx,[string_x] shl ebx,16 add ebx,[string_length] imul bx,6 mov ecx,[string_y] shl ecx,16 mov cx,8 mov edx,0xffffff int 0x40 mov eax,4 mov ebx,[string_x] shl ebx,16 add ebx,[string_y] mov ecx,0x000000 mov edx,string mov esi,[string_length] int 0x40 popa ret ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw int 0x40 ; DRAW WINDOW mov eax,0 ; function 0 : define and draw window mov ebx,100*65536+330 ; [x start] *65536 + [x size] mov ecx,100*65536+157 ; [y start] *65536 + [y size] mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl mov esi,0x806688cc mov edi,0x006688cc int 0x40 ; WINDOW LABEL mov eax,4 ; function 4 : write text to window mov ebx,8*65536+8 ; [x start] *65536 + [y start] mov ecx,0x00ddeeff ; color of text RRGGBB mov edx,labelt ; pointer to text beginning mov esi,labellen-labelt ; text length int 0x40 mov eax,8 ; BUTTON : CLOSE WINDOW mov ebx,(330-19)*65536+12 mov ecx,5*65536+12 mov edx,1 mov esi,[button_color] ; int 0x40 mov eax,8 ; BUTTON : READ SETUP mov ebx,90*65536+65 mov ecx,127*65536+12 mov edx,2 int 0x40 mov eax,8 ; BUTTON : APPLY SETUP mov ebx,163*65536+65 mov ecx,127*65536+12 mov edx,3 int 0x40 mov eax,8 ; BUTTONS 11-14 : SELECT INTERFACE mov ebx,29*65536+8 mov ecx,39*65536+8 mov edx,11 interface_select: int 0x40 add ecx,10*65536 inc edx cmp edx,11+4 jb interface_select mov ebx,[interface] ; PRINT SELECTED INTERFACE 'X' imul ebx,10 add ebx,31*65536+39 mov eax,4 mov ecx,0xffffff mov edx,xx mov esi,1 int 0x40 mov eax,8 ; BUTTONS 21-22 : SERVER / MANUAL IP mov ebx,143*65536+8 mov ecx,69*65536+8 mov edx,21 mov esi,[button_color] int 0x40 mov eax,8 mov ebx,143*65536+8 mov ecx,79*65536+8 mov edx,22 int 0x40 mov ebx,[assigned] ; PRINT SELECTED SERVER/MANUAL 'X' not ebx and ebx,1 imul ebx,10 add ebx,145*65536+69 mov eax,4 mov ecx,0xffffff mov edx,xx mov esi,1 int 0x40 mov eax,47 ; COM ADDRESS mov ebx,3*65536+1*256 mov ecx,[com_add] mov edx,272*65536+40 mov esi,0x000000 int 0x40 mov eax,47 ; COM IRQ mov ebx,1*65536+1*256 mov ecx,[com_irq] mov edx,(266+3*6)*65536+50 mov esi,0x000000 int 0x40 mov edi,ip_address mov edx,205*65536+80 mov esi,0x000000 mov ebx,3*65536 ipdisplay: mov eax,47 movzx ecx,byte [edi] int 0x40 add edx,6*4*65536 inc edi cmp edi,ip_address+4 jb ipdisplay mov edi,gateway_ip mov edx,205*65536+90 mov esi,0x000000 mov ebx,3*65536 gipdisplay: mov eax,47 movzx ecx,byte [edi] int 0x40 add edx,6*4*65536 inc edi cmp edi,gateway_ip+4 jb gipdisplay mov edi,subnet_mask mov edx,205*65536+100 mov esi,0x000000 mov ebx,3*65536 sipdisplay: mov eax,47 movzx ecx,byte [edi] int 0x40 add edx,6*4*65536 inc edi cmp edi,subnet_mask+4 jb sipdisplay mov edi,dns_ip mov edx,205*65536+110 mov esi,0x000000 mov ebx,3*65536 dipdisplay: mov eax,47 movzx ecx,byte [edi] int 0x40 add edx,6*4*65536 inc edi cmp edi,dns_ip+4 jb dipdisplay mov eax,8 ; BUTTON 5 : SET PORT mov ebx,299*65536+8 mov ecx,39*65536+8 mov edx,5 mov esi,[button_color] int 0x40 mov eax,8 ; BUTTON 6 : SET IRQ mov ebx,299*65536+8 mov ecx,49*65536+8 mov edx,6 int 0x40 mov eax,8 ; BUTTON 7 : SET IP mov ebx,299*65536+8 mov ecx,79*65536+8 mov edx,7 int 0x40 mov eax,8 ; BUTTON 8 : SET gateway IP mov ebx,299*65536+8 mov ecx,89*65536+8 mov edx,8 int 0x40 mov eax,8 ; BUTTON 9 : SET subnet mov ebx,299*65536+8 mov ecx,99*65536+8 mov edx,9 int 0x40 mov eax,8 ; BUTTON 10 : SET dns ip mov ebx,299*65536+8 mov ecx,109*65536+8 mov edx,10 int 0x40 mov ebx,31*65536+40 ; draw info text with function 4 mov edx,text mov esi,49 newline: mov ecx,0x224466 cmp [edx],byte 'w' jne nowhite mov ecx,0xeeeeee nowhite: inc edx mov eax,4 int 0x40 add ebx,10 add edx,49 cmp [edx],byte 'x' jne newline mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw int 0x40 ret ; DATA AREA text: db ' Not active Modem Com Port: 0x < ' db ' Slip Modem Com Irq: 0x < ' db ' PPP ' db ' Packet Driver IP server assigned ' db ' Fixed: . . . < ' db ' Gateway: . . . < ' db ' Subnet: . . . < ' db ' DNS IP: . . . < ' db ' ' db 'w READ APPLY ' xx: db 'x <- END MARKER, DONT DELETE ' button_color dd 0x2254b9 labelt: db 'STACK CONFIGURATION' labellen: ip_address db 000,000,000,000 gateway_ip db 000,000,000,000 subnet_mask db 000,000,000,000 dns_ip db 000,000,000,000 com_irq dd 0 ; irq for slip/ppp com_add dd 0 ; com port address for slip/ppp interface dd 0 ; not active,slip,ppp,packet driver assigned dd 1 ; get ip from server config dd 0 I_END: