From 9cdc6da040a7a1a50e5787b9f7d6946bcd43acb2 Mon Sep 17 00:00:00 2001
From: Oliver Schmidt
Date: Tue, 3 Dec 2013 21:31:43 +0100
Subject: [PATCH] Avoid access to the address register during auto-increment.
It cannot be ruled out that access to the address register triggers
an address auto-increment. Therefore a temporary address register
shadow is introduced to replace the access to the address regsiter.
Additionally there are several minor beautifications.
---
cpu/6502/net/w5100.S | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/cpu/6502/net/w5100.S b/cpu/6502/net/w5100.S
index 78335e364..2f5bb8ae7 100644
--- a/cpu/6502/net/w5100.S
+++ b/cpu/6502/net/w5100.S
@@ -79,7 +79,7 @@ fixup: .byte fixup02-fixup01, fixup03-fixup02, fixup04-fixup03
.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
+ .byte fixup26-fixup25
fixups = * - fixup
@@ -181,7 +181,7 @@ fixup09:lda data
: tax
rts
- ; Socket RX Received Size Register: != 0 ?
+ ; Socket 0 RX Received Size Register: != 0 ?
: ldy #$26 ; Socket RX Received Size Register
jsr set_addrsocket0
fixup10:lda data ; Hibyte
@@ -199,9 +199,13 @@ fixup11:ora data ; Lobyte
; ldy #$28 ; Socket RX Read Pointer Register
; jsr set_addrsocket0
- ; Calculate and set pyhsical address
+ ; Calculate and set physical address
jsr set_addrphysical
+ ; Move physical address shadow to $F000-$FFFF
+ ora #>$F000
+ tax
+
; Read MAC raw 2byte packet size header
jsr get_datacheckaddr ; Hibyte
sta adv+1
@@ -241,8 +245,8 @@ fixup11:ora data ; Lobyte
; Advance pointer register
common: jsr set_addrsocket0
tay ; Save command
- lda reg
clc
+ lda reg
adc adv
tax
lda reg+1
@@ -283,7 +287,7 @@ fixup15:lda data
bne :-
; Socket 0 TX Free Size Register: < length ?
-: ldy #$20
+: ldy #$20 ; Socket TX Free Size Register
jsr set_addrsocket0
fixup16:lda data ; Hibyte
fixup17:ldx data ; Lobyte
@@ -318,8 +322,8 @@ exit:
set_addrphysical:
fixup18:lda data ; Hibyte
fixup19:ldy data ; Lobyte
- sta reg+1
sty reg
+ sta reg+1
and #>$1FFF ; Socket Mask Address (hibyte)
ora bas ; Socket Base Address (hibyte)
tax
@@ -341,10 +345,11 @@ set_addrbase:
get_datacheckaddr:
fixup22:lda data
-fixup23:ldx addr ; Hibyte
- cpx lim ; Socket memory limit (hibyte)
- bcs set_addrbase
- rts
+ iny ; Physical address shadow (lobyte)
+ bne :+
+ inx ; Physical address shadow (hibyte)
+ beq set_addrbase
+: rts
;---------------------------------------------------------------------
@@ -380,10 +385,10 @@ mov_data:
; R/W without address wraparound possible because
; highest R/W address > actual R/W address ?
; sec
-fixup24:sbc addr+1 ; Lobyte
+fixup23:sbc addr+1 ; Lobyte
tay
txa
-fixup25:sbc addr ; Hibyte
+fixup24:sbc addr ; Hibyte
tax
tya
bcs :+
@@ -444,7 +449,7 @@ rw_data:eor #$FF ; Two's complement part 1
; Read data
:
-fixup26:lda data
+fixup25:lda data
sta (ptr),y
iny
bne :-
@@ -455,7 +460,7 @@ fixup26:lda data
; Write data
: lda (ptr),y
-fixup27:sta data
+fixup26:sta data
iny
bne :-
inc ptr+1