1. Replaced IP65 Ethernet drivers with Contiki drivers.

* CS8900A
The Contiki driver allows to adjust the chip base addr at runtime (which  allows to support different slots in the Apple II) and removes received frames from the chip if there's no room to send frames.

* LAN91C96
The Contiki driver was used by IP65 more or less unchanged in the first place.

* W5100
The Contiki driver allows to adjust the chip base addr at runtime (which  allows to support different slots in the Apple II) and stays clear from the W5100 hybrid mode. It presumes a fully functional W5100 register auto-increment and pre-calculates necessary W5100 frame buffer wrap-arounds and thus achieves the maximal 6502 <-> W5100 transfer speed.
This commit is contained in:
Oliver Schmidt 2014-06-13 00:00:53 +02:00
parent 5c95d03c48
commit e06c02e4a3
15 changed files with 1598 additions and 2122 deletions

View File

@ -1,46 +1,68 @@
AS = ca65 # c64rrnet.lib : C64 with RR-Net or clone (default base addr: $de0x)
LD = ld65 # c64eth64.lib : C64 with ETH64 (default base addr: $de0x)
AFLAGS = # a2uther.lib : Apple ][ with Uthernet (default slot: #3)
# a2lancegs.lib : Apple ][ with LANceGS (default slot: #3)
%.o: %.c # a2uther2.lib : Apple ][ with Uthernet II (default slot: #3)
$(CC) -c $(CFLAGS) $< # vic20rrnet.lib : VIC20 with RR-Net or clone (default base addr: $980x)
%.o: %.s
$(AS) $(AFLAGS) $<
# c64rrnet.lib : C64 with RR-NET or clone at $de0x
# c64wiznet.lib : C64 with Wiznet W5100 addressed at $df2x
# a2uther.lib : Apple ][ with Uthernet in slot #3
# a2lancegs.lib : Apple ][ with LANceGS
# vic20rrnet.lib : VIC20 with RR-NET or clone at $980x
DRIVERS=\ DRIVERS=\
c64rrnet.lib \ c64rrnet.lib \
c64wiznet.lib \ c64eth64.lib \
a2uther.lib \ a2uther.lib \
a2lancegs.lib \ a2lancegs.lib \
a2uther2.lib \
vic20rrnet.lib vic20rrnet.lib
all: $(DRIVERS) all: $(DRIVERS)
c64rrnet.lib: rr-net.o cs8900a.o c64zeropage.o c64print.o c64timer.o c64kernal.o c64input.o cbmcharconv.o %.o: %.s
ca65 -D DYN_DRV=0 $<
C64OBJS=\
contiki.o \
c64zeropage.o \
c64print.o \
c64timer.o \
c64kernal.o \
c64input.o \
cbmcharconv.o
A2OBJS=\
contiki.o \
a2zeropage.o \
a2print.o \
a2timer.o \
a2kernal.o \
a2input.o \
a2charconv.o
VIC20OBJS=\
contiki.o \
vic20zeropage.o \
vic20print.o \
vic20timer.o \
vic20kernal.o \
vic20input.o \
cbmcharconv.o
c64rrnet.lib: rr-net.o cs8900a.o $(C64OBJS)
ar65 a $@ $^ ar65 a $@ $^
c64wiznet.lib: w5100.o c64zeropage.o c64print.o c64timer.o c64kernal.o c64input.o cbmcharconv.o c64eth64.lib: eth64.o lan91c96.o $(C64OBJS)
ar65 a $@ $^ ar65 a $@ $^
a2lancegs.lib: lan91c96.o a2zeropage.o a2print.o a2timer.o a2kernal.o a2input.o a2charconv.o a2uther.lib: uthernet.o cs8900a.o $(A2OBJS)
ar65 a $@ $^ ar65 a $@ $^
a2uther.lib: uthernet.o cs8900a.o a2zeropage.o a2print.o a2timer.o a2kernal.o a2input.o a2charconv.o a2lancegs.lib: lancegs.o lan91c96.o $(A2OBJS)
ar65 a $@ $^ ar65 a $@ $^
vic20rrnet.lib: vic20-rr-net.o cs8900a.o vic20zeropage.o vic20print.o vic20timer.o vic20kernal.o vic20input.o cbmcharconv.o a2uther2.lib: uthernet2.o w5100.o $(A2OBJS)
ar65 a $@ $^
vic20rrnet.lib: vic20-rr-net.o cs8900a.o $(VIC20OBJS)
ar65 a $@ $^ ar65 a $@ $^
clean: clean:
-rm -f *.o -rm -f *.o
-rm -f *.lib -rm -f *.lib
distclean: clean
-rm -f *~

96
drivers/contiki.s Normal file
View File

@ -0,0 +1,96 @@
; Contiki driver wrapper
.include "../inc/common.i"
.export eth_init
.export eth_rx
.export eth_tx
.import eth_inp
.import eth_inp_len
.import eth_outp
.import eth_outp_len
.import eth_driver_io_base
.import cfg_mac
.import eth
.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
.code
; initialize the ethernet adaptor
; inputs: none
; outputs: carry flag is set if there was an error, clear otherwise
eth_init:
ldax #1518
stax eth+driver::bufsize
ldax eth_driver_io_base
jsr eth+driver::init
ldx #5
: lda eth+driver::mac,x
sta cfg_mac,x
dex
bpl :-
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
stax eth+driver::bufaddr
jsr eth+driver::poll
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
stax eth+driver::bufaddr
ldax eth_outp_len
jmp eth+driver::send
; -- LICENSE FOR contiki.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 --

View File

