Ford Universal ADX
-
- Posts: 1
- Joined: 2021 Feb 17, 04:09
- Location: South Australia
- Vehicle Information: Ford XG Turbo Ute
XR6 Turbo
XF Falcon
HR31 Skyline
Ford Universal ADX
Hi all im looking for a universal ADX as i cant find one for my Aussie 4L, also ive been trying to enable tracing with my Moates Quarterhorse but keep getting an error sign. Is tracing not available to the QH? Cheers
-
- Posts: 5099
- Joined: 2021 Feb 15, 12:23
- Location: Metairie, LA
- Vehicle Information: Work Truck
'19 F-150 3.3L
Re: Ford Universal ADX
you have to make one the only thing universal about my adx is that its standardized so everything is polled in the same order
you still have to find all the ram addresses for all the payloads and patch my datalogging code in your tune
tracing needs datalogging to work
you still have to find all the ram addresses for all the payloads and patch my datalogging code in your tune
tracing needs datalogging to work
-
- Posts: 307
- Joined: 2021 Feb 15, 22:12
- Location: Sacramento CA
- Vehicle Information: 1991 F150 4.9L J1X 80lb Injectors E85
1995 F150 5.8L MOB1
Re: Ford Universal ADX
Is finding ram addresses just a guess and check process? Is there a way to view the raw data stream to find things like throttle position easily?
-
- Posts: 285
- Joined: 2021 Feb 16, 15:46
- Location: Australia
- Vehicle Information: 95 Escort RS Cosworth
2.0 YBP
CARD / QUIK / COSY / ANTI
GHAJ0
SMD-190 / SMD-490 EEC-IV
Binary Editor
ForDiag
Re: Ford Universal ADX
Disassemble the bin, find the ADC routine to get the addresses the input values are stored too. Log those addresses to determine what each channel is, or go through disassembly to work it out.
-
- Posts: 307
- Joined: 2021 Feb 15, 22:12
- Location: Sacramento CA
- Vehicle Information: 1991 F150 4.9L J1X 80lb Injectors E85
1995 F150 5.8L MOB1
Re: Ford Universal ADX
forgive my ignorance but are all A/D conversions done in the same routine? What opcodes am I looking for?
-
- Posts: 285
- Joined: 2021 Feb 16, 15:46
- Location: Australia
- Vehicle Information: 95 Escort RS Cosworth
2.0 YBP
CARD / QUIK / COSY / ANTI
GHAJ0
SMD-190 / SMD-490 EEC-IV
Binary Editor
ForDiag
Re: Ford Universal ADX
In most cases ADC is done in one block aside from MAF.
There was a couple examples of the ADC routine in detail here, but is has been flushed in the forum upgrade.
Run the bin through SAD. Search lst for AD_
I'll post an example.
There was a couple examples of the ADC routine in detail here, but is has been flushed in the forum upgrade.
Run the bin through SAD. Search lst for AD_
I'll post an example.
-
- Posts: 285
- Joined: 2021 Feb 16, 15:46
- Location: Australia
- Vehicle Information: 95 Escort RS Cosworth
2.0 YBP
CARD / QUIK / COSY / ANTI
GHAJ0
SMD-190 / SMD-490 EEC-IV
Binary Editor
ForDiag
Re: Ford Universal ADX
Code: Select all
15bee: 03,ec,03 struct 3, iADC_Ch3.1
15bf1: 00,c6,01 struct 0, iADC_Ch0
15bf4: 01,ca,01 struct 1, iADC_Ch1
15bf7: 02,a8,01 struct 2, iADC_Ch2
15bfa: 05,d4,01 struct 5, iADC_Ch5
15bfd: 06,ce,01 struct 6, iADC_Ch6
15c00: 03,ee,03 struct 3, iADC_Ch3.2
15c03: 07,a6,01 struct 7, iADC_Ch7
15c06: 08,a0,01 struct 8, iADC_Ch8
15c09: 09,a2,01 struct 9, iADC_Ch9
15c0c: 0c,d2,01 struct c, iADC_ChC
15c0f: 03,f0,03 struct 3, iADC_Ch3.3
15c12: 0a,6c,04 struct a, iADC_ChA
15c15: 0d,8c,04 struct d, iADC_ChD
15c18: 0e,8e,04 struct e, iADC_ChE
15c1b: 0f,a4,01 struct f, iADC_ChF
15c1e: 03,f2,03 struct 3, iADC_Ch3.4
15c21: ff ## terminator
Code: Select all
#################################################################
# Save A to D values. Definitons in Structure at 15BEE
#################################################################
# Vect from L1646A
Sbg_82E46_AD_Read:
82e46: a1,ee,5b,34 ldw R34,5bee R34 = 5bee; # A/D Lookup Structure at 15BEE
# JNE from L82E5C Channel requested does not match channel returned
# SJump from L82E70 Do next Channel listed in Structure 15BEE
82e4a: fb ei interrupts ON;
82e4b: 56,34,00,04 ad3b R4,R0,[R34] AD_Cmd = [R34]; # get and set, AD channel required
82e4f: de,21 jlt 82e72 if (AD_Cmd >= 0) { # SIGNED comparison
# Cont for Channels x0 through xF (x7F is positive max)
# JNB Loop from L82E51 until AD_Converted=1
82e51: 33,0a,fd jnb B3,Ra,82e51 if (AD_Converted = 0) goto 82e51; # wait for AD conversion
82e54: fa di interrupts OFF;
82e55: 51,0f,04,38 an3b R38,R4,f R38 = AD_Low & f; # get channel returned
82e59: 9a,34,38 cmpb R38,[R34] # check correct channel
82e5c: d7,ec jne 82e4a if (R38 != [R34]) goto 82e4a; # No, try read again
# Cont Channel requested matched Channel returned
82e5e: 51,f0,04,38 an3b R38,R4,f0 R38 = AD_Low & f0; # AD Low value
82e62: b0,05,39 ldb R39,R5 R39 = AD_Hi^; # AD High value
82e65: 07,34 incw R34 R34++; # incr ptr to iADC address
82e67: b2,35,36 ldb R36,[R34++] R36 = [R34++]; # get iADC address, lo then hi
82e6a: b2,35,37 ldb R37,[R34++] R37 = [R34++];
82e6d: c2,36,38 stw R38,[R36] [R36] = R38; # save AD value to iADC address
82e70: 27,d8 sjmp 82e4a goto 82e4a; } # Do next AD
# JLT from L82E4F negative (x80 to xFF) is less than 0
82e72: 07,34 incw R34 R34++; # [15C22] Struct terminator +1
82e74: ad,02,46 ldzbw R46,2 wR46 = 2; # Why not 1???
82e77: 08,01,46 shrw R46,1 R46 >>= 1; #[ R46 /= 2] # R46=1
# JNE from L82EB2
# SJump from L82EBF
82e7a: 56,34,00,38 ad3b R38,R0,[R34] R38 = [R34]; # x02
82e7e: de,41 jlt 82ec1 if (R38 >= 0) { # Terminator
82e80: c4,39,38 stb R38,R39 R39 = R38; # x02
82e83: 93,47,ce,5b,38 orb R38,[R46+5bce] R38 |= [R46+15bce]; # [15BCF] x42 |= x2 x40
82e88: 28,38 scall 82ec2 Sub82EC2_yLSSO_A=yR38 (); # Write LSSI#A
82e8a: b1,03,42 ldb R42,3 R42 = 3;
# DJNZ Loop from L82E8D
82e8d: e0,42,fd djnz R42,82e8d R42--;
if (R42 != 0) goto 82e8d; # Wait
# JE from L82E9D
82e90: b0,15,36 ldb R36,R15 R36 = LSSI#A; # Read LSSI#A
82e93: 73,47,d0,5b,36 an2b R36,[R46+5bd0] R36 &= [R46+15bd0]; # [15BD1] LSSI#A&=xE0 B4..B0 cleared
82e98: 9b,47,d2,5b,36 cmpb R36,[R46+5bd2] # [15BD3] x40
82e9d: df,f1 je 82e90 if (R36 = [R46+15bd2]) goto 82e90; # B6_LSSI#A Set 1
82e9f: fa di interrupts OFF;
82ea0: b0,19,3b ldb R3b,R19 R3b = LSSI#C;
82ea3: b0,17,3a ldb R3a,R17 R3a = LSSI#B;
82ea6: b0,15,36 ldb R36,R15 R36 = LSSI#A;
82ea9: fb ei interrupts ON;
82eaa: 93,47,d4,5b,39 orb R39,[R46+5bd4] R39 |= [R46+15bd4]; # [15BD5] xC1 |= 1 xC0
82eaf: 98,39,36 cmpb R36,R39
82eb2: d7,c6 jne 82e7a if (R36 != R39) goto 82e7a; # LSSI#A != xC1
82eb4: 07,34 incw R34 R34++; # [15C23]
82eb6: b2,35,36 ldb R36,[R34++] R36 = [R34++]; # Lo Value
82eb9: b2,35,37 ldb R37,[R34++] R37 = [R34++]; # Hi Value
82ebc: c2,36,3a stw R3a,[R36] [R36] = R3a; # Save AD Value to iAICE address
82ebf: 27,b9 sjmp 82e7a goto 82e7a; }
# JLT from L82E7E
82ec1: f0 ret return;
-
- Posts: 307
- Joined: 2021 Feb 15, 22:12
- Location: Sacramento CA
- Vehicle Information: 1991 F150 4.9L J1X 80lb Injectors E85
1995 F150 5.8L MOB1
Re: Ford Universal ADX
I am single bank SD and I don't see anything resembling the first example. But I found this:
Code: Select all
Sub_3af0:
3af0: a1,1e,3b,30 ldw R30,3b1e R30 = 3b1e;
3af4: fb ei interrupts ON;
3af5: 56,30,00,04 ad3b R4,R0,[R30] AD_Cmd = [R30];
3af9: de,22 jlt 3b1d if (AD_Cmd >= 0) {
3afb: 33,0a,fd jnb B3,Ra,3afb if (AD_Ready = 0) goto 3afb;
3afe: fa di interrupts OFF;
3aff: ff nop
3b00: 51,0f,04,34 an3b R34,R4,f R34 = AD_Low & f;
3b04: 9a,30,34 cmpb R34,[R30]
3b07: d7,eb jne 3af4 if (R34 != [R30]) goto 3af4;
3b09: 51,f0,04,34 an3b R34,R4,f0 R34 = AD_Low & f0;
3b0d: b0,05,35 ldb R35,R5 R35 = AD_High;
3b10: 07,30 incw R30 R30++;
3b12: b2,31,32 ldb R32,[R30++] R32 = [R30++];
3b15: b2,31,33 ldb R33,[R30++] R33 = [R30++];
3b18: c2,32,34 stw R34,[R32] [R32] = R34;
3b1b: 27,d7 sjmp 3af4 goto 3af4; }
3b1d: f0 ret return;
3b1e: 01 byte 1
3b1f: 0e byte e
3b20: 01 byte 1
3b21: 02 byte 2
3b22: 0a byte a
3b23: 01 byte 1
3b24: 03,0c,01,07,1c,01,08,10,01,09,12,01,0a,18,01,0b ???
3b34: 1a,01,0c,14,01,ff ???
-
- Posts: 285
- Joined: 2021 Feb 16, 15:46
- Location: Australia
- Vehicle Information: 95 Escort RS Cosworth
2.0 YBP
CARD / QUIK / COSY / ANTI
GHAJ0
SMD-190 / SMD-490 EEC-IV
Binary Editor
ForDiag
Re: Ford Universal ADX
You do, it is right there, hiding in plain sight.efloth wrote: ↑2021 Feb 20, 14:43 I am single bank SD and I don't see anything resembling the first example.
Code: Select all
Ch. Addr. 3b1e:... 1 10e 3b21:... 2 10a 3b24:.... 3 10c 07,1c,01,..7 11c 08,10,01,..8 110 09,12,01,..9 112 0a,18,01,..a 118 0b ??? ..b 11a 0c,14,01,..c 114 ff ???
R30 = 3b1e tells you where to look. Use a str command in your SAD DIR to format it. Use sym commands in your SAD DIR to name the addresses.
Code: Select all
SYM 10E "iADC_Ch1"
STR 3B1E 3B39 $Q1 :Y :WN # AD Conversion Structure
-
- Posts: 307
- Joined: 2021 Feb 15, 22:12
- Location: Sacramento CA
- Vehicle Information: 1991 F150 4.9L J1X 80lb Injectors E85
1995 F150 5.8L MOB1
Re: Ford Universal ADX
Thanks, got it. Here is the result:
Please correct me if I am wrong, the above addresses are not directly readable by the QH so they are being copied by the datalogging routine to readable addresses. The ADX is configured to read shadow addresses so the big question is in what order are these shadowed? My Datalogging List function below is a copy from the A1C DL Patch. Can I assume that 010a=00D6? I think I am missing part of the equation. Thanks for all your help.
Code: Select all
3b1e: 01,0e,01 struct 1, iADC_Ch1
3b21: 02,0a,01 struct 2, iADC_Ch2
3b24: 03,0c,01 struct 3, iADC_Ch3
3b27: 07,1c,01 struct 7, iADC_Ch7
3b2a: 08,10,01 struct 8, iADC_Ch8
3b2d: 09,12,01 struct 9, iADC_Ch9
3b30: 0a,18,01 struct a, iADC_ChA
3b33: 0b,1a,01 struct b, iADC_ChB
3b36: 0c,14,01 struct c, iADC_ChC
Code: Select all
00D6
0396
00B6
009A
00CC
00BA
00B4
0124
008A
0162
01F2
00BE
0096
0170
011A
0154
0092
008C
0090
00B8
00B2
00A8
015C
016A
00DA
021A
0228
014E
0238
00D8
035C
0314
0322
016C
0398
0000
0027
5D01
009E
4404
00A5
4480
0000
0000