212 lines
4.6 KiB
NASM
212 lines
4.6 KiB
NASM
;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
|
|
|