@ -1,282 +1,391 @@
; Ethernet driver for CS8900A chip (as used in RR-NET and Uthernet adapters)
; ;
; Based on Doc Bacardi's tftp source ; Copyright (c) 2007, Adam Dunkels and Oliver Schmidt
; All rights reserved.
.ifndef KPR_API_VERSION_NUMBER
.define EQU =
.include "../inc/kipper_constants.i"
.endif
.include "../inc/common.i"
.include "cs8900a.i"
.export eth_init
.export eth_rx
.export eth_tx
.import eth_inp
.import eth_inp_len
.import eth_outp
.import eth_outp_len
.importzp eth_dest
.importzp eth_src
.importzp eth_type
.importzp eth_data
.import cs_init
.import cs_packet_page
.import cs_packet_data
.import cs_rxtx_data
.import cs_tx_cmd
.import cs_tx_len
.import cfg_mac
.importzp eth_packet
.import ip65_error
.macro write_page page, value
lda #page/2
ldx #<value
ldy #>value
jsr cs_write_page
.endmacro
.code
; initialize the ethernet adaptor
; inputs: none
; outputs: carry flag is set if there was an error, clear otherwise
eth_init:
jsr cs_init
lda #0 ; check magic signature
jsr cs_read_page
cpx #$0e
bne @notfound
cpy #$63
bne @notfound
lda #1
jsr cs_read_page
cpx #0
bne @notfound
; y contains chip rev
write_page pp_self_ctl, $0055 ; $0114, reset chip
write_page pp_rx_ctl, $0d05 ; $0104, accept individual and broadcast packets
lda #pp_ia/2 ; $0158, write mac address
ldx cfg_mac
ldy cfg_mac + 1
jsr cs_write_page
lda #pp_ia/2 + 1
ldx cfg_mac + 2
ldy cfg_mac + 3
jsr cs_write_page
lda #pp_ia/2 + 2
ldx cfg_mac + 4
ldy cfg_mac + 5
jsr cs_write_page
write_page pp_line_ctl, $00d3 ; $0112, enable rx and tx
clc
rts
@notfound:
sec
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:
lda #$24 ; check rx status
sta cs_packet_page
lda #$01
sta cs_packet_page + 1
lda cs_packet_data + 1
and #$0d
bne :+
sec ; no packet ready
rts
: lda cs_rxtx_data + 1 ; ignore status
lda cs_rxtx_data
lda cs_rxtx_data + 1 ; read packet length
sta eth_inp_len + 1
tax ; save
lda cs_rxtx_data
sta eth_inp_len
lda #<eth_inp ; set packet pointer
sta eth_packet
lda #>eth_inp
sta eth_packet + 1
ldy #0
cpx #0 ; < 256 bytes left?
beq @tail
@get256:
lda cs_rxtx_data
sta (eth_packet),y
iny
lda cs_rxtx_data + 1
sta (eth_packet),y
iny
bne @get256
inc eth_packet + 1
dex
bne @get256
@tail:
lda eth_inp_len ; bytes left / 2, round up
lsr
adc #0
beq @done
tax
@get:
lda cs_rxtx_data
sta (eth_packet),y
iny
lda cs_rxtx_data + 1
sta (eth_packet),y
iny
dex
bne @get
@done:
clc
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:
lda #$c9 ; ask for buffer space
sta cs_tx_cmd
lda #0
sta cs_tx_cmd + 1
lda eth_outp_len ; set length
sta cs_tx_len
lda eth_outp_len + 1
sta cs_tx_len + 1
cmp #6
bmi :+
lda #KPR_ERROR_INPUT_TOO_LARGE
sta ip65_error
sec ; oversized packet
rts
: lda #<pp_bus_status ; select bus status register
sta cs_packet_page
lda #>pp_bus_status
sta cs_packet_page + 1
@waitspace:
lda cs_packet_data + 1 ; wait for space
ldx cs_packet_data
lsr
bcs @gotspace
jsr @done ; polling too fast doesn't work, delay added by David Schmidt
jmp @waitspace
@gotspace:
ldax #eth_outp ; send packet
stax eth_packet
ldy #0
ldx eth_outp_len + 1
beq @tail
@send256:
lda (eth_packet),y
sta cs_rxtx_data
iny
lda (eth_packet),y
sta cs_rxtx_data + 1
iny
bne @send256
inc eth_packet + 1
dex
bne @send256
@tail:
ldx eth_outp_len
beq @done
@send:
lda (eth_packet),y
sta cs_rxtx_data
dex
beq @done
iny
lda (eth_packet),y
sta cs_rxtx_data + 1
iny
dex
bne @send
@done: ; also used by timeout code above
clc
rts
; read X/Y from page A * 2
cs_read_page:
asl
sta cs_packet_page
lda #0
rol
sta cs_packet_page + 1
ldx cs_packet_data
ldy cs_packet_data + 1
rts
; write X/Y to page A * 2
cs_write_page:
asl
sta cs_packet_page
lda #0
rol
sta cs_packet_page + 1
stx cs_packet_data
sty cs_packet_data + 1
rts
; -- LICENSE FOR cs8900a.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" ; Redistribution and use in source and binary forms, with or without
; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the ; modification, are permitted provided that the following conditions
; License for the specific language governing rights and limitations ; are met:
; under the License. ; 1. Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
; 3. Neither the name of the Institute nor the names of its contributors
; may be used to endorse or promote products derived from this software
; without specific prior written permission.
; ;
; The Original Code is ip65. ; THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
; ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
; SUCH DAMAGE.
; ;
; The Initial Developer of the Original Code is Per Olofsson, ; This file is part of the Contiki operating system.
; MagerValp@gmail.com. ;
; Portions created by the Initial Developer are Copyright (C) 2009 ; Author: Adam Dunkels <adam@sics.se>, Oliver Schmidt <ol.sc@web.de>
; Per Olofsson. All Rights Reserved. ;
; -- LICENSE END -- ;---------------------------------------------------------------------
.macpack module
module_header _cs8900a
; Driver signature
.byte $65, $74, $68 ; "eth"
.byte $01 ; Ethernet driver API version number
; Ethernet address
mac: .byte $00, $0E, $3A ; OUI of Cirrus Logic
.byte $11, $11, $11
; Buffer attributes
bufaddr:.res 2 ; Address
bufsize:.res 2 ; Size
; Jump table.
jmp init
jmp poll
jmp send
jmp exit
;---------------------------------------------------------------------
.if DYN_DRV
.zeropage
sp: .res 2 ; Stack pointer (Do not trash !)
reg: .res 2 ; Address of rxtxreg
ptr: .res 2 ; Indirect addressing pointer
len: .res 2 ; Frame length
cnt: .res 2 ; Frame length counter
.else
.include "zeropage.inc"
reg := ptr1 ; Address of rxtxreg
ptr := ptr2 ; Indirect addressing pointer
len := ptr3 ; Frame length
cnt := ptr4 ; Frame length counter
.endif
;---------------------------------------------------------------------
.rodata
fixup: .byte fixup02-fixup01, fixup03-fixup02, fixup04-fixup03
.byte fixup05-fixup04, fixup06-fixup05, fixup07-fixup06
.byte fixup08-fixup07, fixup09-fixup08, fixup10-fixup09
.byte fixup11-fixup10, fixup12-fixup11, fixup13-fixup12
.byte fixup14-fixup13, fixup15-fixup14, fixup16-fixup15
.byte fixup17-fixup16, fixup18-fixup17, fixup19-fixup18
.byte fixup20-fixup19, fixup21-fixup20, fixup22-fixup21
.byte fixup23-fixup22, fixup24-fixup23, fixup25-fixup24
.byte fixup26-fixup25
fixups = * - fixup
;---------------------------------------------------------------------
rxtxreg := $FF00 ; High byte patched at runtime
txcmd := $FF04 ; High byte patched at runtime
txlen := $FF06 ; High byte patched at runtime
isq := $FF08 ; High byte patched at runtime
packetpp := $FF0A ; High byte patched at runtime
ppdata := $FF0C ; High byte patched at runtime
.data
;---------------------------------------------------------------------
init:
; Save address of rxtxreg
sta reg
stx reg+1
; Start with first fixup location
lda #<(fixup01+1)
ldx #>(fixup01+1)
sta ptr
stx ptr+1
ldx #$FF
ldy #$00
; Fixup address at location
: lda reg
eor (ptr),y ; Use XOR to support C64 RR-Net
sta (ptr),y
iny
lda reg+1
sta (ptr),y
dey
; Advance to next fixup location
inx
cpx #fixups
bcs :+
lda ptr
clc
adc fixup,x
sta ptr
bcc :-
inc ptr+1
bcs :- ; Always
; Activate C64 RR clockport in order to operate RR-Net
; - RR config register overlays CS8900A ISQ register
; - No need to distinguish as ISQ access doesn't hurt
:
fixup01:lda isq+1
ora #$01 ; Set clockport bit
fixup02:sta isq+1
; Check EISA registration number of Crystal Semiconductor
; PACKETPP = $0000, PPDATA == $630E ?
lda #$00
tax
jsr packetpp_ax
lda #$63^$0E
fixup03:eor ppdata
fixup04:eor ppdata+1
beq :+
sec
rts
; Initiate a chip-wide reset
; PACKETPP = $0114, PPDATA = $0040
: lda #$14
jsr packetpp_a1
ldy #$40
fixup05:sty ppdata
: jsr packetpp_a1
fixup06:ldy ppdata
and #$40
bne :-
; Accept valid unicast + broadcast frames
; PACKETPP = $0104, PPDATA = $0D05
lda #$04
jsr packetpp_a1
lda #$05
ldx #$0D
jsr ppdata_ax
; Set MAC address
; PACKETPP = $0158, PPDATA = MAC[0], MAC[1]
; PACKETPP = $015A, PPDATA = MAC[2], MAC[3]
; PACKETPP = $015C, PPDATA = MAC[4], MAC[5]
ldy #$58
: tya
jsr packetpp_a1
lda mac-$58,y
ldx mac-$58+1,y
jsr ppdata_ax
iny
iny
cpy #$58+6
bcc :-
; Turn on transmission and reception of frames
; PACKETPP = $0112, PPDATA = $00D3
lda #$12
jsr packetpp_a1
lda #$D3
ldx #$00
jsr ppdata_ax
txa
clc
rts
;---------------------------------------------------------------------
poll:
; Check receiver event register to see if there
; are any valid unicast frames avaliable
; PACKETPP = $0124, PPDATA & $0D00 ?
lda #$24
jsr packetpp_a1
fixup07:lda ppdata+1
and #$0D
beq :+
; Process the incoming frame
; --------------------------
; Read receiver event and discard it
; RXTXREG
fixup08:ldx rxtxreg+1
fixup09:lda rxtxreg
; Read frame length
; cnt = len = RXTXREG
fixup10:ldx rxtxreg+1
fixup11:lda rxtxreg
sta len
stx len+1
sta cnt
stx cnt+1
; Adjust odd frame length
jsr adjustcnt
; Is bufsize < cnt ?
lda bufsize
cmp cnt
lda bufsize+1
sbc cnt+1
bcs :++
; Yes, skip frame
jsr skipframe
; No frame ready
lda #$00
: tax
sec
rts
; Read bytes into buffer
: jsr adjustptr
:
fixup12:lda rxtxreg
sta (ptr),y
iny
fixup13:lda rxtxreg+1
sta (ptr),y
iny
bne :-
inc ptr+1
dex
bpl :-
; Return frame length
lda len
ldx len+1
clc
rts
;---------------------------------------------------------------------
send:
; Save frame length
sta cnt
stx cnt+1
; Transmit command
lda #$C9
ldx #$00
fixup14:sta txcmd
fixup15:stx txcmd+1
lda cnt
ldx cnt+1
fixup16:sta txlen
fixup17:stx txlen+1
; Adjust odd frame length
jsr adjustcnt
; 8 retries
ldy #$08
; Check for avaliable buffer space
; PACKETPP = $0138, PPDATA & $0100 ?
: lda #$38
jsr packetpp_a1
fixup18:lda ppdata+1
and #$01
bne :+
; No space avaliable, skip a received frame
jsr skipframe
; And try again
dey
bne :-
sec
rts
; Send the frame
; --------------
; Write bytes from buffer
: jsr adjustptr
: lda (ptr),y
fixup19:sta rxtxreg
iny
lda (ptr),y
fixup20:sta rxtxreg+1
iny
bne :-
inc ptr+1
dex
bpl :-
clc
rts
;---------------------------------------------------------------------
exit:
rts
;---------------------------------------------------------------------
packetpp_a1:
ldx #$01
packetpp_ax:
fixup21:sta packetpp
fixup22:stx packetpp+1
rts
;---------------------------------------------------------------------
ppdata_ax:
fixup23:sta ppdata
fixup24:stx ppdata+1
rts
;---------------------------------------------------------------------
skipframe:
; PACKETPP = $0102, PPDATA = PPDATA | $0040
lda #$02
jsr packetpp_a1
fixup25:lda ppdata
ora #$40
fixup26:sta ppdata
rts
;---------------------------------------------------------------------
adjustcnt:
lsr
bcc :+
inc cnt
bne :+
inc cnt+1
: rts
;---------------------------------------------------------------------
adjustptr:
lda cnt
ldx cnt+1
eor #$FF ; Two's complement part 1
tay
iny ; Two's complement part 2
sty reg
sec
lda bufaddr
sbc reg
sta ptr
lda bufaddr+1
sbc #$00
sta ptr+1
rts
;---------------------------------------------------------------------

