emailler/drivers/ethernetcombo.s
Oliver Schmidt 4577c2ab19 Removed Ethernet driver I/O base.
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.
2019-05-02 14:44:24 +02:00

231 lines
4.6 KiB
ArmAsm

; Wrapper for combination of Contiki ethernet drivers
.include "zeropage.inc"
.include "../inc/common.inc"
.export eth_init
.export eth_rx
.export eth_tx
.export eth_name
.import eth_inp
.import eth_inp_len
.import eth_outp
.import eth_outp_len
.import _w5100
.import _w5100_name
.import _cs8900a
.import _cs8900a_name
.import _lan91c96
.import _lan91c96_name
.import cfg_mac
.struct driver
drvtype .byte 3
apiver .byte
mac .byte 6
bufaddr .addr
bufsize .word
init .byte 3
poll .byte 3
send .byte 3
exit .byte 3
.endstruct
eth = ptr1
.bss
eth_name: .res 20
eth_init_value: .res 1
.code
; computes pointer to ethernet driver struct member
; inputs:
; eth: pointer to Contiki ethernet driver
; A: offset of driver struct member
; outputs:
; AX: pointer to ethernet driver struct member
add_driver_offset:
clc
adc eth
ldx eth+1
bcc :+
inx
: rts
; increment AX by one
; inputs:
; AX: value to increment
; outputs:
; AX: incremented value
incr_ax:
clc
adc #1
bcc :+
inx
: rts
; patches Contiki ethernet driver into wrapper code
; inputs:
; AX: pointer to Contiki ethernet driver
; outputs:
; none
patch_wrapper:
stax eth
lda #driver::mac
jsr add_driver_offset
stax patch_mac+1
lda #driver::bufaddr
jsr add_driver_offset
stax patch_bufaddr_rx+1
stax patch_bufaddr_tx+1
jsr incr_ax
stax patch_bufaddr_rx+4
stax patch_bufaddr_tx+4
lda #driver::bufsize
jsr add_driver_offset
stax patch_bufsize+1
jsr incr_ax
stax patch_bufsize+4
lda #driver::init
jsr add_driver_offset
stax patch_init+1
lda #driver::poll
jsr add_driver_offset
stax patch_poll+1
lda #driver::send
jsr add_driver_offset
stax patch_send+1
rts
; set ethernet driver name
; inputs:
; AX: pointer to name
; outputs:
; none
set_name:
stax ptr1
ldy #18 ; sizeof(eth_driver_name)-2
: lda (ptr1),y
sta eth_name,y
dey
bpl :-
rts
; initialize one of the known ethernet adaptors
; inputs: A = adaptor specific initialisation value or 'eth_init_default'
; outputs: carry flag is set if there was an error, clear otherwise
eth_init:
sta eth_init_value
.ifdef __APPLE2__
ldax #_w5100
jsr patch_wrapper
ldax #_w5100_name
jsr set_name
jsr init_adaptor
bcc @done
.endif
ldax #_cs8900a
jsr patch_wrapper
ldax #_cs8900a_name
jsr set_name
jsr init_adaptor
bcc @done
ldax #_lan91c96
jsr patch_wrapper
ldax #_lan91c96_name
jsr set_name
jsr init_adaptor
@done:
rts
.data
; initialize the ethernet adaptor
; inputs: none
; outputs: carry flag is set if there was an error, clear otherwise
init_adaptor:
lda eth_init_value
patch_init:
jsr $ffff ; temporary vector - gets filled in later
ldx #5
patch_mac:
: lda $ffff,x ; temporary addr - gets filled in later
sta cfg_mac,x
dex
bpl :-
ldax #1518
patch_bufsize:
stax $fffe ; temporary addr - gets filled in later
rts
; receive a packet
; inputs: none
; outputs:
; if there was an error receiving the packet (or no packet was ready) then carry flag is set
; if packet was received correctly then carry flag is clear,
; eth_inp contains the received packet,
; and eth_inp_len contains the length of the packet
eth_rx:
ldax #eth_inp
patch_bufaddr_rx:
stax $fffe ; temporary addr - gets filled in later
patch_poll:
jsr $ffff ; temporary vector - gets filled in later
stax eth_inp_len
rts
; send a packet
; inputs:
; eth_outp: packet to send
; eth_outp_len: length of packet to send
; outputs:
; if there was an error sending the packet then carry flag is set
; otherwise carry flag is cleared
eth_tx:
ldax #eth_outp
patch_bufaddr_tx:
stax $fffe ; temporary addr - gets filled in later
ldax eth_outp_len
patch_send:
jmp $ffff ; temporary vector - gets filled in later
; -- LICENSE FOR ethernetcombo.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 Jonno Downes,
; jonno@jamtronix.com.
; Portions created by the Initial Developer are Copyright (C) 2009
; Jonno Downes. All Rights Reserved.
; -- LICENSE END --