www.pudn.com > zsnes117b-src.zip > zsipx.asm


;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) 
; 
;This program is free software; you can redistribute it and/or 
;modify it under the terms of the GNU General Public License 
;as published by the Free Software Foundation; either 
;version 2 of the License, or (at your option) any later 
;version. 
; 
;This program is distributed in the hope that it will be useful, 
;but WITHOUT ANY WARRANTY; without even the implied warranty of 
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
;GNU General Public License for more details. 
; 
;You should have received a copy of the GNU General Public License 
;along with this program; if not, write to the Free Software 
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 
%include "macros.mac" 
 
EXTSYM ipx_init               ; To init ipx 
EXTSYM ipx_initcode           ; return 0 if everything is ok (int) 
EXTSYM ipx_packet             ; 80 bytes buffer to send 
EXTSYM ipx_packet_size        ; size to send (max 80 bytes) (dword) 
EXTSYM sendpacket             ; to send a packet 
EXTSYM checkpacket            ; check if a packet is ready to receive 
EXTSYM ipx_packet_ready       ; return 1 if there is a packet ready (byte) 
EXTSYM read_packet            ; to read an incoming packet 
EXTSYM ipx_read_packet        ; 80 bytes buffer of received packet 
EXTSYM ipx_deinit             ; to deinit the ipx 
EXTSYM IPXInfoStr,IPXInfoStrR 
EXTSYM modembuffer, modemhead, modemtail 
 
 
 
 
 
 
 
 
 
 
 
 
NEWSYM ipxinited, db 0 
 
NEWSYM initipx 
    mov dword[modemhead],0 
    mov dword[modemtail],0 
    xor ax,ax 
    cmp byte[ipxinited],1 
    je .notokay 
    call ipx_init 
    mov ax,[ipx_initcode] 
    cmp ax,0 
    jne .notokay 
    mov byte[ipxinited],1 
.notokay 
    ret 
 
NEWSYM deinitipx 
    cmp byte[ipxinited],0 
    je .notinitialized 
    mov byte[ipxinited],0 
    call ipx_deinit 
.notinitialized 
    ret 
 
NEWSYM PacketPointer, dd 0 
 
NEWSYM PreparePacketIPX 
    cmp byte[ipxinited],1 
    jne .noipx 
    call ipxpp 
.noipx 
    ret 
 
NEWSYM SendPacketIPX 
    cmp byte[ipxinited],1 
    jne .noipx 
    call ipxsp 
.noipx 
    ret 
 
NEWSYM ipxsendchar    ; prepare packet 
    push esi 
    mov esi,[PacketPointer] 
    mov [esi],al 
    inc dword[PacketPointer] 
    pop esi 
    ret 
 
NEWSYM IPXSearchval, db 0 
NEWSYM ipxlookforconnect 
    cmp byte[ipxinited],0 
    je .initialized 
    ret 
.initialized 
    pushad 
    call checkpacket 
    cmp byte[ipx_packet_ready],1 
    jne near .nopacket 
    call read_packet 
    cmp dword[ipx_read_packet],'ZZ|Z' 
    jne .nopacketf 
    cmp byte[ipx_read_packet+6],'L' 
    jne .nopacketf 
    mov ax,[ipx_read_packet+4] 
    cmp ax,[IPXInfoStr] 
    je .nopacketf 
    mov [IPXInfoStrR],ax 
    mov eax,ipx_packet 
    mov dword[eax],'ZY|Z' 
    mov bx,[IPXInfoStr] 
    mov [eax+4],bx 
    mov bx,[IPXInfoStrR] 
    mov [eax+6],bx 
    mov dword[ipx_packet_size],8 
    call sendpacket 
    mov byte[IPXSearchval],1 
    jmp .skipall 
.nopacketf 
    cmp dword[ipx_read_packet],'ZY|Z' 
    jne .nopacket 
    mov bx,[IPXInfoStr] 
    cmp [eax+6],bx 
    jne .nopacket 
    mov bx,[eax+4] 
    cmp bx,[IPXInfoStr] 
    je .nopacket 
    mov [IPXInfoStrR],bx 
    mov byte[IPXSearchval],1 
    jmp .skipall 
.nopacket 
    mov eax,ipx_packet 
    mov dword[eax],'ZZ|Z' 
    mov bx,[IPXInfoStr] 
    mov [eax+4],bx 
    mov byte[eax+6],'L' 
    mov dword[ipx_packet_size],7 
    call sendpacket 
.skipall 
    popad 
    ret 
 
NEWSYM ipxpp    ; prepare packet 
    pushad 
    mov eax,ipx_packet 
    mov byte[eax],'Z' 
    mov byte[eax+1],'|' 
    mov byte[eax+2],'S' 
    mov bx,[IPXInfoStr] 
    mov [eax+3],bx 
    add eax,6 
    mov [PacketPointer],eax 
    popad 
    ret 
 
NEWSYM ipxsp    ; send packet 
    pushad 
    mov eax,[PacketPointer] 
    sub eax,ipx_packet 
    mov [ipx_packet+5],al 
    mov [ipx_packet_size],eax 
    call sendpacket 
    popad 
    ret 
 
NEWSYM ipxgetchar 
    pushad 
    call checkpacket 
    cmp byte[ipx_packet_ready],1 
    jne .nopacket 
    call read_packet 
    cmp byte[ipx_read_packet],'Z' 
    jne .nopacket 
    cmp byte[ipx_read_packet+1],'|' 
    jne .nopacket 
    cmp byte[ipx_read_packet+2],'S' 
    jne .nopacket 
    mov bx,[IPXInfoStrR] 
    cmp [ipx_read_packet+3],bx 
    jne .nopacket 
    mov cl,[ipx_read_packet+5] 
    sub cl,6 
    mov esi,ipx_read_packet+6 
    cmp cl,0 
    je .nopacket 
.loop 
    mov edi,[modemtail] 
    mov al,[esi] 
    mov [modembuffer+edi],al 
    inc dword[modemtail] 
    inc esi 
    and dword[modemtail],2047 
    dec cl 
    jnz .loop 
.nopacket 
    popad 
    push eax 
    xor dh,dh 
    mov eax,[modemhead] 
    cmp eax,[modemtail] 
    je .nonewchar 
    mov dh,1 
    mov dl,[modembuffer+eax] 
    inc dword[modemhead] 
    and dword[modemhead],2047 
.nonewchar 
    pop eax 
    ret