View File

@ -1,14 +1,26 @@
; originally from Per Olofsson's IP65 library - http://www.paradroid.net/ip65 ; ETH64 driver
pp_rx_ctl = $0104 .import _lan91c96
pp_line_ctl = $0112
pp_self_ctl = $0114 .export eth = _lan91c96
pp_bus_status = $0138 .export eth_driver_name
pp_ia = $0158 .export eth_driver_io_base
.rodata
eth_driver_name:
.byte "ETH64",0
.data
eth_driver_io_base:
.word $de00
; -- LICENSE FOR cs8900a.i -- ; -- LICENSE FOR eth64.s --
; The contents of this file are subject to the Mozilla Public License ; 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 ; 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 ; compliance with the License. You may obtain a copy of the License at

View File

@ -1,458 +1,427 @@
; Ethernet driver for SMC LAN91C96 chip
; ;
; Copyright (c) 2003-2007, Adam Dunkels, Josef Soucek and Oliver Schmidt
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions
; are met:
; 1. Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
; 3. Neither the name of the Institute nor the names of its contributors
; may be used to endorse or promote products derived from this software
; without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
; ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
; SUCH DAMAGE.
;
; This file is part of the Contiki operating system.
;
; Author: Adam Dunkels <adam@sics.se>, Josef Soucek <josef.soucek@ide64.org>,
; Oliver Schmidt <ol.sc@web.de>
;
;---------------------------------------------------------------------
.ifndef KPR_API_VERSION_NUMBER .macpack module
.define EQU = module_header _lan91c96
.include "../inc/kipper_constants.i"
.endif
.include "../inc/common.i" ; Driver signature
.byte $65, $74, $68 ; "eth"
.byte $01 ; Ethernet driver API version number
.export eth_init ; Ethernet address
.export eth_rx mac: .byte $00, $80, $0F ; OUI of Standard Microsystems
.export eth_tx .byte $11, $11, $11
.export eth_driver_name
.export eth_driver_io_base
.import eth_inp
.import eth_inp_len
.import eth_outp
.import eth_outp_len
.import cfg_mac ; Buffer attributes
.importzp eth_packet bufaddr:.res 2 ; Address
bufsize:.res 2 ; Size
; LANceGS hardware addresses ; Jump table.
ethbsr := $c00E ; Bank select register R/W (2B) jmp init
jmp poll
jmp send
jmp exit
;---------------------------------------------------------------------
.if DYN_DRV
.zeropage
sp: .res 2 ; Stack pointer (Do not trash !)
reg: .res 2 ; Address of register base
ptr: .res 2 ; Indirect addressing pointer
len: .res 2 ; Frame length
.else
.include "zeropage.inc"
reg := ptr1 ; Address of register base
ptr := ptr2 ; Indirect addressing pointer
len := ptr3 ; Frame length
.endif
;---------------------------------------------------------------------
.rodata
fixup: .byte fixup02-fixup01, fixup03-fixup02, fixup04-fixup03
.byte fixup05-fixup04, fixup06-fixup05, fixup07-fixup06
.byte fixup08-fixup07, fixup09-fixup08, fixup10-fixup09
.byte fixup11-fixup10, fixup12-fixup11, fixup13-fixup12
.byte fixup14-fixup13, fixup15-fixup14, fixup16-fixup15
.byte fixup17-fixup16, fixup18-fixup17, fixup19-fixup18
.byte fixup20-fixup19, fixup21-fixup20, fixup22-fixup21
.byte fixup23-fixup22, fixup24-fixup23, fixup25-fixup24
.byte fixup26-fixup25, fixup27-fixup26, fixup28-fixup27
.byte fixup29-fixup28, fixup30-fixup29, fixup31-fixup30
.byte fixup32-fixup31, fixup33-fixup32, fixup34-fixup33
.byte fixup35-fixup34, fixup36-fixup35, fixup37-fixup36
.byte fixup38-fixup37, fixup39-fixup38, fixup40-fixup39
fixups = * - fixup
;---------------------------------------------------------------------
ethbsr := $FF0E ; Bank select register R/W (2B)
; Register bank 0 ; Register bank 0
ethtcr := $c000 ; Transmission control register R/W (2B) ethtcr := $FF00 ; Transmition control register R/W (2B)
ethephsr := $c002 ; EPH status register R/O (2B) ethephsr := $FF02 ; EPH status register R/O (2B)
ethrcr := $c004 ; Receive control register R/W (2B) ethrcr := $FF04 ; Receive control register R/W (2B)
ethecr := $c006 ; Counter register R/O (2B) ethecr := $FF06 ; Counter register R/O (2B)
ethmir := $c008 ; Memory information register R/O (2B) ethmir := $FF08 ; Memory information register R/O (2B)
ethmcr := $c00A ; Memory Config. reg. +0 R/W +1 R/O (2B) ethmcr := $FF0A ; Memory Config. reg. +0 R/W +1 R/O (2B)
; Register bank 1 ; Register bank 1
ethcr := $c000 ; Configuration register R/W (2B) ethcr := $FF00 ; Configuration register R/W (2B)
ethbar := $c002 ; Base address register R/W (2B) ethbar := $FF02 ; Base address register R/W (2B)
ethiar := $c004 ; Individual address register R/W (6B) ethiar := $FF04 ; Individual address register R/W (6B)
ethgpr := $c00A ; General address register R/W (2B) ethgpr := $FF0A ; General address register R/W (2B)
ethctr := $c00C ; Control register R/W (2B) ethctr := $FF0C ; Control register R/W (2B)
; Register bank 2 ; Register bank 2
ethmmucr := $c000 ; MMU command register W/O (1B) ethmmucr := $FF00 ; MMU command register W/O (1B)
ethautotx := $c001 ; AUTO TX start register R/W (1B) ethautotx := $FF01 ; AUTO TX start register R/W (1B)
ethpnr := $c002 ; Packet number register R/W (1B) ethpnr := $FF02 ; Packet number register R/W (1B)
etharr := $c003 ; Allocation result register R/O (1B) etharr := $FF03 ; Allocation result register R/O (1B)
ethfifo := $c004 ; FIFO ports register R/O (2B) ethfifo := $FF04 ; FIFO ports register R/O (2B)
ethptr := $c006 ; Pointer register R/W (2B) ethptr := $FF06 ; Pointer register R/W (2B)
ethdata := $c008 ; Data register R/W (4B) ethdata := $FF08 ; Data register R/W (4B)
ethist := $c00C ; Interrupt status register R/O (1B) ethist := $FF0C ; Interrupt status register R/O (1B)
ethack := $c00C ; Interrupt acknowledge register W/O (1B) ethack := $FF0C ; Interrupt acknowledge register W/O (1B)
ethmsk := $c00D ; Interrupt mask register R/W (1B) ethmsk := $FF0D ; Interrupt mask register R/W (1B)
; Register bank 3 ; Register bank 3
ethmt := $c000 ; Multicast table R/W (8B) ethmt := $FF00 ; Multicast table R/W (8B)
ethmgmt := $c008 ; Management interface R/W (2B) ethmgmt := $FF08 ; Management interface R/W (2B)
ethrev := $c00A ; Revision register R/W (2B) ethrev := $FF0A ; Revision register R/W (2B)
ethercv := $c00C ; Early RCV register R/W (2B) ethercv := $FF0C ; Early RCV register R/W (2B)
.data
.data ;---------------------------------------------------------------------
; initialize the ethernet adaptor init:
; inputs: none ; Save address of register base
; outputs: carry flag is set if there was an error, clear otherwise sta reg
eth_init: stx reg+1
jsr lan_self_modify
lda #$01
fixlan00:
sta ethbsr ; Select register bank 1
fixlan01:
lda ethcr ; Read first four bytes - $31, $20, $67, $18
cmp #$31
bne lanerror
fixlan03:
lda ethbar
cmp #$67
bne lanerror
fixlan04:
lda ethbar+1
cmp #$18
bne lanerror
; we have the magic signature
; Reset ETH card ; Start with first fixup location
lda #$00 ; Bank 0 lda #<(fixup01+1)
fixlan05: ldx #>(fixup01+1)
sta ethbsr sta ptr
lda #%10000000 ; Software reset stx ptr+1
fixlan06: ldx #$FF
sta ethrcr+1 ldy #$00
ldy #$00 ; Fixup address at location
fixlan07: : lda reg
sty ethrcr ora (ptr),y
fixlan08: sta (ptr),y
sty ethrcr+1 iny
lda reg+1
sta (ptr),y
dey
; Delay ; Advance to next fixup location
: cmp ($FF,x) ; 6 cycles inx
cmp ($FF,x) ; 6 cycles cpx #fixups
iny ; 2 cycles bcs :+
bne :- ; 3 cycles lda ptr
; 17 * 256 = 4352 -> 4,4 ms clc
adc fixup,x
sta ptr
bcc :-
inc ptr+1
bcs :- ; Always
; Enable transmit and receive ; Reset ETH card
lda #%10000001 ; Enable transmit TXENA, PAD_EN : lda #$00 ; Bank 0
ldx #%00000011 ; Enable receive, strip CRC ??? fixup01:sta ethbsr
fixlan09:
sta ethtcr
fixlan10:
stx ethrcr+1
lda #$01 ; Bank 1 lda #%10000000 ; Software reset
fixlan11: fixup02:sta ethrcr+1
sta ethbsr
fixlan12: ldy #$00
lda ethcr+1 fixup03:sty ethrcr
ora #%00010000 ; No wait (IOCHRDY) fixup04:sty ethrcr+1
fixlan13:
sta ethcr+1
lda #%00001001 ; Auto release ; Delay
fixlan14: : cmp ($FF,x) ; 6 cycles
sta ethctr+1 cmp ($FF,x) ; 6 cycles
iny ; 2 cycles
bne :- ; 3 cycles
; 17 * 256 = 4352 -> 4,4 ms
; Set MAC address ; Enable transmit and receive
lda cfg_mac lda #%10000001 ; Enable transmit TXENA, PAD_EN
ldx cfg_mac + 1 ldx #%00000011 ; Enable receive, strip CRC ???
fixlan15: fixup05:sta ethtcr
sta ethiar fixup06:stx ethrcr+1
fixlan16:
stx ethiar + 1
lda cfg_mac + 2
ldx cfg_mac + 3
fixlan17:
sta ethiar + 2
fixlan18:
stx ethiar + 3
lda cfg_mac + 4
ldx cfg_mac + 5
fixlan19:
sta ethiar + 4
fixlan20:
stx ethiar + 5
; Set interrupt mask lda #$01 ; Bank 1
lda #$02 ; Bank 2 fixup07:sta ethbsr
fixlan21:
sta ethbsr
lda #%00000000 ; No interrupts ; Check ISA mode base address register for reset values
fixlan22: lda #$18^67 ; I/O base $300 + ROM $CC000
sta ethmsk fixup08:eor ethbar
clc fixup09:eor ethbar+1
rts beq :+
sec
rts
lanerror: :
sec fixup10:lda ethcr+1
rts ora #%00010000 ; No wait (IOCHRDY)
fixup11:sta ethcr+1
; receive a packet lda #%00001001 ; Auto release
; inputs: none fixup12:sta ethctr+1
; 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:
fixlan38:
lda ethist
and #%00000001 ; Check receive interrupt
bne :+
sec ; No packet available
rts
: lda #$00 ; Set MAC address
ldx #%11100000 ; Receive, Auto Increment, Read ldy #$00
fixlan39: : lda mac,y
sta ethptr fixup13:sta ethiar,y
fixlan40: iny
stx ethptr + 1 cpy #$06
bcc :-
; Last word contains 'last data byte' and $60 or 'fill byte' and $40 ; Set interrupt mask
fixlan41: lda #$02 ; Bank 2
lda ethdata ; Status word fixup14:sta ethbsr
fixlan42:
lda ethdata ; Only need high byte
; Move ODDFRM bit into carry: lda #%00000000 ; No interrupts
; - Even packet length -> carry clear -> subtract 6 bytes fixup15:sta ethmsk
; - Odd packet length -> carry set -> subtract 5 bytes tax
lsr clc
lsr rts
lsr
lsr
lsr
; The packet contains 3 extra words ;---------------------------------------------------------------------
fixlan43:
lda ethdata ; Total number of bytes
sbc #$05 ; Actually 5 or 6 depending on carry
sta eth_inp_len
fixlan44:
lda ethdata
sbc #$00
sta eth_inp_len+1
; Read bytes into buffer poll:
lda #<eth_inp fixup16:lda ethist
ldx #>eth_inp and #%00000001 ; RCV INT
sta eth_packet beq :+
stx eth_packet+1
ldx eth_inp_len+1
ldy #$00
lanread:
fixlan46:
lda ethdata
sta (eth_packet),y
iny
bne :+
inc eth_packet+1
: cpy eth_inp_len
bne lanread
dex
bpl lanread
; Remove and release RX packet from the FIFO ; Process the incoming packet
lda #%10000000 ; ---------------------------
fixlan47:
sta ethmmucr lda #$00
ldx #%11100000 ; RCV, AUTO INCR., READ
fixup17:sta ethptr
fixup18:stx ethptr+1
clc ; Last word contains 'last data byte' and $60 or 'fill byte' and $40
rts fixup19:lda ethdata ; Status word
fixup20:lda ethdata ; Need high byte only
; send a packet ; Move ODDFRM bit into carry:
; inputs: ; - Even packet length -> carry clear -> subtract 6 bytes
; eth_outp: packet to send ; - Odd packet length -> carry set -> subtract 5 bytes
; eth_outp_len: length of packet to send lsr
; outputs: lsr
; if there was an error sending the packet then carry flag is set lsr
; otherwise carry flag is cleared lsr
eth_tx: lsr
lda eth_outp_len + 1
ora #%00100000
fixlan23:
sta ethmmucr ; Allocate memory for transmission
fixlan24:
lda ethist
and #%00001000 ; Allocation interrupt
bne :+
sec
rts ; Not able to allocate; bail
: lda #%00001000 ; The packet contains 3 extra words
fixlan25: fixup21:lda ethdata ; Total number of bytes
sta ethack ; Acknowledge interrupt sbc #$05 ; Actually 5 or 6 depending on carry
sta len
fixup22:lda ethdata
sbc #$00
sta len+1
fixlan26: ; Is bufsize < len ?
lda etharr lda bufsize
fixlan27: cmp len
sta ethpnr ; Set packet number lda bufsize+1
sbc len+1
bcs :++
lda #$00 ; Yes, skip packet
ldx #%01000000 ; Auto increment ; Remove and release RX packet from the FIFO
fixlan28: lda #%10000000
sta ethptr fixup23:sta ethmmucr
fixlan29:
stx ethptr + 1
lda #$00 ; Status written by CSMA ; No packet available
fixlan30: lda #$00
sta ethdata : tax
fixlan31: sec
sta ethdata rts
lda eth_outp_len ; Read bytes into buffer
eor #$01 : jsr adjustptr
lsr :
lda eth_outp_len fixup24:lda ethdata
adc #$05 ; Actually will be 5 or 6 depending on carry sta (ptr),y
fixlan32: iny
sta ethdata bne :-
lda eth_outp_len + 1 inc ptr+1
adc #$00 dex
fixlan33: bpl :-
sta ethdata
lda #<eth_outp ; Send the packet ; Remove and release RX packet from the FIFO
ldx #>eth_outp lda #%10000000
sta eth_packet fixup25:sta ethmmucr
stx eth_packet + 1
ldx eth_outp_len + 1
ldy #$00
lanwrite:
lda (eth_packet),y
fixlan34:
sta ethdata
iny
bne :+
inc eth_packet + 1
: cpy eth_outp_len
bne lanwrite
dex
bpl lanwrite
lda eth_outp_len ; Odd packet length? ; Return packet length
lsr lda len
bcc :+ ldx len+1
clc
rts
lda #%001000000 ; Yes, Odd ;---------------------------------------------------------------------
bne fixlan36 ; Always
: lda #$00 ; No send:
fixlan35: ; Save packet length
sta ethdata ; Fill byte sta len
fixlan36: stx len+1
sta ethdata ; Control byte
lda #%11000000 ; Enqueue packet - transmit
fixlan37:
sta ethmmucr
clc ; Allocate memory for TX
rts txa
ora #%00100000
fixup26:sta ethmmucr
; ; 8 retries
; lan_self_modify - make all entry points variable so we can move the ldy #$08
; LANceGS card around in the Apple
;
lan_self_modify:
lda #$C0 ; FIXME - hardcoded to slot 4
clc ; We'll be adding later, so clear carry
; Make the accumulator contain slot number plus $80
; i.e. Slot 1 = $90
; i.e. Slot 2 = $A0
; i.e. Slot 3 = $B0
; i.e. Slot 4 = $C0
; i.e. Slot 5 = $D0
; i.e. Slot 6 = $E0
; i.e. Slot 7 = $F0
; $C0s0: Save off all ethtcr, ethcr, ethmmucr, and ethmt mods
sta fixlan01 + 1
sta fixlan09 + 1
sta fixlan23 + 1
sta fixlan37 + 1
; sta fixlan45 + 1 ; Removed
sta fixlan47 + 1
; $C0s1: Save off all ethtcr+1, ethcr+1, ethmmucr+1, and ethmt+1 mods ; Wait for allocation ready
adc #$01 :
; sta fixlan02 + 1 ; Removed fixup27:lda ethist
sta fixlan12 + 1 and #%00001000 ; ALLOC INT
sta fixlan13 + 1 bne :+
; $C0s2: Save off all ethephsr, ethbar, and ethpnr mods ; Shouldn't we do something here to actively free memory,
adc #$01 ; maybe removing and releasing an RX packet from the FIFO ???
sta fixlan03 + 1
sta fixlan27 + 1
; $C0s3: Save off all ethephsr+1, ethbar+1, ethpnr+1, and etharr mods ; And try again
adc #$01 dey
sta fixlan04 + 1 bne :-
sta fixlan26 + 1 sec
rts
; $C0s4: Save off all ethrcr, ethiar, and ethfifo mods ; Acknowledge interrupt, is it necessary ???
adc #$01 : lda #%00001000
sta fixlan07 + 1 fixup28:sta ethack
sta fixlan15 + 1
; $C0s5: Save off all ethrcr+1, ethiar+1, and ethfifo+1 mods ; Set packet address
adc #$01 fixup29:lda etharr
sta fixlan06 + 1 fixup30:sta ethpnr
sta fixlan08 + 1
sta fixlan10 + 1
sta fixlan16 + 1
; $C0s6: Save off all ethecr, ethptr, and ethiar+2 mods lda #$00
adc #$01 ldx #%01000000 ; AUTO INCR.
sta fixlan17 + 1 fixup31:sta ethptr
sta fixlan28 + 1 fixup32:stx ethptr+1
sta fixlan39 + 1
; $C0s7: Save off all ethecr+1, ethptr+1, and ethiar+3 mods ; Status written by CSMA
adc #$01 lda #$00
sta fixlan18 + 1 fixup33:sta ethdata
sta fixlan29 + 1 fixup34:sta ethdata
sta fixlan40 + 1
; $C0s8: Save off all ethmir, ethdata, ethmgmt, and ethiar+4 mods ; Check packet length parity:
adc #$01 ; - Even packet length -> carry set -> add 6 bytes
sta fixlan19 + 1 ; - Odd packet length -> carry clear -> add 5 bytes
sta fixlan30 + 1 lda len
sta fixlan31 + 1 eor #$01
sta fixlan32 + 1 lsr
sta fixlan33 + 1
sta fixlan34 + 1 ; The packet contains 3 extra words
sta fixlan35 + 1 lda len
sta fixlan36 + 1 adc #$05 ; Actually 5 or 6 depending on carry
sta fixlan41 + 1 fixup35:sta ethdata
sta fixlan42 + 1 lda len+1
sta fixlan43 + 1 adc #$00
sta fixlan44 + 1 fixup36:sta ethdata
sta fixlan46 + 1
; $C0s9: Save off all ethmir+1, ethdata+1, ethmgmt+1, and ethiar+5 mods ; Send the packet
adc #$01 ; ---------------
sta fixlan20 + 1
; $C0sA: Save off all ethmcr, ethgpr, and ethrev mods ; Write bytes from buffer
; $C0sB: Save off all ethmcr+1, ethgpr+1, and ethrev+1 mods jsr adjustptr
; None : lda (ptr),y
fixup37:sta ethdata
iny
bne :-
inc ptr+1
dex
bpl :-
; $C0sC: Save off all ethctr, ethist, ethack, and ethercv mods ; Odd packet length ?
adc #$03 ; Because there were no a or b mods lda len
sta fixlan24 + 1 lsr
sta fixlan25 + 1 bcc :+
sta fixlan38 + 1
; $C0sD: Save off all ethmsk, ethctr+1 mods ; Yes
adc #$01 lda #%00100000 ; ODD
sta fixlan14 + 1 bne :++ ; Always
sta fixlan22 + 1
; $C0sE: Save off all ethbsr mods ; No
adc #$01 : lda #$00
sta fixlan00 + 1 fixup38:sta ethdata ; Fill byte
sta fixlan05 + 1 :
sta fixlan11 + 1 fixup39:sta ethdata ; Control byte
sta fixlan21 + 1
rts
; Add packet to FIFO
lda #%11000000 ; ENQUEUE PACKET - transmit packet
fixup40:sta ethmmucr
clc
rts
.rodata ;---------------------------------------------------------------------
eth_driver_name: exit:
.asciiz "LANceGS (91C96)" rts
eth_driver_io_base = fixlan01+1 ;---------------------------------------------------------------------
adjustptr:
lda len
ldx len+1
eor #$FF ; Two's complement part 1
tay
iny ; Two's complement part 2
sty reg
sec
lda bufaddr
sbc reg
sta ptr
lda bufaddr+1
sbc #$00
sta ptr+1
rts
;---------------------------------------------------------------------
; 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 David Schmidt
; Portions created by the Initial Developer is Copyright (C) 2011
; All Rights Reserved.
; -- LICENSE END --

