mirror of
https://github.com/bobbimanners/emailler.git
synced 2024-11-15 17:09:16 +00:00
4577c2ab19
So far the base address of the Ethernet chip was a general property of all Ethernet drivers. It served two purposes: 1. Allowing to use a single Ethernet driver for a certain Ethernet chip, no matter what machine was connected to the chip. 2. Allowing use an Ethernet card in all Apple II slots. However, we now use customized Ethernet drivers for the individual machines so 1.) isn't relevant anymore. In fact one wants to omit the overhead of a runtime-adjustable base address where it isn't needed. So only the Apple II slots are left. But this should rather be a driver-internal approach then. We should just hand the driver the slot number the user wants to use and have the driver do its thing. Independently from the aspect if the driver parameter is a base address or a slot number the parameter handling was changed too. For asm programs there was so far a specific init function to be called prior to the main init function if it was desired to chnage the parameter default. This was done to keep the main init function backward compatible. But now that the parameter (now the slot number) is only used on the Apple II anyhow it seems reasonable to drop the specific init function again and just provide the parameter to the main init function. All C64-only user code can stay as-is. Only Apple II user code needs to by adjusted. Please note that this change only affects asm programs, C programs always used a single init function with the Apple II slot number as parameter.
140 lines
3.8 KiB
ArmAsm
140 lines
3.8 KiB
ArmAsm
; ip65 main routines
|
|
|
|
.include "../inc/common.inc"
|
|
.include "../inc/error.inc"
|
|
|
|
.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 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
|
|
|
|
|
|
.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 $4e ; on an Apple 2, this is RNDL
|
|
adc $9004 ; on a VIC 20, this is the raster register
|
|
adc $d41b ; on a C64, this is a 'random' number from the SID
|
|
adc $d20a ; on an Atari, this is a 'random' number from the POKEY
|
|
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: A = adaptor specific initialisation value or 'eth_init_default'
|
|
; outputs: carry flag is set if there was an error, clear otherwise
|
|
ip65_init:
|
|
jsr eth_init ; initialize ethernet driver
|
|
|
|
bcc @ok
|
|
lda #IP65_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 --
|