ip65 technical reference

File : ip65/ip65.s

 ip65 main routines

functions

functiondescription
ip65_init
 initialise the IP stack
 this calls the individual protocol & driver initialisations, so this is
 the only *_init routine that must be called by a user application,
 except for dhcp_init which must also be called if the application
 is using dhcp rather than hardcoded ip configuration
 inputs: none
 outputs: none
ip65_process
main ip polling loop
this routine should be periodically called by an application at any time
that an inbound packet needs to be handled.
it is 'non-blocking', i.e. it will return if there is no packet waiting to be
handled. any inbound packet will be handed off to the appropriate handler.
inputs: none
outputs: carry flag set if no packet was waiting, or packet handling caused error.
  since the inbound packet may trigger generation of an outbound, eth_outp 
  and eth_outp_len may be overwriiten. 
ip65_random_word
generate a 'random' 16 bit word
entropy comes from the last ethernet frame, counters, and timer
inputs: none
outputs: AX set to a pseudo-random 16 bit number

variables

variabledescriptionsize (bytes)
ip65_ctr incremented for every incoming packet 1
ip65_ctr_arp incremented for every incoming arp packet 1
ip65_ctr_ip incremented for every incoming ip packet 1
ip65_errorlast error code 1

implementation

; ip65 main routines

.include "../inc/common.i"

.ifndef KPR_API_VERSION_NUMBER
  .define EQU     =
  .include "../inc/kipper_constants.i"
.endif

  .export ip65_init
  .export ip65_process
  .export ip65_random_word
  .export ip65_ctr
  .export ip65_ctr_arp
  .export ip65_ctr_ip
  
  .export ip65_error
   
  .import cfg_init
  
  .import eth_init
  .import timer_init
  .import arp_init
  .import ip_init
  .import timer_read

  .import eth_inp
  .import eth_outp
  .import eth_rx

  .import ip_process
  .import arp_process

  .importzp eth_proto_arp

  .export ip65_random_word
  
  .bss


ip65_ctr:  .res 1    ; incremented for every incoming packet
ip65_ctr_arp:  .res 1    ; incremented for every incoming arp packet
ip65_ctr_ip:  .res 1    ; incremented for every incoming ip packet

ip65_error: .res 1  ;last error code

  .code

;generate a 'random' 16 bit word
;entropy comes from the last ethernet frame, counters, and timer
;inputs: none
;outputs: AX set to a pseudo-random 16 bit number
ip65_random_word:
  jsr timer_read ;sets AX
  adc $9004 ;on a VIC 20, this is the raster register
  adc $d41b; on a c64, this is a 'random' number from the SID
  pha
  adc ip65_ctr_arp
  ora #$08    ;make sure we grab at least 8 bytes from eth_inp
  tax   
:  
  adc eth_inp,x
  adc eth_outp,x
  dex
  bne :-
  tax
  pla
  adc ip65_ctr
  eor ip65_ctr_ip
  rts

; initialise the IP stack
; this calls the individual protocol & driver initialisations, so this is
; the only *_init routine that must be called by a user application,
; except for dhcp_init which must also be called if the application
; is using dhcp rather than hardcoded ip configuration
; inputs: none
; outputs: none
ip65_init:
  jsr cfg_init    ;copy default values (including MAC address) to RAM
  jsr eth_init    ; initialize ethernet driver
  
  bcc @ok
  lda #KPR_ERROR_DEVICE_FAILURE
  sta ip65_error
  rts
@ok:  
  jsr timer_init    ; initialize timer
  jsr arp_init    ; initialize arp
  jsr ip_init    ; initialize ip, icmp, udp, and tcp
  clc
  rts


;main ip polling loop
;this routine should be periodically called by an application at any time
;that an inbound packet needs to be handled.
;it is 'non-blocking', i.e. it will return if there is no packet waiting to be
;handled. any inbound packet will be handed off to the appropriate handler.
;inputs: none
;outputs: carry flag set if no packet was waiting, or packet handling caused error.
;  since the inbound packet may trigger generation of an outbound, eth_outp 
;  and eth_outp_len may be overwriiten. 
ip65_process:
  jsr eth_rx    ; check for incoming packets
  bcs @done

  lda eth_inp + 12  ; type should be 08xx
  cmp #8
  bne @done

  lda eth_inp + 13
;  cmp #eth_proto_ip  ; ip = 00
  beq @ip
  cmp #eth_proto_arp  ; arp = 06
  beq @arp
@done:
  rts

@arp:
  inc ip65_ctr_arp
  jmp arp_process

@ip:
  inc ip65_ctr_ip
  jmp ip_process



;-- LICENSE FOR ip65.s --
; The contents of this file are subject to the Mozilla Public License
; Version 1.1 (the "License"); you may not use this file except in
; compliance with the License. You may obtain a copy of the License at
; http://www.mozilla.org/MPL/
; 
; Software distributed under the License is distributed on an "AS IS"
; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
; License for the specific language governing rights and limitations
; under the License.
; 
; The Original Code is ip65.
; 
; The Initial Developer of the Original Code is Per Olofsson,
; MagerValp@gmail.com.
; Portions created by the Initial Developer are Copyright (C) 2009
; Per Olofsson. All Rights Reserved.  
; -- LICENSE END --