40
drivers/lancegs.s Normal file
View File

@ -0,0 +1,40 @@
; LANceGS driver
.import _lan91c96
.export eth = _lan91c96
.export eth_driver_name
.export eth_driver_io_base
.rodata
eth_driver_name:
.byte "LANceGS",0
.data
eth_driver_io_base:
.word $c0b0
; -- LICENSE FOR lancegs.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 --

View File

@ -1,47 +1,22 @@
; RR-Net driver ; RR-Net driver
.export cs_init .import _cs8900a
.export cs_packet_page .export eth = _cs8900a
.export cs_packet_data
.export cs_rxtx_data
.export cs_tx_cmd
.export cs_tx_len
.export eth_driver_name .export eth_driver_name
.export eth_driver_io_base .export eth_driver_io_base
IO_BASE = $de00
rr_ctl = IO_BASE+$01 ; address of 'control' port on Retro-Replay
cs_packet_page = IO_BASE+$02 ; address of 'packet page' port on RR-Net
cs_packet_data = IO_BASE+$04 ; address of 'packet data' port on RR-Net
cs_rxtx_data = IO_BASE+$08 ; address of 'recieve/transmit data' port on RR-Net
cs_tx_cmd = IO_BASE+$0c ; address of 'transmit command' port on RR-Net
cs_tx_len = IO_BASE+$0e ; address of 'transmission length' port on RR-Net
.code
; initialise Retro Replay so we can access the network adapter
; inputs: none
; outputs: none
cs_init:
lda rr_ctl
ora #1
sta rr_ctl
rts
.rodata .rodata
eth_driver_name: eth_driver_name:
.if IO_BASE=$de00 .byte "RR-Net",0
.byte "RR-NET",0
.else
.byte "64NIC+",0 .data
.endif
eth_driver_io_base: eth_driver_io_base:
.word IO_BASE .word $de08

