{An SPX API. Send any questions or corrections to: gmiller@ius.indiana.edu gmiller@grendel.ius.indiana.edu greg.miller@shivasys.com} unit spx_api; interface uses DOS; const {constants for ECB in use flag} available = 0; AES_temporary = $e0; special = $f6; IPX_in_critical_section = $f8; SPX_listening = $f9; processing = $fa; holding = $fb; AES_waiting = $fc; AES_couning_down = $fd; awaiting_packet_receive = $fe; sending_packet = $ff; {constants for ECB completion code} success = 0; terminated_connection_noack = $ec; {remote terminated connection without acknowledging last packet} abnormal_termination = $ed; invalid_connection_ID = $ee; connection_table_full = $ef; cancel_event = $f9; {the event should be canceled} cannot_establish_connection = $fa; cancelled = $fc; malformed_packet = $fd; packet_undeliverable = $fe; physical_error = $ff; {constants for packet type} unkown_packet_type = 0; routing_information_packet = 1; echo_packet = 2; error_packet = 3; packet_exchange = 4; {normal} SPX_packet = 5; NCP_packet = $11; propegated_packet = $14; {constants for connection control (should be ORed together} end_of_message = $16; reserved = $32; ack_required = $64; system_packet = $128; type fragment = record data: pointer; size: word; end; type ecb = record link: longint; esr: longint; {FAR procedure to invoke when ECB is handled} in_use: byte; {00=available, others=in use} completion_code: byte; {see constants} socket_number: word; {big endian socket number} reserved: longint; reserved1: array[1..12] of byte; local_address: array[1..6] of byte; fragment_count: word; {should be 2} frags: array[1..2] of fragment; {first fragment is the header, the second is the actual data you wish to send} end; type SPX_header = record checksum:word; {should be 0} length:word; transport_control: byte; packet_type: byte; desination_address: array[1..10] of byte; destination_socket: word; connection_control: byte; datastream_type: byte; source_connection_ID: word; destination_connection_ID:word; sequence_number: word; allocation_number: word; end; function SPX_installed(var version,max_spx_connections, available_spx_connections:word):boolean; procedure establish_spx_connection(retry_count,watchdog_flag:byte; e:ecb; var connection_id:word; var error:byte); implementation function SPX_installed(var version,max_spx_connections, available_spx_connections:word):boolean; var r:registers; begin r.bx:=$0010; r.al:=0; intr($7a,r); SPX_installed := (r.al = $ff); version := r.bx; max_spx_connections := r.cx; available_spx_connections := r.dx; end; procedure establish_spx_connection(retry_count,watchdog_flag:byte; e:ecb; var connection_id:word; var error:byte); var r:registers; begin r.bx:=$11; r.al:=retry_count; r.ah:=watchdog_flag; r.es:=Seg(e); r.si:=ofs(e); intr($7a,r); error:=r.al; connection_id:=r.dx; end; procedure listen_for_spx_connection(retry_count,watchdog_flag:byte; var e:ecb); var r:registers; begin r.bx:=$12; r.ah:=watchdog_flag; r.al:=retry_count; r.es:=Seg(e); r.si:=ofs(e); intr($7a,r); end; procedure terminate_spx_connection(connection_ID:word; var e:ecb); var r:registers; begin r.bx:=$13; r.dx:=connection_ID; r.es:=seg(e); r.si:=ofs(e); intr($7a,r); end; procedure abort_spx_connection(connection_ID:word); var r:registers; begin r.bx:=$14; r.dx:=connection_ID; intr($7a,r); end; procedure send_spx_packet(connection_ID:word; var e:ecb); var r:registers; begin r.bx:=$16; r.cx:=1; r.dx:=connection_ID; r.es:=seg(e); r.si:=ofs(e); intr($7a,r); end; procedure listen_for_spx_packet(connection_ID:word; var e:ecb); var r:registers; begin r.bx:=$17; r.dx:=connection_ID; r.es:=seg(e); r.si:=ofs(e); intr($7a,r); end; end.