View File

@ -1,35 +1,22 @@
; uthernet driver ; Uthernet driver
; currently hardcoded to use slot 3 addresses only
.export cs_init .import _cs8900a
.export cs_packet_page .export eth = _cs8900a
.export cs_packet_data
.export cs_rxtx_data
.export cs_tx_cmd
.export cs_tx_len
.export eth_driver_name .export eth_driver_name
.export eth_driver_io_base .export eth_driver_io_base
cs_rxtx_data = $c0b0 ; address of 'recieve/transmit data' port on Uthernet
cs_tx_cmd = $c0b4 ; address of 'transmit command' port on Uthernet
cs_tx_len = $c0b6 ; address of 'transmission length' port on Uthernet
cs_packet_page = $c0ba ; address of 'packet page' port on Uthernet
cs_packet_data = $c0bc ; address of 'packet data' port on Uthernet
.code
cs_init:
rts
.rodata .rodata
eth_driver_name: eth_driver_name:
.byte "UTHERNET",0 .byte "Uthernet",0
.data
eth_driver_io_base: eth_driver_io_base:
.word cs_rxtx_data .word $c0b0

40
drivers/uthernet2.s Normal file
View File

@ -0,0 +1,40 @@
; Uthernet II driver
.import _w5100
.export eth = _w5100
.export eth_driver_name
.export eth_driver_io_base
.rodata
eth_driver_name:
.byte "Uthernet II",0
.data
eth_driver_io_base:
.word $c0b4
; -- LICENSE FOR uthernet2.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 --

View File

@ -1,41 +1,22 @@
; RR-Net driver, as seen on a VIC-20 (i.e. using a Masquerade adapter) ; RR-Net driver, as seen on a VIC-20 (i.e. using a Masquerade adapter)
.export cs_init .import _cs8900a
.export cs_packet_page .export eth = _cs8900a
.export cs_packet_data
.export cs_rxtx_data
.export cs_tx_cmd
.export cs_tx_len
.export eth_driver_name .export eth_driver_name
.export eth_driver_io_base .export eth_driver_io_base
rr_ctl = $9801 ; address of 'control' port on Retro-Replay
cs_packet_page = $9802 ; address of 'packet page' port on RR-Net
cs_packet_data = $9804 ; address of 'packet data' port on RR-Net
cs_rxtx_data = $9808 ; address of 'recieve/transmit data' port on RR-Net
cs_tx_cmd = $980c ; address of 'transmit command' port on RR-Net
cs_tx_len = $980e ; address of 'transmission length' port on RR-Net
.code
; initialise Retro Replay so we can access the network adapter
; inputs: none
; outputs: none
cs_init:
lda rr_ctl
ora #1
sta rr_ctl
rts
.rodata .rodata
eth_driver_name: eth_driver_name:
.asciiz "VIC20 RR-NET" .asciiz "VIC20 RR-Net"
.data
eth_driver_io_base: eth_driver_io_base:
.word rr_ctl-1 .word $9808

View File

@ -1,226 +0,0 @@
; Common Registers
W5100_MR = $0000 ; Mode Register
W5100_GAR0 = $0001 ; Gateway Address Byte 0
W5100_GAR1 = $0002 ; Gateway Address Byte 1
W5100_GAR2 = $0003 ; Gateway Address Byte 2
W5100_GAR3 = $0004 ; Gateway Address Byte 3
W5100_SUBR0 = $0005 ; Subnet Mask Address 0
W5100_SUBR1 = $0006 ; Subnet Mask Address 1
W5100_SUBR2 = $0007 ; Subnet Mask Address 2
W5100_SUBR3 = $0008 ; Subnet Mask Address 3
W5100_SHAR0 = $0009 ; Local MAC Address 0
W5100_SHAR1 = $000A ; Local MAC Address 1
W5100_SHAR2 = $000B ; Local MAC Address 2
W5100_SHAR3 = $000C ; Local MAC Address 3
W5100_SHAR4 = $000D ; Local MAC Address 4
W5100_SHAR5 = $000E ; Local MAC Address 5
W5100_SIPR0 = $000F ; Source IP Address 0
W5100_SIPR1 = $0010 ; Source IP Address 0
W5100_SIPR2 = $0011 ; Source IP Address 0
W5100_SIPR3 = $0012 ; Source IP Address 0
W5100_IR = $0015 ; Interrupt
W5100_IMR = $0016 ; Interrupt Mask
W5100_RTR0 = $0017 ; Retry Time High Byte
W5100_RTR1 = $0018 ; Retry Time Low Byte
W5100_RCR = $0019 ; Retry Count
W5100_RMSR = $001A ; RX Memory Size (per socket)
W5100_TMSR = $001B ; TX Memory Size (per socket)
W5100_PATR0 = $001C ; PPPoE Auth Type High
W5100_PART1 = $001D ; PPPoE Auth Type Low
W5100_PTIMER = $0028 ; PPP LCP Request Timer
W5100_PMAGIC = $0029 ; PPP LCP Magic Number
W5100_UIPR0 = $002A ; Unreachable IP Address 0
W5100_UIPR1 = $002B ; Unreachable IP Address 1
W5100_UIPR2 = $002C ; Unreachable IP Address 2
W5100_UIPR3 = $002D ; Unreachable IP Address 3
W5100_UPORT0 = $002E ; Unreachable Port High
W5100_UPORT1 = $002F ; Unreachable Port Low
; Socket Registers
W5100_S0_BASE = $0400 ; Base for socket 0
W5100_S0_MR = $0400 ; Socket 0 Mode
W5100_S0_CR = $0401 ; Socket 0 Command
W5100_S0_IR = $0402 ; Socket 0 Interrupt
W5100_S0_SR = $0403 ; Socket 0 Status
W5100_S0_PORT0 = $0404 ; Socket 0 Source Port High
W5100_S0_PORT1 = $0405 ; Socket 0 Source Port Low
W5100_S0_DHAR0 = $0406 ; Socket 0 Dest Mac 0
W5100_S0_DHAR1 = $0407 ; Socket 0 Dest Mac 1
W5100_S0_DHAR2 = $0408 ; Socket 0 Dest Mac 2
W5100_S0_DHAR3 = $0409 ; Socket 0 Dest Mac 3
W5100_S0_DHAR4 = $040A ; Socket 0 Dest Mac 4
W5100_S0_DHAR5 = $040B ; Socket 0 Dest Mac 5
W5100_S0_DIPR0 = $040C ; Socket 0 Dest IP 0
W5100_S0_DIPR1 = $040D ; Socket 0 Dest IP 1
W5100_S0_DIPR2 = $040E ; Socket 0 Dest IP 2
W5100_S0_DIPR3 = $040F ; Socket 0 Dest IP 3
W5100_S0_DPORT0 = $0410 ; Socket 0 Dest Port High
W5100_S0_DPORT1 = $0411 ; Socket 0 Dest Port Low
W5100_S0_MSSR0 = $0412 ; Socket 0 Max Segment High
W5100_S0_MSSR1 = $0413 ; Socket 0 Max Segment Low
W5100_S0_PROTO = $0414 ; Socket 0 Protocol (Raw Mode)
W5100_S0_TOS = $0415 ; Socket 0 IP TOS
W5100_S0_TTL = $0416 ; Socket 0 IP TTL
W5100_S0_TX_FSR0 = $0420 ; Socket 0 TX Free Size High
W5100_S0_TX_FSR1 = $0421 ; Socket 0 TX Free Size Low
W5100_S0_TX_RD0 = $0422 ; Socket 0 TX Read Pointer High
W5100_S0_TX_RD1 = $0423 ; Socket 0 TX Read Pointer Low
W5100_S0_TX_WR0 = $0424 ; Socket 0 TX Write Pointer High
W5100_S0_TX_WR1 = $0425 ; Socket 0 TX Write Pointer Low
W5100_S0_RX_RSR0 = $0426 ; Socket 0 RX Received Size High
W5100_S0_RX_RSR1 = $0427 ; Socket 0 RX Received Size Low
W5100_S0_RX_RD0 = $0428 ; Socket 0 RX Read Pointer High
W5100_S0_RX_RD1 = $0429 ; Socket 0 RX Read Pointer Low
W5100_S1_BASE = $0500 ; Base for socket 1
W5100_S1_MR = $0500 ; Socket 1 Mode
W5100_S1_CR = $0501 ; Socket 1 Command
W5100_S1_IR = $0502 ; Socket 1 Interrupt
W5100_S1_SR = $0503 ; Socket 1 Status
W5100_S1_PORT0 = $0504 ; Socket 1 Source Port High
W5100_S1_PORT1 = $0505 ; Socket 1 Source Port Low
W5100_S1_DHAR0 = $0506 ; Socket 1 Dest Mac 0
W5100_S1_DHAR1 = $0507 ; Socket 1 Dest Mac 1
W5100_S1_DHAR2 = $0508 ; Socket 1 Dest Mac 2
W5100_S1_DHAR3 = $0509 ; Socket 1 Dest Mac 3
W5100_S1_DHAR4 = $050A ; Socket 1 Dest Mac 4
W5100_S1_DHAR5 = $050B ; Socket 1 Dest Mac 5
W5100_S1_DIPR0 = $050C ; Socket 1 Dest IP 0
W5100_S1_DIPR1 = $050D ; Socket 1 Dest IP 1
W5100_S1_DIPR2 = $050E ; Socket 1 Dest IP 2
W5100_S1_DIPR3 = $050F ; Socket 1 Dest IP 3
W5100_S1_DPORT0 = $0510 ; Socket 1 Dest Port High
W5100_S1_DPORT1 = $0511 ; Socket 1 Dest Port Low
W5100_S1_MSSR0 = $0512 ; Socket 1 Max Segment High
W5100_S1_MSSR1 = $0513 ; Socket 1 Max Segment Low
W5100_S1_PROTO = $0514 ; Socket 1 Protocol (Raw Mode)
W5100_S1_TOS = $0515 ; Socket 1 IP TOS
W5100_S1_TTL = $0516 ; Socket 1 IP TTL
W5100_S1_TX_FSR0 = $0520 ; Socket 1 TX Free Size High
W5100_S1_TX_FSR1 = $0521 ; Socket 1 TX Free Size Low
W5100_S1_TX_RD0 = $0522 ; Socket 1 TX Read Pointer High
W5100_S1_TX_RD1 = $0523 ; Socket 1 TX Read Pointer Low
W5100_S1_TX_WR0 = $0524 ; Socket 1 TX Write Pointer High
W5100_S1_TX_WR1 = $0525 ; Socket 1 TX Write Pointer Low
W5100_S1_RX_RSR0 = $0526 ; Socket 1 RX Received Size High
W5100_S1_RX_RSR1 = $0527 ; Socket 1 RX Received Size Low
W5100_S1_RX_RD0 = $0528 ; Socket 1 RX Read Pointer High
W5100_S1_RX_RD1 = $0529 ; Socket 1 RX Read Pointer Low
W5100_S2_BASE = $0600 ; Base for socket 2
W5100_S2_MR = $0600 ; Socket 2 Mode
W5100_S2_CR = $0601 ; Socket 2 Command
W5100_S2_IR = $0602 ; Socket 2 Interrupt
W5100_S2_SR = $0603 ; Socket 2 Status
W5100_S2_PORT0 = $0604 ; Socket 2 Source Port High
W5100_S2_PORT1 = $0605 ; Socket 2 Source Port Low
W5100_S2_DHAR0 = $0606 ; Socket 2 Dest Mac 0
W5100_S2_DHAR1 = $0607 ; Socket 2 Dest Mac 1
W5100_S2_DHAR2 = $0608 ; Socket 2 Dest Mac 2
W5100_S2_DHAR3 = $0609 ; Socket 2 Dest Mac 3
W5100_S2_DHAR4 = $060A ; Socket 2 Dest Mac 4
W5100_S2_DHAR5 = $060B ; Socket 2 Dest Mac 5
W5100_S2_DIPR0 = $060C ; Socket 2 Dest IP 0
W5100_S2_DIPR1 = $060D ; Socket 2 Dest IP 1
W5100_S2_DIPR2 = $060E ; Socket 2 Dest IP 2
W5100_S2_DIPR3 = $060F ; Socket 2 Dest IP 3
W5100_S2_DPORT0 = $0610 ; Socket 2 Dest Port High
W5100_S2_DPORT1 = $0611 ; Socket 2 Dest Port Low
W5100_S2_MSSR0 = $0612 ; Socket 2 Max Segment High
W5100_S2_MSSR1 = $0613 ; Socket 2 Max Segment Low
W5100_S2_PROTO = $0614 ; Socket 2 Protocol (Raw Mode)
W5100_S2_TOS = $0615 ; Socket 2 IP TOS
W5100_S2_TTL = $0616 ; Socket 2 IP TTL
W5100_S2_TX_FSR0 = $0620 ; Socket 2 TX Free Size High
W5100_S2_TX_FSR1 = $0621 ; Socket 2 TX Free Size Low
W5100_S2_TX_RD0 = $0622 ; Socket 2 TX Read Pointer High
W5100_S2_TX_RD1 = $0623 ; Socket 2 TX Read Pointer Low
W5100_S2_TX_WR0 = $0624 ; Socket 2 TX Write Pointer High
W5100_S2_TX_WR1 = $0625 ; Socket 2 TX Write Pointer Low
W5100_S2_RX_RSR0 = $0626 ; Socket 2 RX Received Size High
W5100_S2_RX_RSR1 = $0627 ; Socket 2 RX Received Size Low
W5100_S2_RX_RD0 = $0628 ; Socket 2 RX Read Pointer High
W5100_S2_RX_RD1 = $0629 ; Socket 2 RX Read Pointer Low
W5100_S3_BASE = $0700 ; Base for socket 3
W5100_S3_MR = $0700 ; Socket 3 Mode
W5100_S3_CR = $0701 ; Socket 3 Command
W5100_S3_IR = $0702 ; Socket 3 Interrupt
W5100_S3_SR = $0703 ; Socket 3 Status
W5100_S3_PORT0 = $0704 ; Socket 3 Source Port High
W5100_S3_PORT1 = $0705 ; Socket 3 Source Port Low
W5100_S3_DHAR0 = $0706 ; Socket 3 Dest Mac 0
W5100_S3_DHAR1 = $0707 ; Socket 3 Dest Mac 1
W5100_S3_DHAR2 = $0708 ; Socket 3 Dest Mac 2
W5100_S3_DHAR3 = $0709 ; Socket 3 Dest Mac 3
W5100_S3_DHAR4 = $070A ; Socket 3 Dest Mac 4
W5100_S3_DHAR5 = $070B ; Socket 3 Dest Mac 5
W5100_S3_DIPR0 = $070C ; Socket 3 Dest IP 0
W5100_S3_DIPR1 = $070D ; Socket 3 Dest IP 1
W5100_S3_DIPR2 = $070E ; Socket 3 Dest IP 2
W5100_S3_DIPR3 = $070F ; Socket 3 Dest IP 3
W5100_S3_DPORT0 = $0710 ; Socket 3 Dest Port High
W5100_S3_DPORT1 = $0711 ; Socket 3 Dest Port Low
W5100_S3_MSSR0 = $0712 ; Socket 3 Max Segment High
W5100_S3_MSSR1 = $0713 ; Socket 3 Max Segment Low
W5100_S3_PROTO = $0714 ; Socket 3 Protocol (Raw Mode)
W5100_S3_TOS = $0715 ; Socket 3 IP TOS
W5100_S3_TTL = $0716 ; Socket 3 IP TTL
W5100_S3_TX_FSR0 = $0720 ; Socket 3 TX Free Size High
W5100_S3_TX_FSR1 = $0721 ; Socket 3 TX Free Size Low
W5100_S3_TX_RD0 = $0722 ; Socket 3 TX Read Pointer High
W5100_S3_TX_RD1 = $0723 ; Socket 3 TX Read Pointer Low
W5100_S3_TX_WR0 = $0724 ; Socket 3 TX Write Pointer High
W5100_S3_TX_WR1 = $0725 ; Socket 3 TX Write Pointer Low
W5100_S3_RX_RSR0 = $0726 ; Socket 3 RX Received Size High
W5100_S3_RX_RSR1 = $0727 ; Socket 3 RX Received Size Low
W5100_S3_RX_RD0 = $0728 ; Socket 3 RX Read Pointer High
W5100_S3_RX_RD1 = $0729 ; Socket 3 RX Read Pointer Low
; Commands
W5100_CMD_OPEN = $01
W5100_CMD_LISTEN = $02
W5100_CMD_CONNECT = $04
W5100_CMD_DISCONNECT = $08
W5100_CMD_CLOSE = $10
W5100_CMD_SEND = $20
W5100_CMD_SEND_MAC = $21
W5100_CMD_SEND_KEEP = $22
W5100_CMD_RECV = $40
; Modes
W5100_MODE_CLOSED = $00
W5100_MODE_TCP = $01
W5100_MODE_UDP = $02
W5100_MODE_IP_RAW = $03
W5100_MODE_MAC_RAW = $04
W5100_MODE_PPPOE = $05
; Status
W5100_STATUS_SOCK_CLOSED = $00
W5100_STATUS_SOCK_INIT = $13
W5100_STATUS_SOCK_LISTEN = $14
W5100_STATUS_SOCK_SYNSENT = $15
W5100_STATUS_SOCK_SYNRECV = $16
W5100_STATUS_SOCK_ESTABLISHED = $17
W5100_STATUS_SOCK_FIN_WAIT = $18
W5100_STATUS_SOCK_CLOSING = $1A
W5100_STATUS_SOCK_TIME_WAIT = $1B
W5100_STATUS_SOCK_CLOSE_WAIT = $1C
W5100_STATUS_SOCK_LAST_ACK = $1D
W5100_STATUS_SOCK_UDP = $22
W5100_STATUS_SOCK_IPRAW = $32
W5100_STATUS_SOCK_MACRAW = $42
W5100_STATUS_SOCK_PPPOE = $5F

File diff suppressed because it is too large Load Diff

View File

@ -1,66 +1,45 @@
AS=ca65
LD=ld65
AFLAGS=
# ip65.lib : minimal IP stack (UDP only) # ip65.lib : minimal IP stack (UDP only)
# ip65_tcp.lib : full featured TCP/IP stack # ip65_tcp.lib : full featured TCP/IP stack
# ip65_wiznet.lib : hybrid stack for use with the w5100 chip : UDP,ICMP & ARP is done on host, TCP is on w5100
%.o: %.c all: ip65.lib ip65_tcp.lib
$(CC) -c $(CFLAGS) $<
%.o: %.s %.o: %.s
$(AS) $(AFLAGS) $< ca65 $<
ETHOBJS=\ %_tcp.o: %.s
copymem.o \ ca65 -DTCP -o $@ $<
config.o \
timer.o \ IP65OBJS=\
eth.o \ arithmetic.o\
arp.o \ arp.o \
ip65.o \ cifs.o \
printf.o \ config.o \
copymem.o \
debug.o \ debug.o \
http.o \
httpd.o \
dhcp.o \ dhcp.o \
dns.o \ dns.o \
dottedquad.o \ dottedquad.o \
output_buffer.o\ eth.o \
http.o \
httpd.o \
ip65.o \
tftp.o \ tftp.o \
timer.o \
output_buffer.o\
parser.o \ parser.o \
printf.o \
sntp.o \
string_utils.o \ string_utils.o \
telnet.o \ telnet.o \
url.o \ udp.o \
arithmetic.o\ url.o
ip.o \
sntp.o \
icmp.o \
cifs.o \
udp.o
all: ip65.lib ip65_tcp.lib ip65_wiznet.lib ip65.lib: $(IP65OBJS) ip.o icmp.o
ar65 a $@ $^
ip65.lib: $(ETHOBJS) ip65_tcp.lib: $(IP65OBJS) ip_tcp.o icmp_tcp.o tcp.o
$(AS) $(AFLAGS) ip.s ar65 a $@ $^
$(AS) $(AFLAGS) icmp.s
ar65 a ip65.lib $(ETHOBJS)
ip65_tcp.lib: tcp.o $(ETHOBJS) tcp.s
$(AS) $(AFLAGS) ip.s -DTCP
$(AS) $(AFLAGS) icmp.s -DTCP
ar65 a ip65_tcp.lib $(ETHOBJS) tcp.o
ip65_wiznet.lib: $(ETHOBJS)
$(AS) $(AFLAGS) ip.s
$(AS) $(AFLAGS) icmp.s -DTCP
ar65 a ip65_wiznet.lib $(ETHOBJS)
clean: clean:
-rm -f *.o -rm -f *.o
-rm -f ip65.lib -rm -f *.lib
-rm -f ip65_tcp.lib
-rm -f ip65_wiznet.lib
distclean: clean
-rm -f *~

View File

@ -8,13 +8,10 @@
.export cfg_netmask .export cfg_netmask
.export cfg_gateway .export cfg_gateway
.export cfg_dns .export cfg_dns
.export cfg_tftp_server
.export cfg_get_configuration_ptr
.export dhcp_server .export dhcp_server
.import copymem .export cfg_tftp_server
.importzp copy_src
.importzp copy_dest .export cfg_get_configuration_ptr
.data .data

View File

@ -7,106 +7,78 @@
# Build for WIZnet W5100 based devices: # Build for WIZnet W5100 based devices:
# make eth=wn # make eth=wn
CC = cl65
AS = ca65
LD = ld65
CFLAGS = -Oirs -t $(TARGET)
AFLAGS =
ifeq ($(eth),sm) ifeq ($(eth),sm)
C64DRIVERLIB = ../drivers/c64eth64.lib
A2DRIVERLIB = ../drivers/a2lancegs.lib A2DRIVERLIB = ../drivers/a2lancegs.lib
else ifeq ($(eth),wn) else ifeq ($(eth),wn)
A2DRIVERLIB = ../drivers/a2uther2.lib
else else
C64DRIVERLIB = ../drivers/c64rrnet.lib C64DRIVERLIB = ../drivers/c64rrnet.lib
A2DRIVERLIB = ../drivers/a2uther.lib A2DRIVERLIB = ../drivers/a2uther.lib
VICDRIVERLIB = ../drivers/vic20rrnet.lib VICDRIVERLIB = ../drivers/vic20rrnet.lib
endif endif
IP65LIB = ../ip65/ip65.lib UDP =\
IP65TCPLIB = ../ip65/ip65_tcp.lib dns \
dottedquad \
parsequerystring \
sntp \
tftp
INCFILES = \ TCP =\
../inc/common.i\ cifs \
../inc/commonprint.i\ geturl \
../inc/net.i\ httpd \
parser \
ping \
tcp
all: prg bin all: $(UDP) $(TCP)
.PHONY: $(UDP) $(TCP)
prg: \ $(addsuffix .prg,$(UDP)): IP65LIB = ../ip65/ip65.lib
ip65 \ $(addsuffix .prg,$(TCP)): IP65LIB = ../ip65/ip65_tcp.lib
drivers \
cifs_tcp.prg \
dns.prg \
dottedquad.prg \
geturl_tcp.prg \
httpd_tcp.prg \
parsequerystring.prg \
parser_tcp.prg \
ping_tcp.prg \
sntp.prg \
tcp_tcp.prg \
tftp.prg
bin: \ $(addsuffix .bin,$(UDP)): IP65LIB = ../ip65/ip65.lib
ip65 \ $(addsuffix .bin,$(TCP)): IP65LIB = ../ip65/ip65_tcp.lib
drivers \
cifs_tcp.bin \
dns.bin \
dottedquad.bin \
geturl_tcp.bin \
httpd_tcp.bin \
parsequerystring.bin \
parser_tcp.bin \
ping_tcp.bin \
sntp.bin \
tcp_tcp.bin \
tftp.bin
vicprg: \ $(addsuffix .vicprg,$(UDP)): IP65LIB = ../ip65/ip65.lib
ip65 \ $(addsuffix .vicprg,$(TCP)): IP65LIB = ../ip65/ip65_tcp.lib
drivers \
cifs_tcp.vicprg \
dns.vicprg \
dottedquad.vicprg \
geturl_tcp.vicprg \
httpd_tcp.vicprg \
parsequerystring.vicprg \
parser_tcp.vicprg \
ping_tcp.vicprg \
sntp.vicprg \
tcp_tcp.vicprg \
tftp.vicprg
ip65: $(foreach pgm,$(UDP) $(TCP),$(eval $(pgm): $(pgm).prg $(pgm).bin $(pgm).vicprg))
make -C ../ip65 all
drivers: INCFILES =\
make -C ../drivers all ../inc/common.i \
../inc/commonprint.i \
../inc/net.i
prg: $(addsuffix .prg,$(UDP) $(TCP))
bin: $(addsuffix .bin,$(UDP) $(TCP))
vicprg: $(addsuffix .vicprg,$(UDP) $(TCP))
d64: ip65.d64 d64: ip65.d64
dsk: ip65.dsk dsk: ip65.dsk
ip65:
make -C ../ip65
drivers:
make -C ../drivers
%.o: %.s %.o: %.s
$(AS) $(AFLAGS) $< ca65 $<
%.prg: %.o $(IP65LIB) $(C64DRIVERLIB) $(INCFILES) %.prg: %.o ip65 drivers $(INCFILES)
$(LD) -o $*.prg -t c64 -m $*.c64.map -vm $< $(IP65LIB) $(C64DRIVERLIB) c64.lib ld65 -o $*.prg -C c64.cfg -m $*.c64.map -vm $< $(IP65LIB) $(C64DRIVERLIB) c64.lib
%_tcp.prg: %.o $(IP65TCPLIB) $(C64DRIVERLIB) $(INCFILES) %.bin: %.o ip65 drivers $(INCFILES)
$(LD) -o $(subst _tcp,,$*).prg -t c64 -m $(subst _tcp,,$*).c64.map -vm $< $(IP65TCPLIB) $(C64DRIVERLIB) c64.lib ld65 -o $*.bin -C apple2.cfg -m $*.a2.map -vm $< $(IP65LIB) $(A2DRIVERLIB) apple2.lib
%.bin: %.o $(IP65LIB) $(A2DRIVERLIB) $(INCFILES) %.vicprg: %.o ip65 drivers $(INCFILES)
$(LD) -o $*.bin -t apple2 -m $*.a2.map -vm $< $(IP65LIB) $(A2DRIVERLIB) apple2.lib ld65 -o $*.vicprg -C vic20-32k.cfg -m $*.vic.map -vm $< $(IP65LIB) $(VICDRIVERLIB) vic20.lib
%_tcp.bin: %.o $(IP65TCPLIB) $(A2DRIVERLIB) $(INCFILES)
$(LD) -o $(subst _tcp,,$*).bin -t apple2 -m $(subst _tcp,,$*).a2.map -vm $< $(IP65TCPLIB) $(A2DRIVERLIB) apple2.lib
%.vicprg: %.o $(IP65LIB) $(VICDRIVERLIB) $(INCFILES)
$(LD) -o $*.vicprg -C vic20-32k.cfg -m $*.vic.map -vm $< $(IP65LIB) $(VICDRIVERLIB) vic20.lib
%_tcp.vicprg: %.o $(IP65TCPLIB) $(VICDRIVERLIB) $(INCFILES)
$(LD) -o $(subst _tcp,,$*).vicprg -C vic20-32k.cfg -m $(subst _tcp,,$*).vic.map -vm $< $(IP65TCPLIB) $(VICDRIVERLIB) vic20.lib
ip65.d64: prg ip65.d64: prg
$(C1541) -format ip65,00 d64 $@ $(C1541) -format ip65,00 d64 $@
@ -133,8 +105,7 @@ ip65.dsk: bin
java -jar $(AC) -cc65 $@ tftp bin 0 < tftp.bin java -jar $(AC) -cc65 $@ tftp bin 0 < tftp.bin
clean: clean:
-rm -f *.o *.prg *.bin *.vicprg *.map make -C ../ip65 clean
make -C ../drivers clean
-rm -f *.prg *.bin *.vicprg *.map
-rm -f ip65.d64 ip65.dsk -rm -f ip65.d64 ip65.dsk
distclean: clean
-rm -f *~