/* asd 33.0.16.209 (e129d135) -- named functions * generated by fw/ta_re.py -- do not edit * reference: asd2.elf * functions: 1338 total in build, 893 named, 445 anonymous * porting tiers: {"DISPATCH": 0, "EXACT": 209, "FUZZY": 3, "MNEM": 125, "ambiguous": 866, "cmd_protos": 0, "comments": 257, "dispatch_conflict": 0, "none": 135, "protos": 333, "relabelled": 0, "types": 1} * * Addresses are omitted and functions are ordered by NAME so that the same * function lines up across versions. See the .index.json sidecar for * name -> address. * * CAUTION on ported names: a name is only an identity claim at tier=EXACT. * At tier=MNEM/FUZZY the bytes differ from the reference, so any ADDRESS or * CONTENT HASH embedded in the name (e.g. *_4025F8, gcp_lib__*) still * refers to the REFERENCE build and does not describe this one. */ /* ==== asd_align_map_range [tier=EXACT size=204] ==== */ // Computes a 4096-aligned [base, base+len) window with 64-bit overflow checks before // handing it to the kernel mapping path (SVC 0x6C). Rejects unaligned/overflowing ranges // with status 2. int __fastcall asd_align_map_range(unsigned int a1, unsigned int a2, unsigned int a3) { unsigned __int64 v5; // kr08_8 unsigned int v6; // r9 int result; // r0 unsigned int v8; // r3 unsigned int v9; // r2 int v11; // r3 _DWORD v15[6]; // [sp+0h] [bp-1Ch] BYREF unsigned __int8 v16; // [sp+1Bh] [bp-1h] v5 = __PAIR64__(a1, a2) + a3 - 1; v6 = (__PAIR64__(a1, a2) + a3 + 4095) >> 32; result = 2; if ( __PAIR64__(~a1, ~a2) >= a3 && __PAIR64__(dword_D0EE9C, WORD2(v5) & 0x800) >= __PAIR64__(HIDWORD(v5) >> 12, 1) ) { v8 = (a2 + a3 + 4095) & 0xFFFFF000; if ( (v8 | v6) != 0 ) { result = 2; v9 = v8 - (a2 & 0xFFFFF000); _CF = __PAIR64__(v6, v8) >= __PAIR64__(a1, a2 & 0xFFFFF000); v11 = (__PAIR64__(v6, v8) - __PAIR64__(a1, a2 & 0xFFFFF000)) >> 32; if ( _CF && v11 == 0 ) { v15[5] = v9; v15[2] = v9; v15[1] = 1; v15[3] = a2 & 0xFFFFF000; v15[4] = a1; v16 = -1; __asm { SVC 0x8B } if ( v15 == (_DWORD *)-4 ) { v15[0] = 0; __asm { SVC 0x6D ; 'm' } } if ( v16 != 255 ) __asm { SVC 0x6C ; 'l' } return 1; } } } return result; } /* ==== asd_asic5592_call_D0BE70 [tier=MNEM size=74] REF-DERIVED-NAME ==== */ // ASIC-gated call to sub_D0BE70 admitting only device 5592 revision 147. int __fastcall asd_asic5592_call_D0BE70(int a1, _WORD *a2, _WORD *a3, _WORD *a4) { int v8; // r4 bool v9; // zf _DWORD v11[8]; // [sp+4h] [bp-20h] BYREF v8 = sub_D11A48(a1: v11); if ( sub_D11A48(a1: v11) == 0 ) { v9 = v11[0] == 5592; if ( v11[0] == 5592 ) v9 = v11[1] == 147; if ( v9 ) return asd_read_link_pair(a1, a2, a3, a4); else return 7; } return v8; } /* ==== asd_aux_idle_check [tier=MNEM size=52] ==== */ // True when idx <= 1, the feature-14 level check passes, and bit0 of the AUX status // register (asd_reg_read_14160) is clear. BOOL __fastcall asd_aux_idle_check(unsigned int a1) { return a1 <= 1 && asd_feature_level_check(a1: 14, a2: a1) != 0 && (sub_D10F50() & 1) == 0; } /* ==== asd_aux_op_D1891C [tier=MNEM size=48] REF-DERIVED-NAME ==== */ // Bounded (idx < dword_D33300) and feature-14 gated dispatch to sub_D1891C using the // per-link register at byte_D42661[4*idx+151]. int __fastcall asd_aux_op_D1891C(unsigned int a1, int a2) { if ( *((_DWORD *)off_D15400 + 2) > a1 && asd_feature_level_check(a1: 14, a2: a1) != 0 ) return asd_dio_write_verify(a1: *(_DWORD *)(dword_D15404 + 4 * a1 + 64), a2, a3: a1); else return 2; } /* ==== asd_aux_transfer_block [tier=MNEM size=218] ==== */ // Feature-14 gated, bounds a1 < dword_D33300. Multi-register AUX/DDC transfer helper. int __fastcall asd_aux_transfer_block(unsigned int a1, unsigned __int8 *a2) { int v4; // r1 int result; // r0 int v6; // r8 int v7; // r9 int v8; // r1 int v9; // r10 int v10; // r7 int v11; // r11 unsigned int *v12; // r6 int v13; // r5 int v14; // [sp+4h] [bp-18h] int v15; // [sp+8h] [bp-14h] int v16; // [sp+Ch] [bp-10h] int v17; // [sp+10h] [bp-Ch] int v18; // [sp+14h] [bp-8h] int v19; // [sp+18h] [bp-4h] if ( *((_DWORD *)off_D15400 + 2) <= a1 ) return 2; v4 = asd_feature_level_check(a1: 14, a2: a1); result = 2; if ( a2 != nullptr && v4 != 0 ) { v6 = a2[5]; v7 = a2[9]; v8 = *a2 | (a2[1] << 8) | ((a2[2] | (a2[3] << 8)) << 16); v9 = a2[4]; v10 = a2[6]; v11 = a2[7]; v12 = (unsigned int *)(dword_D15404 + 4 * a1); v19 = a2[8]; v18 = a2[10]; v17 = a2[11]; v16 = a2[12]; v15 = a2[14]; v14 = a2[15]; v13 = a2[13]; result = asd_dio_write_verify(a1: v12[18], a2: v8, a3: a1); if ( result == 0 ) { result = asd_dio_write_verify(a1: v12[20], a2: v9 | (v6 << 8) | ((v10 | (v11 << 8)) << 16), a3: a1); if ( result == 0 ) { result = asd_dio_write_verify(a1: v12[22], a2: v19 | (v7 << 8) | ((v18 | (v17 << 8)) << 16), a3: a1); if ( result == 0 ) return asd_dio_write_verify(a1: v12[24], a2: v16 | (v13 << 8) | ((v15 | (v14 << 8)) << 16), a3: a1); } } } return result; } /* ==== asd_aux_write_block [tier=MNEM size=206] ==== */ // Feature-14 gated. Writes a command word (0x1000100) then packs a2[0..3] into a DIO // register at byte_D42661[4*a1+127]; emits a block from a3/a4. int __fastcall asd_aux_write_block(unsigned int a1, unsigned __int8 *a2, _BYTE *a3, int a4) { char *v5; // r5 int result; // r0 void (__fastcall *v7)(unsigned int); // r6 unsigned int v8; // r4 int i; // r0 char v10; // t1 _BYTE *v11; // [sp+0h] [bp-8h] int v12; // [sp+4h] [bp-4h] v11 = a3; v12 = a4; v5 = a3; result = asd_feature_level_check(a1: 14, a2: a1); if ( result != 0 ) { v7 = (void (__fastcall *)(unsigned int))off_D14CF8; v8 = *(_DWORD *)(dword_D14EE4 + 4 * a1 + 40); off_D14CF8(a1: v8, a2: dword_D14CF4); v7(a1: v8); v7(a1: v8); v7(a1: v8); v7(a1: v8); v11 = nullptr; v12 = 0; for ( i = 7; i != -1; --i ) { v10 = *v5++; *((_BYTE *)&v11 + i) = v10; } v7(a1: v8); v7(a1: v8); v7(a1: v8); v7(a1: v8); return ((unsigned int (__fastcall *)(unsigned int))v7)(a1: v8); } return result; } /* ==== asd_build_caps_blob [tier=MNEM size=88] ==== */ // Builds a 0x108-byte capability blob: commands 20 and 25 use asd_check_link_budget's // path (sub_D15E8C), command 24 uses sub_D15EE4. int __fastcall asd_build_caps_blob(int a1) { int result; // r0 _DWORD v7[66]; // [sp+0h] [bp-108h] BYREF bzero_core(result: v7, a2: 0x108u); result = 2; switch ( a1 ) { case 20: case 25: result = asd_check_link_budget(a1: v7); goto LABEL_5; case 24: result = asd_build_caps_blob_24(a1: v7); goto LABEL_5; case 29: case 30: result = asd_get_lane_count(a1: v7, a2: a1); LABEL_5: if ( result == 0 ) { __asm { SVC 0xB4 } result = 35; } break; default: return result; } return result; } /* ==== asd_build_caps_blob_24 [tier=MNEM size=120] ==== */ // Builds the command-24 capability blob: emits 4 / 8 plus a fixed table of register // descriptors (0x51AD4, 0x251AD4, 0x3516D4, ... stepping by 0x100000). int __fastcall asd_build_caps_blob_24(_DWORD *a1) { int v1; // r1 int v2; // r6 _DWORD *v3; // r4 int v4; // r5 _DWORD v6[8]; // [sp+0h] [bp-40h] _DWORD v7[8]; // [sp+20h] [bp-20h] *a1 = 4; a1[1] = 8; v6[7] = dword_D12BF0; v6[5] = dword_D12BF4; v6[3] = dword_D12BF8; v6[1] = dword_D12BFC; v7[6] = dword_D12EE8; v7[7] = dword_D12EE8 + 4096; v6[6] = dword_D12EE8 + 4; v7[5] = dword_D12EE0 + 4096; v6[4] = dword_D12EE0 + 4; v7[3] = dword_D12ED8 + 4096; v7[4] = dword_D12EE0; v6[2] = dword_D12ED8 + 4; v7[2] = dword_D12ED8; v6[0] = dword_D12ED0 + 4; v1 = 0; v7[0] = dword_D12ED0; v7[1] = dword_D12ED0 + 4096; while ( v1 != 8 ) { v2 = v6[v1]; v3 = &a1[2 * v1]; v4 = v7[v1++]; v3[2] = v4; v3[3] = v2; } return 0; } /* ==== asd_build_hw_ops [tier=FUZZY size=728] ==== */ // Builds the display hardware operations struct (the runtime vtable ASD calls through). // Switch-per-ASIC-variant: each case stores a set of function pointers at fixed offsets // in the struct at R4. Slots seen: +0x68..+0xE8. This is the registration site for the // indirect-call targets that static call-graph analysis cannot reach. int __fastcall asd_build_hw_ops(_DWORD *a1, int a2) { void *v3; // r12 void *v4; // r6 void *v5; // r5 void *v6; // r7 void *v7; // r3 void *v8; // lr void *v9; // r1 void *v10; // r1 int *v11; // r8 void *v12; // r2 int *v13; // r0 int *v14; // r9 int *v15; // r10 void *v16; // r11 int *v17; // r1 void *v18; // r2 void *v19; // r3 void *v20; // r0 void *v21; // r0 void *v22; // r2 void *v23; // r1 int *v24; // r0 void *v25; // r0 void *v26; // r1 void *v27; // r12 int *v28; // r5 void *v29; // r6 void *v30; // r7 void *v31; // r2 void *v32; // r0 int *v33; // r1 void *v34; // r12 void *v35; // r6 void *v36; // r5 void *v37; // lr void *v38; // r7 void *v39; // r3 void *v40; // r1 void *v41; // r8 void *v42; // r5 int *v43; // r0 int *v44; // r9 int v45; // r10 void *v46; // r2 void *v47; // r11 void *v48; // r3 void *v49; // r0 int *v50; // r3 void *v51; // r6 void *v52; // r7 void *v53; // r2 void *v54; // r1 void *v55; // r0 __int64 v56; // r0 void *v57; // r0 void *v58; // r2 void *v59; // lr void *v60; // r5 void *v61; // r7 void *v62; // r1 int *v63; // r2 void *v64; // r12 int *v65; // r6 void *v66; // r0 void *v67; // r3 void *v68; // r2 void *v69; // r2 void *v70; // r5 void *v71; // r7 void *v72; // lr void *v73; // r6 void *v74; // r0 void *v75; // r1 int *v76; // r2 _DWORD *v77; // r6 int i; // r7 void (__fastcall *v79)(__int16 *); // r1 _DWORD *v80; // r5 int j; // r6 void (__fastcall *v82)(__int16 *); // r1 __int16 v84; // [sp+0h] [bp-4h] BYREF __int16 v85; // [sp+2h] [bp-2h] BYREF v85 = 0; v84 = 0; switch ( a2 ) { case 5: v3 = off_D021F8; v4 = off_D0220C; v5 = off_D02220; v6 = off_D0221C; v7 = off_D02204; v8 = off_D02208; v9 = off_D02214; a1[24] = off_D02200; a1[25] = v3; a1[26] = v7; a1[27] = v4; a1[28] = v9; a1[29] = v5; v10 = off_D02230; a1[30] = off_D02228; a1[31] = v6; a1[32] = v10; v11 = (int *)off_D02210; v12 = off_D021FC; a1[8] = off_D02234; *a1 = v12; a1[1] = v8; v13 = (int *)off_D0222C; v14 = (int *)off_D02218; v15 = (int *)off_D026AC; a1[2] = v11; a1[3] = v14; a1[4] = v15; v16 = off_D02224; v17 = (int *)off_D02238; a1[5] = v13; a1[6] = v17; a1[7] = v16; a1[33] = off_D0223C; a1[9] = off_D02240; a1[34] = off_D021C4; a1[10] = off_D021C8; a1[11] = off_D02244; a1[35] = off_D02248; v18 = off_D0225C; v19 = off_D02260; a1[12] = off_D0224C; a1[36] = off_D02250; v20 = off_D02254; a1[50] = off_D02258; a1[51] = v19; a1[40] = v20; a1[41] = v18; v21 = off_D02264; v22 = off_D0226C; a1[42] = off_D02890; a1[54] = v22; a1[55] = v21; v23 = off_D02268; v24 = (int *)off_D02270; goto LABEL_7; case 6: *a1 = off_D0216C; a1[24] = off_D02170; v25 = off_D02168; v26 = off_D0212C; v27 = off_D02174; goto LABEL_5; case 8: *a1 = off_D02124; a1[24] = off_D02128; v25 = off_D02120; v26 = off_D0212C; v27 = off_D02130; LABEL_5: a1[50] = v25; a1[51] = v26; v28 = (int *)off_D02138; v29 = off_D0213C; v30 = off_D02140; v31 = off_D02144; v32 = off_D02148; v33 = (int *)off_D0214C; a1[52] = off_D02134; a1[53] = v29; a1[54] = v31; a1[41] = v27; a1[42] = v28; a1[43] = v30; a1[44] = v32; a1[45] = v33; goto LABEL_10; case 10: v34 = off_D02178; v35 = off_D0218C; v36 = off_D021A0; v37 = off_D02188; v38 = off_D0219C; v39 = off_D02184; v40 = off_D02194; a1[24] = off_D02180; a1[25] = v34; a1[26] = v39; a1[27] = v35; a1[28] = v40; a1[29] = v36; v41 = off_D02190; v42 = off_D0217C; a1[30] = off_D021A8; a1[31] = v38; *a1 = v42; a1[1] = v37; v43 = (int *)off_D021AC; v44 = (int *)off_D02198; v45 = off_D026DC; a1[2] = v41; a1[3] = v44; a1[4] = v45; v46 = off_D021B4; v47 = off_D021A4; v48 = off_D021B8; a1[5] = v43; a1[6] = v48; a1[7] = v47; v49 = off_D021BC; v50 = (int *)off_D021C0; v51 = off_D021C8; v52 = off_D021CC; a1[8] = v46; a1[9] = v50; a1[10] = v51; a1[11] = v52; v53 = off_D021D0; a1[32] = off_D021B0; a1[33] = v49; v54 = off_D021E0; a1[34] = off_D021C4; a1[35] = v53; v55 = off_D021D4; a1[50] = v54; HIDWORD(v56) = off_D021E4; a1[13] = v55; a1[37] = off_D021D8; LODWORD(v56) = off_D021DC; *((_QWORD *)a1 + 20) = v56; LODWORD(v56) = off_D021E8; v23 = off_D021EC; a1[54] = off_D021F0; a1[55] = v56; v24 = (int *)off_D021F4; LABEL_7: a1[45] = v24; a1[46] = v23; goto LABEL_10; case 11: a1[30] = off_D02150; *a1 = off_D02154; a1[24] = off_D02158; v57 = off_D0215C; a1[6] = off_D02160; v58 = off_D0212C; v59 = off_D02164; v60 = off_D02134; v61 = off_D0213C; a1[50] = v57; a1[51] = v58; a1[52] = v60; a1[53] = v61; v62 = off_D02140; v63 = (int *)off_D0214C; v64 = off_D020F4; v65 = (int *)off_D02138; v66 = off_D02148; a1[54] = off_D02144; a1[40] = v64; a1[41] = v59; a1[42] = v65; a1[43] = v62; a1[44] = v66; a1[45] = v63; goto LABEL_10; case 12: a1[30] = off_D020E4; v67 = off_D02114; *a1 = off_D020E8; v68 = off_D020F8; a1[24] = off_D020EC; a1[6] = v68; v69 = off_D020FC; a1[50] = off_D020F0; a1[51] = v67; v70 = off_D02104; v71 = off_D0210C; a1[52] = v69; a1[53] = v70; a1[54] = v71; v72 = off_D02100; v73 = off_D02108; v74 = off_D02118; v75 = off_D02110; v76 = (int *)off_D0211C; a1[40] = off_D020F4; a1[41] = v72; a1[42] = v76; a1[43] = v73; a1[44] = v75; a1[45] = v74; LABEL_10: v77 = a1 + 24; for ( i = 0; i != 16; ++i ) { v79 = (void (__fastcall *)(__int16 *))v77[i]; if ( v79 != nullptr ) { v79(a1: &v85); *((_WORD *)v77 + i - 16) = v85; } } v80 = a1 + 50; for ( j = 0; j != 6; ++j ) { v82 = (void (__fastcall *)(__int16 *))v80[j]; if ( v82 != nullptr ) { v82(a1: &v84); *((_WORD *)v80 + j - 6) = v84; } } break; default: return 0; } return 0; } /* ==== asd_build_link_map_full [tier=EXACT size=674] ==== */ // Larger sibling of asd_build_link_map producing the full per-link descriptor set. int __fastcall asd_build_link_map_full(unsigned int *a1) { unsigned int v1; // r4 _DWORD *v2; // r12 int v3; // r1 unsigned int v4; // r6 unsigned int v5; // r3 bool v6; // cc unsigned int v7; // r1 unsigned int *v9; // r0 _DWORD *v10; // r1 unsigned __int8 v11; // r5 unsigned int v12; // r3 int v13; // r2 unsigned int v14; // r6 int v15; // r2 unsigned int v16; // r7 int v17; // r2 int v18; // r2 unsigned int v19; // r7 int v20; // r2 int v21; // r2 unsigned int v22; // r7 int v23; // r2 int v24; // r2 unsigned int v25; // r7 int v26; // r2 int v27; // r2 unsigned int v28; // r7 int v29; // r2 int v30; // r2 unsigned int v31; // r7 int v32; // r2 unsigned __int8 v33; // r5 unsigned int v34; // r6 int v35; // r2 int v36; // r2 unsigned int v37; // r7 int v38; // r2 int v39; // r2 unsigned int v40; // r7 int v41; // r2 int v42; // r2 unsigned int v43; // r7 int v44; // r2 int v45; // r2 unsigned int v46; // r7 int v47; // r2 int v48; // r2 unsigned int v49; // r7 int v50; // r2 int v51; // r2 unsigned int v52; // r7 int v53; // r2 unsigned __int8 v54; // r5 int v55; // r2 unsigned int v56; // r6 int v57; // r2 unsigned int v58; // r7 int v59; // r2 int v60; // r2 unsigned int v61; // r7 int v62; // r2 int v63; // r2 unsigned int v64; // r7 int v65; // r2 int v66; // r2 unsigned int v67; // r7 int v68; // r2 int v69; // r2 unsigned int v70; // r7 int v71; // r2 int v72; // r2 unsigned int v73; // r7 int v74; // r2 if ( a1 == nullptr ) return 2; v2 = off_D08BD4; v3 = 2; v4 = *((_DWORD *)off_D08BD4 + 3); if ( v4 <= 0x20 ) { v5 = *((_DWORD *)off_D08BD4 + 4); v6 = v5 > 0x20; if ( v5 <= 0x20 ) { v1 = *((_DWORD *)off_D08BD4 + 5); v6 = v1 > 0x20; } if ( !v6 ) { v7 = 6 * (v5 + v4 + v1); if ( v7 > 0x40 ) return 2; *a1 = v7; v9 = a1 + 3; v10 = off_D08138; v11 = 0; v12 = 0; while ( v4 > v11 ) { if ( v12 > 0x3A ) return 2; v13 = v2[18]; if ( v13 != 0 ) v14 = *(_DWORD *)(v13 + 4 * v11); else v14 = 0; v15 = v10[60]; ++v11; v12 += 6; v16 = v15 + v14; if ( v14 > ~v15 ) v16 = 0; v17 = 4 * v16; if ( v16 >> 30 != 0 ) v17 = 0; *(v9 - 2) = v17; v18 = v10[61]; v19 = v18 + v14; if ( v14 > ~v18 ) v19 = 0; v20 = 4 * v19; if ( v19 >> 30 != 0 ) v20 = 0; *(v9 - 1) = v20; v21 = v10[62]; v22 = v21 + v14; if ( v14 > ~v21 ) v22 = 0; v23 = 4 * v22; if ( v22 >> 30 != 0 ) v23 = 0; *v9 = v23; v24 = v10[63]; v25 = v24 + v14; if ( v14 > ~v24 ) v25 = 0; v26 = 4 * v25; if ( v25 >> 30 != 0 ) v26 = 0; v9[1] = v26; v27 = v10[64]; v28 = v27 + v14; if ( v14 > ~v27 ) v28 = 0; v29 = 4 * v28; if ( v28 >> 30 != 0 ) v29 = 0; v9[2] = v29; v30 = v10[65]; v31 = v30 + v14; if ( v14 > ~v30 ) v31 = 0; v32 = 4 * v31; if ( v31 >> 30 != 0 ) v32 = 0; v9[3] = v32; v9 += 6; v4 = v2[3]; } v33 = 0; while ( v2[4] > (unsigned int)v33 ) { if ( v12 > 0x3A ) return 2; v34 = 0; if ( v2[2] > (unsigned int)v33 ) { v35 = v2[20]; if ( v35 != 0 ) v34 = *(_DWORD *)(v35 + 4 * v33); } v36 = v10[68]; ++v33; v12 += 6; v37 = v36 + v34; if ( v34 > ~v36 ) v37 = 0; v38 = 4 * v37; if ( v37 >> 30 != 0 ) v38 = 0; *(v9 - 2) = v38; v39 = v10[69]; v40 = v39 + v34; if ( v34 > ~v39 ) v40 = 0; v41 = 4 * v40; if ( v40 >> 30 != 0 ) v41 = 0; *(v9 - 1) = v41; v42 = v10[70]; v43 = v42 + v34; if ( v34 > ~v42 ) v43 = 0; v44 = 4 * v43; if ( v43 >> 30 != 0 ) v44 = 0; *v9 = v44; v45 = v10[71]; v46 = v45 + v34; if ( v34 > ~v45 ) v46 = 0; v47 = 4 * v46; if ( v46 >> 30 != 0 ) v47 = 0; v9[1] = v47; v48 = v10[72]; v49 = v48 + v34; if ( v34 > ~v48 ) v49 = 0; v50 = 4 * v49; if ( v49 >> 30 != 0 ) v50 = 0; v9[2] = v50; v51 = v10[73]; v52 = v51 + v34; if ( v34 > ~v51 ) v52 = 0; v53 = 4 * v52; if ( v52 >> 30 != 0 ) v53 = 0; v9[3] = v53; v9 += 6; } v54 = 0; while ( v2[5] > (unsigned int)v54 ) { if ( v12 > 0x3A ) return 2; v55 = v2[22]; if ( v55 != 0 ) v56 = *(_DWORD *)(v55 + 4 * v54); else v56 = 0; v57 = v10[76]; ++v54; v12 += 6; v58 = v57 + v56; if ( v56 > ~v57 ) v58 = 0; v59 = 4 * v58; if ( v58 >> 30 != 0 ) v59 = 0; *(v9 - 2) = v59; v60 = v10[77]; v61 = v60 + v56; if ( v56 > ~v60 ) v61 = 0; v62 = 4 * v61; if ( v61 >> 30 != 0 ) v62 = 0; *(v9 - 1) = v62; v63 = v10[78]; v64 = v63 + v56; if ( v56 > ~v63 ) v64 = 0; v65 = 4 * v64; if ( v64 >> 30 != 0 ) v65 = 0; *v9 = v65; v66 = v10[79]; v67 = v66 + v56; if ( v56 > ~v66 ) v67 = 0; v68 = 4 * v67; if ( v67 >> 30 != 0 ) v68 = 0; v9[1] = v68; v69 = v10[80]; v70 = v69 + v56; if ( v56 > ~v69 ) v70 = 0; v71 = 4 * v70; if ( v70 >> 30 != 0 ) v71 = 0; v9[2] = v71; v72 = v10[81]; v73 = v72 + v56; if ( v56 > ~v72 ) v73 = 0; v74 = 4 * v73; if ( v73 >> 30 != 0 ) v74 = 0; v9[3] = v74; v9 += 6; } return 0; } } return v3; } /* ==== asd_build_reg_addr_table [tier=MNEM size=236] ==== */ // Fills a 16-entry table of register block addresses (0x251AD0, 0x351AD0, 0x451AD0, ... // stepping by 0x100000) used to resolve per-instance register bases. int __fastcall asd_build_reg_addr_table(int a1, int a2, int a3, int *a4) { unsigned int v8; // r4 int v9; // r5 _QWORD *v10; // r6 int result; // r0 __int64 *v12; // r7 __int64 v13; // r0 _DWORD v14[16]; // [sp+4h] [bp+0h] BYREF _DWORD v15[16]; // [sp+44h] [bp+40h] BYREF v15[15] = dword_D0E784 + 4096; v15[14] = dword_D0E784; v15[13] = dword_D0E788 + 4096; v15[12] = dword_D0E788; v15[11] = dword_D0E78C + 4096; v15[10] = dword_D0E78C; v15[9] = dword_D0E790 + 4096; v15[6] = dword_D0E794; v15[7] = dword_D0E794 + 4096; v15[4] = dword_D0E798; v15[5] = dword_D0E798 + 4096; v15[2] = dword_D0E79C; v15[3] = dword_D0E79C + 4096; v15[0] = dword_D0E7A0; v15[1] = dword_D0E7A0 + 4096; v14[15] = dword_D0E7A4; v14[14] = dword_D0E784 + 4; v14[13] = dword_D0E7A8; v14[12] = dword_D0E788 + 4; v14[11] = dword_D0E7AC; v14[10] = dword_D0E78C + 4; v14[9] = dword_D0E7B0; v14[8] = dword_D0E790 + 4; v14[7] = dword_D0E7B4; v14[6] = dword_D0E794 + 4; v8 = 0; v14[5] = dword_D0E7B8; v14[4] = dword_D0E798 + 4; v9 = 0; v14[3] = dword_D0E7BC; v14[2] = dword_D0E79C + 4; v10 = v15; v14[1] = dword_D0E7C0; result = dword_D0E7A0 + 4; v12 = (__int64 *)v14; v15[8] = dword_D0E790; v14[0] = dword_D0E7A0 + 4; while ( a1 != v8 ) { result = asd_feature_level_check(a1: 0, a2: v8); if ( result != 0 ) { if ( v9 < 0 ) break; *(_QWORD *)(a2 + 8 * v9) = *v10; v13 = *v12; *(_DWORD *)(a3 + 8 * v9) = *(_DWORD *)v12; result = a3 + 8 * v9++; *(_DWORD *)(result + 4) = HIDWORD(v13); } ++v12; ++v10; ++v8; } *a4 = v9; return result; } /* ==== asd_build_reg_addr_table_v2 [tier=MNEM size=346] ==== */ // Fills a 24-entry table of register block base addresses (0x33000000-class values // stepping by 0x2000000) used to resolve per-instance register bases. unsigned int __fastcall asd_build_reg_addr_table_v2(int a1, int a2) { unsigned int *v2; // r11 _DWORD *v3; // r8 unsigned int v4; // r6 unsigned int v5; // r7 _DWORD *v6; // r9 unsigned int result; // r0 int v8; // r3 int v9; // r4 int v10; // r5 _DWORD *v11; // r0 int v12; // r3 int v13; // r4 int v14; // r5 _DWORD *v15; // r0 _DWORD v18[24]; // [sp+Ch] [bp-C0h] BYREF _DWORD v19[24]; // [sp+6Ch] [bp-60h] BYREF v19[22] = dword_D0E634; v19[23] = dword_D0E634 + 4096; v19[21] = dword_D0E638 + 4096; v19[20] = dword_D0E638; v19[19] = dword_D0E63C + 4096; v19[6] = dword_D0E654; v19[17] = dword_D0E640 + 4096; v2 = (unsigned int *)off_D0E694; v19[15] = dword_D0E644 + 4096; v19[18] = dword_D0E63C; v19[13] = dword_D0E648 + 4096; v19[10] = dword_D0E64C; v19[11] = dword_D0E64C + 4096; v19[8] = dword_D0E650; v19[9] = dword_D0E650 + 4096; v19[7] = dword_D0E654 + 4096; v19[4] = dword_D0E658; v19[5] = dword_D0E658 + 4096; v19[2] = dword_D0E65C; v19[3] = dword_D0E65C + 4096; v19[1] = dword_D0E660 + 4096; v18[23] = dword_D0E664; v18[22] = dword_D0E634 + 4; v18[21] = dword_D0E668; v18[20] = dword_D0E638 + 4; v3 = v19; v18[19] = dword_D0E66C; v18[18] = dword_D0E63C + 4; v18[17] = dword_D0E670; v18[16] = dword_D0E640 + 4; v18[15] = dword_D0E674; v18[14] = dword_D0E644 + 4; v18[13] = dword_D0E678; v18[12] = dword_D0E648 + 4; v18[11] = dword_D0E67C; v18[10] = dword_D0E64C + 4; v4 = 0; v18[9] = dword_D0E680; v18[8] = dword_D0E650 + 4; v5 = 0; v18[7] = dword_D0E684; v18[6] = dword_D0E654 + 4; v18[5] = dword_D0E688; v18[4] = dword_D0E658 + 4; v18[3] = dword_D0E68C; v6 = v18; v18[2] = dword_D0E65C + 4; v18[1] = dword_D0E690; v19[16] = dword_D0E640; v19[14] = dword_D0E644; v19[12] = dword_D0E648; v19[0] = dword_D0E660; v18[0] = dword_D0E660 + 4; while ( 1 ) { result = *v2; if ( *v2 >= 6 ) result = 6; if ( v4 >= result ) break; result = asd_test_bit(a1: v2[1], a2: v4); if ( result != 0 ) { if ( v5 >> 30 != 0 ) return result; v8 = v3[1]; v9 = v3[2]; v10 = v3[3]; v11 = (_DWORD *)(a1 + 16 * v5); *v11 = *v3; v11[1] = v8; v11[2] = v9; v11[3] = v10; v12 = v6[1]; v13 = v6[2]; v14 = v6[3]; v15 = (_DWORD *)(a2 + 16 * v5++); *v15 = *v6; v15[1] = v12; v15[2] = v13; v15[3] = v14; } v6 += 4; v3 += 4; ++v4; } return result; } /* ==== asd_bzero_core_cfg1 [tier=EXACT size=50] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls bzero_core. One of 0 near-identical siblings. int __fastcall asd_bzero_core_cfg1() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== asd_bzero_core_cfg2 [tier=EXACT size=40] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls bzero_core. One of 0 near-identical siblings. int __fastcall asd_bzero_core_cfg2() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== asd_bzero_core_cfg3 [tier=EXACT size=56] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls bzero_core. One of 0 near-identical siblings. int __fastcall asd_bzero_core_cfg3() { _DWORD *v0; // r5 int result; // r0 _DWORD v6[12]; // [sp+8h] [bp-78h] BYREF v0 = off_D01BCC; result = *(_DWORD *)off_D01BCC; if ( *(_DWORD *)off_D01BCC == 0 ) { bzero_core(result: v6, a2: 0x20u); __asm { SVC 0xF2 } *v0 = 1; return 1; } return result; } /* ==== asd_call_D17BC4_if_zero [tier=EXACT size=14] ==== */ // Calls sub_D17BC4(0) when the argument is zero, else returns false. BOOL __fastcall asd_call_D17BC4_if_zero(int a1) { bool v1; // zf BOOL result; // r0 v1 = a1 == 0; result = false; if ( v1 ) return asd_aux_idle_check(a1: 0); return result; } /* ==== asd_cfg_132byte_blob [tier=IDA size=92] ==== */ int __fastcall asd_cfg_132byte_blob(int a1, unsigned int *a2, int a3) { int result; // r0 void *v6; // r1 unsigned int *v7; // r0 unsigned int v8; // r2 result = 36; if ( a2 != nullptr && a3 == 132 ) { result = 7; switch ( a1 ) { case 20: case 25: v6 = off_D11448; v7 = a2; v8 = 8; goto LABEL_7; case 24: v6 = off_D11444; v7 = a2; v8 = 5; LABEL_7: result = asd_copy_dword_list(a1: v7, a2: (int)v6, a3: v8); goto LABEL_8; case 29: case 30: result = sub_D11324(a1: a2); LABEL_8: if ( result == 0 ) { if ( *a2 != 0 ) __asm { SVC 0xB4 } result = 36; } break; default: return result; } } return result; } /* ==== asd_cfg_type_2_3 [tier=MNEM size=72] ==== */ // Prepares a 0x2C-byte descriptor (word 2 = 0x1000000, high half of word 0 = 4) for // type 2 (index 0) or type 3 (index 1). int __fastcall asd_cfg_type_2_3(int a1) { int result; // r0 _DWORD v7[12]; // [sp+0h] [bp-30h] BYREF bzero_core(result: v7, a2: 0x2Cu); v7[2] = 0x1000000; HIWORD(v7[0]) = 4; if ( a1 != 2 && a1 != 3 ) return 2; result = asd_opt_cb_D49828(); if ( result == 0 ) { __asm { SVC 0xB4 } return 35; } return result; } /* ==== asd_check_fw_version [tier=EXACT size=82] ==== */ // Firmware/ASIC version gate: reads two descriptors and accepts only when the middle byte // is 0x11 and the version is 0x0B09xxxx with low byte > 0x24, or 0x0B10xxxx with low byte // > 4. Returns 3 if either descriptor read fails. int __fastcall asd_check_fw_version() { int vars0; // [sp+0h] [bp+0h] int vars4; // [sp+4h] [bp+4h] vars0 = 0; vars4 = 0; if ( asd_sysdrv_rpc_103C() != 0 || asd_sysdrv_rpc_1043() != 0 ) return 3; else return 7; } /* ==== asd_check_link_budget [tier=MNEM size=84] ==== */ // Compares the number of set bits in unk_D4288C (capped at 6) against dword_D42888; // returns 1 when the count exceeds the available budget. int __fastcall asd_check_link_budget(_DWORD *a1) { unsigned int *v2; // r5 unsigned int v3; // r6 int v4; // r1 unsigned int v5; // r0 int v7; // r0 _QWORD *v8; // r1 __int64 *v9; // r2 _BYTE *v10; // r3 __int64 v11; // r4 _BYTE v12[96]; // [sp+0h] [bp-C0h] BYREF _BYTE v13[96]; // [sp+60h] [bp-60h] BYREF asd_build_reg_addr_table_v2(a1: (int)v13, a2: (int)v12); v2 = (unsigned int *)off_D12B74; v3 = 6; v4 = *(_DWORD *)off_D12B74; if ( *(_DWORD *)off_D12B74 >= 6u ) v4 = 6; v5 = asd_count_bits_below(a1: *((_DWORD *)off_D12B74 + 1), a2: v4); if ( *v2 < 6 ) v3 = *v2; if ( v5 > v3 ) return 1; v7 = 4 * v5; *a1 = 4; a1[1] = v7; v8 = a1 + 2; v9 = (__int64 *)v13; v10 = v12; while ( v7 != 0 ) { v11 = *v9; v10 += 4; --v7; v9 = (__int64 *)((char *)v9 + 4); *v8++ = v11; } return 0; } /* ==== asd_clear_link_outputs [tier=MNEM size=262] ==== */ // Zeroes the caller's two output descriptors before a link query fills them. int __fastcall asd_clear_link_outputs(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { _BYTE *v5; // r1 unsigned int field14; // r8 int *v7; // r9 int v9; // r5 a2[5] = 0; a2[3] = 0; a2[2] = 0; a2[1] = 0; *a2 = 0; a2[4] = 0; v5 = a2 + 4; v5[3] = 0; v5[2] = 0; a3[4] = 0; a3[5] = 0; a3[2] = 0; a3[3] = 0; *a3 = 0; a3[1] = 0; a3[6] = 0; a3[7] = 0; if ( a1 == nullptr ) return 2; field14 = a1->field14; if ( *((_DWORD *)off_D07198 + 3) <= field14 ) return 2; v7 = (int *)off_D07DF4; if ( (asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07DF4 + 8), a3: a1->field14) & 0x100) == 0 ) return 1; *(_DWORD *)a2 = asd_reg_read_13B74(a1: 0, a2: v7[20], a3: field14); if ( (asd_reg_read_13B74(a1: 0, a2: v7[8], a3: field14) & 0x200) == 0 ) return 1; v9 = 0; *((_DWORD *)a2 + 1) = asd_reg_read_13B74(a1: 0, a2: v7[21], a3: field14); if ( a1->field40 == 2 ) { if ( (asd_reg_read_13B74(a1: 0, a2: v7[12], a3: field14) & 0x100) != 0 ) { *(_DWORD *)a3 = asd_reg_read_13B74(a1: 0, a2: v7[34], a3: field14); if ( (asd_reg_read_13B74(a1: 0, a2: v7[12], a3: field14) & 0x200) != 0 ) { v9 = 0; *((_DWORD *)a3 + 1) = asd_reg_read_13B74(a1: 0, a2: v7[35], a3: field14); return v9; } } return 1; } return v9; } /* ==== asd_connector_enable [tier=MNEM size=52] ==== */ // Requires the link register bit31 set (else status 8), then sets bit0 of the connector // register via asd_reg_write_19600. int __fastcall asd_connector_enable(unsigned int a1) { _DWORD *v1; // r5 v1 = off_D06458; if ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D06458 + 4), a3: a1) << 31 == 0 ) return 8; asd_reg_read_13D24(a1: v1[42], a2: a1); asd_reg_write_19600(a1: v1[42], a2: a1); return 0; } /* ==== asd_copy_dword_list [tier=EXACT size=46] ==== */ // Copies up to 0x20 dwords from a2 into a1[1..], storing the count in a1[0]. // Rejects counts above 0x20 with status 36. int __fastcall asd_copy_dword_list(unsigned int *a1, int a2, unsigned int a3) { int v3; // r3 unsigned int v4; // r4 v3 = 36; if ( a1 != nullptr && a2 != 0 && a3 <= 0x20 ) { v4 = 0; *a1 = a3; while ( v4 < a3 ) { a1[v4 + 1] = *(_DWORD *)(a2 + 4 * v4); ++v4; a3 = *a1; } return 0; } return v3; } /* ==== asd_count_bits_below [tier=EXACT size=44] ==== */ // Counts set bits of a1 at positions [0, a2), saturating at -1. int __fastcall asd_count_bits_below(unsigned int a1, int a2) { int result; // r0 unsigned int i; // r3 result = 0; for ( i = 0; a2 != i; ++i ) result += (i < 0x20) & (a1 >> i) & (result != -1); return result; } /* ==== asd_dio_apply_mask [tier=MNEM size=78] ==== */ // Feature-14 gated. Reads a DIO register, applies unk_D33304 as a set/clear mask // depending on a2, and writes it back to up to two register addresses. int __fastcall asd_dio_apply_mask(unsigned int a1, int a2) { int result; // r0 unsigned int *v4; // r6 unsigned int v5; // r0 result = asd_feature_level_check(a1: 14, a2: a1); if ( result != 0 ) { v4 = (unsigned int *)(dword_D14E0C + 4 * a1 + 32); sub_D10F6E(); asd_reg_write_1981C(a1: *v4); v5 = *(v4 - 2); if ( v5 != 0 ) asd_reg_write_1981C(a1: v5); return sub_D10F6E(); } return result; } /* ==== asd_dio_current_instance_op [tier=MNEM size=82] ==== */ // Operates on the DIO instance recorded at off_D17FF8+0x10, bounded by the instance count // at off_D17FF8+8 and the feature-14 level check; returns 10 when out of range. int __fastcall asd_dio_current_instance_op(int a1) { int result; // r0 unsigned int v2; // r1 bool v3; // cc if ( a1 == 0 || *(_DWORD *)(a1 + 64) != 6 ) return 2; result = 10; v2 = *((_DWORD *)off_D14B54 + 4); v3 = v2 > 0x7FFFFFFF; if ( v2 != 0x7FFFFFFF ) v3 = *((_DWORD *)off_D14B54 + 2) > v2; if ( v3 ) { if ( asd_feature_level_check(a1: 14, a2: v2) != 0 ) { if ( sysdrv_dram_window_describe() != 0 ) return 18; else return asd_stream_slot_update(a1: 0, a2: 0, a3: 0, a4: 1); } else { return 10; } } return result; } /* ==== asd_dio_desc_D330D0 [tier=MNEM size=90] REF-DERIVED-NAME ==== */ // Builds a 5-pointer DIO descriptor over the dword_D330D0 block with the fixed // {0,1,1,0} selector pattern. int __fastcall asd_dio_desc_D330D0() { int v0; // r2 int v1; // r3 int v3[11]; // [sp+0h] [bp-100h] BYREF _DWORD v4[43]; // [sp+2Ch] [bp-D4h] BYREF int v5[4]; // [sp+D8h] [bp-28h] BYREF char v6; // [sp+E8h] [bp-18h] int *v7; // [sp+ECh] [bp-14h] int *v8; // [sp+F0h] [bp-10h] int *v9; // [sp+F4h] [bp-Ch] int *v10; // [sp+F8h] [bp-8h] int *v11; // [sp+FCh] [bp-4h] v6 = 1; v5[2] = 1; v5[3] = 0; v5[0] = 0; v5[1] = 1; v10 = (int *)off_D13AC4; v11 = &(*off_D13AC4)[3]; v9 = &(*off_D13AC4)[2]; v8 = &(*off_D13AC4)[1]; v7 = &(*off_D13AC4)[4]; bzero_core(result: v3, a2: 0x20u); v3[9] = 0; v3[10] = 32451; v3[8] = 32450; bzero_core(result: v4, a2: 0xACu); return asd_store_link_config(a1: v5, a2: v3, a3: v0, a4: v1); } /* ==== asd_dio_desc_D33158 [tier=MNEM size=326] REF-DERIVED-NAME ==== */ // DIO descriptor builder over the block at 0xD33158 (13840792). int __fastcall asd_dio_desc_D33158() { int v1[54]; // [sp+0h] [bp-100h] BYREF int v2[4]; // [sp+D8h] [bp-28h] BYREF char v3; // [sp+E8h] [bp-18h] int v4; // [sp+ECh] [bp-14h] int v5; // [sp+F0h] [bp-10h] int v6; // [sp+F4h] [bp-Ch] int v7; // [sp+F8h] [bp-8h] int v8; // [sp+FCh] [bp-4h] v3 = 1; v2[2] = 1; v2[3] = 0x7FFFFFFF; v7 = dword_D13F10; v8 = dword_D13F10 + 20; v6 = dword_D13F10 + 12; v4 = dword_D13F10 + 28; v1[10] = 32267; v1[8] = 32266; v1[6] = 32280; v1[4] = 32288; v1[2] = 32287; v2[1] = 2; v1[0] = 32258; memset(&v1[12], 0, 16); v1[24] = 34756; v1[22] = 34755; v1[20] = 34754; v1[18] = 34753; v1[16] = 34752; v5 = dword_D13F10 + 4; v1[11] = dword_D13F14 + 9; v1[9] = dword_D13F14 + 8; v1[7] = dword_D13F14 + 22; v1[5] = dword_D13F14 + 30; v1[3] = dword_D13F14 + 29; v1[17] = dword_D13F18; v1[25] = dword_D13F18 + 4; v1[23] = dword_D13F18 + 3; v1[19] = dword_D13F18 + 1; v1[1] = dword_D13F14; v1[21] = dword_D13F18 + 2; memset(&v1[26], 0, 16); v1[30] = 32392; v1[31] = dword_D13F14 + 134; v1[32] = 32393; v1[33] = dword_D13F14 + 135; v1[34] = 32394; v1[35] = dword_D13F14 + 136; v1[36] = 32395; v1[37] = dword_D13F14 + 137; memset(&v1[38], 0, 16); v2[0] = 0; v1[42] = 32396; v1[43] = dword_D13F14 + 138; v1[44] = 32397; v1[45] = dword_D13F14 + 139; v1[46] = 32398; v1[47] = dword_D13F14 + 140; v1[48] = 32399; v1[49] = dword_D13F14 + 141; v1[50] = 32400; v1[51] = dword_D13F14 + 142; v1[52] = 32401; v1[53] = dword_D13F14 + 143; return asd_store_link_config(a1: v2, a2: v1, a3: dword_D13F14 + 137, a4: dword_D13F18 + 2); } /* ==== asd_dio_desc_D33228 [tier=MNEM size=254] REF-DERIVED-NAME ==== */ // Builds a DIO descriptor with the {1,1,1,0x7FFFFFFF} selector over the block at // 0xD33228 (13841064). int __fastcall asd_dio_desc_D33228() { int v0; // r2 int v1; // r3 int v3[11]; // [sp+0h] [bp-100h] BYREF _DWORD v4[14]; // [sp+2Ch] [bp-D4h] BYREF _DWORD v5[12]; // [sp+64h] [bp-9Ch] BYREF _DWORD v6[17]; // [sp+94h] [bp-6Ch] BYREF int v7[4]; // [sp+D8h] [bp-28h] BYREF char v8; // [sp+E8h] [bp-18h] int v9; // [sp+ECh] [bp-14h] int v10; // [sp+F0h] [bp-10h] int v11; // [sp+F4h] [bp-Ch] int v12; // [sp+F8h] [bp-8h] int v13; // [sp+FCh] [bp-4h] v8 = 1; v7[3] = 0x7FFFFFFF; v7[1] = 1; v7[2] = 1; v12 = dword_D14644; v13 = dword_D14644 + 12; v11 = dword_D14644 + 8; v9 = dword_D14644 + 16; v3[9] = 0; v3[10] = 32267; v3[7] = 0; v3[8] = 32266; v3[5] = 0; v3[6] = 32280; v3[3] = 0; v3[4] = 32288; v3[1] = 0; v3[2] = 32287; v3[0] = 32258; v10 = dword_D14644 + 4; v7[0] = 0; bzero_core(result: v4, a2: 0x14u); v4[12] = 0; v4[13] = 34756; v4[10] = 0; v4[11] = 34755; v4[8] = 0; v4[9] = 34754; v4[6] = 0; v4[7] = 34753; v4[5] = 34752; bzero_core(result: v5, a2: 0x14u); v5[10] = 0; v5[11] = 32395; v5[8] = 0; v5[9] = 32394; v5[6] = 0; v5[7] = 32393; v5[5] = 32392; bzero_core(result: v6, a2: 0x14u); v6[16] = 0; v6[14] = 0; v6[15] = 32401; v6[12] = 0; v6[13] = 32400; v6[10] = 0; v6[11] = 32399; v6[8] = 0; v6[9] = 32398; v6[6] = 0; v6[7] = 32397; v6[5] = 32396; return asd_store_link_config(a1: v7, a2: v3, a3: v0, a4: v1); } /* ==== asd_dio_disable_all [tier=MNEM size=74] ==== */ // Walks the *(off_D17FF8+8) DIO instances, and for each that passes the feature-14 level // check clears its state byte, runs asd_dio_write_clear_seq on the register at // byte_D42661[4*i+127], and reapplies the mask via asd_dio_apply_mask. int __fastcall asd_dio_disable_all(int a1) { _DWORD *v1; // r6 int v2; // r7 unsigned __int8 i; // r5 if ( a1 == 0 ) return 2; v1 = off_D14AF0; v2 = dword_D14AEC; for ( i = 0; v1[2] > (unsigned int)i; ++i ) { if ( asd_feature_level_check(a1: 14, a2: i) != 0 ) { *(_BYTE *)(v1[9] + i) = 0; asd_dio_write_clear_seq(a1: *(_DWORD *)(v2 + 4 * i + 40)); asd_dio_apply_mask(a1: i, a2: *(unsigned __int8 *)(v1[9] + i)); } } return 0; } /* ==== asd_dio_enable_all [tier=MNEM size=128] ==== */ // Companion to asd_dio_disable_all: walks the *(off_D17FF8+8) DIO instances and, for each // that passes the feature-14 check and asd_link_callback_ok, clears the state byte and // emits asd_dio_write_clear_seq on its register. int __fastcall asd_dio_enable_all(int a1) { _DWORD *v1; // r6 int v2; // r8 unsigned __int8 i; // r7 _BYTE *v4; // r0 if ( a1 == 0 ) return 2; v1 = off_D14B54; v2 = dword_D15404; for ( i = 0; v1[2] > (unsigned int)i; ++i ) { if ( asd_feature_level_check(a1: 14, a2: i) != 0 ) { *(_BYTE *)(v1[9] + i) = 0; if ( asd_link_callback_ok(a1: i) ) { asd_dio_write_clear_seq(a1: *(_DWORD *)(v2 + 4 * i + 40)); asd_dio_apply_mask(a1: i, a2: *(unsigned __int8 *)(v1[9] + i)); } asd_hdcp1_sub_1144(result: (_BYTE *)(v1[6] + 24 * i), a2: 0x10u); v4 = (_BYTE *)(v1[6] + 24 * i); v4[16] = 0; v4 += 16; v4[4] = 0; v4 += 4; v4[3] = 0; v4[2] = 0; v4[1] = 0; *(v4 - 1) = 0; *(v4 - 2) = 0; *(v4 - 3) = 0; } } return 0; } /* ==== asd_dio_entry_present [tier=IDA size=28] ==== */ BOOL __fastcall asd_dio_entry_present(unsigned int a1) { return a1 <= 3 && off_D123C4[5 * a1 + 4] != 0; } /* ==== asd_dio_idle_check [tier=MNEM size=48] ==== */ // True when idx < dword_D33300, the feature-14 level check passes, and the DIO status // register's low 2 bits are clear. BOOL __fastcall asd_dio_idle_check(unsigned int a1) { return *((_DWORD *)off_D15278 + 2) > a1 && asd_feature_level_check(a1: 14, a2: a1) != 0 && (sub_D10F6E() & 3) == 0; } /* ==== asd_dio_read_block [tier=MNEM size=116] ==== */ // Feature-14 gated, bounds a2 < dword_D33300. Reads a block through the per-link register // at byte_D42661[4*a2+151]. int __fastcall asd_dio_read_block(struct asd_link_caps *a1, unsigned int a2) { int v4; // r1 int result; // r0 _DWORD *v6; // r1 unsigned int v7; // r2 unsigned int v8; // r3 unsigned int v9; // r2 unsigned int v10; // r3 unsigned int v11; // r2 unsigned int v12; // r3 unsigned int v13; // r2 unsigned int v14; // r3 unsigned int v15; // r1 unsigned int v16; // r2 if ( *((_DWORD *)off_D150BC + 2) <= a2 ) return 2; v4 = asd_feature_level_check(a1: 14, a2); result = 2; if ( a1 != nullptr && v4 != 0 ) { v6 = (_DWORD *)(dword_D150C0 + 4 * a2); result = 0; v7 = v6[16]; v8 = 4 * v7; if ( v7 >> 30 != 0 ) v8 = 0; a1->field04 = v8; v9 = v6[18]; v10 = 4 * v9; if ( v9 >> 30 != 0 ) v10 = 0; a1->field0C = v10; v11 = v6[20]; v12 = 4 * v11; if ( v11 >> 30 != 0 ) v12 = 0; a1->field10 = v12; v13 = v6[22]; v14 = 4 * v13; if ( v13 >> 30 != 0 ) v14 = 0; a1->field14 = v14; v15 = v6[24]; LOWORD(a1->unk00) = 4; v16 = 4 * v15; if ( v15 >> 30 != 0 ) v16 = 0; a1->field18 = v16; } return result; } /* ==== asd_dio_read_block10 [tier=MNEM size=124] ==== */ // Feature-14 gated block read (10 words) through the per-link register at // byte_D42661[4*idx+127]. int __fastcall asd_dio_read_block10(_DWORD *a1, unsigned int a2) { int v4; // r1 int result; // r0 unsigned int v6; // r1 int v7; // r0 bool v8; // zf int v9; // r1 int v10; // r0 int v11; // r3 int i; // r2 if ( *((_DWORD *)off_D14F54 + 2) <= a2 ) return 2; v4 = asd_feature_level_check(a1: 14, a2); result = 2; if ( a1 != nullptr && v4 != 0 ) { *a1 = 10; v6 = *(_DWORD *)(dword_D14F58 + 4 * a2 + 40); v7 = 4 * v6; v8 = v6 >> 30 == 0; v9 = 1; if ( !v8 ) v7 = 0; while ( v9 != 11 ) a1[2 * v9++] = v7; v10 = dword_D14CF4; v11 = 0; a1[3] = dword_D14CF4; while ( v11 != 4 ) a1[2 * v11++ + 5] = 0; a1[13] = v10 + 16; for ( i = 0; i != 4; ++i ) a1[2 * i + 15] = 0; return 0; } return result; } /* ==== asd_dio_read_pair [tier=MNEM size=106] ==== */ // Feature-14 gated: reads the DIO status register and splits it into the caller's two // outputs. int __fastcall asd_dio_read_pair(unsigned int a1, char *a2, _BYTE *a3) { int v5; // r0 int v6; // r5 int v7; // r8 int v8; // r0 unsigned int v9; // r0 char v10; // r1 unsigned int v11; // r1 if ( *((_DWORD *)off_D15278 + 2) <= a1 ) return 0; v5 = asd_feature_level_check(a1: 14, a2: a1); v6 = 0; if ( a3 != nullptr && a2 != nullptr && v5 != 0 ) { v6 = 0; *a2 = 0; *a3 = 0; v7 = sub_D10F6E(); v8 = sub_D10F6E(); if ( v7 != v8 ) { v9 = v8 ^ v7; v10 = v9; if ( (_WORD)v9 != 0 ) v10 = 1; *a2 = v10; v11 = HIWORD(v9); v6 = 1; if ( HIWORD(v9) != 0 ) LOBYTE(v11) = 1; *a3 = v11; } } return v6; } /* ==== asd_dio_set_pair [tier=MNEM size=78] ==== */ // Feature-14 gated per-instance DIO write: composes a 32-bit value from two reads of // asd_reg_read_1417E and stores it into the instance's register pair. int __fastcall asd_dio_set_pair(unsigned int a1, int a2, int a3) { unsigned int v4; // r7 if ( MEMORY[0xD2F280] <= a1 || asd_feature_level_check(a1: 14, a2: a1) == 0 ) return 2; v4 = dword_D147E0 + 4 * a1; sub_D10F6E(); sub_D10F6E(); asd_reg_write_1981C(a1: *(_DWORD *)(v4 + 16)); return 0; } /* ==== asd_dio_write_clear_seq [tier=EXACT size=74] ==== */ // Emits a fixed 10-word clear sequence to a DIO register: 0x1000100, four zeroes, // 0x1000110, then four more zeroes. int __fastcall asd_dio_write_clear_seq(unsigned int a1) { void (__fastcall *v2)(unsigned int); // r6 v2 = (void (__fastcall *)(unsigned int))off_D14CF8; off_D14CF8(a1, a2: dword_D14CF4); v2(a1); v2(a1); v2(a1); v2(a1); v2(a1); v2(a1); v2(a1); v2(a1); return ((unsigned int (__fastcall *)(unsigned int))v2)(a1); } /* ==== asd_dio_write_packed [tier=MNEM size=158] ==== */ // Feature-14 gated: packs the caller's byte array into 32-bit words and writes them to the // per-link registers at byte_D42661[4*idx+207]... int __fastcall asd_dio_write_packed(unsigned int a1, unsigned __int8 *a2) { int v4; // r1 int result; // r0 _DWORD *v6; // r6 void (__fastcall *v7)(unsigned int); // r5 if ( *((_DWORD *)off_D15400 + 2) <= a1 ) return 2; v4 = asd_feature_level_check(a1: 14, a2: a1); result = 2; if ( a2 != nullptr && v4 != 0 ) { v6 = (_DWORD *)(dword_D15404 + 4 * a1); v7 = (void (__fastcall *)(unsigned int))off_D15408; off_D15408(a1: v6[30], a2: *a2 | (a2[1] << 8) | ((a2[2] | (a2[3] << 8)) << 16)); v7(a1: v6[32]); v7(a1: v6[34]); v7(a1: v6[36]); return 0; } return result; } /* ==== asd_dio_write_verify [tier=MNEM size=96] ==== */ // Feature-14 gated DIO register write with verification: rejects with 38 if the status // register's bit30 is set, writes, re-reads, and on mismatch waits (SVC 0x56) and retries // once before reporting the difference. int __fastcall asd_dio_write_verify(unsigned int a1, int a2, unsigned int a3) { int result; // r0 if ( *((_DWORD *)off_D15400 + 2) <= a3 || asd_feature_level_check(a1: 14, a2: a3) == 0 ) return 2; if ( sub_D10F6E() << 30 != 0 ) return 38; asd_reg_write_1981C(a1); if ( sub_D10F6E() == a2 ) return 0; __asm { SVC 0x56 ; 'V' } asd_reg_write_1981C(a1); result = sub_D10F6E() - a2; if ( result != 0 ) return 38; return result; } /* ==== asd_dispatch [tier=DISPATCH size=1306] ==== */ unsigned int __fastcall asd_dispatch(struct asd_req *req, int a2, int a3, int a4) { int *v4; // r7 int v6; // r0 int v7; // r2 unsigned int rpc_id; // r6 int link_info; // r0 void (__fastcall *v14)(int, int, int, int); // r5 int v15; // r3 unsigned int v16; // r4 int v17; // r3 void (__fastcall *v18)(int, int, int, int); // r5 int v19; // r3 int v20; // r3 int v21; // r3 if ( req != nullptr ) { v4 = off_D018D4; v6 = off_D018D4[1]; v7 = v6 + 1; if ( v6 != -1 ) __asm { SVC 0x5E ; '^' } rpc_id = req->rpc_id; switch ( req->rpc_id ) { case 0x180u: link_info = sub_D0D144(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x181u: link_info = sub_D0D408(a1: req->arg1, a2: LOBYTE(req->arg2), a3: v7); goto LABEL_109; case 0x182u: link_info = sub_D0D21C(a1: req->arg1, a2: req->arg2, a3: req->arg3); goto LABEL_109; case 0x183u: link_info = sub_D0D2D0(a1: req->arg1, a2: req->arg2, a3: req->arg3); goto LABEL_109; case 0x184u: link_info = sub_D0D278(a1: req->arg1, a2: req->arg2, a3: req->arg3); goto LABEL_109; case 0x185u: link_info = sub_D0D470(a1: req->arg1, a2: req->arg2, a3: req->arg3); goto LABEL_109; case 0x186u: link_info = sub_D0CEC4(a1: req->arg1, a2: LOWORD(req->arg2), a3: HIWORD(req->arg2)); goto LABEL_109; case 0x187u: link_info = sub_D0D010(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x188u: link_info = sub_D0D0A4(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x189u: link_info = asd_hdcp1_disable(a1: req->arg1); goto LABEL_109; case 0x18Au: link_info = sub_D0D4C8(a1: req->arg1, a2: LOWORD(req->arg2), a3: v7); goto LABEL_109; case 0x18Bu: link_info = sub_D0CE74(a1: req->arg1, a2: LOBYTE(req->arg2), a3: v7); goto LABEL_109; case 0x18Cu: link_info = sub_D0D520(a1: req->arg1, a2: req->arg2, a3: req->arg3, a4: req->arg4); goto LABEL_109; case 0x18Du: case 0x190u: case 0x191u: case 0x192u: case 0x193u: case 0x194u: case 0x195u: case 0x196u: case 0x197u: case 0x198u: case 0x199u: case 0x19Au: case 0x19Bu: case 0x19Cu: case 0x19Du: case 0x19Eu: case 0x19Fu: case 0x1ABu: case 0x1ACu: case 0x1ADu: case 0x1AEu: case 0x1AFu: case 0x1B0u: case 0x1B1u: case 0x1B2u: case 0x1B3u: case 0x1B4u: case 0x1B5u: case 0x1B6u: case 0x1B7u: case 0x1B8u: case 0x1B9u: case 0x1BAu: case 0x1BBu: case 0x1BCu: case 0x1BDu: case 0x1BEu: case 0x1BFu: LABEL_104: v16 = 4; goto LABEL_110; case 0x18Eu: link_info = sub_D0CD28(a1: req->arg1, a2: req->arg2, a3: LOBYTE(req->arg3), a4: req->arg4); goto LABEL_109; case 0x18Fu: link_info = asd_hdcp1_teardown(a1: req->arg1); goto LABEL_109; case 0x1A0u: link_info = sub_D0DAD0(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x1A1u: link_info = sub_D0D898(a1: req->arg1, a2: req->arg2, a3: req->arg3); goto LABEL_109; case 0x1A2u: link_info = asd_hdcp2_disable(a1: req->arg1); goto LABEL_109; case 0x1A3u: link_info = sub_D0DBE4(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x1A4u: link_info = sub_D0DC14(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x1A5u: link_info = sub_D0DA04(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x1A6u: link_info = sub_D0D974(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x1A7u: link_info = sub_D0D5CC(a1: req->arg1, a2: (int *)req->arg2, a3: LOBYTE(req->arg3), a4: (_DWORD *)req->arg4); goto LABEL_109; case 0x1A8u: link_info = sub_D0DB78(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x1A9u: link_info = sub_D0B1F0(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x1AAu: link_info = sub_D0DF14(a1: (int *)req->arg1, a2: LOBYTE(req->arg2)); goto LABEL_109; case 0x1C0u: link_info = sub_D0A870(a1: req->arg1, a2, a3: v7); LABEL_109: v16 = link_info; LABEL_110: if ( v4[1] != -1 ) __asm { SVC 0x5F ; '_' } if ( v16 != 0 ) { v18 = (void (__fastcall *)(int, int, int, int))off_D018D8; off_D018D8(a1: 227, a2: 1, a3: 61440); v18(a1: 227, a2: 1, a3: HIWORD(v16), a4: v19); v18(a1: 227, a2: 1, a3: (unsigned __int16)v16, a4: v20); if ( rpc_id <= 0xFFFE ) asd_log_event(a1: 227, a2: 1, a3: (unsigned __int16)rpc_id, a4: v21); } else { v16 = 0; } break; default: switch ( rpc_id ) { case 0x200u: link_info = sub_D11984(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x201u: link_info = sub_D127B0(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x202u: link_info = asd_svc_op_202(a1: req->arg1, a2: req->arg2, a3: req->arg3, a4: (unsigned int *)req->arg4); goto LABEL_109; case 0x203u: link_info = sub_D12080(a1: req->arg1, a2: req->arg2, a3: req->arg3); goto LABEL_109; case 0x204u: link_info = sub_D11A2C(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x205u: v16 = sub_D11620(a1: req->arg1, a2: req->arg2, a3: v7); if ( sub_D122C4() == 0 && req->arg1 == 1 ) asd_session_op57(); goto LABEL_110; case 0x206u: v16 = sub_D11678(a1: req->arg1, a2: req->arg2, a3: v7); if ( sub_D122C4() == 0 && req->arg1 == 1 && !asd_dio_entry_present(a1: 1u) ) asd_session_timeout_disable(); goto LABEL_110; case 0x207u: link_info = asd_svc_op_207(a1: req->arg1); goto LABEL_109; case 0x208u: link_info = asd_log_event(a1: LOBYTE(req->arg1), a2: BYTE1(req->arg1), a3: HIWORD(req->arg1), a4); goto LABEL_109; case 0x209u: link_info = sub_D122C4(); goto LABEL_109; case 0x20Au: link_info = sub_D12128(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x20Bu: link_info = asd_svc_op_20B(a1: (BOOL *)req->arg1); goto LABEL_109; default: switch ( rpc_id ) { case 0x100u: link_info = sub_D0E03C(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x101u: link_info = asd_topology_remove(a1: req->arg1); goto LABEL_109; case 0x102u: link_info = sub_D0B16C(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x103u: link_info = sub_D0B294(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x104u: link_info = sub_D0B2B4(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x105u: link_info = sub_D0B14C(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x106u: goto LABEL_104; case 0x107u: link_info = asd_get_link_info(a1: req->arg1, a2: (unsigned int *)req->arg2); goto LABEL_109; case 0x108u: link_info = sub_D0B12C(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x109u: link_info = sub_D0B18C(a1: req->arg1, a2, a3: v7); goto LABEL_109; case 0x10Au: link_info = sub_D0DE28(a1: req->arg1, a2: req->arg2, a3: v7); goto LABEL_109; case 0x10Bu: link_info = sub_D0DE64(a1: LOBYTE(req->arg1), a2: req->arg2, a3: req->arg3, a4: req->arg4); goto LABEL_109; default: switch ( rpc_id ) { case 0x300u: link_info = asd_srm_read( a1: (int *)req->arg1, a2: req->arg2, a3: (_DWORD *)req->arg3, a4: (_BYTE *)req->arg4); break; case 0x301u: link_info = asd_srm_op_301( a1: req->arg1, a2: req->arg2, a3: (int *)req->arg3, a4, a5: a2, a6: a3, a7: a4); break; case 0x302u: link_info = sub_D1011C(a1: req->arg1, a2, a3: v7); break; case 0x303u: link_info = sub_D101A4(a1: req->arg1, a2, a3: v7); break; case 0x304u: link_info = asd_op_304(a1: rpc_id - 768, a2); break; case 0x305u: link_info = asd_op_305(a1: req->arg1); break; case 0x306u: link_info = asd_op_306(); break; case 0x307u: link_info = asd_revocation_check_ksv(a1: req->arg1); break; case 0x308u: link_info = asd_srm_store( a1: req->arg1, a2: (int *)req->arg2, a3: (unsigned int *)req->arg3, a4: (_BYTE *)req->arg4); break; case 0x309u: link_info = asd_op_309(a1: (unsigned int *)req->arg1); break; default: switch ( rpc_id ) { case 0xFFFF0000: case 0xFFFF0004: if ( a2 != 0 ) goto LABEL_104; __asm { SVC 0x5E ; '^' } LABEL_29: v16 = 0; goto LABEL_110; case 0xFFFF0001: if ( a2 != 0 ) goto LABEL_104; v16 = sub_D02590(); __asm { SVC 0x5F ; '_' } goto LABEL_110; case 0xFFFF0002: if ( a2 != 0 ) goto LABEL_104; link_info = sub_D024C8(); goto LABEL_109; case 0xFFFF0003: goto LABEL_104; case 0xFFFF0005: if ( a2 != 0 ) goto LABEL_104; v16 = sub_D025C4(); __asm { SVC 0x5F ; '_' } goto LABEL_110; case 0xFFFF0006: if ( a2 != 0 ) goto LABEL_104; __asm { SVC 0x5E ; '^' } link_info = sub_D02604(a1: off_D018D4[2], a2: 0, a3: v7); goto LABEL_109; case 0xFFFF0007: if ( a2 != 0 ) goto LABEL_104; v16 = sub_D0260C(); __asm { SVC 0x5F ; '_' } goto LABEL_110; default: switch ( rpc_id ) { case 0x402u: __asm { SVC 0x8D; jumptable 00D0157E case 1026 } if ( ((rpc_id - 1026) | 1) != 3 ) goto LABEL_29; link_info = asd_platform_op_402(a1: LOBYTE(req->arg1)); goto LABEL_109; case 0x403u: link_info = asd_platform_op_403( a1: LOBYTE(req->arg1), a2: BYTE1(req->arg1), a3: (_DWORD *)req->arg2, a4: req->arg3, a5: req->arg4, a6: req->arg5); goto LABEL_109; case 0x404u: link_info = asd_platform_op_404( a1: LOBYTE(req->arg1), a2: BYTE1(req->arg1), a3: (unsigned int *)req->arg2, a4: &req->arg3, a5: &req->arg4, a6: req->arg5); goto LABEL_109; case 0x405u: link_info = sub_D10838(a1: &req->arg1, a2, a3: v7); goto LABEL_109; default: switch ( rpc_id ) { case 0x160u: link_info = asd_link_reset(a1: req->arg1, a2: req->arg2); goto LABEL_109; case 0x161u: link_info = asd_get_link_status( a1: req->arg1, a2: (int *)req->arg2, a3: (_DWORD *)req->arg3, a4: (_DWORD *)req->arg4, a5: *(_DWORD **)&req->arg5); goto LABEL_109; case 0x800u: goto LABEL_29; default: break; } if ( rpc_id != 2049 ) { _ZF = rpc_id == 2050; if ( rpc_id == 2050 ) _ZF = a2 == 0; if ( _ZF ) { link_info = asd_op_802(a1: (_DWORD *)req->arg1); goto LABEL_109; } goto LABEL_104; } if ( a2 != 0 ) goto LABEL_104; link_info = sub_D11F48(a1: req->arg1, a2: req->arg2, a3: v7); break; } goto LABEL_109; } } goto LABEL_109; } } } } else { v14 = (void (__fastcall *)(int, int, int, int))off_D018D8; off_D018D8(a1: 227, a2: 1, a3: 61440); v14(a1: 227, a2: 1, a3: 0, a4: v15); v16 = 2; v14(a1: 227, a2: 1, a3: 2, a4: v17); } return v16; } /* ==== asd_encoder_enable_seq [tier=MNEM size=1072] ==== */ // Per-signal-type (switch on ctx+40) display encoder bring-up sequence: DIO register // read-modify-writes via asd_reg_* with SVC 0x56 (kernel wait) between steps. // sub_D08BD0 is a near-identical sibling for another variant. int __fastcall asd_encoder_enable_seq(struct asd_link_cfg *a1, char *a2, char *a3) { unsigned int field28; // r10 __int64 v5; // kr00_8 int *v8; // r7 unsigned int v9; // r6 int v10; // r0 int v15; // r6 int *v16; // r7 unsigned int v17; // r6 int v18; // r0 int _13B74; // r0 void (__fastcall *v20)(int, int, unsigned int); // r4 _DWORD *v21; // r7 void (__fastcall *v22)(int, int, unsigned int); // r4 unsigned int v23; // r6 int v24; // r0 unsigned int field40; // r0 _DWORD *v26; // r4 int v27; // r1 _DWORD *v28; // r7 _DWORD *v29; // r4 int v30; // r0 _DWORD *v31; // r7 _DWORD *v32; // r5 unsigned int v33; // r7 int v34; // r0 _DWORD *v35; // r4 _DWORD *v36; // r5 int v37; // r0 _DWORD *v38; // r4 unsigned int v39; // r7 _DWORD *v40; // r8 int v41; // r0 _DWORD *v42; // r5 unsigned int v43; // r7 if ( a1 == nullptr ) return 2; field28 = a1->field28; v5 = *(_QWORD *)&a1->field14; switch ( field28 ) { case 0x10u: v8 = (int *)off_D08434; if ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D08434 + 4), a3: v5) << 31 != 0 ) { v9 = asd_reg_read_13974(a1: v8[95], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v8[94], a2: v9); asd_reg_write_19394(a1: v8[94], a2: v9); v10 = v8[97]; if ( v10 != 0 ) { asd_reg_read_13974(a1: v10, a2: v9); asd_reg_write_19328(a1: v8[97], a2: v9); } asd_reg_read_13B74(a1: 0, a2: v8[40], a3: v5); asd_reg_write_1946C(a1: 0, a2: v8[40], a3: v5); asd_reg_read_13B74(a1: 0, a2: v8[59], a3: v5); if ( a1->field40 == 3 ) asd_reg_write_1946C(a1: 0, a2: v8[59], a3: v5); asd_reg_write_1946C(a1: 0, a2: v8[59], a3: v5); __asm { SVC 0x56 ; 'V' } asd_reg_write_1946C(a1: 0, a2: v8[59], a3: v5); break; } return 8; case 0x30u: v21 = off_D07878; if ( asd_reg_read_13BF8(a1: *((_DWORD *)off_D07878 + 99), a2: HIDWORD(v5)) << 31 == 0 ) return 8; v22 = (void (__fastcall *)(int, int, unsigned int))off_D0787C; off_D0787C(a1: 2, a2: v21[75], a3: v5, a4: 16); v22(a1: 2, a2: v21[75], a3: v5); __asm { SVC 0x56 ; 'V' } v22(a1: 2, a2: v21[75], a3: v5); v23 = asd_reg_read_13BF8(a1: v21[100], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v21[94], a2: v23); asd_reg_write_19394(a1: v21[94], a2: v23); v24 = v21[101]; if ( v24 != 0 ) { asd_reg_read_13BF8(a1: v24, a2: v23); asd_reg_write_19524(a1: v21[101], a2: v23); } break; case 0x20u: v16 = (int *)off_D07878; if ( asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D07878 + 85), a3: v5) << 31 == 0 ) return 8; v17 = asd_reg_read_13974(a1: v16[96], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v16[94], a2: v17); asd_reg_write_19394(a1: v16[94], a2: v17); v18 = v16[98]; if ( v18 != 0 ) { asd_reg_read_13974(a1: v18, a2: 0); asd_reg_write_19328(a1: v16[98], a2: 0); } _13B74 = asd_reg_read_13B74(a1: 1, a2: v16[67], a3: v5); v20 = (void (__fastcall *)(int, int, unsigned int))off_D0787C; off_D0787C(a1: 1, a2: v16[67], a3: v5, a4: _13B74 | 0x10); __asm { SVC 0x56 ; 'V' } v20(a1: 1, a2: v16[67], a3: v5); asd_reg_read_13B74(a1: 1, a2: v16[87], a3: v5); v20(a1: 1, a2: v16[87], a3: v5); break; default: break; } v15 = ((int (__fastcall *)(struct asd_link_cfg *, char *, char *))loc_D08438)(a1, a2, a3); field40 = a1->field40; if ( field40 - 1 >= 3 ) { if ( field40 == 4 ) { v31 = off_D07878; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07878 + 59), a3: v5); asd_reg_read_13B74(a1: 0, a2: v31[47], a3: v5); asd_reg_write_1946C(a1: 0, a2: v31[47], a3: v5); v27 = v31[59]; } else { if ( field40 != 5 ) return 1; if ( field28 != 16 ) goto LABEL_32; v28 = off_D07878; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07878 + 59), a3: v5); asd_reg_read_13B74(a1: 0, a2: v28[47], a3: v5); asd_reg_write_1946C(a1: 0, a2: v28[59], a3: v5); v27 = v28[47]; } goto LABEL_30; } if ( field28 == 16 ) { v26 = off_D07878; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07878 + 41), a3: v5); v27 = v26[41]; LABEL_30: v30 = 0; goto LABEL_31; } if ( field28 == 32 ) { v29 = off_D07878; asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D07878 + 86), a3: v5); v27 = v29[86]; v30 = 1; LABEL_31: asd_reg_write_1946C(a1: v30, a2: v27, a3: v5); } LABEL_32: if ( v15 == 0 ) { switch ( field28 ) { case 0x10u: v32 = off_D07878; v33 = 0; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07878 + 59), a3: v5); asd_reg_write_1946C(a1: 0, a2: v32[59], a3: v5); v34 = asd_reg_read_13B74(a1: 0, a2: v32[59], a3: v5); v35 = off_D07880; v15 = 0; while ( (v34 & 0x10000000) == 0 && v35[12] > v33 ) { __asm { SVC 0x56 ; 'V' } v34 = asd_reg_read_13B74(a1: 0, a2: v32[59], a3: v5); ++v33; } break; case 0x30u: v40 = off_D087B8; asd_reg_read_13B74(a1: 2, a2: *((_DWORD *)off_D087B8 + 75), a3: v5); asd_reg_write_1946C(a1: 2, a2: v40[75], a3: v5); v41 = asd_reg_read_13B74(a1: 2, a2: v40[75], a3: v5); v42 = off_D07880; v43 = 0; v15 = 0; while ( (v41 & 0x10000000) == 0 && v42[12] > v43 ) { __asm { SVC 0x56 ; 'V' } v41 = asd_reg_read_13B74(a1: 2, a2: v40[75], a3: v5); ++v43; } break; case 0x20u: v36 = off_D07BA0; asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D07BA0 + 67), a3: v5); asd_reg_write_1946C(a1: 1, a2: v36[67], a3: v5); v37 = asd_reg_read_13B74(a1: 1, a2: v36[67], a3: v5); v38 = off_D07880; v39 = 0; v15 = 0; while ( (v37 & 0x10000000) == 0 && v38[12] > v39 ) { __asm { SVC 0x56 ; 'V' } v37 = asd_reg_read_13B74(a1: 1, a2: v36[67], a3: v5); ++v39; } break; default: return 0; } } return v15; } /* ==== asd_encoder_enable_seq_v3 [tier=MNEM size=796] ==== */ // Third form of the encoder bring-up sequence: per-signal-type switch resolving the lane // via unk_D42588 and driving the unk_D42408 register group. int __fastcall asd_encoder_enable_seq_v3(struct asd_link_cfg *a1, int a2, __int16 a3) { unsigned int field28; // r8 __int64 v5; // kr00_8 int *v6; // r7 unsigned int v7; // r6 int v8; // r0 int *v14; // r7 unsigned int v15; // r6 int v16; // r0 int _13B74; // r0 void (__fastcall *v18)(int, int, unsigned int); // r9 _DWORD *v19; // r7 void (__fastcall *v20)(int, int, unsigned int); // r9 unsigned int v21; // r6 int v22; // r0 unsigned int field40; // r0 _DWORD *v24; // r6 int v25; // r1 _DWORD *v26; // r8 _DWORD *v27; // r6 int v28; // r0 _DWORD *v29; // r7 if ( a1 == nullptr ) return 2; field28 = a1->field28; v5 = *(_QWORD *)&a1->field14; switch ( field28 ) { case 0x10u: v6 = (int *)off_D07BA0; if ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07BA0 + 4), a3: v5) << 31 != 0 ) { v7 = asd_reg_read_13974(a1: v6[95], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v6[94], a2: v7); asd_reg_write_19394(a1: v6[94], a2: v7); v8 = v6[97]; if ( v8 != 0 ) { asd_reg_read_13974(a1: v8, a2: v7); asd_reg_write_19328(a1: v6[97], a2: v7); } asd_reg_read_13B74(a1: 0, a2: v6[40], a3: v5); asd_reg_write_1946C(a1: 0, a2: v6[40], a3: v5); asd_reg_read_13B74(a1: 0, a2: v6[59], a3: v5); if ( a1->field40 == 3 ) asd_reg_write_1946C(a1: 0, a2: v6[59], a3: v5); asd_reg_write_1946C(a1: 0, a2: v6[59], a3: v5); __asm { SVC 0x56 ; 'V' } asd_reg_write_1946C(a1: 0, a2: v6[59], a3: v5); break; } return 8; case 0x30u: v19 = off_D07DF4; if ( asd_reg_read_13BF8(a1: *((_DWORD *)off_D07DF4 + 99), a2: HIDWORD(v5)) << 31 == 0 ) return 8; v20 = (void (__fastcall *)(int, int, unsigned int))off_D07BA4; off_D07BA4(a1: 2, a2: v19[75], a3: v5, a4: 16); v20(a1: 2, a2: v19[75], a3: v5); __asm { SVC 0x56 ; 'V' } v20(a1: 2, a2: v19[75], a3: v5); v21 = asd_reg_read_13BF8(a1: v19[100], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v19[94], a2: v21); asd_reg_write_19394(a1: v19[94], a2: v21); v22 = v19[101]; if ( v22 != 0 ) { asd_reg_read_13BF8(a1: v22, a2: v21); asd_reg_write_19524(a1: v19[101], a2: v21); } break; case 0x20u: v14 = (int *)off_D07BA0; if ( asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D07BA0 + 85), a3: v5) << 31 == 0 ) return 8; v15 = asd_reg_read_13974(a1: v14[96], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v14[94], a2: v15); asd_reg_write_19394(a1: v14[94], a2: v15); v16 = v14[98]; if ( v16 != 0 ) { asd_reg_read_13974(a1: v16, a2: 0); asd_reg_write_19328(a1: v14[98], a2: 0); } _13B74 = asd_reg_read_13B74(a1: 1, a2: v14[67], a3: v5); v18 = (void (__fastcall *)(int, int, unsigned int))off_D07BA4; off_D07BA4(a1: 1, a2: v14[67], a3: v5, a4: _13B74 | 0x10); __asm { SVC 0x56 ; 'V' } v18(a1: 1, a2: v14[67], a3: v5); asd_reg_read_13B74(a1: 1, a2: v14[87], a3: v5); v18(a1: 1, a2: v14[87], a3: v5); break; default: break; } field40 = a1->field40; if ( field40 - 1 < 3 ) { if ( field28 == 16 ) { v24 = off_D07E90; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07E90 + 41), a3: v5); v25 = v24[41]; LABEL_30: v28 = 0; goto LABEL_31; } if ( field28 == 32 ) { v27 = off_D07E90; asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D07E90 + 86), a3: v5); v25 = v27[86]; v28 = 1; LABEL_31: asd_reg_write_1946C(a1: v28, a2: v25, a3: v5); return 7; } return 7; } if ( field40 == 4 ) { v29 = off_D07E90; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07E90 + 59), a3: v5); asd_reg_read_13B74(a1: 0, a2: v29[47], a3: v5); asd_reg_write_1946C(a1: 0, a2: v29[47], a3: v5); v25 = v29[59]; goto LABEL_30; } if ( field40 == 5 ) { if ( field28 == 16 ) { v26 = off_D08A48; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D08A48 + 59), a3: v5); asd_reg_read_13B74(a1: 0, a2: v26[47], a3: v5); asd_reg_write_1946C(a1: 0, a2: v26[59], a3: v5); v25 = v26[47]; goto LABEL_30; } return 7; } return 1; } /* ==== asd_encoder_query [tier=MNEM size=186] ==== */ // Switch on the descriptor's signal type (48 / 16): validates the encoder state and // reports the encoder/connector pairing. int __fastcall asd_encoder_query(_DWORD *a1, int a2, __int16 a3) { unsigned int v4; // r5 int v5; // r0 int v6; // r1 __int16 v7; // r2 unsigned int v9; // r6 int _13BF8; // r0 int v11; // r0 if ( a1 == nullptr ) return 2; v4 = a1[5]; v5 = a1[10]; switch ( v5 ) { case 48: v9 = a1[6]; if ( a1[8] != 0 && asd_encoder_state_check(a1: v4) == 0 ) { v11 = a1[19]; goto LABEL_29; } _13BF8 = asd_reg_read_13BF8(a1: *((_DWORD *)off_D06794 + 99), a2: v9); break; case 32: _13BF8 = asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D06794 + 83), a3: v4); break; case 16: switch ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D06794 + 3), a3: v4) & 7 ) { case 0: if ( a1[8] != 0 && asd_reg_read_13D24_cfg0(a1: v4, a2: v6, a3: v7) == 0 ) { if ( a1[19] != 4 ) return 17; } else if ( a1[19] != 3 ) { return 17; } v11 = a1[16]; break; case 1: case 4: case 6: case 7: return 0; case 2: if ( a1[16] == 1 && a1[19] == 1 ) return 0; return 17; case 3: if ( a1[16] == 3 && a1[19] == 2 ) return 0; return 17; case 5: if ( a1[16] == 5 && a1[19] == 3 ) return 0; return 17; } LABEL_29: if ( v11 == 4 ) return 0; return 17; default: return 2; } if ( _13BF8 << 31 == 0 ) return 17; return 0; } /* ==== asd_encoder_state_check [tier=IDA size=26] ==== */ int __fastcall asd_encoder_state_check(unsigned int a1) { int result; // r0 result = (asd_reg_read_13CDC(a1: *((_DWORD *)off_D064C0 + 117), a2: a1) & 0x31) - 33; if ( result != 0 ) return 19; return result; } /* ==== asd_event_dispatch [tier=IDA size=788] ==== */ unsigned int asd_event_dispatch() { int *v0; // r8 _DWORD *v4; // r9 int v5; // r0 int v6; // r1 int v7; // r1 void (__fastcall *v8)(int, int, int, int); // r5 int v9; // r3 unsigned int v10; // r4 int v11; // r3 void (__fastcall *v12)(int, int, int, int); // r5 int v13; // r3 int v14; // r3 int v15; // r0 int v16; // r1 void (__fastcall *v17)(int, int, int, int); // r5 int v18; // r3 int v19; // r3 void (__fastcall *v20)(int, int, int, int); // r5 int v21; // r3 int v22; // r3 int v24; // r0 int v25; // r0 int v26; // r4 int v27; // r1 int v28; // r0 void (__fastcall *v29)(int, int, int, int); // r5 int v30; // r3 int v31; // r3 unsigned int *v32; // r5 unsigned int v33; // r7 int v34; // r0 int v35; // r1 unsigned int v36; // r0 unsigned int v38; // r0 void (__fastcall *v41)(int, int); // r5 int v42; // r1 int v43; // r1 int v44; // r1 int v45; // r1 void (__fastcall *v46)(int, int, int, int); // r5 int v47; // r3 int v48; // r3 int v49; // [sp+8h] [bp-9Ch] BYREF int v50; // [sp+Ch] [bp-98h] BYREF unsigned int v51; // [sp+10h] [bp-94h] BYREF int v52; // [sp+14h] [bp-90h] BYREF int v53; // [sp+18h] [bp-8Ch] BYREF unsigned int v54; // [sp+1Ch] [bp-88h] BYREF _DWORD v55[32]; // [sp+20h] [bp-84h] BYREF unsigned int v56; // [sp+A0h] [bp-4h] BYREF v56 = 0; bzero_core(result: v55, a2: 0x80u); v0 = off_D127A4; v54 = 0; if ( *off_D127A4 != -1 ) __asm { SVC 0x5E ; '^' } v4 = off_D128E4; *(_DWORD *)off_D128E4 = 0; if ( asd_svc_sub_2794() ) { v5 = asd_link_check_C930(a1: &v56); if ( v5 == 15 ) { *v4 = 2; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } sub_D128A8(a1: 0, a2: *v0 + 1); v20 = (void (__fastcall *)(int, int, int, int))off_D127A8; off_D127A8(a1: 227, a2: 1, a3: 61440); v20(a1: 227, a2: 1, a3: 0, a4: v21); v10 = 15; v20(a1: 227, a2: 1, a3: 15, a4: v22); } else if ( v5 != 0 || (v5 = v56 - 1, v56 - 1 < 0x1F) ) { v15 = asd_op_304(a1: v5, a2: v6); if ( v15 != 0 ) { v10 = v15; *v4 = 4; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } sub_D128A8(a1: 0, a2: *v0 + 1); } else { v24 = sub_D128A8(a1: 0, a2: v16); if ( v24 != 0 ) { v10 = v24; *v4 = 4; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } } else { v25 = v4[1]; v26 = v25 + 1; if ( v25 == -1 ) { v29 = (void (__fastcall *)(int, int, int, int))off_D127A8; off_D127A8(a1: 227, a2: 1, a3: 61440); v29(a1: 227, a2: 1, a3: 0, a4: v30); v10 = 2; v29(a1: 227, a2: 1, a3: 2, a4: v31); return v10; } sub_D15F70(a1: v25 + 1, a2: 1000); if ( v27 != 0 ) v27 = v26; v4[1] = v27; v28 = sub_D128A8(a1: 1, a2: v27); if ( v28 != 0 ) { v10 = v28; *v4 = 4; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } } else { v32 = v55; v10 = 0; v33 = 0; v4[2] = 0; v4[3] = 0; v4[4] = 0; v4[5] = 0; while ( v33 < v56 ) { if ( asd_feature_enabled_cfg0(a1: v33, a2: v32) != 0 ) { *v4 = 1; v7 = *v0 + 1; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } goto LABEL_9; } if ( sub_D0E960(a1: *v32, a2: &v49) != 0 ) { *v4 = 16; v45 = *v0 + 1; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } goto LABEL_74; } if ( sub_D0E8F8(a1: *v32, a2: &v54) != 0 ) { *v4 = 16; v45 = *v0 + 1; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } LABEL_74: sub_D128A8(a1: 0, a2: v45); v46 = (void (__fastcall *)(int, int, int, int))off_D127A8; off_D127A8(a1: 227, a2: 1, a3: 61440); v46(a1: 227, a2: 1, a3: 0, a4: v47); v10 = 33; v46(a1: 227, a2: 1, a3: 33, a4: v48); return v10; } if ( asd_link_sub_113A0(a1: *v32, a2: &v53, a3: &v52, a4: &v51, a5: &v50) != 0 ) { v50 = 0; v51 = 0; } v34 = v49; v35 = 2; switch ( v49 ) { case 0: goto LABEL_61; case 1: case 2: case 3: goto LABEL_43; case 4: v35 = 3; goto LABEL_43; case 5: v35 = 4; goto LABEL_43; default: v35 = 5; LABEL_43: v36 = v4[v35]; if ( v36 == 0 ) { _R0 = v54 << 16; __asm { UXTB16.W R0, R0 } v38 = (_R0 & 0xF0FFFFFF | ((v50 & 0xF) << 24)) + (unsigned __int16)((_WORD)v51 << 8) + 0x80000000; goto LABEL_59; } if ( v50 == 2 ) { if ( (v36 & 0xF000000) == 0x1000000 ) goto LABEL_47; } else if ( v50 == 0 && (v36 & 0xF000000) != 0 ) { LABEL_47: v36 = v36 & 0xF0FFFFFF | ((v50 & 0xF) << 24); v4[v35] = v36; } _ZF = v54 == 4; if ( v54 != 4 ) _ZF = v54 == 0; if ( _ZF && (v36 & 0xFF0000) != 0 || BYTE2(v36) > v54 && BYTE2(v36) != 4 ) { v36 = v36 & 0xFF00FFFF | ((unsigned __int8)v54 << 16); v4[v35] = v36; } if ( BYTE1(v36) > v51 ) { v38 = v36 & 0xFFFF00FF | ((unsigned __int8)v51 << 8); LABEL_59: v4[v35] = v38; } v34 = v35; LABEL_61: v10 = sub_D128A8(a1: v34, a2: v35); ++v32; ++v33; break; } } v41 = (void (__fastcall *)(int, int))off_D127AC; off_D127AC(a1: 2); v41(a1: 4, a2: v42); v41(a1: 3, a2: v43); v41(a1: 5, a2: v44); if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } if ( v10 == 0 ) return 0; } } } v17 = (void (__fastcall *)(int, int, int, int))off_D127A8; off_D127A8(a1: 227, a2: 1, a3: 61440); v17(a1: 227, a2: 1, a3: HIWORD(v10), a4: v18); v17(a1: 227, a2: 1, a3: (unsigned __int16)v10, a4: v19); } else { *v4 = 1; v7 = *v0 + 1; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } LABEL_9: sub_D128A8(a1: 0, a2: v7); v8 = (void (__fastcall *)(int, int, int, int))off_D127A8; off_D127A8(a1: 227, a2: 1, a3: 61440); v8(a1: 227, a2: 1, a3: 0, a4: v9); v10 = 5; v8(a1: 227, a2: 1, a3: 5, a4: v11); } } else { *v4 = 4; if ( *v0 != -1 ) __asm { SVC 0x5F ; '_' } sub_D128A8(a1: 0, a2: *v0 + 1); v12 = (void (__fastcall *)(int, int, int, int))off_D127A8; off_D127A8(a1: 227, a2: 1, a3: 61440); v12(a1: 227, a2: 1, a3: 0, a4: v13); v10 = 8; v12(a1: 227, a2: 1, a3: 8, a4: v14); } return v10; } /* ==== asd_event_loop [tier=MNEM size=32] ==== */ // ASD service loop: blocks on SVC 0x56 (wait), binds the caller handle with two // SVC 0x5E, dispatches via sub_D158C4(dword_D1F008), then releases with two SVC 0x5F. // Never returns - this is the module's main message pump. void __noreturn asd_event_loop() { while ( 1 ) { __asm { SVC 0x56 ; 'V' } __asm { SVC 0x5E ; '^' } __asm { SVC 0x5E ; '^' } asd_event_dispatch(); __asm { SVC 0x5F ; '_' } __asm { SVC 0x5F ; '_' } } } /* ==== asd_feature15_query_D44134 [tier=IDA size=60] REF-DERIVED-NAME ==== */ int asd_feature15_query_D44134() { int (__fastcall *v0)(_DWORD *); // r1 int result; // r0 _DWORD v6[66]; // [sp+0h] [bp-108h] BYREF bzero_core(result: v6, a2: 0x104u); if ( !asd_feature_enabled(a1: 15) ) return 8; v0 = *((int (__fastcall **)(_DWORD *))off_D0DE60 + 807); if ( v0 == nullptr || (result = v0(a1: v6)) == 0 ) { __asm { SVC 0xB4 } return 35; } return result; } /* ==== asd_feature_enabled [tier=IDA size=54] ==== */ BOOL __fastcall asd_feature_enabled(int a1) { char *v1; // r0 if ( *(_BYTE *)off_D0EDCC == 0 ) return true; if ( a1 != 0 ) { switch ( a1 ) { case 15: v1 = (char *)off_D0EDCC + 32; break; case 14: v1 = (char *)off_D0EDCC + 20; break; case 6: v1 = (char *)off_D0EDCC + 24; break; default: return false; } } else { v1 = (char *)off_D0EDCC + 28; } return *(_DWORD *)v1 != 0; } /* ==== asd_feature_enabled_cfg0 [tier=MNEM size=64] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_feature_enabled. One of 0 near-identical siblings. int __fastcall asd_feature_enabled_cfg0(int a1, _DWORD *a2) { int v4; // r1 int v5; // r0 int v6; // r2 if ( !asd_feature_enabled(a1: 15) ) return 8; v4 = dword_D0EAB0; *a2 = 32; v5 = 0; v6 = 0; while ( 1 ) { if ( v5 == 3072 ) return 1; if ( *(_DWORD *)(v4 + v5 + 4) == 1 ) break; LABEL_7: v5 += 96; } if ( v6 != a1 ) { ++v6; goto LABEL_7; } *a2 = *(_DWORD *)(v4 + v5); return 0; } /* ==== asd_feature_level_check [tier=IDA size=56] ==== */ int __fastcall asd_feature_level_check(int a1, unsigned int a2) { unsigned int v2; // r0 if ( *(_BYTE *)off_D0F14C == 0 ) return 1; if ( a2 <= 9 ) { switch ( a1 ) { case 0: v2 = *((_DWORD *)off_D0F14C + 7); return asd_test_bit(a1: v2, a2); case 6: v2 = *((_DWORD *)off_D0F14C + 6); return asd_test_bit(a1: v2, a2); case 15: v2 = *((_DWORD *)off_D0F14C + 8); return asd_test_bit(a1: v2, a2); case 14: v2 = *((_DWORD *)off_D0F14C + 5); return asd_test_bit(a1: v2, a2); default: break; } } return 0; } /* ==== asd_find_active_pipe [tier=EXACT size=160] ==== */ // Scans the four pipe registers dword_D424BC/C0/C4/C8 for one whose lane field matches the // caller's selector with the 0x7F00 and 0x10 bits set. int __fastcall asd_find_active_pipe(int a1) { _DWORD *v1; // r4 __int64 v2; // kr00_8 int (__fastcall *v3)(int, int, unsigned int); // r5 __int16 v4; // r6 __int16 v5; // r10 __int16 v6; // r9 __int16 v7; // r0 int v8; // r1 if ( a1 == 0 ) return 2; v1 = off_D08B70; v2 = *(_QWORD *)(a1 + 20); v3 = off_D08984; v4 = off_D08984(a1: 2, a2: *((_DWORD *)off_D08B70 + 48), a3: v2); v5 = v3(a1: 2, a2: v1[49], a3: v2); v6 = v3(a1: 2, a2: v1[50], a3: v2); v7 = v3(a1: 2, a2: v1[51], a3: v2); if ( (v4 & 0x7F00) != 0 && (v4 & 7) == HIDWORD(v2) && (v4 & 0x10) != 0 || (v5 & 0x7F00) != 0 && (v5 & 7) == HIDWORD(v2) && (v5 & 0x10) != 0 ) { return 0; } v8 = 0; if ( (v6 & 0x7F00) == 0 || (v6 & 7) != HIDWORD(v2) || (v6 & 0x10) == 0 ) { if ( (v7 & 0x10) == 0 ) v8 = 10; if ( (v7 & 7) != HIDWORD(v2) ) v8 = 10; if ( (v7 & 0x7F00) == 0 ) return 10; } return v8; } /* ==== asd_foreach_dio_entry [tier=FUZZY size=60] ==== */ // Walks the four 20-byte entries of the byte_D42614 table, calling sub_D15412 for each // entry whose preceding dword is non-zero; reports 27 if any call fails. int __fastcall asd_foreach_dio_entry(unsigned int a1) { int v2; // r5 unsigned int v3; // r6 int *v4; // r7 v2 = 0; v3 = 0; v4 = off_D123C4 + 4; while ( v3 != 4 ) { if ( *v4 != 0 && asd_link_call_D49810_D49814(a1, a2: v3, a3: (int)(v4 + 1)) != 0 ) v2 = 27; v4 += 5; ++v3; } if ( v2 != 0 ) return v2; else return asd_link_notify_D49810(a1); } /* ==== asd_foreach_link_D15412 [tier=MNEM size=42] REF-DERIVED-NAME ==== */ // Iterates the two link instances, running sub_D15412(i, a1, a2) on each that passes the // feature-14 level check; stops at the first non-zero result. int __fastcall asd_foreach_link_D15412(unsigned int a1, int a2) { unsigned int i; // r6 int result; // r0 for ( i = 0; i != 2; ++i ) { if ( asd_feature_level_check(a1: 14, a2: i) != 0 ) { result = asd_link_call_D49810_D49814(a1: i, a2: a1, a3: a2); if ( result != 0 ) return result; } } return 0; } /* ==== asd_foreach_link_D15650 [tier=MNEM size=38] REF-DERIVED-NAME ==== */ // Iterates the two link instances, running sub_D15650(i, a1) on each that passes the // feature-14 level check; stops at the first non-zero result. int __fastcall asd_foreach_link_D15650(int a1) { unsigned int i; // r5 int result; // r0 for ( i = 0; i != 2; ++i ) { if ( asd_feature_level_check(a1: 14, a2: i) != 0 ) { result = asd_link_call_D49818(a1: i, a2: a1); if ( result != 0 ) return result; } } return 0; } /* ==== asd_foreach_link_active [tier=IDA size=62] ==== */ int asd_foreach_link_active() { char *v0; // r5 int i; // r4 void (*v2)(void); // r1 void (*v3)(void); // r0 if ( asd_feature_enabled(a1: 15) ) { v0 = (char *)off_D0E130; for ( i = 0; i != 3072; i += 96 ) { if ( *(_DWORD *)&v0[i + 4] != 0 ) { if ( *(_DWORD *)&v0[i + 8] == 1 ) { asd_opt_cb_D497F8(); } else { v2 = *((void (**)(void))v0 + 800); if ( v2 != nullptr ) v2(); v3 = *((void (**)(void))v0 + 787); if ( v3 != nullptr ) v3(); } } } } return 0; } /* ==== asd_full_reset [tier=MNEM size=20] ==== */ // Clears dword_D33054, performs the global HDCP reset, then re-walks the active links. int __fastcall asd_full_reset() { *((_DWORD *)off_D11604 + 1) = 0; asd_hdcp_reset_all(); return asd_foreach_link_active(); } /* ==== asd_fw_version_gated_stream_op [tier=MNEM size=30] ==== */ // Runs the firmware/ASIC version gate and, on success, tail-calls the stream operation at // 0xD17DFC. int __fastcall asd_fw_version_gated_stream_op(int a1, unsigned __int8 *a2, _BYTE *a3) { int result; // r0 result = asd_check_fw_version(); if ( result == 0 ) JUMPOUT(0xD14898); return result; } /* ==== asd_get_D49810 [tier=IDA size=6] REF-DERIVED-NAME ==== */ int asd_get_D49810() { return *((_DWORD *)off_D1544C + 12); } /* ==== asd_get_D49814 [tier=IDA size=6] REF-DERIVED-NAME ==== */ int asd_get_D49814() { return *((_DWORD *)off_D1544C + 13); } /* ==== asd_get_D49818 [tier=IDA size=6] REF-DERIVED-NAME ==== */ int asd_get_D49818() { return *((_DWORD *)off_D1544C + 14); } /* ==== asd_get_connector_ids_a [tier=IDA size=144] ==== */ int __fastcall asd_get_connector_ids_a(_DWORD *a1, int *a2, int *a3) { _DWORD *v5; // r1 int v6; // r1 int v8; // r8 int v9; // r7 unsigned int _140AC; // r0 int result; // r0 int v12; // r2 int v13; // r0 __int64 v14; // r0 int v15; // r0 *a2 = 255; v5 = off_D064D4; *a3 = 255; if ( v5[7] <= a1[11] ) return 2; v6 = a1[13]; v8 = a1[10]; v9 = a1[5]; if ( v6 == 1 ) { _140AC = asd_reg_read_140AC(a1: *((_DWORD *)off_D064C0 + 114), a2: a1[14]); v6 = a1[13]; } else { _140AC = 0; } v12 = _140AC & 3; *a2 = v12; if ( v6 == 2 ) return 0; if ( v12 == 2 ) { v13 = (_140AC >> 8) & 7; *a3 = v13; LODWORD(v14) = v13 ^ v9; HIDWORD(v14) = v8 ^ 0x30; return 2 * (v14 != 0); } if ( v12 == 1 ) { v15 = (_140AC >> 4) & 7; *a3 = v15; LODWORD(v14) = v15 ^ v9; HIDWORD(v14) = v8 ^ 0x20; return 2 * (v14 != 0); } if ( (_140AC & 3) != 0 ) return 31; result = v8 - 16; if ( v8 != 16 ) return 31; return result; } /* ==== asd_get_key_words [tier=EXACT size=152] ==== */ // Maps a signal/key class (e.g. 48) to a word count plus the register constants held in // unk_D4252C/30/34... int __fastcall asd_get_key_words(int a1, _DWORD *a2) { int result; // r0 _DWORD *v4; // r2 int v5; // r2 _DWORD *v6; // r2 int v7; // r0 _DWORD *v8; // r0 if ( a2 == nullptr ) return 2; result = 2; switch ( a1 ) { case 48: v6 = off_D08138; *a2 = 2; a2[1] = v6[76]; a2[2] = v6[77]; a2[3] = v6[78]; a2[4] = v6[79]; a2[5] = v6[80]; v7 = v6[81]; LABEL_9: a2[6] = v7; return 0; case 32: v8 = off_D08138; a2[1] = *((_DWORD *)off_D08138 + 68); a2[2] = v8[69]; a2[3] = v8[70]; a2[4] = v8[71]; a2[5] = v8[72]; *a2 = 1; v7 = v8[73]; goto LABEL_9; case 16: v4 = off_D08138; a2[1] = *((_DWORD *)off_D08138 + 60); a2[2] = v4[61]; a2[3] = v4[62]; a2[4] = v4[63]; a2[5] = v4[64]; v5 = v4[65]; *a2 = 0; a2[6] = v5; return 0; default: break; } return result; } /* ==== asd_get_lane_count [tier=MNEM size=88] ==== */ // Maps mode 29 -> 4 and mode 30 -> 8 (else 0), queries sub_D10D08, and returns 4 plus // twice the resulting lane count. int __fastcall asd_get_lane_count(_DWORD *a1, int a2) { int v3; // r0 int v4; // r0 _QWORD *v5; // r1 __int64 *v6; // r2 _BYTE *v7; // r3 __int64 v8; // r4 int v10; // [sp+4h] [bp-84h] BYREF _BYTE v11[64]; // [sp+8h] [bp-80h] BYREF _BYTE v12[64]; // [sp+48h] [bp-40h] BYREF v10 = 0; v3 = 8 * (a2 == 30); if ( a2 == 29 ) v3 = 4; asd_build_reg_addr_table(a1: v3, a2: (int)v12, a3: (int)v11, a4: &v10); if ( v10 < 0 ) return 2; v4 = 2 * v10; *a1 = 4; a1[1] = v4; v5 = a1 + 2; v6 = (__int64 *)v12; v7 = v11; while ( v4 != 0 ) { v8 = *v6; v7 += 4; --v4; v6 = (__int64 *)((char *)v6 + 4); *v5++ = v8; } return 0; } /* ==== asd_get_link_caps_full [tier=MNEM size=694] ==== */ // Fills the caller's capability struct from the unk_D42344/D4234C/qword_D42350 globals // after zeroing a 0x24-byte scratch descriptor. int __fastcall asd_get_link_caps_full(struct asd_link_caps *a1) { _DWORD *v2; // r4 int v3; // r11 int *v4; // r9 unsigned int v5; // r5 unsigned int v6; // r6 unsigned int v7; // r0 __int64 v8; // r2 __int16 _13B74; // r7 char v10; // r0 char *v11; // r1 bool v12; // zf unsigned int *v13; // r0 int i; // r1 unsigned int v15; // r6 int v16; // r3 int v17; // r0 unsigned int *v18; // r1 unsigned int v19; // r5 unsigned int v20; // r6 int *v21; // r7 int *p_field08; // r6 unsigned int j; // r5 unsigned int v24; // r0 int v25; // r1 int v26; // r5 unsigned int v27; // r11 unsigned int k; // r6 unsigned int _140AC; // r0 int v30; // r0 int v31; // r1 unsigned int *p_field04; // r2 unsigned int v33; // r0 int v34; // r7 unsigned int *v35; // r1 unsigned int *v36; // r12 _DWORD *v37; // lr unsigned int *v38; // r3 unsigned int *p_field10; // r1 _DWORD v41[7]; // [sp+8h] [bp-1Ch] BYREF bzero_core(result: v41, a2: 0x1Cu); if ( a1 == nullptr ) return 2; v2 = off_D09E04; v3 = 0; v4 = (int *)off_D0A1B4; v5 = 0; v6 = 0; v7 = *((_DWORD *)off_D09E04 + 3); v8 = *((_QWORD *)off_D09E04 + 2); a1->unk00 = *((_DWORD *)off_D09E04 + 1); a1->field04 = v7; *(_QWORD *)&a1->field08 = v8; a1->field10 = v2[6]; a1->field14 = v2[7]; a1->field18 = v2[8]; a1->field1C = v2[9]; while ( v6 < v7 ) { if ( asd_reg_read_11B00() == 0 ) return 44; _13B74 = asd_reg_read_13B74(a1: 0, a2: v4[1], a3: v6); if ( asd_reg_read_11B00() == 0 ) return 44; v10 = asd_reg_read_13B74(a1: 0, a2: *v4, a3: v6); v11 = (char *)a1 + 8 * v6; v12 = v5 == 6; *((_DWORD *)v11 + 8) = (_13B74 & 0x800) != 0; *((_DWORD *)v11 + 9) = v10 & 7; if ( v5 <= 6 ) v12 = (_13B74 & 0x800) == 0; if ( v12 ) v41[v5++] = v6; if ( sub_D0953C() != 0 ) { if ( asd_reg_read_11B00() == 0 ) return 44; *(&a1[2].field08 + v6) = ((unsigned int)asd_reg_read_13B74(a1: 0, a2: v4[2], a3: v6) >> 8) & 0x7F; if ( *(unsigned __int8 *)v2 << 31 == 0 ) { if ( asd_reg_read_11B00() == 0 ) return 44; if ( sub_D06490(a1: v6) == 0 ) { v13 = &a1->unk00 + v3; v13[71] = 1; v13[72] = v6; } } } v3 += 3; v7 = v2[3]; ++v6; } for ( i = 0; i != v5; ++i ) { v15 = 0; v16 = ~(1 << (v41[i] & 0x1F)); while ( v15 < v2[3] ) *(&a1[2].field08 + v15++) &= v16; } v17 = v2[7]; v18 = v2 + 4; v19 = v2[3]; if ( v17 == 0 ) v18 = v2 + 2; v20 = *v18; if ( v17 != 0 ) v19 = 0; v21 = (int *)(&a1[2].field24 + 6 * v19); while ( v19 < v20 ) { if ( asd_reg_read_11BE4() == 0 ) return 44; *v21 = asd_reg_read_13B74(a1: 1, a2: v4[83], a3: v19) & 1; if ( asd_reg_read_11BE4() == 0 ) return 44; v21[1] = asd_reg_read_13B74(a1: 1, a2: v4[84], a3: v19) & 7; v21[2] = v19; v21 += 6; ++v19; } p_field08 = (int *)&a1[9].field08; for ( j = 0; j < v2[6]; ++j ) { if ( asd_reg_read_11BE4() == 0 ) return 44; *p_field08 = asd_reg_read_13BF8(a1: v4[99], a2: j) & 1; if ( asd_reg_read_11BE4() == 0 ) return 44; p_field08[1] = asd_reg_read_13BF8(a1: v4[54], a2: j) & 7; if ( asd_reg_read_11BE4() == 0 ) return 44; v24 = sub_D10AD0(a1: v4[55], a2: j) & 7; p_field08[2] = v24; if ( v24 >= a1->field0C ) return 2; v25 = *p_field08; p_field08 += 3; if ( v25 == 1 ) *(&a1[11].field0C + 4 * v24) = 1 << j; } v26 = 2; v27 = v2[7] - v2[9]; if ( v27 <= 5 ) { for ( k = 0; k != v27; ++k ) { if ( asd_reg_read_11B00() == 0 ) return 44; _140AC = asd_reg_read_140AC(a1: v4[116], a2: k); if ( (_140AC & 3) == 2 ) { v33 = (_140AC >> 8) & 7; v34 = v2[6]; v35 = &a1->unk00 + 4 * v33; v36 = v35 + 114; v37 = v35 + 116; v38 = v35 + 115; p_field10 = &a1[9].field10; while ( v34 != 0 ) { if ( *p_field10 == v33 ) { if ( v33 >= a1->field0C ) return 2; *v37 = 2; *v38 = k; *v36 = v33; } p_field10 += 3; --v34; } } else if ( (_140AC & 3) == 1 ) { v30 = (_140AC >> 4) & 7; v31 = v2[4]; p_field04 = &a1[3].field04; while ( v31 != 0 ) { --v31; if ( *p_field04 == v30 ) { p_field04[1] = k; p_field04[2] = v30; p_field04[3] = 1; } p_field04 += 6; } } } return 0; } return v26; } /* ==== asd_get_link_caps_full_v2 [tier=MNEM size=762] ==== */ // Link capability fill variant: copies unk_D42344 / unk_D4234C / qword_D42350 and the // per-link descriptors into the caller's struct. int __fastcall asd_get_link_caps_full_v2(struct asd_link_caps *a1) { _DWORD *v2; // r7 int v3; // r4 int *v4; // r8 unsigned int v5; // r5 unsigned int v6; // r6 unsigned int v7; // r0 __int64 v8; // r2 int _13B74; // r0 char *v10; // r2 bool v11; // zf int (__fastcall *v12)(unsigned int); // r1 char *v13; // r0 int i; // r1 unsigned int v15; // r4 int v16; // r3 int v17; // r0 unsigned int *v18; // r1 unsigned int v19; // r5 unsigned int v20; // r4 int *v21; // r6 int *p_field08; // r4 unsigned int j; // r5 unsigned int v24; // r0 int v25; // r1 char v26; // r0 int v27; // r11 unsigned int k; // r9 unsigned int _140AC; // r0 unsigned int v30; // r1 int v31; // r0 int v32; // r2 unsigned int *p_field04; // r3 unsigned int v34; // r1 unsigned int v35; // r0 int v36; // r5 unsigned int *p_field10; // r6 unsigned int *v38; // r4 unsigned int *v39; // r12 _DWORD *v40; // r3 unsigned int *v41; // r4 unsigned int *v42; // r4 unsigned int m; // r5 unsigned int v44; // r0 unsigned int v45; // r1 BOOL v47; // [sp+Ch] [bp-28h] BOOL v48; // [sp+10h] [bp-24h] unsigned int v49; // [sp+14h] [bp-20h] _DWORD v50[7]; // [sp+18h] [bp-1Ch] BYREF bzero_core(result: v50, a2: 0x1Cu); if ( a1 == nullptr ) return 2; v2 = off_D0984C; v3 = 0; v4 = (int *)off_D0A1B4; v5 = 0; v6 = 0; v7 = *((_DWORD *)off_D0984C + 3); v8 = *((_QWORD *)off_D0984C + 2); a1->unk00 = *((_DWORD *)off_D0984C + 1); a1->field04 = v7; *(_QWORD *)&a1->field08 = v8; a1->field10 = v2[6]; a1->field14 = v2[7]; a1->field18 = v2[8]; a1->field1C = v2[9]; while ( v6 < v7 ) { _13B74 = asd_reg_read_13B74(a1: 0, a2: *v4, a3: v6); v10 = (char *)a1 + 8 * v6; v11 = v5 == 6; *((_DWORD *)v10 + 9) = _13B74 & 7; *((_DWORD *)v10 + 8) = (_13B74 & 0x1000000) != 0; if ( v5 <= 6 ) v11 = (_13B74 & 0x1000000) == 0; if ( v11 ) v50[v5++] = v6; v12 = (int (__fastcall *)(unsigned int))v2[37]; if ( v12 == nullptr || v12(a1: v6) != 0 ) { *(&a1[2].field08 + v6) = ((unsigned int)asd_reg_read_13B74(a1: 0, a2: v4[2], a3: v6) >> 8) & 0x7F; if ( *(unsigned __int8 *)v2 << 31 == 0 && asd_link_ready_check(a1: v6) == 0 ) { v13 = (char *)a1 + 2 * v3; *((_DWORD *)v13 + 71) = 1; *((_DWORD *)v13 + 72) = v6; } } v3 += 6; v7 = v2[3]; ++v6; } for ( i = 0; i != v5; ++i ) { v15 = 0; v16 = ~(1 << (v50[i] & 0x1F)); while ( v15 < v2[3] ) *(&a1[2].field08 + v15++) &= v16; } v17 = v2[7]; v18 = v2 + 4; v19 = v2[3]; if ( v17 == 0 ) v18 = v2 + 2; v20 = *v18; if ( v17 != 0 ) v19 = 0; v21 = (int *)(&a1[2].field24 + 6 * v19); while ( v19 < v20 ) { *v21 = asd_reg_read_13B74(a1: 1, a2: v4[83], a3: v19) & 1; v21[1] = asd_reg_read_13B74(a1: 1, a2: v4[84], a3: v19) & 7; v21[2] = v19; v21 += 6; ++v19; } p_field08 = (int *)&a1[9].field08; for ( j = 0; j < v2[6]; ++j ) { *p_field08 = asd_reg_read_13BF8(a1: v4[99], a2: j) & 1; p_field08[1] = asd_reg_read_13BF8(a1: v4[54], a2: j) & 7; v24 = sub_D10AD0(a1: v4[55], a2: j) & 7; p_field08[2] = v24; if ( v24 >= a1->field0C ) return 2; v25 = *p_field08; p_field08 += 3; if ( v25 == 1 ) *(&a1[11].field0C + 4 * v24) = 1 << (j & 0x1F); } if ( a1->field1C != 0 ) { v26 = sub_D1099C(a1: v4[103]); v47 = (v26 & 8) != 0; v48 = (v26 & 4) != 0; } else { v48 = false; v47 = false; } v27 = 2; v49 = v2[7] - v2[9]; if ( v49 <= 5 ) { for ( k = 0; k != v49; ++k ) { _140AC = asd_reg_read_140AC(a1: v4[114], a2: k); if ( (_140AC & 3) == 2 ) { v34 = k; if ( (k ^ 3 | !v47) == 0 ) v34 = k + 3; if ( (k ^ 2 | !v48) == 0 ) v34 = k + 3; v35 = (_140AC >> 8) & 7; v36 = v2[6]; p_field10 = &a1[9].field10; v38 = &a1->unk00 + 4 * v35; v39 = v38 + 114; v40 = v38 + 116; v41 = v38 + 115; while ( v36 != 0 ) { if ( *p_field10 == v35 ) { if ( v35 >= a1->field0C ) return 2; *v40 = 2; *v41 = v34; *v39 = v35; } p_field10 += 3; --v36; } } else if ( (_140AC & 3) == 1 ) { v30 = k; if ( (k ^ 3 | !v47) == 0 ) v30 = k + 3; if ( (k ^ 2 | !v48) == 0 ) v30 = k + 3; v31 = (_140AC >> 4) & 7; v32 = v2[4]; p_field04 = &a1[3].field04; while ( v32 != 0 ) { --v32; if ( *p_field04 == v31 ) { p_field04[1] = v30; p_field04[2] = v31; p_field04[3] = 1; } p_field04 += 6; } } } v42 = &a1[14].field04; for ( m = 0; m < v2[8]; ++m ) { v44 = sub_D10C30(a1: v4[102], a2: m); v45 = (v44 >> 8) & 0xF; if ( a1->field04 < v45 ) return 2; *v42 = v44 & 1; v42[1] = v45; v42[2] = m; v42 += 3; } return 0; } return v27; } /* ==== asd_get_link_info [tier=MNEM size=72] ==== */ // Feature-15 gated, link index bounded to 0x3F, caller pointer validated for 8 bytes. // Reports 64 and a status word, provided unk_D42894[24*idx] == 1. int __fastcall asd_get_link_info(unsigned int a1, unsigned int *a2) { int result; // r0 if ( !asd_feature_enabled(a1: 15) ) return 8; if ( a1 > 0x1F ) return 5; if ( asd_validate_ptr(a1: (unsigned int)a2, a2: 8u) == 0 ) return 2; result = 0; *a2 = 32; a2[1] = 0; if ( *((_DWORD *)off_D0B290 + 24 * a1 + 1) != 1 ) return 1; *a2 = a1; a2[1] = 0; return result; } /* ==== asd_get_link_reg_offsets [tier=MNEM size=76] ==== */ // Feature-14 gated, bounds a2 < dword_D33300. Returns 4 and three register offsets // (x4) read from byte_D42661 at +207/+215/+223 for the link. int __fastcall asd_get_link_reg_offsets(_DWORD *a1, unsigned int a2) { int v4; // r1 int result; // r0 _DWORD *v6; // r0 if ( *((_DWORD *)off_D15140 + 2) <= a2 ) return 2; v4 = asd_feature_level_check(a1: 14, a2); result = 2; if ( a1 != nullptr && v4 != 0 ) { *a1 = 4; v6 = (_DWORD *)(dword_D15144 + 4 * a2); a1[1] = 4 * v6[30]; a1[2] = 4 * v6[32]; a1[3] = 4 * v6[34]; a1[4] = 4 * v6[36]; return 0; } return result; } /* ==== asd_get_link_status [tier=MNEM size=78] ==== */ // HDCP opcode 0x161 (disp_get_link_status). int __fastcall asd_get_link_status(unsigned int a1, int *a2, _DWORD *a3, _DWORD *a4, _DWORD *a5) { if ( asd_validate_ptr(a1: (unsigned int)a2, a2: 4u) != 0 && asd_validate_ptr(a1: (unsigned int)a3, a2: 4u) != 0 && asd_validate_ptr(a1: (unsigned int)a4, a2: 4u) != 0 && asd_validate_ptr(a1: (unsigned int)a5, a2: 4u) != 0 ) { return asd_link_sub_113A0(r0_0: a1, r1_0: a2, r2_0: a3, r3_0: a4, arg0: a5); } else { return 2; } } /* ==== asd_get_pair_D49838 [tier=EXACT size=18] ==== */ // Returns *unk_D49838 through the caller's pointer (paired with asd_set_pair_D49838). int __fastcall asd_get_pair_D49838(_DWORD *a1) { if ( a1 == nullptr ) return 2; *a1 = **(_DWORD **)off_D0F6E0; return 0; } /* ==== asd_get_platform_info [tier=MNEM size=236] ==== */ // Issues SVC 0x8D (read soc_platform_id) then calls a callback obtained from // sub_D12C4C(&fp, 2), returning its result through a1/a2. int __fastcall asd_get_platform_info(int *a1, _BYTE *a2, void (__fastcall *a3)(int *)) { int result; // r0 void (__fastcall *v10)(int *); // [sp+0h] [bp-8h] BYREF int v11; // [sp+4h] [bp-4h] BYREF v10 = a3; v11 = 0; result = 2; if ( a1 != nullptr && a2 != nullptr ) { __asm { SVC 0x8D } v11 = 2; v10 = nullptr; if ( asd_get_reg_read_fn(a1: &v10, a2: 2) != 0 || v10 == nullptr ) { return 1; } else { v10(a1: &v11); *a1 = v11; result = 0; *a2 = 1; } } return result; } /* ==== asd_get_reg_read_fn [tier=EXACT size=14] ==== */ // Returns the register-read function pointer (asd_reg_read_10744) when the // requested class is 2, else status 7. int __fastcall asd_get_reg_read_fn(_DWORD *a1, int a2) { if ( a2 != 2 ) return 7; *a1 = off_D0FC60; return 0; } /* ==== asd_get_signal_reg [tier=MNEM size=84] ==== */ // Selects the register block for the link's signal type (switch on ctx+40, e.g. type 16) // and indexes it by ctx+20. int __fastcall asd_get_signal_reg(int a1) { int v1; // r1 unsigned int v3; // r5 int *v4; // r7 int v5; // r6 if ( a1 == 0 ) return 2; v1 = *(_DWORD *)(a1 + 40); v3 = *(_DWORD *)(a1 + 20); switch ( v1 ) { case 16: v4 = (int *)((char *)off_D07444 + 236); v5 = 0; goto LABEL_9; case 48: v4 = (int *)((char *)off_D07444 + 300); v5 = 2; goto LABEL_9; case 32: v4 = (int *)((char *)off_D07444 + 268); v5 = 1; LABEL_9: asd_reg_read_13B74(a1: v5, a2: *v4, a3: v3); asd_reg_write_1946C(a1: v5, a2: *v4, a3: v3); break; default: break; } return asd_wait_signal16_idle(a1); } /* ==== asd_hdcp1_disable [tier=IDA size=242] ==== */ int __fastcall asd_hdcp1_disable(unsigned int a1) { _DWORD *v2; // r10 _DWORD *v3; // r9 _DWORD *v4; // r4 int v5; // r7 int v6; // r5 _DWORD *v7; // r6 int v8; // r0 bool v9; // zf void (__fastcall *v10)(_DWORD *, _DWORD, int); // r3 int (__fastcall *v11)(_DWORD *, _DWORD, int); // r3 void (__fastcall *v13)(char *, _DWORD, int); // r3 int (__fastcall *v14)(_DWORD *, _DWORD, int); // r3 int (__fastcall *v15)(_DWORD *); // r1 void (__fastcall *v16)(_DWORD *, _DWORD, int); // r3 int (__fastcall *v17)(_DWORD *); // r1 int (*v18)(void); // r0 if ( !asd_feature_enabled(a1: 15) ) return 8; if ( a1 > 0x1E ) return 5; v2 = off_D0DECC; v3 = (_DWORD *)((char *)off_D0DECC + 96 * a1); if ( v3[1] != 1 ) return 5; if ( v3[16] != 5 ) { LABEL_24: v6 = 0; goto LABEL_25; } if ( v3[15] != a1 ) { v13 = *((void (__fastcall **)(char *, _DWORD, int))off_D0DECC + 790); if ( v13 != nullptr ) v13(a1: (char *)off_D0DECC + 96 * a1, a2: 0, a3: 1); v14 = (int (__fastcall *)(_DWORD *, _DWORD, int))v2[788]; if ( v14 != nullptr ) { v6 = v14(a1: v3, a2: 0, a3: 1); goto LABEL_25; } goto LABEL_24; } v4 = v3 + 5; v5 = 0; v6 = 0; while ( v5 != 744 ) { v7 = &v2[v5]; if ( v2[v5 + 1] == 1 ) { v8 = v7[5]; v9 = *v4 == v8; if ( *v4 == v8 ) v9 = v7[16] == 5; if ( v9 ) { v10 = (void (__fastcall *)(_DWORD *, _DWORD, int))v2[790]; if ( v10 != nullptr ) v10(a1: &v2[v5], a2: 0, a3: 1); v11 = (int (__fastcall *)(_DWORD *, _DWORD, int))v2[788]; if ( v11 != nullptr ) v6 = v11(a1: &v2[v5], a2: 0, a3: 1); } } v5 += 24; } LABEL_25: v15 = (int (__fastcall *)(_DWORD *))v2[789]; if ( v15 != nullptr && (v3[16] != 5 || v15(a1: v3) == 0) ) { v16 = (void (__fastcall *)(_DWORD *, _DWORD, int))v2[790]; if ( v16 != nullptr ) { v16(a1: v3, a2: 0, a3: 1); v17 = (int (__fastcall *)(_DWORD *))v2[795]; if ( v17 != nullptr ) v6 = v17(a1: v3); } } if ( v6 != 0 ) return v6; v18 = (int (*)(void))v2[792]; if ( v18 == nullptr ) return v6; return v18(); } /* ==== asd_hdcp1_sub_1144 [tier=EXACT size=68] ==== */ // Reachability-derived label: called only from the 'hdcp1' RPC subsystem // (BFS over direct calls + tail calls from the named 0xhdcp1 handlers). // Behaviour not individually identified. _BYTE *__fastcall asd_hdcp1_sub_1144(_BYTE *result, unsigned int a2) { int v2; // r12 _BYTE *v3; // r0 if ( a2 >= 4 ) { if ( ((unsigned __int8)result & 3) != 0 ) { v2 = 4 - ((unsigned __int8)result & 3); if ( v2 != 2 ) *result++ = 0; if ( v2 >= 2 ) *(_WORD *)result = 0; } JUMPOUT(0xD0118C); } if ( __CFSHL__(a2, 31) ) { *result = 0; v3 = result + 1; *v3 = 0; result = v3 + 1; } if ( (a2 & 1) != 0 ) *result++ = 0; return result; } /* ==== asd_hdcp1_teardown [tier=MNEM size=220] ==== */ // HDCP opcode 0x18F. int __fastcall asd_hdcp1_teardown(unsigned int a1) { int v2; // r3 int v3; // r5 unsigned __int8 v4; // r6 unsigned __int8 v5; // r8 unsigned int v6; // r9 _DWORD *v7; // r10 unsigned int v8; // r11 int v9; // r2 int v10; // r0 char v11; // r2 int v12; // r7 char v13; // r1 char v14; // r0 if ( !asd_feature_enabled(a1: 15) ) return 8; if ( a1 == 0 || asd_validate_ptr(a1, a2: 0x10u) == 0 ) return 2; v2 = dword_D0D720; v3 = 0; v4 = 0; v5 = 0; while ( v3 != 4 ) { v6 = *(_DWORD *)(a1 + 4 * v3); v7 = (_DWORD *)(v2 + 4 * v3 + 4216); v8 = v6; do { if ( v8 == 0 ) break; if ( v6 << 31 != 0 ) { v9 = 1 << (v5 & 0x1F); v10 = ~v9; if ( (*v7 & v9) != 0 ) { v11 = *(_BYTE *)(v2 + 4232); *v7 &= v10; *(_BYTE *)(v2 + 4232) = v11 - 1; } v12 = v2; *(_DWORD *)(a1 + 4 * v3) &= v10; asd_hdcp1_sub_1144(result: (_BYTE *)(5 * v4 + v2 + 4233), a2: 5u); v2 = v12; v8 &= v8 - 1; } v6 >>= 1; v13 = v5 + 1; v14 = v4 + 1; if ( (unsigned __int8)(v5 + 1) != v5 + 1 ) v13 = -1; v5 = v14 & 0x1F; if ( ((v4 + 1) & 0x1F) != 0 ) v5 = v13; ++v4; } while ( v14 > -1 ); ++v3; } return 0; } /* ==== asd_hdcp2_disable [tier=IDA size=268] ==== */ int __fastcall asd_hdcp2_disable(unsigned int a1) { char *v2; // r11 _DWORD *v3; // r4 int v5; // r5 void (__fastcall *v6)(char *, _DWORD, _DWORD); // r3 _DWORD *v7; // r9 _DWORD *v8; // r10 int v9; // r7 char *v10; // r6 int v11; // r0 bool v12; // zf int (__fastcall *v13)(_DWORD *); // r1 void (__fastcall *v14)(_DWORD *, _DWORD, _DWORD); // r3 int (*v15)(void); // r0 if ( !asd_feature_enabled(a1: 15) ) return 8; if ( a1 > 0x1F ) return 5; v2 = (char *)off_D0E130; v3 = (_DWORD *)((char *)off_D0E130 + 96 * a1); if ( v3[1] != 1 ) return 5; if ( v3[2] == 1 ) return asd_opt_cb_D497F0(); v5 = 0; if ( v3[16] == 5 ) { v6 = *((void (__fastcall **)(char *, _DWORD, _DWORD))off_D0E130 + 790); if ( v6 != nullptr && *((_DWORD *)off_D0E130 + 788) != 0 ) { if ( v3[15] == a1 ) { v7 = v3 + 21; v8 = v3 + 5; v9 = 0; v5 = 0; while ( v9 != 2976 ) { v10 = &v2[v9]; if ( *(_DWORD *)&v2[v9 + 4] == 1 ) { v11 = *((_DWORD *)v10 + 5); v12 = *v8 == v11; if ( *v8 == v11 ) v12 = *((_DWORD *)v10 + 16) == 5; if ( v12 ) { (*((void (__fastcall **)(char *, _DWORD, _DWORD))v2 + 790))(a1: &v2[v9], a2: 0, a3: *v7); v5 = (*((int (__fastcall **)(char *, _DWORD, _DWORD))v2 + 788))(a1: &v2[v9], a2: 0, a3: *v7); } } v9 += 96; } } else { v6(a1: (char *)off_D0E130 + 96 * a1, a2: 0, a3: v3[21]); v5 = (*((int (__fastcall **)(_DWORD *, _DWORD, _DWORD))v2 + 788))(a1: v3, a2: 0, a3: v3[21]); } } } v13 = *((int (__fastcall **)(_DWORD *))v2 + 789); if ( v13 != nullptr ) { v14 = *((void (__fastcall **)(_DWORD *, _DWORD, _DWORD))v2 + 790); if ( v14 != nullptr && *((_DWORD *)v2 + 798) != 0 ) { if ( v3[16] != 5 ) { LABEL_28: v14(a1: v3, a2: 0, a3: v3[21]); v5 = (*((int (__fastcall **)(_DWORD *))v2 + 798))(a1: v3); goto LABEL_29; } if ( v13(a1: v3) == 0 ) { v14 = *((void (__fastcall **)(_DWORD *, _DWORD, _DWORD))v2 + 790); goto LABEL_28; } } } LABEL_29: if ( v5 != 0 ) return v5; v15 = *((int (**)(void))v2 + 792); if ( v15 == nullptr ) return v5; return v15(); } /* ==== asd_hdcp_reset_all [tier=IDA size=172] ==== */ int asd_hdcp_reset_all() { int v0; // r5 int v1; // r4 v0 = *((_DWORD *)off_D12474 + 4); v1 = sub_D11014(); if ( v1 == 0 ) v1 = sub_D11060(); switch ( v0 ) { case 2: asd_reg_write_16330(); break; case 3: asd_reg_write_16384(); break; case 6: asd_reg_write_163C8(); break; case 8: asd_reg_write_164B4(); break; case 9: case 16: sub_D12FF4(); break; case 12: asd_reg_write_166AC(); break; case 14: sub_D12C58(); break; case 15: asd_reg_write_16788(); break; case 17: case 19: asd_reg_write_1683C(); break; case 18: sub_D12D68(); break; case 20: case 25: asd_reg_write_16554(); break; case 21: case 28: sub_D13504(); break; case 22: case 27: sub_D12E1C(); break; case 23: sub_D12D0C(); break; case 24: asd_reg_write_165BC(); break; case 26: asd_reg_read_162C0(); break; case 29: case 30: asd_reg_write_1663C(a1: v0); break; case 31: asd_reg_read_162F0(); break; default: return v1; } return v1; } /* ==== asd_hdcp_version_select [tier=MNEM size=62] ==== */ // Maps the caller's HDCP SRM type (8 -> index 0, 9 -> index 1, anything else status 2) // and prepares a 0x104-byte working buffer. int __fastcall asd_hdcp_version_select(int a1) { int result; // r0 _DWORD v7[66]; // [sp+0h] [bp-108h] BYREF bzero_core(result: v7, a2: 0x104u); if ( a1 != 8 && a1 != 9 ) return 2; result = asd_opt_cb_D4982C(); if ( result == 0 ) { __asm { SVC 0xB4 } return 35; } return result; } /* ==== asd_hw_ops_init [tier=EXACT size=30] ==== */ // Zeroes the 0xEC-byte asd_hw_ops struct at 0xD4279C, records the ASIC variant in // asd_asic_variant (0xD42798), then calls asd_build_hw_ops. Reached from // asd_task_ctl_2 (RPC opcode 0xFFFF0002), i.e. ASD initialisation. int __fastcall asd_hw_ops_init(int a1) { int *v1; // r6 _DWORD *v3; // r5 v1 = (int *)off_D02494; v3 = (_DWORD *)((char *)off_D02494 + 4); bzero_core(result: (_DWORD *)off_D02494 + 1, a2: 0xE0u); *v1 = a1; return asd_build_hw_ops(a1: v3, a2: a1); } /* ==== asd_hwop_068_v0 [tier=EXACT size=56] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x068 (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_068_v0(_WORD *a1) { int *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D13934; *a1 = 224; v2 = 0; v3 = (char *)off_D138F0; while ( v2 != 2688 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 4]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 2); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 2) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_068_v1 [tier=EXACT size=56] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x068 (variant 1). Invoked indirectly through that struct. int __fastcall asd_hwop_068_v1(_WORD *a1) { int *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D139B4; *a1 = 112; v2 = 0; v3 = (char *)off_D13970; while ( v2 != 1344 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 4]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 2); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 2) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_068_v2 [tier=EXACT size=56] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x068 (variant 2). Invoked indirectly through that struct. int __fastcall asd_hwop_068_v2(_WORD *a1) { int v1; // r1 int *v2; // r2 int *v3; // r0 int v4; // r3 unsigned int v5; // r3 int v6; // r5 v1 = 876; v2 = (int *)off_D13830; *a1 = 876; v3 = (int *)((char *)off_D137EC + 8); while ( v1 != 0 ) { v4 = *((unsigned __int8 *)v3 - 4); if ( v4 != 255 ) { v5 = v2[v4]; v6 = 4 * (v5 + *v3); if ( v5 > ~*v3 ) v6 = 0; *v3 = v6; } v3 += 3; --v1; } return 0; } /* ==== asd_hwop_068_v3 [tier=EXACT size=58] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x068 (variant 3). Invoked indirectly through that struct. int __fastcall asd_hwop_068_v3(_WORD *a1) { int *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D138B4; *a1 = 320; v2 = 0; v3 = (char *)off_D13870; while ( v2 != 3840 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 4]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 2); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 2) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_068_v4 [tier=EXACT size=56] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x068 (variant 4). Invoked indirectly through that struct. int __fastcall asd_hwop_068_v4(_WORD *a1) { int *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D13A34; *a1 = 48; v2 = 0; v3 = (char *)off_D139F0; while ( v2 != 576 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 4]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 2); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 2) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_068_v4_0 [tier=EXACT size=56] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x068, ASIC variant 4. // Invoked indirectly through that struct. int __fastcall asd_hwop_068_v4_0(_WORD *a1) { int v1; // r1 int *v2; // r2 int *v3; // r0 int v4; // r3 unsigned int v5; // r3 int v6; // r5 v1 = 1244; v2 = (int *)off_D137B0; *a1 = 1244; v3 = (int *)((char *)off_D1376C + 8); while ( v1 != 0 ) { v4 = *((unsigned __int8 *)v3 - 4); if ( v4 != 255 ) { v5 = v2[v4]; v6 = 4 * (v5 + *v3); if ( v5 > ~*v3 ) v6 = 0; *v3 = v6; } v3 += 3; --v1; } return 0; } /* ==== asd_hwop_06C_v0 [tier=EXACT size=88] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x06C, ASIC variant 0. // Invoked indirectly through that struct. int __fastcall asd_hwop_06C_v0(_WORD *a1) { int *v1; // r2 unsigned int v2; // r0 char *v3; // r1 int *v4; // r3 char *v5; // r4 int v6; // r5 unsigned int v7; // r5 int v8; // r6 int v9; // r7 int v10; // r5 int v11; // r6 unsigned int v12; // r5 int v13; // r7 v1 = (int *)off_D11128; *a1 = 8; v2 = 0; v3 = (char *)off_D110E0; v4 = (int *)off_D110E4; while ( v2 <= 7 ) { v5 = &v3[12 * v2]; v6 = (unsigned __int8)v5[4]; if ( v6 != 255 ) { v7 = v1[v6]; ++v2; v8 = *((_DWORD *)v5 + 2); v9 = 4 * (v7 + v8); if ( v7 > ~v8 ) v9 = 0; v10 = (unsigned __int8)v5[16]; v11 = *((_DWORD *)v5 + 5); *((_DWORD *)v5 + 2) = v9; v12 = v4[v10]; v13 = 4 * (v12 + v11); if ( v12 > ~v11 ) v13 = 0; *((_DWORD *)v5 + 5) = v13; } v2 += 2; } return 0; } /* ==== asd_hwop_06C_v1 [tier=EXACT size=354] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x06C, ASIC variant 1. // Invoked indirectly through that struct. int __fastcall asd_hwop_06C_v1(_WORD *a1) { int *v1; // r12 unsigned int v2; // r0 char *v3; // r1 int *v4; // lr int *v5; // r8 int *v6; // r9 int *v7; // r10 int *v8; // r11 int *v9; // r2 int *v10; // r3 char *v11; // r4 int v12; // r6 unsigned int v13; // r5 int v14; // r6 int v15; // r7 char *v16; // r4 int v17; // r6 unsigned int v18; // r5 int v19; // r7 char *v20; // r4 int v21; // r6 unsigned int v22; // r5 int v23; // r7 char *v24; // r4 int v25; // r6 unsigned int v26; // r5 int v27; // r7 char *v28; // r4 int v29; // r6 unsigned int v30; // r5 int v31; // r7 char *v32; // r4 int v33; // r6 unsigned int v34; // r5 int v35; // r7 char *v36; // r4 int v37; // r6 unsigned int v38; // r5 int v39; // r7 int v40; // r4 char *v41; // r4 int v42; // r6 unsigned int v43; // r5 int v44; // r7 v1 = (int *)off_D112F0; *a1 = 32; v2 = 0; v3 = (char *)off_D11290; v4 = (int *)off_D11294[0]; v5 = (int *)off_D11298[0]; v6 = (int *)off_D1129C[0]; v7 = (int *)off_D112A0[0]; v8 = (int *)off_D112A4[0]; v9 = (int *)off_D112A8[0]; v10 = (int *)off_D112AC; LABEL_2: v11 = &v3[12 * v2]; while ( v2 <= 0x18 ) { v12 = (unsigned __int8)v11[4]; if ( v12 != 255 ) { v13 = v1[v12]; v14 = *((_DWORD *)v11 + 2); v15 = 4 * (v13 + v14); if ( v13 > ~v14 ) v15 = 0; *((_DWORD *)v11 + 2) = v15; v16 = &v3[12 * (v2 | 1)]; v17 = *((_DWORD *)v16 + 2); v18 = v4[(unsigned __int8)v16[4]]; v19 = 4 * (v18 + v17); if ( v18 > ~v17 ) v19 = 0; *((_DWORD *)v16 + 2) = v19; v20 = &v3[12 * (v2 | 2)]; v21 = *((_DWORD *)v20 + 2); v22 = v5[(unsigned __int8)v20[4]]; v23 = 4 * (v22 + v21); if ( v22 > ~v21 ) v23 = 0; *((_DWORD *)v20 + 2) = v23; v24 = &v3[12 * (v2 | 3)]; v25 = *((_DWORD *)v24 + 2); v26 = v6[(unsigned __int8)v24[4]]; v27 = 4 * (v26 + v25); if ( v26 > ~v25 ) v27 = 0; *((_DWORD *)v24 + 2) = v27; v28 = &v3[12 * (v2 | 4)]; v29 = *((_DWORD *)v28 + 2); v30 = v7[(unsigned __int8)v28[4]]; v31 = 4 * (v30 + v29); if ( v30 > ~v29 ) v31 = 0; *((_DWORD *)v28 + 2) = v31; v32 = &v3[12 * (v2 | 5)]; v33 = *((_DWORD *)v32 + 2); v34 = v8[(unsigned __int8)v32[4]]; v35 = 4 * (v34 + v33); if ( v34 > ~v33 ) v35 = 0; *((_DWORD *)v32 + 2) = v35; v36 = &v3[12 * (v2 | 6)]; v37 = *((_DWORD *)v36 + 2); v38 = v9[(unsigned __int8)v36[4]]; v39 = 4 * (v38 + v37); if ( v38 > ~v37 ) v39 = 0; *((_DWORD *)v36 + 2) = v39; v40 = v2 | 7; v2 += 8; v41 = &v3[12 * v40]; v42 = *((_DWORD *)v41 + 2); v43 = v10[(unsigned __int8)v41[4]]; v44 = 4 * (v43 + v42); if ( v43 > ~v42 ) v44 = 0; *((_DWORD *)v41 + 2) = v44; goto LABEL_2; } } return 2 * (v2 < 0x20); } /* ==== asd_hwop_070_v0 [tier=EXACT size=58] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x070 (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_070_v0(_WORD *a1) { int *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0E370; *a1 = 119; v2 = dword_D0E368; v3 = (char *)off_D0E36C; while ( v2 != 0 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 1432]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 359); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 359) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_070_v1 [tier=EXACT size=56] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x070, ASIC variant 1. // Invoked indirectly through that struct. int __fastcall asd_hwop_070_v1(_WORD *a1) { int *v1; // r2 int v2; // r0 int *v3; // r1 int *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0E328; *a1 = 108; v2 = 0; v3 = (int *)off_D0E324; while ( v2 != 324 ) { v4 = &v3[v2]; v5 = LOBYTE(v3[v2 + 1]); if ( v5 != 255 ) { v6 = v1[v5]; v7 = v4[2]; v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; v4[2] = v8; } v2 += 3; } return 0; } /* ==== asd_hwop_074_v0 [tier=EXACT size=58] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x074 (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_074_v0(_WORD *a1) { int *v1; // r2 int v2; // r0 int *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0F3BC; *a1 = 215; v2 = dword_D0F3B4; v3 = (int *)off_D0F3B8; while ( v2 != 0 ) { v4 = (char *)v3 + v2; v5 = *((unsigned __int8 *)v3 + v2 + 2584); if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 647); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 647) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_074_v1 [tier=EXACT size=56] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x074, ASIC variant 1. // Invoked indirectly through that struct. int __fastcall asd_hwop_074_v1(_WORD *a1) { int *v1; // r2 int v2; // r0 int *v3; // r1 int *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0F374; *a1 = 43; v2 = 0; v3 = (int *)off_D0F370; while ( v2 != 129 ) { v4 = &v3[v2]; v5 = LOBYTE(v3[v2 + 1]); if ( v5 != 255 ) { v6 = v1[v5]; v7 = v4[2]; v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; v4[2] = v8; } v2 += 3; } return 0; } /* ==== asd_hwop_078_v0 [tier=EXACT size=40] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x078 (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_078_v0(_WORD *a1) { int v1; // r1 unsigned int v2; // r1 int v3; // r2 int v4; // r3 *a1 = 1; v1 = *(unsigned __int8 *)(off_D026DC + 4); if ( v1 != 255 ) { v2 = (*off_D026E0)[v1]; v3 = *(_DWORD *)(off_D026DC + 8); v4 = 4 * (v2 + v3); if ( v2 > ~v3 ) v4 = 0; *(_DWORD *)(off_D026DC + 8) = v4; } return 0; } /* ==== asd_hwop_07C_v0 [tier=EXACT size=54] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x07C (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_07C_v0(_WORD *a1) { int *v1; // r2 int v2; // r0 int *v3; // r1 int *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0E840; *a1 = 4; v2 = 0; v3 = (int *)off_D0E83C; while ( v2 != 12 ) { v4 = &v3[v2]; v5 = LOBYTE(v3[v2 + 1]); if ( v5 != 255 ) { v6 = v1[v5]; v7 = v4[2]; v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; v4[2] = v8; } v2 += 3; } return 0; } /* ==== asd_hwop_07C_v1 [tier=EXACT size=54] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x07C, ASIC variant 1. // Invoked indirectly through that struct. int __fastcall asd_hwop_07C_v1(_WORD *a1) { int *v1; // r2 int v2; // r0 int *v3; // r1 int *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0E800; *a1 = 3; v2 = 0; v3 = (int *)off_D0E7FC; while ( v2 != 9 ) { v4 = &v3[v2]; v5 = LOBYTE(v3[v2 + 1]); if ( v5 != 255 ) { v6 = v1[v5]; v7 = v4[2]; v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; v4[2] = v8; } v2 += 3; } return 0; } /* ==== asd_hwop_080_v0 [tier=EXACT size=56] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x080 (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_080_v0(_WORD *a1) { int v1; // r1 int *v2; // r2 int *v3; // r0 int v4; // r3 unsigned int v5; // r3 int v6; // r5 v1 = 898; v2 = (int *)off_D0A6E0; *a1 = 898; v3 = (int *)((char *)off_D0A6DC + 8); while ( v1 != 0 ) { v4 = *((unsigned __int8 *)v3 - 4); if ( v4 != 255 ) { v5 = v2[v4]; v6 = 4 * (v5 + *v3); if ( v5 > ~*v3 ) v6 = 0; *v3 = v6; } v3 += 3; --v1; } return 0; } /* ==== asd_hwop_080_v1 [tier=EXACT size=54] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x080 (variant 1). Invoked indirectly through that struct. int __fastcall asd_hwop_080_v1(_WORD *a1) { int *v1; // r2 int v2; // r0 int *v3; // r1 int *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0A660; *a1 = 7; v2 = 0; v3 = (int *)off_D0A65C; while ( v2 != 21 ) { v4 = &v3[v2]; v5 = LOBYTE(v3[v2 + 1]); if ( v5 != 255 ) { v6 = v1[v5]; v7 = v4[2]; v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; v4[2] = v8; } v2 += 3; } return 0; } /* ==== asd_hwop_080_v2 [tier=EXACT size=54] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x080 (variant 2). Invoked indirectly through that struct. int __fastcall asd_hwop_080_v2(_WORD *a1) { int *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0A720; *a1 = 6; v2 = 0; v3 = (char *)off_D0A71C; while ( v2 != 72 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 4]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 2); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 2) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_080_v3 [tier=EXACT size=56] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x080, ASIC variant 3. // Invoked indirectly through that struct. int __fastcall asd_hwop_080_v3(_WORD *a1) { int v1; // r1 int *v2; // r2 int *v3; // r0 int v4; // r3 unsigned int v5; // r3 int v6; // r5 v1 = 890; v2 = (int *)off_D0A6A0; *a1 = 890; v3 = &(*off_D0A69C)[2]; while ( v1 != 0 ) { v4 = *((unsigned __int8 *)v3 - 4); if ( v4 != 255 ) { v5 = v2[v4]; v6 = 4 * (v5 + *v3); if ( v5 > ~*v3 ) v6 = 0; *v3 = v6; } v3 += 3; --v1; } return 0; } /* ==== asd_hwop_084_v0 [tier=EXACT size=56] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x084 (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_084_v0(_WORD *a1) { _DWORD *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = off_D0FA64; *a1 = 154; v2 = 0; v3 = (char *)off_D0FA60; while ( v2 != 1848 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 4]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 2); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 2) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_084_v1 [tier=EXACT size=58] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x084, ASIC variant 1. // Invoked indirectly through that struct. int __fastcall asd_hwop_084_v1(_WORD *a1) { _DWORD *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = off_D0F9F8; *a1 = 105; v2 = dword_D0F9F0; v3 = (char *)off_D0F9F4; while ( v2 != 0 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 1264]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 317); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 317) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_090_v0 [tier=EXACT size=54] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x090 (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_090_v0(_WORD *a1) { int *v1; // r2 int v2; // r0 char *v3; // r1 char *v4; // r3 int v5; // r4 unsigned int v6; // r4 int v7; // r5 int v8; // r6 v1 = (int *)off_D0E1D0; *a1 = 19; v2 = 0; v3 = (char *)off_D0E1CC; while ( v2 != 228 ) { v4 = &v3[v2]; v5 = (unsigned __int8)v3[v2 + 4]; if ( v5 != 255 ) { v6 = v1[v5]; v7 = *((_DWORD *)v4 + 2); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v4 + 2) = v8; } v2 += 12; } return 0; } /* ==== asd_hwop_094_v0 [tier=EXACT size=8] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x094 (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_094_v0(_WORD *a1) { *a1 = 24; return 0; } /* ==== asd_hwop_094_v1 [tier=EXACT size=10] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x094, ASIC variant 1. // Invoked indirectly through that struct. int __fastcall asd_hwop_094_v1(_WORD *a1) { *a1 = 338; return 0; } /* ==== asd_hwop_098_v0 [tier=EXACT size=8] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x098, ASIC variant 0. // Invoked indirectly through that struct. int __fastcall asd_hwop_098_v0(_WORD *a1) { *a1 = 51; return 0; } /* ==== asd_hwop_0D4_v1 [tier=EXACT size=58] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x0D4 (variant 1). Invoked indirectly through that struct. int __fastcall asd_hwop_0D4_v1(_WORD *a1) { int *v1; // r2 int v2; // r0 unsigned __int8 *v3; // r1 int v4; // r3 unsigned __int8 *v5; // r4 unsigned int v6; // r3 int v7; // r5 int v8; // r6 v1 = (int *)off_D13830; *a1 = 12; v2 = 0; v3 = (unsigned __int8 *)off_D1382C; while ( v2 != 12 ) { v4 = v3[8 * v2]; if ( v4 != 255 ) { v5 = &v3[8 * v2]; v6 = v1[v4]; v7 = *((_DWORD *)v5 + 1); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v5 + 1) = v8; } ++v2; } return 0; } /* ==== asd_hwop_0D4_v2 [tier=EXACT size=58] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x0D4 (variant 2). Invoked indirectly through that struct. int __fastcall asd_hwop_0D4_v2(_WORD *a1) { int *v1; // r2 int v2; // r0 unsigned __int8 *v3; // r1 int v4; // r3 unsigned __int8 *v5; // r4 unsigned int v6; // r3 int v7; // r5 int v8; // r6 v1 = (int *)off_D13A34; *a1 = 34; v2 = 0; v3 = (unsigned __int8 *)off_D13A30; while ( v2 != 34 ) { v4 = v3[8 * v2]; if ( v4 != 255 ) { v5 = &v3[8 * v2]; v6 = v1[v4]; v7 = *((_DWORD *)v5 + 1); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v5 + 1) = v8; } ++v2; } return 0; } /* ==== asd_hwop_0DC_v0 [tier=EXACT size=58] ==== */ // Display hardware-ops callback, installed by asd_build_hw_ops at struct // offset +0x0DC (variant 0). Invoked indirectly through that struct. int __fastcall asd_hwop_0DC_v0(_WORD *a1) { int *v1; // r2 int v2; // r0 unsigned __int8 *v3; // r1 int v4; // r3 unsigned __int8 *v5; // r4 unsigned int v6; // r3 int v7; // r5 int v8; // r6 v1 = (int *)off_D13B0C; *a1 = 2; v2 = 0; v3 = (unsigned __int8 *)off_D13B08; while ( v2 != 2 ) { v4 = v3[8 * v2]; if ( v4 != 255 ) { v5 = &v3[8 * v2]; v6 = v1[v4]; v7 = *((_DWORD *)v5 + 1); v8 = 4 * (v6 + v7); if ( v6 > ~v7 ) v8 = 0; *((_DWORD *)v5 + 1) = v8; } ++v2; } return 0; } /* ==== asd_hwop_0DC_v1 [tier=EXACT size=78] ==== */ // Display hardware-ops callback: installed by asd_build_hw_ops into the ops // struct (asd_hw_ops @0xD4279C, 0xEC bytes) at offset +0x0DC, ASIC variant 1. // Invoked indirectly through that struct. int __fastcall asd_hwop_0DC_v1(_WORD *a1) { unsigned __int8 *v5; // r2 int *v6; // r3 int v7; // r1 BOOL v8; // r0 int v9; // r4 unsigned int v10; // r4 unsigned __int8 *v11; // r5 int v12; // r6 int v13; // r7 __asm { SVC 0x8D } *a1 = 2; v5 = (unsigned __int8 *)off_D13BF8; v6 = (int *)off_D13BFC; v7 = 0; v8 = a1 == (_WORD *)25; while ( v7 != 2 ) { v9 = v5[8 * v7]; if ( v9 != 255 ) { v10 = v6[5 * v8 + v9]; v11 = &v5[8 * v7]; v12 = *((_DWORD *)v11 + 1); v13 = 4 * (v10 + v12); if ( v10 > ~v12 ) v13 = 0; *((_DWORD *)v11 + 1) = v13; } ++v7; } return 0; } /* ==== asd_is_not_sigtype1 [tier=EXACT size=8] ==== */ // Predicate: returns (a1 != 1), a display signal-type test. BOOL __fastcall asd_is_not_sigtype1(int a1) { return a1 != 1; } /* ==== asd_is_not_sigtype3 [tier=EXACT size=8] ==== */ // Predicate: returns (a1 != 3), a display signal-type test. BOOL __fastcall asd_is_not_sigtype3(int a1) { return a1 != 3; } /* ==== asd_is_supported_asic [tier=EXACT size=86] ==== */ // Whitelist test on a (device, revision) pair: device 5686 with revision 131/132/211/ // 133/128/129, or the literal 0xC100001636. BOOL __fastcall asd_is_supported_asic(__int64 a1) { return (_DWORD)a1 == 5686 && ((unsigned int)(HIDWORD(a1) - 131) < 2 || HIDWORD(a1) == 211 || HIDWORD(a1) == 133 || (HIDWORD(a1) | 1) == 129) || a1 == 0xC100001636LL; } /* ==== asd_link_call_D49810_D49814 [tier=MNEM size=106] REF-DERIVED-NAME ==== */ // Bounds a1 <= 1 and a2 <= 3, then invokes the runtime callbacks obtained from // asd_get_D49810 and asd_get_D49814. int __fastcall asd_link_call_D49810_D49814(unsigned int a1, unsigned int a2, int a3) { int (__fastcall *D49810)(unsigned int, unsigned int); // r9 int v7; // r7 int D49814; // r0 bool v9; // cc int (__fastcall *v10)(unsigned int, unsigned int, int); // r8 bool v11; // zf D49810 = (int (__fastcall *)(unsigned int, unsigned int))asd_get_D49810(); v7 = 2; D49814 = asd_get_D49814(); v9 = a1 > 1; if ( a1 <= 1 ) v9 = a2 > 3; if ( !v9 && a3 != 0 ) { v10 = (int (__fastcall *)(unsigned int, unsigned int, int))D49814; v11 = D49810 == nullptr; v7 = 27; if ( D49810 != nullptr ) v11 = D49814 == 0; if ( !v11 ) { if ( asd_link_callback_ok(a1) && asd_opt_cb_D4980C_bounded(a1) != 0 ) { v7 = v10(a1, a2, a3); if ( v7 == 0 ) return D49810(a1, a2: (16 * a2) | 0x1000000); } else { return 0; } } } return v7; } /* ==== asd_link_call_D49818 [tier=IDA size=74] REF-DERIVED-NAME ==== */ int __fastcall asd_link_call_D49818(unsigned int a1, int a2) { int D49818; // r3 int result; // r0 unsigned int v6; // r1 int (__fastcall *v7)(unsigned int, int); // r6 D49818 = asd_get_D49818(); result = 2; if ( a1 <= 1 && a2 != 0 ) { v6 = *((_DWORD *)off_D12474 + 4); result = 0; if ( v6 <= 0x1F && ((1 << v6) & dword_D1226C) != 0 ) { if ( D49818 != 0 ) { v7 = (int (__fastcall *)(unsigned int, int))D49818; if ( asd_link_callback_ok(a1) ) return v7(a1, a2); else return 0; } else { return 27; } } } return result; } /* ==== asd_link_callback_ok [tier=MNEM size=36] ==== */ // Bounds idx<=1, then calls the RUNTIME callback pointer off_D330C4(idx) and // sub_D19204(idx). off_D330C4 lives in BSS and is populated at run time - this is one of // the indirect edges that static call-graph analysis cannot follow. BOOL __fastcall asd_link_callback_ok(unsigned int a1) { int (__fastcall *v2)(unsigned int); // r1 BOOL result; // r0 result = false; if ( a1 <= 1 ) { v2 = *((int (__fastcall **)(unsigned int))off_D12474 + 12); if ( v2 != nullptr && v2(a1) != 0 && asd_link_sub_19204(a1) != 0 ) return true; } return result; } /* ==== asd_link_check_C930 [tier=MNEM size=72] ==== */ // Feature-15 gated probe via asd_link_sub_C930; reports 15 when that probe is non-zero. int __fastcall asd_link_check_C930(unsigned int *a1) { int v2; // r0 unsigned int v3; // r1 int result; // r0 unsigned int v5; // r2 int *v6; // r0 bool v7; // r3 int v8; // t1 if ( !asd_feature_enabled(a1: 15) ) return 8; v2 = asd_link_sub_C930(); v3 = 0; if ( v2 != 0 ) { result = 15; } else { v5 = 0; v6 = (int *)((char *)off_D0ECD8 + 4); while ( v5 != 32 ) { v7 = v3 <= v5; v8 = *v6; v6 += 24; ++v5; v3 += v7 && v8 == 1; } result = 0; } *a1 = v3; return result; } /* ==== asd_link_notify_D49810 [tier=MNEM size=56] REF-DERIVED-NAME ==== */ // Bounds a1 <= 1, fetches the runtime callback from asd_get_D49810 (status 27 if absent), // and invokes it with (link, 0x200000F) when the link passes both callback gates. int __fastcall asd_link_notify_D49810(unsigned int a1) { int D49810; // r0 int (__fastcall *v4)(unsigned int, int); // r5 D49810 = asd_get_D49810(); if ( a1 > 1 ) return 2; if ( D49810 == 0 ) return 27; v4 = (int (__fastcall *)(unsigned int, int))D49810; if ( asd_link_callback_ok(a1) && asd_opt_cb_D4980C_bounded(a1) != 0 ) return v4(a1, a2: dword_D11854); else return 0; } /* ==== asd_link_program_timing [tier=MNEM size=154] ==== */ // Programs the link timing registers: writes the encoded value from sub_D16AEC to // unk_D42434 and merges a byte into the low 8 bits of unk_D42438. int __fastcall asd_link_program_timing(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { unsigned int v4; // r4 int *v6; // r9 int v7; // r6 if ( a1 == 0 ) return 2; v4 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D07320 + 3) <= v4 ) return 2; asd_load_le32(a1: a2); v6 = (int *)off_D07E90; v7 = 0; asd_reg_write_1946C(a1: 0, a2: *((_DWORD *)off_D07E90 + 14), a3: v4); asd_reg_read_13B74(a1: 0, a2: v6[15], a3: v4); asd_reg_write_1946C(a1: 0, a2: v6[15], a3: v4); if ( *(_DWORD *)(a1 + 64) == 2 ) { asd_load_le32(a1: a3); v7 = 0; asd_reg_write_1946C(a1: 0, a2: v6[28], a3: v4); asd_reg_read_13B74(a1: 0, a2: v6[29], a3: v4); asd_reg_write_1946C(a1: 0, a2: v6[29], a3: v4); } return v7; } /* ==== asd_link_query_a [tier=MNEM size=168] ==== */ // Reads the link's status register, using unk_D4259C for signal type 48 and the indexed // path otherwise. int __fastcall asd_link_query_a(_DWORD *a1, int a2, __int16 a3) { int v4; // r0 unsigned int v5; // r5 int _13BF8; // r0 if ( a1 == nullptr ) return 2; v4 = a1[10]; if ( v4 == 48 ) { _13BF8 = asd_reg_read_13BF8(a1: *((_DWORD *)off_D066E8 + 99), a2: a1[6]); } else { v5 = a1[5]; if ( v4 != 32 ) { if ( v4 == 16 ) { switch ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D066E8 + 3), a3: a1[5]) & 7 ) { case 0: if ( a1[8] != 0 && asd_reg_read_13D24_cfg1(a1: v5) == 0 ) { if ( a1[19] != 4 ) return 17; } else if ( a1[19] != 3 ) { return 17; } if ( a1[16] == 4 ) return 0; return 17; case 1: case 4: case 6: case 7: return 0; case 2: if ( a1[16] == 1 && a1[19] == 1 ) return 0; return 17; case 3: if ( a1[16] == 3 && a1[19] == 2 ) return 0; return 17; case 5: if ( a1[16] == 5 && a1[19] == 3 ) return 0; return 17; } } return 2; } _13BF8 = asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D066E8 + 83), a3: a1[5]); } if ( _13BF8 << 31 != 0 ) return 0; else return 17; } /* ==== asd_link_query_b [tier=MNEM size=170] ==== */ // Sibling of asd_link_query_a with a different output field. int __fastcall asd_link_query_b(_DWORD *a1, int a2, __int16 a3) { int v4; // r0 unsigned int v5; // r5 int v6; // r1 __int16 v7; // r2 int _13BF8; // r0 if ( a1 == nullptr ) return 2; v4 = a1[10]; if ( v4 == 48 ) { _13BF8 = asd_reg_read_13BF8(a1: *((_DWORD *)off_D06660 + 99), a2: a1[6]); } else { v5 = a1[5]; if ( v4 != 32 ) { if ( v4 == 16 ) { switch ( ((unsigned int)asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D06584 + 2), a3: a1[5]) >> 16) & 7 ) { case 0u: if ( a1[8] != 0 && asd_reg_read_13D24_cfg0(a1: v5, a2: v6, a3: v7) == 0 ) { if ( a1[19] != 4 ) return 17; } else if ( a1[19] != 3 ) { return 17; } if ( a1[16] == 4 ) return 0; return 17; case 2u: if ( a1[16] == 1 && a1[19] == 1 ) return 0; return 17; case 3u: if ( a1[16] == 3 && a1[19] == 2 ) return 0; return 17; case 5u: if ( a1[16] == 5 && a1[19] == 3 ) return 0; return 17; default: return 0; } } return 2; } _13BF8 = asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D06660 + 83), a3: a1[5]); } if ( _13BF8 << 31 != 0 ) return 0; else return 17; } /* ==== asd_link_read_pair_regs [tier=MNEM size=148] ==== */ // Reads the link register pair unk_D42444 / unk_D42448 into two 5-byte caller buffers // (zeroed first via asd_hdcp1_sub_1144). int __fastcall asd_link_read_pair_regs(int a1, _BYTE *a2, _BYTE *a3) { unsigned int v6; // r6 int *v7; // r9 int v8; // r8 asd_hdcp1_sub_1144(result: a2, a2: 5u); asd_hdcp1_sub_1144(result: a3, a2: 5u); if ( a1 == 0 ) return 2; v6 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D07064 + 3) <= v6 ) return 2; v7 = (int *)off_D07BA0; v8 = 0; *(_DWORD *)a2 = asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07BA0 + 18), a3: *(_DWORD *)(a1 + 20)); a2[4] = asd_reg_read_13B74(a1: 0, a2: v7[19], a3: v6); if ( *(_DWORD *)(a1 + 64) == 2 ) { v8 = 0; *(_DWORD *)a3 = asd_reg_read_13B74(a1: 0, a2: v7[32], a3: v6); a3[4] = asd_reg_read_13B74(a1: 0, a2: v7[33], a3: v6); } return v8; } /* ==== asd_link_ready_check [tier=MNEM size=46] ==== */ // Returns 19 unless the link register (unk_D42408) bit31 is clear AND the connector // register (unk_D424A4) bit31 is set. int __fastcall asd_link_ready_check(unsigned int a1) { _DWORD *v1; // r6 int v3; // r4 v1 = off_D06794; v3 = 0; if ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D06794 + 4), a3: a1) << 31 != 0 ) return 19; if ( asd_reg_read_13D24(a1: v1[42], a2: a1) << 31 == 0 ) return 19; return v3; } /* ==== asd_link_ready_full_check [tier=MNEM size=108] ==== */ // Requires (unk_D42410 & 0x101) == 0x101 and (unk_D4241C & 0x1005) == 0x1001 for the // link, else returns 10. int __fastcall asd_link_ready_full_check(int a1) { unsigned int v2; // r4 _DWORD *v3; // r6 int result; // r0 if ( a1 == 0 ) return 2; v2 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D0687C + 3) <= v2 ) return 2; v3 = off_D06878; if ( (asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D06878 + 5), a3: v2) & 0x101) != 0x101 || (asd_reg_read_13B74(a1: 0, a2: v3[8], a3: v2) & 0x1005) != 0x1001 ) { return 10; } if ( *(_DWORD *)(a1 + 64) != 2 ) return 0; result = (asd_reg_read_13B74(a1: 0, a2: v3[12], a3: v2) & 0x1005) - 4097; if ( result != 0 ) return 10; return result; } /* ==== asd_link_reset [tier=IDA size=48] ==== */ int __fastcall asd_link_reset(unsigned int a1, int a2) { char *v4; // r0 if ( !asd_feature_enabled(a1: 15) ) return 8; if ( a1 > 0x1F ) return 5; v4 = (char *)off_D0E130 + 96 * a1; if ( *((_DWORD *)v4 + 1) != 1 ) return 5; *((_DWORD *)v4 + 22) = a2; return 0; } /* ==== asd_link_reset_seq [tier=MNEM size=164] ==== */ // Link reset sequence: verifies the register triplet, clears bit8 of unk_D42410, polls via // asd_reg_poll_seq, then continues through unk_D42430. int __fastcall asd_link_reset_seq(__int64 a1, int a2, int a3) { int v3; // r5 unsigned int v4; // r4 _DWORD *v5; // r6 void (__fastcall *v6)(int, int, unsigned int); // r7 int v7; // r0 void (__fastcall *v8)(int, int, unsigned int); // r8 int v9; // r2 int v10; // r3 if ( (_DWORD)a1 == 0 ) return 2; v3 = a1; v4 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D06A58 + 3) <= v4 ) return 2; LODWORD(a1) = *(_DWORD *)(a1 + 12); asd_verify_reg_triplet(a1, a2, a3); v5 = off_D06A5C; v6 = (void (__fastcall *)(int, int, unsigned int))off_D06A60; v7 = off_D06A60(a1: 0, a2: *((_DWORD *)off_D06A5C + 5), a3: v4); v8 = (void (__fastcall *)(int, int, unsigned int))off_D071A0; off_D071A0(a1: 0, a2: v5[5], a3: v4, a4: v7 & 0xFFFFFEFF); asd_reg_poll_seq(a1: *(_DWORD *)(v3 + 12), a2: 2, a3: v9, a4: v10); v6(a1: 0, a2: v5[13], a3: v4); v8(a1: 0, a2: v5[13], a3: v4); v6(a1: 0, a2: v5[6], a3: v4); v8(a1: 0, a2: v5[6], a3: v4); if ( (*(_DWORD *)(v3 + 64) & 0xFFFFFFFE) == 4 ) { asd_reg_read_13B74(a1: 0, a2: v5[37], a3: v4); asd_reg_write_1946C(a1: 0, a2: v5[37], a3: v4); } asd_reg_clr_bit1_wait(a1: v4); asd_reg_clr_bit2_wait(a1: v4); return 0; } /* ==== asd_link_set_reg42468_field [tier=MNEM size=90] ==== */ // Per-link register write: merges a2 into bits 8..23 of register unk_D42468, then sets // bit0 of register unk_D424DC. int __fastcall asd_link_set_reg42468_field(int a1, int a2) { unsigned int v2; // r5 _DWORD *v3; // r7 int v4; // r4 int _13E8C; // r5 __int16 v6; // r2 __int16 v7; // r2 if ( a1 == 0 ) return 2; v2 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D073EC + 3) <= v2 ) return 2; v3 = off_D073E8; v4 = 0; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D073E8 + 27), a3: v2); asd_reg_write_1946C(a1: 0, a2: v3[27], a3: v2); _13E8C = asd_reg_read_13E8C(); asd_reg_write_196E4(a1: v3[56], a2: _13E8C | 1, a3: v6); asd_reg_write_196E4(a1: v3[56], a2: _13E8C & 0xFFFFFFFE, a3: v7); return v4; } /* ==== asd_link_set_reg4248C_half [tier=MNEM size=60] ==== */ // Per-link register halfword write: merges a2 into the low 16 bits of register unk_D4248C. int __fastcall asd_link_set_reg4248C_half(int a1, int a2) { unsigned int v2; // r5 _DWORD *v3; // r7 int v4; // r4 if ( a1 == 0 ) return 2; v2 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D07320 + 3) <= v2 ) return 2; v3 = off_D0731C; v4 = 0; asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D0731C + 36), a3: v2); asd_reg_write_1946C(a1: 0, a2: v3[36], a3: v2); return v4; } /* ==== asd_link_state_poll [tier=MNEM size=124] ==== */ // One iteration of the link-state poll: waits (SVC 0x56), reads the link state, queries // SYS_DRV RPC 0x1021, re-probes the power state, and reports whether dword_D33054 has // settled. Driven in a loop by asd_sync_link_state. unsigned int __fastcall asd_link_state_poll() { BOOL v0; // r6 unsigned int v5; // r4 unsigned int v6; // r5 void (__fastcall *v7)(int, int, int, int); // r6 int v8; // r3 int v9; // r3 void (__fastcall *v10)(int, int, int, int); // r6 int v11; // r3 int v12; // r3 int v14; // [sp+0h] [bp-8h] BYREF int v15; // [sp+4h] [bp-4h] BYREF v0 = false; v14 = 0; v15 = 0; __asm { SVC 0x56 ; 'V' } asd_query_link_state(a1: &v15); v5 = sysdrv_rpc_1021(a1: v15, a2: 0, a3: (int)&v14); if ( v5 == 0 ) v0 = asd_probe_power_state(); v6 = *((_DWORD *)off_D11604 + 1) != 2; if ( (v0 | v5) != 0 ) v6 = v0; if ( v6 != 0 ) { v7 = (void (__fastcall *)(int, int, int, int))off_D11608; off_D11608(a1: 227, a2: 1, a3: 61440); v7(a1: 227, a2: 1, a3: HIWORD(v6), a4: v8); v7(a1: 227, a2: 1, a3: (unsigned __int16)v6, a4: v9); } if ( v5 != 0 ) { v10 = (void (__fastcall *)(int, int, int, int))off_D11608; off_D11608(a1: 227, a2: 1, a3: 61440); v10(a1: 227, a2: 1, a3: HIWORD(v5), a4: v11); v10(a1: 227, a2: 1, a3: (unsigned __int16)v5, a4: v12); } return v6; } /* ==== asd_link_sub_113A0 [tier=IDA size=548] ==== */ int __fastcall asd_link_sub_113A0(unsigned int a1, int *a2, _DWORD *a3, _DWORD *a4, _DWORD *a5) { _DWORD *v9; // r2 _DWORD *v10; // r11 int *v11; // r8 char *v12; // r3 int result; // r0 char *v14; // r0 int v15; // r0 int (__fastcall *v16)(char *); // r1 char *v17; // r7 int v18; // r0 _DWORD *v19; // r7 char *v20; // r7 int v21; // r0 int (__fastcall *v22)(char *); // r1 int v23; // r0 int v24; // r0 int v25; // r0 int v26; // r3 unsigned int *v27; // r1 unsigned int v28; // r1 char *v29; // r0 int v30; // r0 int (__fastcall *v31)(_DWORD *); // r1 int v32; // r1 int v33; // r0 int (__fastcall *v34)(_DWORD *); // r1 _DWORD *v35; // [sp+4h] [bp-8h] char *v36; // [sp+4h] [bp-8h] int v37; // [sp+8h] [bp-4h] BYREF *a2 = 0; *a3 = 0; *a4 = 0; *a5 = 0; v37 = 0; if ( !asd_feature_enabled(a1: 15) ) return 8; if ( a1 > 0x1F ) return 5; v9 = off_D0ECD8; v10 = (_DWORD *)((char *)off_D0ECD8 + 96 * a1); if ( v10[1] != 1 ) return 5; v11 = v10 + 16; if ( v10[16] == 5 ) { a1 = v10[15]; v12 = (char *)off_D0ECD8 + 96 * a1; if ( *((_DWORD *)v12 + 1) != 1 ) return 5; } else { v12 = nullptr; } v14 = (char *)off_D0ECD8 + 96 * a1; *a2 = *((_DWORD *)v14 + 20); v15 = *((_DWORD *)v14 + 18); if ( v15 == 2 ) { v19 = v10 + 2; if ( v10[2] == 1 ) { v35 = v10 + 2; v20 = v12; v21 = sub_D15968(a1: v10); } else { v22 = (int (__fastcall *)(char *))v9[796]; if ( v22 == nullptr || v9[791] == 0 ) goto LABEL_28; if ( *v11 == 5 ) { v36 = v12; v23 = v22(a1: v12); v12 = v36; v9 = off_D0ECD8; if ( v23 != 0 ) goto LABEL_28; v21 = (*((int (__fastcall **)(_DWORD *))off_D0ECD8 + 791))(a1: v10); v12 = v36; goto LABEL_21; } v35 = v10 + 2; v20 = v12; v21 = v22(a1: (char *)v10); } v12 = v20; v19 = v35; LABEL_21: v9 = off_D0ECD8; if ( v21 == 0 ) *a5 = 1; LABEL_28: if ( v9[799] == 0 ) goto LABEL_50; if ( *v11 == 5 ) { *a3 = *((_DWORD *)v12 + 22); v24 = (*((int (__fastcall **)(char *, int *))off_D0ECD8 + 799))(a1: v12, a2: &v37); } else { *a3 = v10[22]; if ( *v19 == 1 ) { v25 = v10[21]; LABEL_49: *a4 = v25; goto LABEL_50; } v24 = (*((int (__fastcall **)(_DWORD *, int *))off_D0ECD8 + 799))(a1: v10, a2: &v37); } if ( v24 != 0 ) goto LABEL_50; v25 = v37; goto LABEL_49; } if ( v15 != 1 ) { result = 7; goto LABEL_53; } v16 = (int (__fastcall *)(char *))v9[793]; if ( v16 == nullptr || v9[791] == 0 || v9[779] == 0 || v9[785] == 0 ) goto LABEL_50; if ( *v11 == 5 ) { v17 = v12; if ( v16(a1: v12) != 0 ) goto LABEL_36; v18 = (*((int (__fastcall **)(_DWORD *))off_D0ECD8 + 791))(a1: v10); } else { v17 = v12; v18 = v16(a1: (char *)v10); } if ( v18 == 0 ) *a5 = 1; LABEL_36: v26 = *v11; v27 = v10 + 22; if ( *v11 == 5 ) v27 = (unsigned int *)(v17 + 88); v28 = *v27; if ( v28 < 2 ) { *a3 = v28; goto LABEL_50; } v29 = v17; if ( v28 == 3 ) { v32 = *a2; if ( v26 == 5 ) { if ( v32 == 2 ) v33 = (*((int (__fastcall **)(char *))off_D0ECD8 + 785))(a1: v17); else v33 = (*((int (__fastcall **)(char *))off_D0ECD8 + 779))(a1: v17); } else { if ( v32 == 2 ) v34 = *((int (__fastcall **)(_DWORD *))off_D0ECD8 + 785); else v34 = *((int (__fastcall **)(_DWORD *))off_D0ECD8 + 779); v33 = v34(a1: v10); } if ( v33 == 0 ) { v30 = 3; goto LABEL_73; } } else if ( v28 == 2 ) { if ( v26 != 5 ) v29 = (char *)v10; if ( (*((int (__fastcall **)(char *))off_D0ECD8 + 779))(a1: v29) == 0 ) { v30 = 2; LABEL_73: *a3 = v30; } } LABEL_50: if ( asd_link_sub_C930() != 0 ) { result = 15; LABEL_52: *a2 = 0; *a3 = 0; *a4 = 0; *a5 = 0; goto LABEL_53; } result = 0; if ( v10[1] == 1 ) { v31 = *((int (__fastcall **)(_DWORD *))off_D0ECD8 + 802); if ( v31 == nullptr ) goto LABEL_53; if ( v10[2] == 0 && v31(a1: v10) != 0 ) { result = 17; goto LABEL_52; } result = 0; } LABEL_53: if ( *a3 != 3 ) *a5 = 0; return result; } /* ==== asd_link_sub_19204 [tier=EXACT size=38] ==== */ // Reachability-derived label: called only from the 'link' RPC subsystem // (BFS over direct calls + tail calls from the named 0xlink handlers). // Behaviour not individually identified. int __fastcall asd_link_sub_19204(int a1) { _DWORD *v1; // r5 int (__fastcall *v3)(int); // r1 int result; // r0 int (__fastcall *v5)(int); // r1 v1 = off_D15A44; v3 = *((int (__fastcall **)(int))off_D15A44 + 9); if ( v3 == nullptr ) { v5 = *((int (__fastcall **)(int))off_D15A44 + 10); if ( v5 == nullptr ) return 0; return v5(a1); } result = v3(a1); if ( result != 0 ) { v5 = (int (__fastcall *)(int))v1[10]; if ( v5 != nullptr ) return v5(a1); } return result; } /* ==== asd_link_sub_C930 [tier=IDA size=1834] ==== */ int asd_link_sub_C930() { char *v0; // r8 int (__fastcall *v1)(unsigned int *); // r1 int result; // r0 unsigned int v3; // r4 unsigned int v4; // r10 unsigned __int64 v5; // kr00_8 unsigned __int64 v6; // kr08_8 int i; // r0 int v8; // r2 int j; // r3 int v10; // r0 int v11; // r1 int v12; // r2 bool v13; // zf int v14; // r2 int v15; // r12 int v16; // lr int v17; // r2 unsigned int v18; // r6 _DWORD *v19; // r2 int v20; // r3 bool v21; // zf int *v22; // r6 unsigned int v23; // r2 int v24; // t1 int v25; // r0 int v26; // r1 int v27; // r0 int v28; // r12 unsigned int *v29; // r1 unsigned int v30; // r1 int v31; // r2 int v32; // r3 char *v33; // r1 int v34; // r0 bool v35; // zf int v36; // r0 int v37; // r0 bool v38; // zf int v39; // lr int v40; // r11 int *v41; // r6 unsigned int v42; // r0 int v43; // t1 unsigned int *v44; // r0 int v45; // r1 _DWORD *v46; // r0 int v47; // r6 bool v48; // zf int v49; // r0 int v50; // r1 int v51; // r7 unsigned int *v52; // r0 int v53; // r1 int k; // r2 unsigned int v55; // r3 int m; // r2 char *v57; // r3 int v58; // r0 bool v59; // zf unsigned int v60; // r4 unsigned int v61; // r3 unsigned int v62; // r0 int v63; // r4 unsigned int *v64; // r3 int *v65; // r0 int v66; // r2 unsigned int v67; // r10 unsigned int *v68; // r0 int v69; // r1 unsigned int n; // r2 unsigned int v71; // r3 int ii; // r2 int v73; // r0 bool v74; // zf unsigned int v75; // r3 bool v76; // cf int v77; // r0 unsigned int *v78; // r0 unsigned int v79; // r7 bool v80; // zf int v81; // r0 int v82; // r2 unsigned int v83; // r10 unsigned int *v84; // r0 int v85; // r1 unsigned int jj; // r2 unsigned int v87; // r3 int kk; // r2 char *v89; // r3 int v90; // r0 bool v91; // zf unsigned int v92; // r4 unsigned int v93; // r3 unsigned int v94; // r0 int v95; // r4 unsigned int *v96; // r3 int v97; // r0 int v98; // r2 unsigned int v99; // r3 int mm; // r0 int v101; // r2 int nn; // r3 int i1; // r1 char *v104; // r2 int v105; // r0 bool v106; // zf unsigned int v107; // r3 int v108; // r0 int v109; // r0 int v110; // r1 unsigned int v111; // r7 unsigned int v112; // r2 unsigned int *v113; // r0 int v114; // r1 unsigned int v115; // r3 int i2; // r2 char *v117; // r6 int v118; // r0 bool v119; // zf unsigned int v120; // r3 bool v121; // cf int v122; // r0 int v123; // r6 unsigned int *v124; // r0 unsigned int v125; // r6 bool v126; // zf int v127; // r0 int v128; // r2 int v129; // r0 int v130; // r1 unsigned int v131; // r2 int i3; // r2 unsigned int v133; // r4 int v134; // r0 bool v135; // zf unsigned int v136; // r3 bool v137; // cc int v138; // r0 unsigned int *v139; // r0 unsigned int v140; // r6 bool v141; // zf int v142; // r0 int v143; // r1 unsigned int v144; // [sp+4h] [bp-298h] unsigned int v145; // [sp+8h] [bp-294h] unsigned int v146; // [sp+Ch] [bp-290h] unsigned int v147; // [sp+18h] [bp-284h] BYREF unsigned int v148; // [sp+1Ch] [bp-280h] unsigned int v149; // [sp+20h] [bp-27Ch] unsigned int v150; // [sp+24h] [bp-278h] unsigned int v151; // [sp+28h] [bp-274h] unsigned int v152; // [sp+2Ch] [bp-270h] int v153; // [sp+30h] [bp-26Ch] _DWORD v154[8]; // [sp+70h] [bp-22Ch] int v155; // [sp+90h] [bp-20Ch] BYREF int v156; // [sp+A0h] [bp-1FCh] BYREF _BYTE v157[8]; // [sp+134h] [bp-168h] BYREF _BYTE v158[80]; // [sp+13Ch] [bp-160h] BYREF _BYTE v159[92]; // [sp+18Ch] [bp-110h] BYREF _BYTE v160[152]; // [sp+1E8h] [bp-B4h] BYREF _DWORD v161[7]; // [sp+280h] [bp-1Ch] BYREF bzero_core(result: &v147, a2: 0x264u); v0 = (char *)off_D0B290; v1 = *((int (__fastcall **)(unsigned int *))off_D0B290 + 801); if ( v1 == nullptr ) return 7; result = v1(a1: &v147); if ( result == 44 ) return 0; if ( result != 0 ) return result; v3 = v147; if ( v147 == 0 ) return 2; v4 = v148; if ( v148 == 0 ) return 2; if ( v147 > 7 ) return 7; v5 = v149 + (unsigned __int64)v148; result = 7; if ( (unsigned int)v5 <= 7 && HIDWORD(v5) == 0 ) { v6 = v150 + (unsigned __int64)v148; result = 7; if ( (unsigned int)v6 <= 7 && HIDWORD(v6) == 0 ) { v145 = v149; v146 = v147; v144 = v150; bzero_core(result: v161, a2: 0x1Cu); for ( i = 0; i != v4; ++i ) { v8 = v154[i]; if ( v8 != 0 ) { for ( j = 0; j != 7; ++j ) { v3 = 1 << j; if ( (v8 & (1 << j)) != 0 ) { v8 &= ~v3; if ( v161[j] != -1 ) ++v161[j]; } } if ( v8 != 0 ) return 7; } } v10 = 0; v11 = 0; while ( v10 != 31 ) { v3 = (unsigned int)&v0[96 * v10]; v12 = *(_DWORD *)(v3 + 4); v13 = v12 == 1; if ( v12 == 1 ) v13 = *(_DWORD *)(v3 + 8) == 0; if ( v13 ) { v14 = *(_DWORD *)(v3 + 40); if ( v14 == 16 ) { v16 = *(_DWORD *)(v3 + 24); v15 = *(_DWORD *)(v3 + 20); v17 = v161[v16]; if ( v17 != 0 ) { v161[v16] = v17 - 1; } else { v22 = (int *)v157; v23 = v4; while ( v23 != 0 ) { --v23; v24 = *v22; v22 += 3; v11 += v11 != -1 && v24 == 1; } } if ( v154[v15] >> (v16 & 0x1F) << 31 == 0 ) { v3 = *(_DWORD *)(v3 + 76); v18 = v4; v19 = v158; while ( v18 != 0 ) { if ( v3 == 4 ) { v20 = *(v19 - 2); v21 = v20 == 1; if ( v20 == 1 ) v21 = v15 == *(v19 - 1); if ( v21 ) { *v19 = v16; if ( v11 != 0 ) --v11; } } --v18; v19 += 3; } if ( v11 != 0 ) return 15; v11 = 0; } } else if ( (v14 | 0x10) != 0x30 ) { return 2; } } ++v10; } v25 = 0; while ( v25 != 7 ) { v26 = v161[v25++]; if ( v26 != 0 ) return 15; } bzero_core(result: v161, a2: 0x1Cu); v27 = 0; v28 = 0; while ( v4 != v27 ) { v29 = &v147 + 2 * v27; if ( v29[8] == 1 ) { v30 = v29[9]; if ( v30 >= v146 ) return 2; if ( v161[v30] != -1 ) ++v161[v30]; v76 = __CFADD__(v28++, 1); if ( v76 ) v28 = -1; } ++v27; } v31 = 0; v32 = 0; while ( v31 != 31 ) { v33 = &v0[96 * v31]; v34 = *((_DWORD *)v33 + 1); v35 = v34 == 1; if ( v34 == 1 ) v35 = *((_DWORD *)v33 + 2) == 0; if ( v35 ) { v36 = *((_DWORD *)v33 + 10); if ( v36 == 16 ) { v37 = *((_DWORD *)v33 + 3); v38 = v28 == 0; v39 = *((_DWORD *)v33 + 6); v40 = v37 - 1; if ( v28 != 0 ) { v37 = v161[v40]; v38 = v37 == 0; } if ( v38 ) { v41 = (int *)v157; v42 = v4; while ( v42 != 0 ) { --v42; v43 = *v41; v41 += 3; v32 += v43 == 1 && v32 != -1; } } else { --v28; v161[v40] = v37 - 1; } v44 = &v147 + 2 * v39; v3 = v44[8]; if ( v3 == 1 ) { if ( v40 != v44[9] ) return 15; } else { v45 = *((_DWORD *)v33 + 19); v3 = 0; v46 = v158; while ( v4 != v3 ) { if ( v45 == 4 ) { v47 = *(v46 - 2); v48 = v47 == 1; if ( v47 == 1 ) v48 = v3 == *v46; if ( v48 ) { *(v46 - 2) = 0; if ( v32 != 0 ) --v32; } } v46 += 3; ++v3; } if ( v32 != 0 ) return 15; v32 = 0; } } else if ( (v36 | 0x10) != 0x30 ) { return 2; } } ++v31; } v49 = 0; while ( v49 != 7 ) { v50 = v161[v49++]; if ( v50 != 0 ) return 15; } if ( v28 != 0 ) return 15; if ( v145 == 0 ) goto LABEL_165; bzero_core(result: v161, a2: 0x1Cu); v51 = v5; v52 = (unsigned int *)&v155; v53 = 0; for ( k = v5; k != 0; --k ) { if ( *(v52 - 1) == 1 ) { v55 = *v52; if ( *v52 >= v146 ) return 2; v3 = v161[v55] + 1; if ( v161[v55] != -1 ) v161[v55] = v3; v76 = __CFADD__(v53++, 1); if ( v76 ) v53 = -1; } v52 += 6; } for ( m = 0; m != 2976; m += 96 ) { v57 = &v0[m]; v58 = *(_DWORD *)&v0[m + 4]; v59 = v58 == 1; if ( v58 == 1 ) v59 = *((_DWORD *)v57 + 2) == 0; if ( v59 && *((_DWORD *)v57 + 10) == 32 ) { v60 = *((_DWORD *)v57 + 3); result = 2; if ( v60 >= v146 ) return result; if ( v60 == 0 ) return result; v61 = *((_DWORD *)v57 + 5); if ( v61 >= (unsigned int)v5 ) return result; v62 = v60 - 1; if ( v53 != 0 ) { v63 = v161[v62]; if ( v63 != 0 ) { --v53; v161[v62] = v63 - 1; } } v64 = &v147 + 6 * v61; v3 = v64[29]; if ( v3 == 1 && v62 != v64[30] ) return 15; } } v65 = v161; while ( v51 != 0 ) { v66 = *v65++; --v51; if ( v66 != 0 ) return 15; } if ( v53 != 0 ) return 15; v67 = v152; if ( v152 != 0 ) { bzero_core(result: v161, a2: 0x1Cu); v68 = (unsigned int *)&v156; v69 = 0; for ( n = v145; n != 0; --n ) { v71 = *(v68 - 1); if ( v71 >= v145 ) return 2; v3 = *v68; if ( *v68 == 1 ) { v3 = v161[v71] + 1; if ( v161[v71] != -1 ) v161[v71] = v3; v76 = __CFADD__(v69++, 1); if ( v76 ) v69 = -1; } v68 += 6; } for ( ii = 0; ii != 2976; ii += 96 ) { v3 = (unsigned int)&v0[ii]; v73 = *(_DWORD *)&v0[ii + 4]; v74 = v73 == 1; if ( v73 == 1 ) v74 = *(_DWORD *)(v3 + 8) == 0; if ( v74 && *(_DWORD *)(v3 + 40) == 32 ) { v75 = *(_DWORD *)(v3 + 20); result = 2; v76 = v75 >= 6; if ( v75 <= 6 ) { v3 = *(_DWORD *)(v3 + 44); v76 = v3 >= v67; } if ( v76 ) return result; if ( v69 != 0 ) { v77 = v161[v75]; if ( v77 != 0 ) { --v69; v161[v75] = v77 - 1; } } v78 = &v147 + 6 * v75; if ( v78[29] == 1 ) { v79 = v78[33]; v80 = v75 == v79; if ( v75 == v79 ) v80 = v3 == v78[32]; if ( !v80 ) return 15; } } } v81 = 0; while ( v81 != 7 ) { v82 = v161[v81++]; if ( v82 != 0 ) return 15; } if ( v69 != 0 ) return 15; LABEL_165: if ( v144 != 0 ) { v83 = v151; bzero_core(result: v161, a2: 0x1Cu); v84 = (unsigned int *)v159; v85 = 0; for ( jj = v83; jj != 0; --jj ) { if ( *(v84 - 1) == 1 ) { v87 = *v84; if ( *v84 >= v146 ) return 2; v3 = v161[v87] + 1; if ( v161[v87] != -1 ) v161[v87] = v3; v76 = __CFADD__(v85++, 1); if ( v76 ) v85 = -1; } v84 += 3; } for ( kk = 0; kk != 2976; kk += 96 ) { v89 = &v0[kk]; v90 = *(_DWORD *)&v0[kk + 4]; v91 = v90 == 1; if ( v90 == 1 ) v91 = *((_DWORD *)v89 + 2) == 0; if ( v91 && *((_DWORD *)v89 + 10) == 48 ) { v92 = *((_DWORD *)v89 + 3); result = 2; if ( v92 >= v146 ) return result; if ( v92 == 0 ) return result; v93 = *((_DWORD *)v89 + 6); if ( v93 >= v83 ) return result; v94 = v92 - 1; if ( v85 != 0 ) { v95 = v161[v94]; if ( v95 != 0 ) { --v85; v161[v94] = v95 - 1; } } v96 = &v147 + 3 * v93; v3 = v96[92]; if ( v3 == 1 && v94 != v96[93] ) return 15; } } v97 = 0; while ( v97 != 7 ) { v98 = v161[v97++]; if ( v98 != 0 ) return 15; } if ( v85 != 0 ) return 15; bzero_core(result: v161, a2: 0x1Cu); v99 = v144; for ( mm = 0; mm != v99; ++mm ) { v101 = *(_DWORD *)&v159[16 * mm + 80]; if ( v101 != 0 ) { for ( nn = 0; nn != 7; ++nn ) { v3 = 1 << nn; if ( (v101 & (1 << nn)) != 0 ) { v101 &= ~v3; if ( v161[nn] != -1 ) ++v161[nn]; } } v99 = v144; if ( v101 != 0 ) return 7; } } for ( i1 = 0; i1 != 2976; i1 += 96 ) { v104 = &v0[i1]; v105 = *(_DWORD *)&v0[i1 + 4]; v106 = v105 == 1; if ( v105 == 1 ) v106 = *((_DWORD *)v104 + 2) == 0; if ( v106 && *((_DWORD *)v104 + 10) == 48 ) { v107 = *((_DWORD *)v104 + 6); result = 2; if ( v107 >= v83 || *((_DWORD *)v104 + 5) > 6u ) return result; v108 = v161[v107]; if ( v108 != 0 ) v161[v107] = v108 - 1; } } v109 = 0; while ( v109 != 7 ) { v110 = v161[v109++]; if ( v110 != 0 ) return 15; } v111 = v152; bzero_core(result: v161, a2: 0x1Cu); v112 = v144; v113 = (unsigned int *)v160; v114 = 0; while ( v112 != 0 ) { v115 = *(v113 - 2); if ( v115 >= v144 ) return 2; v3 = *v113; if ( *v113 == 2 ) { v3 = v161[v115] + 1; if ( v161[v115] != -1 ) v161[v115] = v3; v76 = __CFADD__(v114++, 1); if ( v76 ) v114 = -1; } --v112; v113 += 4; } for ( i2 = 0; i2 != 2976; i2 += 96 ) { v117 = &v0[i2]; v118 = *(_DWORD *)&v0[i2 + 4]; v119 = v118 == 1; if ( v118 == 1 ) v119 = *((_DWORD *)v117 + 2) == 0; if ( v119 && *((_DWORD *)v117 + 10) == 48 ) { v120 = *((_DWORD *)v117 + 5); result = 2; v121 = v120 >= 6; if ( v120 <= 6 ) { v3 = *((_DWORD *)v117 + 11); v121 = v3 >= v111; } if ( v121 ) return result; v122 = *((_DWORD *)v117 + 6); if ( v114 != 0 ) { v123 = v161[v120]; if ( v123 != 0 ) { --v114; v161[v120] = v123 - 1; } } if ( *(_DWORD *)&v158[12 * v122 + 76] == 1 ) { v124 = &v147 + 4 * v120; v125 = v124[114]; v126 = v120 == v125; if ( v120 == v125 ) v126 = v3 == v124[115]; if ( !v126 ) return 15; } } } v127 = 0; while ( v127 != 7 ) { v128 = v161[v127++]; if ( v128 != 0 ) return 15; } if ( v114 != 0 ) return 15; } if ( v153 != 0 ) { bzero_core(result: v161, a2: 0x14u); v129 = 0; v130 = 0; while ( v129 != 48 ) { if ( *(_DWORD *)&v160[v129 + 100] == 1 ) { v131 = *(_DWORD *)&v160[v129 + 104]; if ( v131 > 4 ) return 2; if ( v161[v131] != -1 ) ++v161[v131]; v76 = __CFADD__(v130++, 1); if ( v76 ) v130 = -1; } v129 += 12; } for ( i3 = 0; i3 != 2976; i3 += 96 ) { v133 = (unsigned int)&v0[i3]; v134 = *(_DWORD *)&v0[i3 + 4]; v135 = v134 == 1; if ( v134 == 1 ) v135 = *(_DWORD *)(v133 + 8) == 0; if ( v135 && *(_DWORD *)(v133 + 52) == 2 ) { v136 = *(_DWORD *)(v133 + 20); result = 2; v137 = v136 > 4; if ( v136 <= 4 ) { v133 = *(_DWORD *)(v133 + 56); v137 = v133 > 3; } if ( v137 ) return result; if ( v130 != 0 ) { v138 = v161[v136]; if ( v138 != 0 ) { --v130; v161[v136] = v138 - 1; } } v139 = &v147 + 3 * v133; if ( v139[141] == 1 ) { v140 = v139[142]; v141 = v136 == v140; if ( v136 == v140 ) v141 = v139[143] == v133; if ( !v141 ) return 15; } } } if ( v130 != 0 ) return 15; v142 = 0; while ( v142 != 5 ) { v143 = v161[v142++]; if ( v143 != 0 ) return 15; } } } return 0; } } return result; } /* ==== asd_link_train_status [tier=MNEM size=88] ==== */ // Per-link training status: requires (reg unk_D4241C & 0x1005) == 0x1001, and for // ctx+64 == 2 additionally checks register unk_D4242C the same way. int __fastcall asd_link_train_status(int a1) { unsigned int v2; // r4 _DWORD *v3; // r6 int result; // r0 if ( a1 == 0 ) return 2; v2 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D06968 + 3) <= v2 ) return 2; v3 = off_D0696C; if ( (asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D0696C + 8), a3: v2) & 0x1005) != 0x1001 ) return 9; if ( *(_DWORD *)(a1 + 64) != 2 ) return 0; result = (asd_reg_read_13B74(a1: 0, a2: v3[12], a3: v2) & 0x1005) - 4097; if ( result != 0 ) return 9; return result; } /* ==== asd_link_wait_and_set [tier=MNEM size=210] ==== */ // Polls register unk_D4241C for bit24 (bounded 400 iterations), then merges a2 into the // low 16 bits of unk_D4243C. int __fastcall asd_link_wait_and_set(int a1, int a2, int a3) { unsigned int v4; // r4 int v5; // r5 int *v6; // r7 int v7; // r5 int v8; // r6 int v13; // r6 if ( a1 == 0 ) return 2; v4 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D06968 + 3) <= v4 ) return 2; v5 = dword_D0665C; v6 = (int *)off_D0696C; while ( (asd_reg_read_13B74(a1: 0, a2: v6[8], a3: v4) & 0x1000000) == 0 && v5 != 0 ) ++v5; asd_reg_read_13B74(a1: 0, a2: v6[16], a3: v4); asd_reg_write_1946C(a1: 0, a2: v6[16], a3: v4); v8 = 4; __asm { SVC 0x56 ; 'V' } while ( --v8 != 0 ) { if ( (asd_reg_read_13B74(a1: 0, a2: v6[8], a3: v4) & 5) == 1 ) { if ( *(_DWORD *)(a1 + 64) != 2 ) return 0; while ( (asd_reg_read_13B74(a1: 0, a2: v6[12], a3: v4) & 0x1000000) == 0 && v5 != 0 ) ++v5; asd_reg_read_13B74(a1: 0, a2: v6[30], a3: v4); asd_reg_write_1946C(a1: 0, a2: v6[30], a3: v4); v13 = 4; v7 = 0; __asm { SVC 0x56 ; 'V' } while ( --v13 != 0 ) { if ( (asd_reg_read_13B74(a1: 0, a2: v6[12], a3: v4) & 5) == 1 ) return v7; } return 9; } } return 9; } /* ==== asd_link_write_quad [tier=MNEM size=130] ==== */ // Writes four caller-supplied words to the link register quad // unk_D42454/58/5C/60 indexed by ctx+20. int __fastcall asd_link_write_quad(int a1, _DWORD *a2) { unsigned int v2; // r5 _DWORD *v3; // r7 void (__fastcall *v4)(int, int, unsigned int); // r8 int v5; // r4 unsigned int v6; // r6 void (__fastcall *v7)(unsigned int, int, __int16); // r5 __int16 v8; // r2 __int16 v9; // r2 if ( a1 == 0 ) return 2; v2 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D073EC + 3) <= v2 ) return 2; v3 = off_D07444; v4 = (void (__fastcall *)(int, int, unsigned int))off_D07BA4; v5 = 0; off_D07BA4(a1: 0, a2: *((_DWORD *)off_D07444 + 22), a3: v2, a4: *a2); v4(a1: 0, a2: v3[23], a3: v2); v4(a1: 0, a2: v3[24], a3: v2); v4(a1: 0, a2: v3[25], a3: v2); v4(a1: 0, a2: v3[26], a3: v2); v6 = asd_reg_read_13E8C() & 0xFFFFFF8F | (16 * (v2 & 7)); v7 = (void (__fastcall *)(unsigned int, int, __int16))off_D071A4; off_D071A4(a1: v3[56], a2: v6); v7(a1: v3[56], a2: v6 | 1, a3: v8); v7(a1: v3[56], a2: v6 & 0xFFFFFFFE, a3: v9); return v5; } /* ==== asd_load_le32 [tier=EXACT size=22] ==== */ // Loads a little-endian 32-bit word from an unaligned byte pointer. int __fastcall asd_load_le32(unsigned __int8 *a1) { return *a1 | (a1[1] << 8) | (a1[2] << 16) | (a1[3] << 24); } /* ==== asd_log_event [tier=MNEM size=22] ==== */ // Opcode 0x208 - trace/log sink (HDCP-side disp_log_event). int __fastcall asd_log_event(int a1, int a2, int a3, int a4) { int result; // r0 result = asd_bzero_core_cfg2(); if ( result != 0 ) return 28; return result; } /* ==== asd_lookup_by_class [tier=EXACT size=62] ==== */ // Class-indexed table lookup: class 2 bounds a2 against HIDWORD(qword_D42350) and uses // unk_D423A0; class 1 takes the sibling path. int __fastcall asd_lookup_by_class(int a1, unsigned int a2) { int result; // r0 int v3; // r2 if ( a1 == 2 ) { result = 0; if ( *((_DWORD *)off_D0E4BC + 5) <= a2 ) return result; v3 = *((_DWORD *)off_D0E4BC + 22); goto LABEL_10; } if ( a1 == 1 ) { result = 0; if ( *((_DWORD *)off_D0E4BC + 2) <= a2 ) return result; v3 = *((_DWORD *)off_D0E4BC + 20); goto LABEL_10; } if ( a1 != 0 ) return 0; result = 0; if ( *((_DWORD *)off_D0E4BC + 3) > a2 ) { v3 = *((_DWORD *)off_D0E4BC + 18); LABEL_10: if ( v3 != 0 ) return *(_DWORD *)(v3 + 4 * a2); } return result; } /* ==== asd_mmio_30106AC_rmw [tier=EXACT size=34] ==== */ // Direct MMIO read-modify-write on the register at 0x30106AC (no SVC; mapped aperture). int __fastcall asd_mmio_30106AC_rmw(_DWORD *a1) { if ( a1 == nullptr ) return 2; *(_DWORD *)off_D10FD0 |= 0xC00000u; __asm { SVC 0x59 ; 'Y' } *a1 = 91; return 0; } /* ==== asd_mmio_32000C4_rmw [tier=EXACT size=18] ==== */ // Direct MMIO read-modify-write on the register at 0x32000C4 (no SVC; mapped aperture). int __fastcall asd_mmio_32000C4_rmw(char a1) { *(_DWORD *)off_D0F5D8 = *(_DWORD *)off_D0F5D8 & 0xFFFFFFDF | (32 * (a1 & 1)); return 0; } /* ==== asd_op_304 [tier=MNEM size=30] ==== */ // Opcode 0x304. int __fastcall asd_op_304(int a1, int a2) { int result; // r0 if ( asd_state_not_1() ) return 14; result = *(_DWORD *)off_D0FE8C != 6; if ( *(_DWORD *)off_D0FE8C == 5 ) return 14; return result; } /* ==== asd_op_305 [tier=EXACT size=64] ==== */ // Opcode 0x305. int __fastcall asd_op_305(int a1) { int result; // r0 _DWORD *v2; // r0 int v3; // r1 _DWORD *v4; // r0 int v5; // r1 int *v6; // r0 int v7; // r1 switch ( a1 ) { case 1: v2 = off_D0FE8C; v3 = 1; goto LABEL_6; case 2: v2 = off_D0FE8C; v3 = 2; LABEL_6: v2[2] = v3; goto LABEL_13; case 3: v4 = off_D0FE8C; v5 = 3; goto LABEL_9; case 4: v4 = off_D0FE8C; v5 = 4; LABEL_9: v4[1] = v5; goto LABEL_13; case 5: v6 = (int *)off_D0FE8C; v7 = 5; goto LABEL_12; case 6: v6 = (int *)off_D0FE8C; v7 = 6; LABEL_12: *v6 = v7; LABEL_13: result = 0; break; default: result = 4; break; } return result; } /* ==== asd_op_306 [tier=MNEM size=34] ==== */ // Opcode 0x306. int __fastcall asd_op_306() { int v0; // r1 bool v1; // zf v0 = *((_DWORD *)off_D0FE8C + 1); v1 = v0 == 3; if ( v0 != 3 ) v1 = *((_DWORD *)off_D0FE8C + 2) == 1; if ( v1 || asd_dio_entry_present(a1: 1u) ) return 14; else return 0; } /* ==== asd_op_309 [tier=MNEM size=58] ==== */ // Opcode 0x309. int __fastcall asd_op_309(unsigned int *a1) { _DWORD *v2; // r0 unsigned int v3; // r2 unsigned int v4; // r1 v2 = off_D0FE8C; v3 = *a1 & 0xFFFFFFFB; if ( *((_DWORD *)off_D0FE8C + 1) == 3 ) v3 += 4; *a1 = v3; v4 = v3 & 0xFFFFFFFD; if ( v2[2] == 1 ) v4 += 2; *a1 = v4; *a1 = asd_dio_entry_present(a1: 1u) + (*a1 & 0xFFFFFFFE); return 0; } /* ==== asd_op_802 [tier=EXACT size=14] ==== */ // Opcode 0x802. int __fastcall asd_op_802(_DWORD *a1) { if ( a1 == nullptr ) return 2; *a1 = 0; return 0; } /* ==== asd_opt_cb_D497F0 [tier=IDA size=12] REF-DERIVED-NAME ==== */ int asd_opt_cb_D497F0() { int (*v0)(void); // r1 v0 = *((int (**)(void))off_D15A44 + 4); if ( v0 != nullptr ) return v0(); else return 1; } /* ==== asd_opt_cb_D497F8 [tier=IDA size=12] REF-DERIVED-NAME ==== */ int asd_opt_cb_D497F8() { int (*v0)(void); // r1 v0 = *((int (**)(void))off_D15A44 + 6); if ( v0 != nullptr ) return v0(); else return 1; } /* ==== asd_opt_cb_D497FC [tier=IDA size=12] REF-DERIVED-NAME ==== */ int asd_opt_cb_D497FC() { int (*v0)(void); // r2 v0 = *((int (**)(void))off_D15A44 + 7); if ( v0 != nullptr ) return v0(); else return 1; } /* ==== asd_opt_cb_D4980C_bounded [tier=MNEM size=12] ==== */ // Bounds a1 <= 1, then calls the optional runtime callback unk_D4980C if installed. int __fastcall asd_opt_cb_D4980C_bounded(unsigned int a1) { int (*v2)(void); // r1 if ( a1 > 1 ) return 0; v2 = *((int (**)(void))off_D15A44 + 11); if ( v2 != nullptr ) return v2(); else return 0; } /* ==== asd_opt_cb_D49828 [tier=IDA size=12] REF-DERIVED-NAME ==== */ int asd_opt_cb_D49828() { int (*v0)(void); // r2 v0 = *((int (**)(void))off_D15A44 + 18); if ( v0 != nullptr ) return v0(); else return 1; } /* ==== asd_opt_cb_D4982C [tier=IDA size=12] REF-DERIVED-NAME ==== */ int asd_opt_cb_D4982C() { int (*v0)(void); // r2 v0 = *((int (**)(void))off_D15A44 + 19); if ( v0 != nullptr ) return v0(); else return 1; } /* ==== asd_pipe_enable [tier=MNEM size=190] ==== */ // Enables the pipe for signal type 16 or 48: resolves the lane via unk_D42588/unk_D425A0, // sets bit7 in unk_D42584 and the companion bit in unk_D42594. int __fastcall asd_pipe_enable(int a1, int a2, int a3) { unsigned int v5; // r1 int v7; // r0 _DWORD *v8; // r8 unsigned int v9; // r7 int v10; // r0 _DWORD *v12; // r8 unsigned int v13; // r7 int v14; // r0 if ( a1 == 0 ) return 2; v5 = *(_DWORD *)(a1 + 24); v7 = *(_DWORD *)(a1 + 40); if ( v7 != 48 ) { if ( v7 == 16 ) { v8 = off_D09850; v9 = asd_reg_read_13974(a1: *((_DWORD *)off_D09850 + 95), a2: v5) & 7; asd_reg_read_139E4(a1: v8[94], a2: v9); asd_reg_write_19394(a1: v8[94], a2: v9); v10 = v8[97]; if ( v10 != 0 ) { asd_reg_read_13974(a1: v10, a2: v9); asd_reg_write_19328(a1: v8[97], a2: v9); } return asd_reg_offsets_init_19600(a1, a2, a3); } return 2; } v12 = off_D09850; v13 = asd_reg_read_13BF8(a1: *((_DWORD *)off_D09850 + 100), a2: v5) & 7; asd_reg_read_139E4(a1: v12[94], a2: v13); asd_reg_write_19394(a1: v12[94], a2: v13); v14 = v12[101]; if ( v14 != 0 ) { asd_reg_read_13BF8(a1: v14, a2: v13); asd_reg_write_19524(a1: v12[101], a2: v13); } return asd_scan_pipe_regs(a1, a2, a3); } /* ==== asd_pipe_lookup [tier=EXACT size=180] ==== */ // Dispatches by signal type: type 48 delegates to asd_find_active_pipe, type 16 resolves // the pipe directly; anything else returns 2. int __fastcall asd_pipe_lookup(_DWORD *a1, int a2, __int16 a3) { int v3; // r1 unsigned int v5; // r5 _DWORD *v6; // r4 int v7; // r9 int (__fastcall *v8)(int, unsigned int); // r7 unsigned int v9; // r6 unsigned int v10; // r8 unsigned int v11; // r0 int v12; // r1 if ( a1 == nullptr ) return 2; v3 = a1[10]; if ( v3 == 48 ) return asd_find_active_pipe((int)a1); if ( v3 != 16 ) return 2; v5 = a1[5]; if ( *((_DWORD *)off_D087B4 + 3) <= v5 ) return 2; v6 = off_D08980; v7 = a1[6]; v8 = off_D087BC; v9 = off_D087BC(a1: *((_DWORD *)off_D08980 + 43), a2: a1[5]); v10 = v8(a1: v6[44], a2: v5); v11 = v8(a1: v6[45], a2: v5); if ( (v9 & 7) == v7 && (v9 & 0x10) != 0 || (v9 & 0x100000) != 0 && (HIWORD(v9) & 7) == v7 || (v10 & 7) == v7 && (v10 & 0x10) != 0 || (v10 & 0x100000) != 0 && (HIWORD(v10) & 7) == v7 || (v11 & 7) == v7 && (v11 & 0x10) != 0 ) { return 0; } v12 = (HIWORD(v11) & 7) - v7; if ( v12 != 0 ) v12 = 10; if ( (v11 & 0x100000) == 0 ) return 10; return v12; } /* ==== asd_plat_sub_1B40 [tier=EXACT size=46] ==== */ // Reachability-derived label: called only from the 'plat' RPC subsystem // (BFS over direct calls + tail calls from the named 0xplat handlers). // Behaviour not individually identified. int __fastcall asd_plat_sub_1B40() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== asd_platform_op_402 [tier=EXACT size=106] ==== */ // Opcode 0x402. int __fastcall asd_platform_op_402(int a1) { __asm { SVC 0x7B ; '{' } if ( a1 == 1 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } } else { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } } return 0; } /* ==== asd_platform_op_403 [tier=MNEM size=268] ==== */ // Opcode 0x403. int __fastcall asd_platform_op_403(int a1, unsigned int a2, _DWORD *a3, int a4, int a5, int a6) { _DWORD *v6; // r9 int result; // r0 int i; // r0 int (__fastcall *v13)(unsigned __int8 *); // r1 _DWORD *v15; // r2 int j; // r4 char v20; // [sp+6h] [bp-22h] unsigned __int8 v21; // [sp+7h] [bp-21h] BYREF _DWORD v22[8]; // [sp+8h] [bp-20h] BYREF v6 = off_D02494; if ( a2 <= 3 && *(_DWORD *)off_D02494 == 12 ) { result = sub_D11A48(a1: v22); if ( result != 0 ) return result; for ( i = 0; i != 6; ++i ) { if ( (*off_D02498)[2 * i] == v22[0] && (*off_D02498)[2 * i + 1] == v22[1] ) return 8; } } if ( (a2 | 4) == 6 ) { v13 = (int (__fastcall *)(unsigned __int8 *))v6[41]; if ( v13 != nullptr ) result = v13(a1: &v21); else result = 7; if ( (result | v21) == 0 ) result = 8; _ZF = a2 == 6; if ( a2 == 6 ) _ZF = v21 == 1; if ( _ZF ) { if ( asd_plat_sub_1B40() != 0 ) return 1; if ( v20 == 0 ) return 8; } else if ( result != 0 ) { return result; } } v15 = &v6[a1 + 1]; for ( j = 0; ; j += 12 ) { if ( 12 * *((unsigned __int16 *)v6 + a1 + 34) == j ) return 7; if ( *(_DWORD **)(*v15 + j + 8) == a3 && *(_DWORD *)(*v15 + j) == a2 ) break; } if ( a6 == 8 ) { if ( a1 == 9 ) { *a3 = a4; a3[1] = a5; } else { __asm { SVC 0xA5 } } } else { if ( a6 != 4 ) return 2; if ( a1 == 9 ) *a3 = a4; else __asm { SVC 0x7C ; '|' } } return 0; } /* ==== asd_platform_op_404 [tier=MNEM size=244] ==== */ // Opcode 0x404. int __fastcall asd_platform_op_404(unsigned int a1, unsigned int a2, unsigned int *a3, _DWORD *a4, _DWORD *a5, int a6) { char *v10; // r9 int result; // r0 int i; // r0 bool v13; // cc int v15; // r1 char *v16; // r12 int j; // r4 int v18; // r3 __int64 v19; // r0 __int64 v23; // [sp+0h] [bp-2Ch] _DWORD v24[8]; // [sp+Ch] [bp-20h] BYREF if ( asd_validate_ptr(a1: (unsigned int)a4, a2: 4u) == 0 || asd_validate_ptr(a1: (unsigned int)a5, a2: 4u) == 0 ) return 2; v10 = (char *)off_D02494; result = 7; if ( a2 <= 3 && *(_DWORD *)off_D02494 == 12 ) { result = sub_D11A48(a1: v24); if ( result == 0 ) { for ( i = 0; ; ++i ) { if ( i == 6 ) { result = 0; goto LABEL_14; } if ( (*off_D02498)[2 * i] == v24[0] && (*off_D02498)[2 * i + 1] == v24[1] ) break; } return 8; } } else { LABEL_14: v13 = a1 > 0xF; if ( a1 <= 0xF ) v13 = a2 > 7; if ( !v13 ) { _ZF = a6 == 8; if ( a6 != 8 ) _ZF = a6 == 4; if ( _ZF ) { v15 = 0; v16 = v10 + 4; result = 0; while ( v15 != 6 ) { for ( j = 0; *(unsigned __int16 *)&v16[2 * v15 + 188] != j; ++j ) { v18 = *(_DWORD *)&v16[4 * v15 + 164] + 8 * j; if ( *(unsigned int **)(v18 + 4) == a3 ) result = 7; } ++v15; } if ( result == 0 ) { if ( a1 == 9 ) { if ( a6 == 8 ) v19 = *(_QWORD *)a3; else v19 = *a3; } else { __asm { SVC 0x7B ; '{' } v19 = v23; } *a5 = HIDWORD(v19); *a4 = v19; return 0; } } } } return result; } /* ==== asd_probe_power_state [tier=MNEM size=42] ==== */ // Issues SYS_DRV RPC 0x1021 (sub_D01A18 verb 6); maps the returned value to // dword_D33054 (1, or 2 when the reply is 3, or 0 on RPC failure). BOOL __fastcall asd_probe_power_state() { int v0; // r0 int v1; // r1 int v3; // [sp+4h] [bp-4h] BYREF v3 = 0; v0 = sysdrv_rpc_1021(a1: 6, a2: 0, a3: (int)&v3); v1 = 1; if ( v3 == 3 ) v1 = 2; if ( v0 != 0 ) v1 = 0; *((_DWORD *)off_D11604 + 1) = v1; return v0 != 0; } /* ==== asd_program_key_regs [tier=EXACT size=100] ==== */ // Resolves per-signal key words via sub_D09254 then drives asd_write_key_regs across the // 2 x 2 and 4-entry register groups. int __fastcall asd_program_key_regs(int a1) { int result; // r0 unsigned int i; // r8 int j; // r7 int k; // r7 int v6[7]; // [sp+4h] [bp-1Ch] BYREF if ( a1 == 0 ) return 2; result = asd_get_key_words(a1: *(_DWORD *)(a1 + 40), a2: v6); if ( result == 0 ) { for ( i = 0; i <= 1; ++i ) { for ( j = 0; j != 2; ++j ) asd_write_key_regs(a1, a2: v6[0], a3: v6[j + 1]); for ( k = 0; k != 4; ++k ) asd_write_key_regs(a1, a2: v6[0], a3: v6[k + 3]); } return 0; } return result; } /* ==== asd_program_link_by_signal [tier=MNEM size=790] ==== */ // Programs the link for its signal class: switch over __ROR4__(ctx+40, 4) with each case // bounds-checking the link index against unk_D4234C / qword_D42350 before touching the // register block. int __fastcall asd_program_link_by_signal(struct asd_link_cfg *a1, int a2, int a3, int a4) { __int64 v5; // kr00_8 unsigned int field28; // r0 unsigned int v7; // r0 bool v8; // cc unsigned int v9; // r1 unsigned int v10; // r7 unsigned int v11; // r1 bool v12; // cc unsigned int v13; // r1 bool v14; // cc unsigned int v15; // r1 bool v16; // cc int result; // r0 unsigned int field0C; // r1 _DWORD *v19; // r5 unsigned int field2C; // r3 unsigned int v21; // r1 unsigned int field38; // r2 BOOL v23; // r6 BOOL v24; // r3 __int64 v25; // kr08_8 _DWORD *v26; // r9 unsigned int v27; // r6 int v28; // r0 __int16 v29; // r2 int (__fastcall *v30)(_DWORD); // r1 unsigned int v31; // r0 _DWORD *v32; // r5 unsigned int v33; // r6 int v34; // r0 int *v35; // r5 unsigned int field24; // r5 int v37; // r1 __int16 v38; // r2 int _13B74; // r6 unsigned int field20; // r0 unsigned int field44; // r0 unsigned int v42; // r0 unsigned int v43; // r6 int v44; // r0 int v45; // [sp+0h] [bp-8h] BYREF int v46; // [sp+4h] [bp-4h] BYREF v45 = a3; v46 = a4; if ( a1 == nullptr ) return 2; v5 = *(_QWORD *)&a1->field14; field28 = a1->field28; switch ( __ROR4__(field28, 4) ) { case 0: v7 = *((_DWORD *)off_D08EF4 + 3); v8 = v7 > (unsigned int)v5; if ( v7 > (unsigned int)v5 ) v8 = v7 > HIDWORD(v5); if ( v8 ) { v10 = 16; } else if ( v7 > (unsigned int)v5 || (v9 = *((_DWORD *)off_D08EF4 + 2)) <= HIDWORD(v5) || v7 > HIDWORD(v5) || v9 <= (unsigned int)v5 ) { v10 = 0; } else { v10 = 32; } a1->field30 = 1; break; case 1: v11 = *((_DWORD *)off_D08EF4 + 3); v12 = v11 > (unsigned int)v5; if ( v11 > (unsigned int)v5 ) v12 = v11 > HIDWORD(v5); if ( v12 ) { v10 = 16; } else { if ( field28 == 48 ) goto LABEL_20; if ( field28 == 32 ) goto LABEL_16; v10 = 0; } break; case 2: LABEL_16: v13 = *((_DWORD *)off_D08EF4 + 4); v14 = v13 > (unsigned int)v5; if ( v13 > (unsigned int)v5 ) v14 = v13 > HIDWORD(v5); if ( v14 ) { v10 = 32; } else { if ( field28 == 48 ) goto LABEL_20; v10 = 0; } break; case 3: LABEL_20: v15 = *((_DWORD *)off_D08EF4 + 5); v16 = v15 > (unsigned int)v5; if ( v15 > (unsigned int)v5 ) v16 = *((_DWORD *)off_D08EF4 + 6) > HIDWORD(v5); if ( !v16 ) goto LABEL_23; v10 = 48; break; default: LABEL_23: v10 = 0; break; } result = 2; a1->field28 = v10; if ( v10 != 0 ) { field0C = a1->field0C; if ( field0C != 0 ) { v19 = off_D08EF4; if ( *((_DWORD *)off_D08EF4 + 1) > field0C ) { field2C = a1->field2C; v21 = *((_DWORD *)off_D08EF4 + 7); result = 2; field38 = a1->field38; v23 = v21 <= field2C; v24 = field2C != 0; if ( field38 <= 4 && (!v24 || !v23) ) { v25 = *(_QWORD *)&a1->field30; if ( HIDWORD(v25) == 2 && *((_DWORD *)off_D08EF4 + 8) <= field38 ) return 2; v45 = 255; v46 = 255; if ( v10 == 16 ) { if ( v21 == 0 || (result = asd_get_connector_ids_a(a1, a2: &v46, a3: &v45)) == 0 ) { if ( v19[4] == 0 || asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D08EF8 + 4), a3: v5) << 31 != 0 ) { if ( (_DWORD)v25 == 1 ) { v26 = off_D09B48; v27 = asd_reg_read_13974(a1: *((_DWORD *)off_D09B48 + 95), a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v26[94], a2: v27); asd_reg_write_19394(a1: v26[94], a2: v27); v28 = v26[97]; if ( v28 != 0 ) { asd_reg_read_13974(a1: v28, a2: v27); asd_reg_write_19328(a1: v26[97], a2: v27); } } switch ( ((unsigned int)asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D08EF8 + 2), a3: v5) >> 16) & 7 ) { case 0u: if ( a1->field20 == 0 || (v30 = (int (__fastcall *)(_DWORD))v19[38]) != nullptr && v30(a1: v5) != 0 || asd_reg_read_13D24_cfg0(a1: v5, a2: (int)v30, a3: v29) != 0 ) { a1->field4C = 3; v31 = 4; goto LABEL_65; } a1->field40 = 4; a1->field48 = 16; a1->field4C = 4; break; case 2u: v31 = 1; a1->field4C = 1; goto LABEL_65; case 3u: goto LABEL_59; case 5u: a1->field4C = 3; v31 = 5; goto LABEL_65; default: goto LABEL_66; } goto LABEL_66; } return 8; } } else { if ( v10 == 48 ) { result = asd_get_connector_ids_a(a1, a2: &v46, a3: &v45); if ( result != 0 ) return result; v35 = (int *)off_D08EF8; if ( asd_reg_read_13BF8(a1: *((_DWORD *)off_D08EF8 + 99), a2: HIDWORD(v5)) << 31 != 0 ) { a1->field4C = 3; a1->field40 = 5; if ( (_DWORD)v25 == 1 ) { v43 = asd_reg_read_13BF8(a1: v35[100], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v35[94], a2: v43); asd_reg_write_19394(a1: v35[94], a2: v43); v44 = v35[101]; if ( v44 != 0 ) { asd_reg_read_13BF8(a1: v44, a2: v43); asd_reg_write_19524(a1: v35[101], a2: v43); } } LABEL_66: result = asd_state_not_1(); if ( result != 0 ) { a1->field44 = 4; return result; } field24 = a1->field24; if ( v10 == 16 ) { _13B74 = asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D09224 + 8), a3: v5); field20 = a1->field20; a1->field44 = 0; if ( field20 != 0 && asd_reg_read_13D24_cfg0(a1: v5, a2: v37, a3: v38) == 0 ) { v42 = 16; goto LABEL_83; } if ( field24 >= 0xA && (_13B74 & 0x70000000) == 0x30000000 ) a1->field44 |= 1u; if ( field24 < 0x16 ) return 0; field44 = a1->field44; } else { field44 = a1->field44 & 0xFFFFFFFE; a1->field44 = field44; if ( field24 < 0x16 ) return 0; } v42 = field44 | 2; LABEL_83: a1->field44 = v42; return 0; } return 8; } if ( v21 == 0 || (result = asd_get_connector_ids_a(a1, a2: &v46, a3: &v45)) == 0 ) { if ( (_DWORD)v25 == 1 ) { v32 = off_D08EF8; v33 = asd_reg_read_13974(a1: *((_DWORD *)off_D08EF8 + 96), a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v32[94], a2: v33); asd_reg_write_19394(a1: v32[94], a2: v33); v34 = v32[98]; if ( v34 != 0 ) { asd_reg_read_13974(a1: v34, a2: 0); asd_reg_write_19328(a1: v32[98], a2: 0); } } if ( asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D08EF8 + 83), a3: v5) << 31 != 0 ) { LABEL_59: a1->field4C = 2; v31 = 3; LABEL_65: a1->field40 = v31; goto LABEL_66; } return 8; } } } } } } return result; } /* ==== asd_program_link_by_signal_v2 [tier=MNEM size=802] ==== */ // Second ASIC form of asd_program_link_by_signal. int __fastcall asd_program_link_by_signal_v2(struct asd_link_cfg *a1, int a2, int a3, int a4) { __int64 v5; // kr00_8 unsigned int field28; // r0 unsigned int v7; // r0 bool v8; // cc unsigned int v9; // r1 unsigned int v10; // r5 unsigned int v11; // r1 bool v12; // cc unsigned int v13; // r1 bool v14; // cc unsigned int v15; // r1 bool v16; // cc int connector_ids_a; // r7 unsigned int field0C; // r0 _DWORD *v19; // r9 unsigned int field2C; // r2 unsigned int v21; // r0 unsigned int field38; // r1 BOOL v23; // r3 BOOL v24; // r2 __int64 v25; // kr08_8 _DWORD *v27; // r7 unsigned int v28; // r6 int v29; // r0 unsigned int v30; // r0 _DWORD *v31; // r7 unsigned int v32; // r6 int v33; // r0 int *v34; // r7 unsigned int v35; // r6 int v36; // r0 BOOL v37; // r0 int v38; // r1 unsigned int v39; // r0 unsigned int field24; // r6 int (__fastcall *v41)(_DWORD, int); // r0 unsigned int v42; // r0 unsigned int v43; // r0 int v44; // [sp+0h] [bp-8h] BYREF int v45; // [sp+4h] [bp-4h] BYREF v44 = a3; v45 = a4; if ( a1 == nullptr ) return 2; v5 = *(_QWORD *)&a1->field14; field28 = a1->field28; switch ( __ROR4__(field28, 4) ) { case 0: v7 = *((_DWORD *)off_D09220 + 3); v8 = v7 > (unsigned int)v5; if ( v7 > (unsigned int)v5 ) v8 = v7 > HIDWORD(v5); if ( v8 ) { v10 = 16; } else if ( v7 > (unsigned int)v5 || (v9 = *((_DWORD *)off_D09220 + 2)) <= HIDWORD(v5) || v7 > HIDWORD(v5) || v9 <= (unsigned int)v5 ) { v10 = 0; } else { v10 = 32; } a1->field30 = 1; break; case 1: v11 = *((_DWORD *)off_D09220 + 3); v12 = v11 > (unsigned int)v5; if ( v11 > (unsigned int)v5 ) v12 = v11 > HIDWORD(v5); if ( v12 ) { v10 = 16; } else { if ( field28 == 48 ) goto LABEL_20; if ( field28 == 32 ) goto LABEL_16; v10 = 0; } break; case 2: LABEL_16: v13 = *((_DWORD *)off_D09220 + 4); v14 = v13 > (unsigned int)v5; if ( v13 > (unsigned int)v5 ) v14 = v13 > HIDWORD(v5); if ( v14 ) { v10 = 32; } else { if ( field28 == 48 ) goto LABEL_20; v10 = 0; } break; case 3: LABEL_20: v15 = *((_DWORD *)off_D09220 + 5); v16 = v15 > (unsigned int)v5; if ( v15 > (unsigned int)v5 ) v16 = *((_DWORD *)off_D09220 + 6) > HIDWORD(v5); if ( !v16 ) goto LABEL_23; v10 = 48; break; default: LABEL_23: v10 = 0; break; } connector_ids_a = 2; a1->field28 = v10; if ( v10 == 0 ) return connector_ids_a; field0C = a1->field0C; if ( field0C == 0 ) return connector_ids_a; v19 = off_D09E04; if ( *((_DWORD *)off_D09E04 + 1) <= field0C ) return connector_ids_a; field2C = a1->field2C; v21 = *((_DWORD *)off_D09E04 + 7); connector_ids_a = 2; field38 = a1->field38; v23 = v21 <= field2C; v24 = field2C != 0; if ( field38 > 4 || v24 && v23 ) return connector_ids_a; v25 = *(_QWORD *)&a1->field30; if ( HIDWORD(v25) == 2 && *((_DWORD *)off_D09E04 + 8) <= field38 ) return 2; v44 = 255; v45 = 255; if ( v10 == 16 ) { if ( v21 != 0 ) { connector_ids_a = asd_get_connector_ids_a(a1, a2: &v45, a3: &v44); if ( connector_ids_a != 0 ) return connector_ids_a; } if ( v19[4] == 0 || asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D09224 + 4), a3: v5) << 31 != 0 ) { if ( (_DWORD)v25 == 1 ) { v27 = off_D09224; v28 = asd_reg_read_13974(a1: *((_DWORD *)off_D09224 + 95), a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v27[94], a2: v28); asd_reg_write_19394(a1: v27[94], a2: v28); v29 = v27[97]; if ( v29 != 0 ) { asd_reg_read_13974(a1: v29, a2: v28); asd_reg_write_19328(a1: v27[97], a2: v28); } } switch ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D09224 + 3), a3: v5) & 7 ) { case 0: if ( a1->field20 == 0 || sub_D064C4() != 0 || asd_reg_read_13D24_cfg1(a1: v5) != 0 ) { a1->field4C = 3; v30 = 4; goto LABEL_68; } a1->field40 = 4; a1->field48 = 16; a1->field4C = 4; break; case 1: case 4: case 6: case 7: goto LABEL_69; case 2: v30 = 1; a1->field4C = 1; goto LABEL_68; case 3: goto LABEL_59; case 5: a1->field4C = 3; v30 = 5; goto LABEL_68; } goto LABEL_69; } return 8; } if ( v10 != 48 ) { if ( v21 != 0 ) { connector_ids_a = asd_get_connector_ids_a(a1, a2: &v45, a3: &v44); if ( connector_ids_a != 0 ) return connector_ids_a; } if ( (_DWORD)v25 == 1 ) { v31 = off_D09224; v32 = asd_reg_read_13974(a1: *((_DWORD *)off_D09224 + 96), a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v31[94], a2: v32); asd_reg_write_19394(a1: v31[94], a2: v32); v33 = v31[98]; if ( v33 != 0 ) { asd_reg_read_13974(a1: v33, a2: 0); asd_reg_write_19328(a1: v31[98], a2: 0); } } if ( asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D09224 + 83), a3: v5) << 31 != 0 ) { LABEL_59: a1->field4C = 2; v30 = 3; LABEL_68: a1->field40 = v30; goto LABEL_69; } return 8; } connector_ids_a = asd_get_connector_ids_a(a1, a2: &v45, a3: &v44); if ( connector_ids_a != 0 ) return connector_ids_a; v34 = (int *)off_D09224; if ( asd_reg_read_13BF8(a1: *((_DWORD *)off_D09224 + 99), a2: HIDWORD(v5)) << 31 == 0 ) return 8; a1->field4C = 3; a1->field40 = 5; if ( (_DWORD)v25 == 1 ) { v35 = asd_reg_read_13BF8(a1: v34[100], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v34[94], a2: v35); asd_reg_write_19394(a1: v34[94], a2: v35); v36 = v34[101]; if ( v36 != 0 ) { asd_reg_read_13BF8(a1: v36, a2: v35); asd_reg_write_19524(a1: v34[101], a2: v35); } } LABEL_69: v37 = asd_state_not_1(); if ( v37 ) { connector_ids_a = v37; v39 = 4; LABEL_71: a1->field44 = v39; return connector_ids_a; } field24 = a1->field24; if ( v10 != 16 ) { v42 = a1->field44 & 0xFFFFFFFE; a1->field44 = v42; if ( field24 < 0x16 ) return 0; v43 = v42 | 2; LABEL_85: a1->field44 = v43; return 0; } a1->field44 = 0; if ( a1->field20 != 0 && asd_reg_read_13D24_cfg1(a1: v5) == 0 ) { v43 = 16; goto LABEL_85; } if ( field24 < 0xA ) return 0; v41 = (int (__fastcall *)(_DWORD, int))v19[39]; if ( v41 == nullptr || (connector_ids_a = v41(a1: v41, a2: v38)) == 0 ) { connector_ids_a = 0; if ( (asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D09538 + 8), a3: v5) & 0x70000000) == 0x30000000 ) { a1->field44 |= 1u; connector_ids_a = 0; } } if ( field24 >= 0x16 ) { v39 = a1->field44 | 2; goto LABEL_71; } return connector_ids_a; } /* ==== asd_program_link_by_signal_v3 [tier=MNEM size=784] ==== */ // Third ASIC form of asd_program_link_by_signal. int __fastcall asd_program_link_by_signal_v3(struct asd_link_cfg *a1, int a2, int a3, int a4) { __int64 v5; // kr00_8 unsigned int field28; // r0 unsigned int v7; // r0 bool v8; // cc unsigned int v9; // r1 unsigned int v10; // r5 unsigned int v11; // r1 bool v12; // cc unsigned int v13; // r1 bool v14; // cc unsigned int v15; // r1 bool v16; // cc int v17; // r7 unsigned int field0C; // r0 _DWORD *v19; // r6 unsigned int field2C; // r2 unsigned int v21; // r0 unsigned int field38; // r1 BOOL v23; // r3 BOOL v24; // r2 __int64 v25; // kr08_8 _DWORD *v27; // r7 unsigned int v28; // r6 int v29; // r0 int v30; // r1 __int16 v31; // r2 unsigned int v32; // r0 _DWORD *v33; // r7 unsigned int v34; // r6 int v35; // r0 int *v36; // r7 unsigned int v37; // r6 int v38; // r0 BOOL v39; // r0 int v40; // r1 __int16 v41; // r2 unsigned int v42; // r0 unsigned int field24; // r6 unsigned int v44; // r0 unsigned int v45; // r0 int v46; // [sp+0h] [bp-8h] BYREF int v47; // [sp+4h] [bp-4h] BYREF v46 = a3; v47 = a4; if ( a1 == nullptr ) return 2; v5 = *(_QWORD *)&a1->field14; field28 = a1->field28; switch ( __ROR4__(field28, 4) ) { case 0: v7 = *((_DWORD *)off_D0954C + 3); v8 = v7 > (unsigned int)v5; if ( v7 > (unsigned int)v5 ) v8 = v7 > HIDWORD(v5); if ( v8 ) { v10 = 16; } else if ( v7 > (unsigned int)v5 || (v9 = *((_DWORD *)off_D0954C + 2)) <= HIDWORD(v5) || v7 > HIDWORD(v5) || v9 <= (unsigned int)v5 ) { v10 = 0; } else { v10 = 32; } a1->field30 = 1; break; case 1: v11 = *((_DWORD *)off_D0954C + 3); v12 = v11 > (unsigned int)v5; if ( v11 > (unsigned int)v5 ) v12 = v11 > HIDWORD(v5); if ( v12 ) { v10 = 16; } else { if ( field28 == 48 ) goto LABEL_20; if ( field28 == 32 ) goto LABEL_16; v10 = 0; } break; case 2: LABEL_16: v13 = *((_DWORD *)off_D0954C + 4); v14 = v13 > (unsigned int)v5; if ( v13 > (unsigned int)v5 ) v14 = v13 > HIDWORD(v5); if ( v14 ) { v10 = 32; } else { if ( field28 == 48 ) goto LABEL_20; v10 = 0; } break; case 3: LABEL_20: v15 = *((_DWORD *)off_D0954C + 5); v16 = v15 > (unsigned int)v5; if ( v15 > (unsigned int)v5 ) v16 = *((_DWORD *)off_D0954C + 6) > HIDWORD(v5); if ( !v16 ) goto LABEL_23; v10 = 48; break; default: LABEL_23: v10 = 0; break; } v17 = 2; a1->field28 = v10; if ( v10 == 0 ) return v17; field0C = a1->field0C; if ( field0C == 0 ) return v17; v19 = off_D0954C; if ( *((_DWORD *)off_D0954C + 1) <= field0C ) return v17; field2C = a1->field2C; v21 = *((_DWORD *)off_D0954C + 7); v17 = 2; field38 = a1->field38; v23 = v21 <= field2C; v24 = field2C != 0; if ( field38 > 4 || v24 && v23 ) return v17; v25 = *(_QWORD *)&a1->field30; if ( HIDWORD(v25) == 2 && *((_DWORD *)off_D0954C + 8) <= field38 ) return 2; v46 = 255; v47 = 255; if ( v10 == 16 ) { if ( v21 != 0 ) { v17 = sub_D061B4(a1, a2: &v47, a3: &v46); if ( v17 != 0 ) return v17; } if ( v19[4] == 0 || asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D09538 + 4), a3: v5) << 31 != 0 ) { if ( (_DWORD)v25 == 1 ) { v27 = off_D09538; v28 = asd_reg_read_13974(a1: *((_DWORD *)off_D09538 + 95), a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v27[94], a2: v28); asd_reg_write_19394(a1: v27[94], a2: v28); v29 = v27[97]; if ( v29 != 0 ) { asd_reg_read_13974(a1: v29, a2: v28); asd_reg_write_19328(a1: v27[97], a2: v28); } } switch ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D09538 + 3), a3: v5) & 7 ) { case 0: if ( a1->field20 == 0 || sub_D064C4() != 0 || asd_reg_read_13D24_cfg0(a1: v5, a2: v30, a3: v31) != 0 ) { a1->field4C = 3; v32 = 4; goto LABEL_68; } a1->field40 = 4; a1->field48 = 16; a1->field4C = 4; break; case 1: case 4: case 6: case 7: goto LABEL_69; case 2: v32 = 1; a1->field4C = 1; goto LABEL_68; case 3: goto LABEL_59; case 5: a1->field4C = 3; v32 = 5; goto LABEL_68; } goto LABEL_69; } return 8; } if ( v10 != 48 ) { if ( v21 != 0 ) { v17 = sub_D061B4(a1, a2: &v47, a3: &v46); if ( v17 != 0 ) return v17; } if ( (_DWORD)v25 == 1 ) { v33 = off_D09538; v34 = asd_reg_read_13974(a1: *((_DWORD *)off_D09538 + 96), a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v33[94], a2: v34); asd_reg_write_19394(a1: v33[94], a2: v34); v35 = v33[98]; if ( v35 != 0 ) { asd_reg_read_13974(a1: v35, a2: 0); asd_reg_write_19328(a1: v33[98], a2: 0); } } if ( asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D09538 + 83), a3: v5) << 31 != 0 ) { LABEL_59: a1->field4C = 2; v32 = 3; LABEL_68: a1->field40 = v32; goto LABEL_69; } return 8; } v17 = sub_D061B4(a1, a2: &v47, a3: &v46); if ( v17 != 0 ) return v17; v36 = (int *)off_D09538; if ( asd_reg_read_13BF8(a1: *((_DWORD *)off_D09538 + 99), a2: HIDWORD(v5)) << 31 == 0 ) return 8; a1->field4C = 3; a1->field40 = 5; if ( (_DWORD)v25 == 1 ) { v37 = asd_reg_read_13BF8(a1: v36[100], a2: HIDWORD(v5)) & 7; asd_reg_read_139E4(a1: v36[94], a2: v37); asd_reg_write_19394(a1: v36[94], a2: v37); v38 = v36[101]; if ( v38 != 0 ) { asd_reg_read_13BF8(a1: v38, a2: v37); asd_reg_write_19524(a1: v36[101], a2: v37); } } LABEL_69: v39 = asd_state_not_1(); if ( v39 ) { v17 = v39; v42 = 4; LABEL_71: a1->field44 = v42; return v17; } field24 = a1->field24; if ( v10 != 16 ) { v44 = a1->field44 & 0xFFFFFFFE; a1->field44 = v44; if ( field24 < 0x16 ) return 0; v45 = v44 | 2; LABEL_84: a1->field44 = v45; return 0; } a1->field44 = 0; if ( a1->field20 != 0 && asd_reg_read_13D24_cfg0(a1: v5, a2: v40, a3: v41) == 0 ) { v45 = 16; goto LABEL_84; } if ( field24 < 0xA ) return 0; v17 = sub_D06D08(); if ( v17 == 0 && (asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D09850 + 8), a3: v5) & 0x70000000) == 0x30000000 ) a1->field44 |= 1u; if ( field24 >= 0x16 ) { v42 = a1->field44 | 2; goto LABEL_71; } return v17; } /* ==== asd_query_link_config [tier=MNEM size=582] ==== */ // Switch on the descriptor's class (a1[16] in 1..3) and signal type (a1[10]) returning the // link configuration; rejects type 32 on the class path. int __fastcall asd_query_link_config(_DWORD *a1, int *a2) { int v3; // r2 unsigned int v4; // r6 int v5; // r1 int v6; // r5 int v7; // r10 _DWORD *v8; // r7 unsigned int v9; // r11 int (__fastcall *v10)(int, unsigned int); // r8 unsigned int v11; // r9 unsigned int v12; // r0 int v13; // r1 bool v14; // zf bool v15; // zf bool v16; // zf _DWORD *v17; // r7 __int16 _13B74; // r5 __int16 v19; // r0 __int64 v20; // r0 _DWORD *v21; // r7 int (__fastcall *v22)(int, int, unsigned int); // r11 __int16 v23; // r5 __int16 v24; // r9 __int16 v25; // r8 __int16 v26; // r0 int v27; // r0 unsigned int v29; // [sp+0h] [bp-4h] *a2 = 0; if ( a1 == nullptr ) return 2; v3 = a1[16]; v4 = a1[5]; v5 = a1[10]; if ( (unsigned int)(v3 - 1) < 3 ) { if ( v5 != 32 ) { if ( v5 == 16 ) { if ( asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07E90 + 41), a3: a1[5]) << 31 != 0 ) goto LABEL_65; LABEL_61: v27 = 1; LABEL_66: *a2 = v27; } return 0; } if ( asd_reg_read_13B74(a1: 1, a2: *((_DWORD *)off_D07E90 + 86), a3: a1[5]) << 31 == 0 ) { *a2 = 1; return 0; } LABEL_65: v27 = 2; goto LABEL_66; } if ( v3 == 4 ) { v17 = off_D07E90; _13B74 = asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07E90 + 59), a3: v4); v19 = asd_reg_read_13B74(a1: 0, a2: v17[47], a3: v4); HIDWORD(v20) = _13B74 & 0x300; LODWORD(v20) = (v19 & 0x100) != 0; if ( v20 == 0x10000000000LL ) goto LABEL_61; v6 = 0; if ( HIDWORD(v20) == 512 && (_DWORD)v20 != 0 ) goto LABEL_65; } else if ( v3 == 5 ) { v7 = a1[6]; if ( v5 == 48 ) { v21 = off_D07E90; v22 = off_D08984; v23 = off_D08984(a1: 2, a2: *((_DWORD *)off_D07E90 + 48), a3: v4); v24 = v22(a1: 2, a2: v21[49], a3: v4); v25 = v22(a1: 2, a2: v21[50], a3: v4); v26 = v22(a1: 2, a2: v21[51], a3: v4); if ( (v23 & 7) == v7 && (v23 & 0x7F00) != 0 ) { if ( (v23 & 0x20) != 0 ) goto LABEL_65; goto LABEL_61; } if ( (v24 & 7) == v7 && (v24 & 0x7F00) != 0 ) { if ( (v24 & 0x20) != 0 ) goto LABEL_65; goto LABEL_61; } if ( (v25 & 7) == v7 && (v25 & 0x7F00) != 0 ) { if ( (v25 & 0x20) == 0 ) goto LABEL_61; goto LABEL_65; } v6 = 0; if ( (v26 & 7) == v7 && (v26 & 0x7F00) != 0 ) { if ( (v26 & 0x20) == 0 ) goto LABEL_61; goto LABEL_65; } } else { if ( v5 != 16 ) return 0; v8 = off_D07E90; v6 = 0; v9 = asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07E90 + 59), a3: v4); v10 = off_D087BC; v11 = off_D087BC(a1: v8[43], a2: v4); v29 = v10(a1: v8[44], a2: v4); v12 = v10(a1: v8[45], a2: v4); v13 = (v9 >> 8) & 3; if ( v13 == 3 ) { if ( (v11 & 7) == v7 && (v11 & 0x20) != 0 ) goto LABEL_65; if ( (v11 & 0x200000) != 0 && (HIWORD(v11) & 7) == v7 ) goto LABEL_65; if ( (v29 & 7) == v7 && (v29 & 0x20) != 0 ) goto LABEL_65; if ( (v29 & 0x200000) != 0 && (HIWORD(v29) & 7) == v7 ) goto LABEL_65; if ( (v12 & 7) == v7 && (v12 & 0x20) != 0 ) goto LABEL_65; v6 = 0; if ( (v12 & 0x200000) != 0 && (HIWORD(v12) & 7) == v7 ) goto LABEL_65; } else if ( v13 == 1 ) { v14 = (v11 & 7) == v7; if ( (v11 & 7) == v7 ) v14 = (v11 & 0x20) == 0; if ( v14 || (v11 & 0x200000) == 0 && (HIWORD(v11) & 7) == v7 ) goto LABEL_61; v15 = (v29 & 7) == v7; if ( (v29 & 7) == v7 ) v15 = (v29 & 0x20) == 0; if ( v15 || (v29 & 0x200000) == 0 && (HIWORD(v29) & 7) == v7 ) goto LABEL_61; v16 = (v12 & 7) == v7; if ( (v12 & 7) == v7 ) v16 = (v12 & 0x20) == 0; if ( v16 ) goto LABEL_61; v6 = 0; if ( (v12 & 0x200000) == 0 && (HIWORD(v12) & 7) == v7 ) goto LABEL_61; } } } else { return 1; } return v6; } /* ==== asd_query_link_state [tier=MNEM size=34] ==== */ // Sets dword_D33054 = 2 then probes via sub_D157DC/sub_D104A0, reporting state 1 or 2 // through the caller's pointer. int __fastcall asd_query_link_state(_DWORD *a1) { int v2; // r5 *a1 = 1; *((_DWORD *)off_D11604 + 1) = 2; v2 = asd_hdcp_reset_all(); if ( (asd_foreach_link_active() | v2) == 0 ) *a1 = 2; return 0; } /* ==== asd_query_type_6_7 [tier=MNEM size=70] ==== */ // Feature-15 gated query with a 0xA8-byte working buffer; accepts type 6 (index 0) or // type 7 (index 1). int __fastcall asd_query_type_6_7(int a1) { int result; // r0 _DWORD v7[42]; // [sp+0h] [bp-A8h] BYREF bzero_core(result: v7, a2: 0xA8u); if ( !asd_feature_enabled(a1: 15) ) return 8; if ( a1 != 6 && a1 != 7 ) return 2; result = asd_opt_cb_D497FC(); if ( result == 0 ) { __asm { SVC 0xB4 } return 35; } return result; } /* ==== asd_read_caps_blob [tier=MNEM size=136] ==== */ // Fetches the 132-byte capability blob via asd_cfg_132byte_blob, rejecting counts above // 0x20 with status 35. int __fastcall asd_read_caps_blob(int a1) { int result; // r0 unsigned int v3; // r0 unsigned int v4; // r6 int v5; // r0 int v6; // r0 int v7; // r0 unsigned int v8[34]; // [sp+0h] [bp-88h] BYREF bzero_core(result: v8, a2: 0x84u); result = asd_cfg_132byte_blob(a1, a2: v8, a3: 132); if ( result == 0 ) { v3 = v8[0]; if ( v8[0] > 0x20 ) { return 35; } else { v4 = 0; while ( v4 < v3 ) { switch ( v8[v4 + 1] ) { case 2u: v5 = 2; goto LABEL_10; case 3u: v5 = 3; LABEL_10: result = asd_cfg_type_2_3(a1: v5); goto LABEL_17; case 4u: result = asd_build_caps_blob(a1); goto LABEL_17; case 5u: result = asd_feature15_query_D44134(); goto LABEL_17; case 6u: v6 = 6; goto LABEL_13; case 7u: v6 = 7; LABEL_13: result = asd_query_type_6_7(a1: v6); goto LABEL_17; case 8u: v7 = 8; goto LABEL_16; case 9u: v7 = 9; LABEL_16: result = asd_hdcp_version_select(a1: v7); LABEL_17: if ( result != 0 ) return result; ++v4; v3 = v8[0]; break; default: return 7; } } return 0; } } return result; } /* ==== asd_read_link_pair [tier=MNEM size=82] ==== */ // Reads the register pair unk_D42568 / unk_D4256C for link a1 into the caller's outputs. int __fastcall asd_read_link_pair(unsigned int a1, _WORD *a2, _WORD *a3, _WORD *a4) { int result; // r0 _DWORD *v8; // r8 __int16 v10; // r0^2 int v11; // [sp+0h] [bp-8h] BYREF int v12; // [sp+4h] [bp-4h] BYREF v11 = 0; v12 = 0; result = 2; if ( a2 != nullptr && a3 != nullptr && a4 != nullptr ) { v8 = off_D0A1B4; result = asd_reg_read_13FD4(a1: *((_DWORD *)off_D0A1B4 + 91), a2: a1, a3: &v12); if ( result == 0 ) { result = asd_reg_read_13FD4(a1: v8[92], a2: a1, a3: &v11); if ( result == 0 ) { v10 = HIWORD(v12); *a2 = v12; *a3 = v10; *a4 = v11; return 0; } } } return result; } /* ==== asd_reg_clr_bit1_wait [tier=MNEM size=72] ==== */ // Clears bit 1 of a display register and polls (bounded ~499 iterations) until it reads // back clear. Inverse of asd_reg_set_bit1_wait. int __fastcall asd_reg_clr_bit1_wait(unsigned int a1) { int result; // r0 _DWORD *v3; // r5 int v4; // r6 result = asd_reg_read_13B74_cfg0(); if ( result == 0 ) { v3 = off_D13718; result = asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D13718 + 39), a3: a1); if ( (result & 2) != 0 ) { asd_reg_write_1946C(a1: 0, a2: v3[39], a3: a1); v4 = -499; do { result = asd_reg_read_13B74(a1: 0, a2: v3[39], a3: a1); if ( v4 == 0 ) break; ++v4; result &= 2u; } while ( result != 0 ); } } return result; } /* ==== asd_reg_clr_bit2_wait [tier=MNEM size=66] ==== */ // Clears bit 2 of a display register and polls (bounded ~499 iterations) until it reads // back clear. Inverse of asd_reg_set_bit2_wait. int __fastcall asd_reg_clr_bit2_wait(unsigned int a1) { _DWORD *v1; // r5 int result; // r0 int v4; // r6 v1 = off_D13718; result = asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D13718 + 39), a3: a1); if ( (result & 4) != 0 ) { asd_reg_write_1946C(a1: 0, a2: v1[39], a3: a1); v4 = -499; do { result = asd_reg_read_13B74(a1: 0, a2: v1[39], a3: a1); if ( v4 == 0 ) break; ++v4; result &= 4u; } while ( result != 0 ); } return result; } /* ==== asd_reg_offsets_init_19600 [tier=MNEM size=358] ==== */ // Per-ASIC display register-offset table initialiser: copies the 0xB4-byte // template from 0xd19600 then patches individual register offsets. int __fastcall asd_reg_offsets_init_19600(int a1, int a2, int a3) { unsigned int v3; // r4 int *v4; // r10 int v5; // r11 int _13D24; // r5 int result; // r0 int (__fastcall *v8)(int, unsigned int); // r8 unsigned int v9; // r6 unsigned int v10; // r0 int *v11; // r1 char v12; // r5 int v13; // r6 int v18; // r0 unsigned int v19; // [sp+0h] [bp-4h] if ( a1 == 0 ) return 2; v3 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D087B4 + 3) <= v3 ) return 2; v4 = (int *)off_D09538; v5 = *(_DWORD *)(a1 + 24); _13D24 = asd_reg_read_13D24(a1: *((_DWORD *)off_D09538 + 46), a2: *(_DWORD *)(a1 + 20)); if ( _13D24 << 30 != 0 ) return 1; v8 = off_D087BC; v9 = off_D087BC(a1: v4[43], a2: v3); v19 = v8(a1: v4[44], a2: v3); v10 = v8(a1: v4[45], a2: v3); if ( (v9 & 7) == v5 || (HIWORD(v9) & 7) == v5 ) { v11 = v4 + 43; LABEL_9: asd_reg_write_19600(a1: *v11, a2: v3); goto LABEL_10; } if ( (v19 & 7) == v5 || (HIWORD(v19) & 7) == v5 ) { v11 = v4 + 44; goto LABEL_9; } if ( (v10 & 7) == v5 || (HIWORD(v10) & 7) == v5 ) { v11 = v4 + 45; goto LABEL_9; } LABEL_10: v12 = _13D24 & 0xFC | 2; asd_reg_write_19600(a1: v4[46], a2: v3); v13 = 11; while ( --v13 != 0 ) { __asm { SVC 0x56 ; 'V' } v18 = asd_reg_read_13D24(a1: v4[46], a2: v3); v12 = v18; if ( v18 << 30 == 0 ) return 0; } result = v12 & 3; if ( (v12 & 3) != 0 ) return 1; return result; } /* ==== asd_reg_offsets_init_198C0 [tier=FUZZY size=466] ==== */ // Per-ASIC display register-offset table initialiser: copies the 0xB4-byte // template from 0xd198c0 then patches individual register offsets. int __fastcall asd_reg_offsets_init_198C0(int a1, int a2, int a3, int a4) { _DWORD v5[48]; // [sp+0h] [bp-280h] BYREF _DWORD v6[18]; // [sp+C0h] [bp-1C0h] BYREF _DWORD v7[32]; // [sp+108h] [bp-178h] BYREF _DWORD v8[15]; // [sp+188h] [bp-F8h] BYREF _DWORD v9[7]; // [sp+1C4h] [bp-BCh] BYREF int v10[40]; // [sp+1E0h] [bp-A0h] BYREF memcpy_aligned(result: v10, a2: off_D03AC0, a3: 0xA0u, a4); v5[47] = 22022; v5[46] = 22013; v5[45] = 22012; v5[44] = 22011; v5[43] = 22010; v5[42] = 21967; v5[41] = 21910; v5[40] = 21909; v5[39] = 21908; v5[38] = 21907; v5[37] = 21906; v5[36] = 21905; v5[35] = 21904; v5[34] = 21903; v5[33] = 21902; v5[32] = 21901; v5[31] = 21900; v5[30] = 21899; v5[29] = 21898; v5[28] = 21897; v5[27] = 21896; v5[26] = 21895; v5[25] = 21894; v5[24] = 21893; v5[23] = 21892; v5[22] = 21891; v5[21] = 21890; v5[20] = 21889; v5[19] = 21888; v5[18] = 21887; v5[17] = 21886; v5[16] = 21885; v5[15] = 21884; v5[14] = 21883; v5[13] = 21882; v5[12] = 21881; v5[11] = 21880; v5[10] = 21879; v5[9] = 21878; v5[8] = 21877; v5[7] = 21876; v5[6] = 21875; v5[5] = 21874; v5[4] = 21873; v5[3] = 0; v5[1] = 0; v5[2] = 21872; v5[0] = 21835; bzero_core(result: v6, a2: 0x20u); v6[17] = 21939; v6[16] = 21938; v6[15] = 21937; v6[14] = 21936; v6[13] = 21935; v6[12] = 21934; v6[11] = 21931; v6[10] = 21330; v6[9] = 21329; v6[8] = 21328; bzero_core(result: v7, a2: 0x58u); v7[30] = 0; v7[31] = 21832; v7[29] = 21829; v7[28] = 14409; memset(&v7[25], 0, 12); v7[24] = 20494; v7[23] = 20489; v7[22] = 20481; bzero_core(result: v8, a2: 0x38u); v8[14] = 21380; bzero_core(result: v9, a2: 0x18u); return sub_D08B14(a1: v10, a2: v5); } /* ==== asd_reg_poll_seq [tier=MNEM size=136] ==== */ // Register read/poll sequence over an index, using asd_reg_read_13A54. int __fastcall asd_reg_poll_seq(unsigned int a1, int a2, int a3, int a4) { _DWORD *v4; // r7 int result; // r0 int _13A54; // r8 int i; // r6 bool v10; // zf int j; // r6 int v12; // r0 int v13; // [sp+0h] [bp-Ch] int v14; // [sp+4h] [bp-8h] int v15; // [sp+8h] [bp-4h] v13 = a2; v14 = a3; v15 = a4; v4 = off_D15E08; result = asd_reg_read_13A54(a1: *((_DWORD *)off_D15E08 + 88), a2: a1) << 31; if ( result != 0 ) { _13A54 = asd_reg_read_13A54(a1: v4[90], a2: a1); for ( i = 0; i != 3; ++i ) *(&v13 + i) = asd_reg_read_13A54(a1: v4[90], a2: a1); result = v13; v10 = v13 == v14; if ( v13 == v14 ) v10 = v13 == _13A54; if ( !v10 || v13 != v15 ) { result = asd_reg_read_13A54(a1: v4[89], a2: a1); for ( j = 0; j != a2; ++j ) { do v12 = asd_reg_read_13A54(a1: v4[89], a2: a1); while ( v12 << 31 == 0 ); while ( 1 ) { result = v12 << 31; if ( result == 0 ) break; v12 = asd_reg_read_13A54(a1: v4[89], a2: a1); } } } } return result; } /* ==== asd_reg_read_10744 [tier=EXACT size=44] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_10744(_DWORD *a1) { if ( *a1 == 2 ) __asm { SVC 0x7B ; '{' } return 0; } /* ==== asd_reg_read_11B00 [tier=IDA size=182] ==== */ int asd_reg_read_11B00() { if ( *((_DWORD *)off_D0F2CC + 109) != 0 && *((_DWORD *)off_D0F2CC + 110) != 0 ) __asm { SVC 0x7B ; '{' } return 0; } /* ==== asd_reg_read_11BE4 [tier=IDA size=182] ==== */ int asd_reg_read_11BE4() { if ( *((_DWORD *)off_D0F2CC + 109) != 0 && *((_DWORD *)off_D0F2CC + 111) != 0 ) __asm { SVC 0x7B ; '{' } return 0; } /* ==== asd_reg_read_1217E [tier=EXACT size=12] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int asd_reg_read_1217E() { __asm { SVC 0x7B ; '{' } return 14220; } /* ==== asd_reg_read_12688 [tier=EXACT size=80] ==== */ // Display-block register accessor: 3 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_12688(_DWORD *a1, unsigned __int16 a2, unsigned int a3, unsigned int a4) { char *v4; // r4 if ( a1 == nullptr ) return 2; v4 = off_D0FB58; __asm { SVC 0x7B ; '{' } *a1 = (unsigned __int16)a4; a1[1] = ((a4 >> 20) & 0xF) + ((a4 >> 12) & 0xF0); if ( (unsigned __int8)*v4 << 31 == 0 ) { __asm { SVC 0x7B ; '{' } a1[2] = a2; __asm { SVC 0x7B ; '{' } a1[3] = (unsigned __int16)(a3 >> 2); } return 0; } /* ==== asd_reg_read_12688_cfg13 [tier=EXACT size=6] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_12688. One of 0 near-identical siblings. int __fastcall asd_reg_read_12688_cfg13(int a1, _DWORD *a2, unsigned int a3, unsigned int a4) { return asd_reg_read_12688(a1: a2, (unsigned __int16)a2, a3, a4); } /* ==== asd_reg_read_12688_cfg14 [tier=EXACT size=6] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_12688. One of 0 near-identical siblings. int __fastcall asd_reg_read_12688_cfg14(int a1, _DWORD *a2, unsigned int a3, unsigned int a4) { return asd_reg_read_12688(a1: a2, (unsigned __int16)a2, a3, a4); } /* ==== asd_reg_read_12688_cfg17 [tier=EXACT size=6] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_12688. One of 0 near-identical siblings. int __fastcall asd_reg_read_12688_cfg17(int a1, _DWORD *a2, unsigned int a3, unsigned int a4) { return asd_reg_read_12688(a1: a2, (unsigned __int16)a2, a3, a4); } /* ==== asd_reg_read_12688_cfg18 [tier=EXACT size=6] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_12688. One of 0 near-identical siblings. int __fastcall asd_reg_read_12688_cfg18(int a1, _DWORD *a2, unsigned int a3, unsigned int a4) { return asd_reg_read_12688(a1: a2, (unsigned __int16)a2, a3, a4); } /* ==== asd_reg_read_12688_cfg19 [tier=EXACT size=6] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_12688. One of 0 near-identical siblings. int __fastcall asd_reg_read_12688_cfg19(int a1, _DWORD *a2, unsigned int a3, unsigned int a4) { return asd_reg_read_12688(a1: a2, (unsigned __int16)a2, a3, a4); } /* ==== asd_reg_read_12688_cfg20 [tier=EXACT size=6] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_12688. One of 0 near-identical siblings. int __fastcall asd_reg_read_12688_cfg20(int a1, _DWORD *a2, unsigned int a3, unsigned int a4) { return asd_reg_read_12688(a1: a2, (unsigned __int16)a2, a3, a4); } /* ==== asd_reg_read_13974 [tier=IDA size=110] ==== */ int __fastcall asd_reg_read_13974(int a1, unsigned int a2) { if ( *((_DWORD *)off_D10BB4 + 14) > a2 ) { if ( *((_DWORD *)off_D10B40 + 109) != 0 ) { if ( asd_reg_read_11B00() != 0 ) { asd_tbl_get_D423CC(a1: a2); __asm { SVC 0x7B ; '{' } } } else { asd_tbl_get_D423CC(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_139E4 [tier=IDA size=110] ==== */ int __fastcall asd_reg_read_139E4(int a1, unsigned int a2) { if ( *((_DWORD *)off_D10C28 + 13) > a2 ) { if ( *((_DWORD *)off_D10C2C + 109) != 0 ) { if ( asd_reg_read_11B00() != 0 ) { asd_tbl_get_D423C8(a1: a2); __asm { SVC 0x7B ; '{' } } } else { asd_tbl_get_D423C8(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_13A54 [tier=IDA size=110] ==== */ int __fastcall asd_reg_read_13A54(int a1, unsigned int a2) { if ( *((_DWORD *)off_D10CA0 + 1) > a2 ) { if ( *((_DWORD *)off_D10CA4 + 109) != 0 ) { if ( asd_reg_read_11B00() != 0 ) { asd_tbl_get_D4238C(a1: a2); __asm { SVC 0x7B ; '{' } } } else { asd_tbl_get_D4238C(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_13B74 [tier=MNEM size=130] ==== */ // Display-block register accessor: 2 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_13B74(int a1, int a2, unsigned int a3) { int _11B00; // r0 int _11BE4; // r0 if ( *((_DWORD *)off_D10D18 + 2) > a3 ) { if ( *((_DWORD *)off_D10D5C + 109) != 0 ) { _11B00 = asd_reg_read_11B00(); if ( a1 == 0 && _11B00 != 0 || (_11BE4 = asd_reg_read_11BE4(), (unsigned int)(a1 - 1) <= 1) && _11BE4 != 0 ) { asd_lookup_by_class(a1, a2: a3); __asm { SVC 0x7B ; '{' } } } else { asd_lookup_by_class(a1, a2: a3); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_13B74_cfg0 [tier=MNEM size=44] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_13B74. One of 0 near-identical siblings. int __fastcall asd_reg_read_13B74_cfg0() { _DWORD *v0; // r5 unsigned int v1; // r4 _DWORD *v2; // r6 __int16 _13B74; // r0 v0 = off_D02844; v1 = 0; v2 = off_D02848; while ( v1 < v0[3] ) { _13B74 = asd_reg_read_13B74(a1: 0, a2: v2[5], a3: v1++); if ( (_13B74 & 0x101) == 0x101 ) return 1; } return 0; } /* ==== asd_reg_read_13B74_cfg2 [tier=MNEM size=42] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_13B74. One of 0 near-identical siblings. int __fastcall asd_reg_read_13B74_cfg2(int a1) { unsigned int v1; // r2 int result; // r0 if ( a1 == 0 ) return 2; v1 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D06A58 + 3) <= v1 ) return 2; result = (asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D06A5C + 8), a3: v1) & (dword_D066EC + 4)) - dword_D066EC; if ( result != 0 ) return 11; return result; } /* ==== asd_reg_read_13B74_cfg3 [tier=MNEM size=50] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_13B74. One of 0 near-identical siblings. int __fastcall asd_reg_read_13B74_cfg3(int a1, _BYTE *a2, _BYTE *a3) { unsigned int v5; // r2 int v6; // r6 unsigned int v7; // r0 *a2 = 0; *a3 = 0; if ( a1 == 0 ) return 2; v5 = *(_DWORD *)(a1 + 20); if ( *((_DWORD *)off_D07064 + 3) <= v5 ) return 2; v6 = 0; v7 = (unsigned int)asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D07068 + 19), a3: v5) >> 8; *a2 = v7; *a3 = v7; return v6; } /* ==== asd_reg_read_13BF8 [tier=IDA size=110] ==== */ int __fastcall asd_reg_read_13BF8(int a1, unsigned int a2) { if ( *((_DWORD *)off_D10E34 + 6) > a2 ) { if ( *((_DWORD *)off_D10DD0 + 109) != 0 ) { if ( asd_reg_read_11BE4() != 0 ) { asd_tbl_get_D423A8(a1: a2); __asm { SVC 0x7B ; '{' } } } else { asd_tbl_get_D423A8(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_13CDC [tier=IDA size=110] ==== */ int __fastcall asd_reg_read_13CDC(int a1, unsigned int a2) { if ( *((_DWORD *)off_D10F0C + 5) > a2 && asd_reg_read_11BE4() != 0 ) __asm { SVC 0x7B ; '{' } return 0; } /* ==== asd_reg_read_13D24 [tier=IDA size=110] ==== */ int __fastcall asd_reg_read_13D24(int a1, unsigned int a2) { if ( *((_DWORD *)off_D10F0C + 3) > a2 ) { if ( *((_DWORD *)off_D10F10 + 109) != 0 ) { if ( asd_reg_read_11B00() != 0 ) { asd_tbl_get_D423B8(a1: a2); __asm { SVC 0x7B ; '{' } } } else { asd_tbl_get_D423B8(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_13D24_cfg0 [tier=MNEM size=26] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_13D24. One of 0 near-identical siblings. int __fastcall asd_reg_read_13D24_cfg0(unsigned int a1, int a2, __int16 a3) { bool v3; // zf int result; // r0 v3 = asd_reg_read_13D24(a1: *((_DWORD *)off_D06398 + 42), a2: a1) << 31 == 0; result = 0; if ( v3 ) return 19; return result; } /* ==== asd_reg_read_13D24_cfg1 [tier=IDA size=62] ==== */ int __fastcall asd_reg_read_13D24_cfg1(unsigned int a1) { int v1; // r5 int result; // r0 if ( a1 > 0x1F ) return 5; v1 = 0; if ( asd_reg_read_13D24(a1: *((_DWORD *)off_D06398 + 42), a2: a1) << 31 == 0 ) v1 = 19; if ( asd_reg_read_11B00() != 0 ) return v1; result = *(_DWORD *)(dword_D06104 + 96 * a1 + 92) - 1; if ( *(_DWORD *)(dword_D06104 + 96 * a1 + 92) != 1 ) return v1; return result; } /* ==== asd_reg_read_13E14 [tier=IDA size=110] ==== */ int __fastcall asd_reg_read_13E14(int a1, unsigned int a2) { if ( *((_DWORD *)off_D10F0C + 1) > a2 ) { if ( *((_DWORD *)off_D10F10 + 109) != 0 ) { if ( asd_reg_read_11B00() != 0 ) { asd_tbl_get_D423BC(a1: a2); __asm { SVC 0x7B ; '{' } } } else { asd_tbl_get_D423BC(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_13E8C [tier=IDA size=62] ==== */ int asd_reg_read_13E8C() { if ( *((_DWORD *)off_D10F10 + 109) != 0 ) { if ( asd_reg_read_11B00() != 0 ) __asm { SVC 0x7B ; '{' } } else { __asm { SVC 0x7B ; '{' } } return 0; } /* ==== asd_reg_read_13ED0 [tier=MNEM size=112] ==== */ // Display-block register accessor: 2 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_13ED0(int a1, unsigned int a2, __int16 a3) { if ( a1 != 0 && *((_DWORD *)off_D10F0C + 1) > a2 ) { if ( *((_DWORD *)off_D10F10 + 109) != 0 ) { if ( asd_reg_read_11B00() != 0 ) { asd_tbl_get_D423C0(a1: a2); __asm { SVC 0x7B ; '{' } } } else { asd_tbl_get_D423C0(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_13FD4 [tier=IDA size=96] ==== */ int __fastcall asd_reg_read_13FD4(int a1, unsigned int a2, _DWORD *a3) { int v3; // r5 unsigned int v4; // r4 int v5; // r3 unsigned int v6; // r6 int result; // r0 if ( a3 == nullptr ) return 2; *a3 = 0; if ( a1 == 0 ) return 7; if ( *((_DWORD *)off_D10F0C + 16) <= a2 ) return 30; v3 = *((_DWORD *)off_D10F0C + 35); v4 = ~a1; v5 = 0; if ( v3 != 0 ) { v6 = *(_DWORD *)(v3 + 4 * a2); if ( v6 > v4 ) goto LABEL_14; } else { v6 = 0; } if ( (v6 + a1) >> 30 != 0 ) goto LABEL_18; if ( v3 == 0 ) { v6 = 0; goto LABEL_17; } v6 = *(_DWORD *)(v3 + 4 * a2); LABEL_14: if ( v6 > v4 ) { v5 = 0; goto LABEL_18; } LABEL_17: v5 = 4 * (a1 + v6); LABEL_18: result = v5; __asm { SVC 0x7B ; '{' } if ( v5 != 0 ) return 30; return result; } /* ==== asd_reg_read_14028 [tier=IDA size=90] ==== */ int __fastcall asd_reg_read_14028(int a1, unsigned int a2, unsigned __int8 a3) { if ( *((_DWORD *)off_D10F0C + 1) > a2 ) { __asm { SVC 0x7B ; '{' } if ( a3 << 31 == 0 ) { sub_D0E48C(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_140AC [tier=IDA size=110] ==== */ int __fastcall asd_reg_read_140AC(int a1, unsigned int a2) { if ( *((_DWORD *)off_D10F0C + 7) > a2 ) { if ( *((_DWORD *)off_D10F10 + 109) != 0 ) { if ( asd_reg_read_11B00() != 0 ) { asd_tbl_get_D423B0(a1: a2); __asm { SVC 0x7B ; '{' } } } else { asd_tbl_get_D423B0(a1: a2); __asm { SVC 0x7B ; '{' } } } return 0; } /* ==== asd_reg_read_1419C_cfg0 [tier=MNEM size=40] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_read_1419C. One of 0 near-identical siblings. int __fastcall asd_reg_read_1419C_cfg0(unsigned int a1) { if ( a1 <= 1 ) return sub_D10F8C() & 1; else return 0; } /* ==== asd_reg_read_15C78 [tier=EXACT size=30] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_15C78(int a1) { int result; // r0 result = 0; if ( a1 == 0 ) { __asm { SVC 0x7B ; '{' } return 0; } return result; } /* ==== asd_reg_read_15CF4 [tier=EXACT size=42] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_15CF4(unsigned int a1) { int result; // r0 result = 0; if ( a1 <= 1 ) { __asm { SVC 0x7B ; '{' } return 0; } return result; } /* ==== asd_reg_read_15D24 [tier=EXACT size=30] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_15D24(int a1) { int result; // r0 result = 0; if ( a1 == 0 ) { __asm { SVC 0x7B ; '{' } return 0; } return result; } /* ==== asd_reg_read_15DF0 [tier=EXACT size=18] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int asd_reg_read_15DF0() { int v5; // [sp+0h] [bp-4h] __asm { SVC 0x7B ; '{' } return v5; } /* ==== asd_reg_read_162C0 [tier=EXACT size=48] ==== */ // Display-block register accessor: 4 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_162C0() { __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } return dword_D12F5C; } /* ==== asd_reg_read_162F0 [tier=EXACT size=48] ==== */ // Display-block register accessor: 4 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_162F0() { __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } return dword_D12F5C; } /* ==== asd_reg_read_18878 [tier=EXACT size=30] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_18878(int a1) { int result; // r0 result = 0; if ( a1 == 0 ) { __asm { SVC 0x7B ; '{' } return 0; } return result; } /* ==== asd_reg_read_18898 [tier=MNEM size=36] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_18898(int a1) { if ( a1 == 0 && asd_feature_level_check(a1: 14, a2: 0) != 0 ) __asm { SVC 0x7B ; '{' } return 0; } /* ==== asd_reg_read_BE08 [tier=EXACT size=100] ==== */ // Display-block register accessor: 1 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_BE08(unsigned int a1, _DWORD *a2) { int v2; // r3 int v3; // r5 unsigned int v4; // r4 int v5; // r2 unsigned int v6; // r6 int result; // r0 if ( a2 == nullptr ) return 2; v2 = *((_DWORD *)off_D0A1B4 + 115); *a2 = 0; if ( v2 == 0 ) return 7; if ( *((_DWORD *)off_D0A15C + 15) <= a1 ) return 29; v3 = *((_DWORD *)off_D0A15C + 34); v4 = ~v2; v5 = 0; if ( v3 != 0 ) { v6 = *(_DWORD *)(v3 + 4 * a1); if ( v6 > v4 ) goto LABEL_14; } else { v6 = 0; } if ( (v6 + v2) >> 30 != 0 ) goto LABEL_18; if ( v3 == 0 ) { v6 = 0; goto LABEL_17; } v6 = *(_DWORD *)(v3 + 4 * a1); LABEL_14: if ( v6 > v4 ) { v5 = 0; goto LABEL_18; } LABEL_17: v5 = 4 * (v6 + v2); LABEL_18: result = v5; __asm { SVC 0x7B ; '{' } if ( v5 != 0 ) return 29; return result; } /* ==== asd_reg_read_BE08_asic5592 [tier=MNEM size=62] ==== */ // Variant of the gated register read that only admits device 5592 revision 147. int __fastcall asd_reg_read_BE08_asic5592(unsigned int a1, _DWORD *a2) { int v4; // r6 bool v5; // zf _DWORD v7[8]; // [sp+4h] [bp+0h] BYREF v4 = sub_D11A48(a1: v7); if ( sub_D11A48(a1: v7) == 0 ) { v5 = v7[0] == 5592; if ( v7[0] == 5592 ) v5 = v7[1] == 147; if ( v5 ) return asd_reg_read_BE08(a1, a2); else return 7; } return v4; } /* ==== asd_reg_read_C704 [tier=EXACT size=90] ==== */ // Display-block register accessor: 5 x SVC 0x7B (register read), 0 x SVC 0x7C (MMIO write). int __fastcall asd_reg_read_C704() { int i; // r5 for ( i = 100; i != 0; --i ) __asm { SVC 0x7B ; '{' } return 0; } /* ==== asd_reg_rw_19798 [tier=IDA size=126] ==== */ unsigned int __fastcall asd_reg_rw_19798(int a1, unsigned int a2, int a3, unsigned __int8 a4) { unsigned int result; // r0 unsigned int v7; // r6 int v12; // r1 char v13; // r2 int v14; // r7 unsigned int v15; // r2 result = *((_DWORD *)off_D15F40 + 1); if ( result > a2 ) { v7 = 0; __asm { SVC 0x7B ; '{' } result = a4 << 31; if ( result == 0 ) { v12 = *((_DWORD *)off_D15F40 + 31); v13 = v12; if ( v12 != 0 ) v13 = 1; v14 = (unsigned __int8)v13 & (*((_DWORD *)off_D15F40 + 1) > a2); v15 = ~a1; if ( v14 != 1 || (v7 = *(_DWORD *)(v12 + 4 * a2)) <= v15 ) { result = 0; if ( (v7 + a1) >> 30 != 0 ) { LABEL_14: __asm { SVC 0x7C ; '|' } return result; } if ( v14 == 0 ) { v7 = 0; goto LABEL_13; } v7 = *(_DWORD *)(v12 + 4 * a2); } if ( v7 > v15 ) { result = 0; goto LABEL_14; } LABEL_13: result = 4 * (v7 + a1); goto LABEL_14; } } return result; } /* ==== asd_reg_write_16330 [tier=EXACT size=66] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 8 x SVC 0x7C (MMIO write). __int64 __fastcall asd_reg_write_16330() { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } return (unsigned int)dword_D12FB0; } /* ==== asd_reg_write_16384 [tier=EXACT size=54] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 4 x SVC 0x7C (MMIO write). __int64 __fastcall asd_reg_write_16384() { int v0; // r3 __int64 result; // r0 v0 = 0; while ( v0 != 4 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } ++v0; __asm { SVC 0x7C ; '|' } result = (unsigned int)dword_D12FF0; __asm { SVC 0x7C ; '|' } } return result; } /* ==== asd_reg_write_163C8 [tier=EXACT size=202] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_163C8() { int v0; // r5 int result; // r0 int i; // r4 _DWORD v7[32]; // [sp+0h] [bp+0h] v7[30] = dword_D130C4; v7[31] = dword_D130C4 + 0x2000; v7[28] = dword_D130C8; v7[29] = dword_D130C8 + 0x2000; v7[26] = dword_D130CC; v7[27] = dword_D130CC + 0x2000; v7[24] = dword_D130D0; v7[25] = dword_D130D0 + 0x2000; v7[22] = dword_D13164; v7[23] = dword_D13164 + 0x2000; v7[20] = dword_D13168; v7[21] = dword_D13168 + 0x2000; v7[18] = dword_D1316C; v7[19] = dword_D1316C + 0x2000; v7[16] = dword_D13170; v7[17] = dword_D13170 + 0x2000; v7[15] = dword_D130D4; v7[14] = dword_D130C4 + 4; v7[13] = dword_D130D8; v7[12] = dword_D130C8 + 4; v7[11] = dword_D130DC; v7[10] = dword_D130CC + 4; v7[9] = dword_D130E0; v7[8] = dword_D130D0 + 4; v7[7] = dword_D13174; v7[6] = dword_D13164 + 4; v7[5] = dword_D13178; v7[4] = dword_D13168 + 4; v0 = 0; v7[3] = dword_D1317C; v7[2] = dword_D1316C + 4; v7[1] = dword_D13180; result = dword_D13170 + 4; v7[0] = dword_D13170 + 4; while ( v0 != 16 ) { for ( i = 0; i != 4; ++i ) { __asm { SVC 0x7C ; '|' } result = v7[v0]; __asm { SVC 0x7C ; '|' } } ++v0; } return result; } /* ==== asd_reg_write_164B4 [tier=EXACT size=126] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_164B4() { int v0; // r5 int result; // r0 int i; // r4 _DWORD v7[16]; // [sp+0h] [bp+0h] v7[14] = dword_D13164; v0 = 0; v7[15] = dword_D13164 + 0x2000; v7[6] = dword_D13164 + 4; v7[13] = dword_D13168 + 0x2000; v7[11] = dword_D1316C + 0x2000; v7[5] = dword_D13178; v7[4] = dword_D13168 + 4; v7[3] = dword_D1317C; v7[9] = dword_D13170 + 0x2000; v7[2] = dword_D1316C + 4; v7[1] = dword_D13180; result = dword_D13170 + 4; v7[12] = dword_D13168; v7[10] = dword_D1316C; v7[8] = dword_D13170; v7[7] = dword_D13174; v7[0] = dword_D13170 + 4; while ( v0 != 8 ) { for ( i = 0; i != 4; ++i ) { __asm { SVC 0x7C ; '|' } result = v7[v0]; __asm { SVC 0x7C ; '|' } } ++v0; } return result; } /* ==== asd_reg_write_16554 [tier=MNEM size=100] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). unsigned int __fastcall asd_reg_write_16554() { unsigned int *v0; // r4 unsigned int v1; // r6 int v2; // r1 unsigned int result; // r0 unsigned int v4; // r7 int i; // r4 int j; // r6 _DWORD v11[24]; // [sp+0h] [bp-C0h] BYREF _BYTE v12[96]; // [sp+60h] [bp-60h] BYREF asd_build_reg_addr_table_v2(a1: (int)v12, a2: (int)v11); v0 = (unsigned int *)off_D131E8; v1 = 6; v2 = *(_DWORD *)off_D131E8; if ( *(_DWORD *)off_D131E8 >= 6u ) v2 = 6; result = asd_count_bits_below(a1: *((_DWORD *)off_D131E8 + 1), a2: v2); if ( *v0 < 6 ) v1 = *v0; if ( result <= v1 ) { v4 = 4 * result; for ( i = 0; i != v4; ++i ) { for ( j = 0; j != 4; ++j ) { __asm { SVC 0x7C ; '|' } result = v11[i]; __asm { SVC 0x7C ; '|' } } } } return result; } /* ==== asd_reg_write_165BC [tier=EXACT size=126] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_165BC() { int v0; // r5 int result; // r0 int i; // r4 _DWORD v7[16]; // [sp+0h] [bp+0h] v7[7] = dword_D134F4; v0 = 0; v7[5] = dword_D134F8; v7[3] = dword_D134FC; v7[1] = dword_D13500; v7[14] = dword_D134EC; v7[15] = dword_D134EC + 4096; v7[6] = dword_D134EC + 4; v7[13] = dword_D134F0 + 4096; v7[4] = dword_D134F0 + 4; v7[11] = dword_D13570 + 4096; v7[2] = dword_D13570 + 4; result = dword_D13568 + 4; v7[12] = dword_D134F0; v7[10] = dword_D13570; v7[8] = dword_D13568; v7[9] = dword_D13568 + 4096; v7[0] = dword_D13568 + 4; while ( v0 != 8 ) { for ( i = 0; i != 4; ++i ) { __asm { SVC 0x7C ; '|' } result = v7[v0]; __asm { SVC 0x7C ; '|' } } ++v0; } return result; } /* ==== asd_reg_write_1663C [tier=MNEM size=108] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). unsigned int __fastcall asd_reg_write_1663C(int a1) { int v1; // r1 unsigned int result; // r0 int i; // r4 int j; // r6 unsigned int v9; // [sp+4h] [bp-84h] BYREF _DWORD v10[16]; // [sp+8h] [bp-80h] BYREF _BYTE v11[64]; // [sp+48h] [bp-40h] BYREF v9 = 0; v1 = 8 * (a1 == 30); if ( a1 == 29 ) v1 = 4; asd_build_reg_addr_table(a1: v1, a2: (int)v11, a3: (int)v10, a4: (int *)&v9); result = v9; if ( v9 <= dword_D132D8 ) { for ( i = 0; i != 2 * v9; ++i ) { for ( j = 0; j != 4; ++j ) { __asm { SVC 0x7C ; '|' } result = v10[i]; __asm { SVC 0x7C ; '|' } } } } return result; } /* ==== asd_reg_write_166AC [tier=EXACT size=202] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_166AC() { int v0; // r5 int result; // r0 int i; // r4 _DWORD v7[32]; // [sp+0h] [bp+0h] v7[30] = dword_D133A8; v7[31] = dword_D133A8 + 4096; v7[28] = dword_D133AC; v7[29] = dword_D133AC + 4096; v7[26] = dword_D1345C; v7[27] = dword_D1345C + 4096; v7[24] = dword_D13460; v7[25] = dword_D13460 + 4096; v7[22] = dword_D134EC; v7[23] = dword_D134EC + 4096; v7[20] = dword_D134F0; v7[21] = dword_D134F0 + 4096; v7[18] = dword_D13570; v7[19] = dword_D13570 + 4096; v7[16] = dword_D13568; v7[17] = dword_D13568 + 4096; v7[15] = dword_D133B0; v7[14] = dword_D133A8 + 4; v7[13] = dword_D133B4; v7[12] = dword_D133AC + 4; v7[11] = dword_D13464; v7[10] = dword_D1345C + 4; v7[9] = dword_D13468; v7[8] = dword_D13460 + 4; v7[7] = dword_D134F4; v7[6] = dword_D134EC + 4; v7[5] = dword_D134F8; v7[4] = dword_D134F0 + 4; v0 = 0; v7[3] = dword_D134FC; v7[2] = dword_D13570 + 4; v7[1] = dword_D13500; result = dword_D13568 + 4; v7[0] = dword_D13568 + 4; while ( v0 != 16 ) { for ( i = 0; i != 4; ++i ) { __asm { SVC 0x7C ; '|' } result = v7[v0]; __asm { SVC 0x7C ; '|' } } ++v0; } return result; } /* ==== asd_reg_write_16788 [tier=EXACT size=162] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_16788() { int result; // r0 int v1; // r5 int i; // r4 _DWORD v7[24]; // [sp+0h] [bp+0h] v7[22] = dword_D1345C; v7[23] = dword_D1345C + 4096; v7[10] = dword_D1345C + 4; v7[21] = dword_D13460 + 4096; v7[19] = dword_D134EC + 4096; v7[9] = dword_D13468; v7[17] = dword_D134F0 + 4096; v7[8] = dword_D13460 + 4; v7[7] = dword_D134F4; v7[15] = dword_D13570 + 4096; v7[6] = dword_D134EC + 4; v7[5] = dword_D134F8; v7[4] = dword_D134F0 + 4; v7[13] = dword_D13568 + 4096; v7[3] = dword_D134FC; v7[11] = dword_D13464; v7[2] = dword_D13570 + 4; v7[1] = dword_D13500; result = dword_D13568 + 4; v7[12] = dword_D13568; v1 = 0; v7[20] = dword_D13460; v7[18] = dword_D134EC; v7[16] = dword_D134F0; v7[14] = dword_D13570; v7[0] = dword_D13568 + 4; while ( v1 != 12 ) { for ( i = 0; i != 4; ++i ) { __asm { SVC 0x7C ; '|' } result = v7[v1]; __asm { SVC 0x7C ; '|' } } ++v1; } return result; } /* ==== asd_reg_write_1683C [tier=EXACT size=126] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_1683C() { int v0; // r5 int result; // r0 int i; // r4 _DWORD v7[16]; // [sp+0h] [bp+0h] v7[14] = dword_D134EC; v0 = 0; v7[15] = dword_D134EC + 4096; v7[6] = dword_D134EC + 4; v7[13] = dword_D134F0 + 4096; v7[11] = dword_D13570 + 4096; v7[5] = dword_D134F8; v7[4] = dword_D134F0 + 4; v7[3] = dword_D134FC; v7[9] = dword_D13568 + 4096; v7[2] = dword_D13570 + 4; v7[1] = dword_D13500; result = dword_D13568 + 4; v7[12] = dword_D134F0; v7[10] = dword_D13570; v7[8] = dword_D13568; v7[7] = dword_D134F4; v7[0] = dword_D13568 + 4; while ( v0 != 8 ) { for ( i = 0; i != 4; ++i ) { __asm { SVC 0x7C ; '|' } result = v7[v0]; __asm { SVC 0x7C ; '|' } } ++v0; } return result; } /* ==== asd_reg_write_19328 [tier=IDA size=106] ==== */ unsigned int __fastcall asd_reg_write_19328(int a1, unsigned int a2) { unsigned int result; // r0 unsigned int D423CC; // r0 int v6; // r1 unsigned int v11; // r0 int v12; // r1 result = *((_DWORD *)off_D15EB8 + 14); if ( result > a2 ) { if ( *((_DWORD *)off_D15EBC + 109) != 0 ) { result = asd_reg_read_11B00(); if ( result != 0 ) { D423CC = asd_tbl_get_D423CC(a1: a2); v6 = 4 * (D423CC + a1); if ( (D423CC + a1) >> 30 != 0 ) v6 = 0; if ( D423CC > ~a1 ) v6 = 0; result = v6; __asm { SVC 0x7C ; '|' } } } else { v11 = asd_tbl_get_D423CC(a1: a2); v12 = 4 * (v11 + a1); if ( (v11 + a1) >> 30 != 0 ) v12 = 0; if ( v11 > ~a1 ) v12 = 0; __asm { SVC 0x7C ; '|' } return v12; } } return result; } /* ==== asd_reg_write_19394 [tier=IDA size=106] ==== */ unsigned int __fastcall asd_reg_write_19394(int a1, unsigned int a2) { unsigned int result; // r0 unsigned int D423C8; // r0 int v6; // r1 unsigned int v11; // r0 int v12; // r1 result = *((_DWORD *)off_D15F40 + 13); if ( result > a2 ) { if ( *((_DWORD *)off_D15F44 + 109) != 0 ) { result = asd_reg_read_11B00(); if ( result != 0 ) { D423C8 = asd_tbl_get_D423C8(a1: a2); v6 = 4 * (D423C8 + a1); if ( (D423C8 + a1) >> 30 != 0 ) v6 = 0; if ( D423C8 > ~a1 ) v6 = 0; result = v6; __asm { SVC 0x7C ; '|' } } } else { v11 = asd_tbl_get_D423C8(a1: a2); v12 = 4 * (v11 + a1); if ( (v11 + a1) >> 30 != 0 ) v12 = 0; if ( v11 > ~a1 ) v12 = 0; __asm { SVC 0x7C ; '|' } return v12; } } return result; } /* ==== asd_reg_write_1946C [tier=MNEM size=136] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_1946C(int a1, int a2, unsigned int a3) { int result; // r0 int _11B00; // r0 unsigned int v8; // r0 int v9; // r1 unsigned int v14; // r0 int v15; // r1 result = *((_DWORD *)off_D15F40 + 2); if ( result > a3 ) { if ( *((_DWORD *)off_D15F44 + 109) != 0 ) { _11B00 = asd_reg_read_11B00(); if ( a1 == 0 && _11B00 != 0 || (result = asd_reg_read_11BE4(), (unsigned int)(a1 - 1) <= 1) && result != 0 ) { v8 = asd_lookup_by_class(a1, a2: a3); v9 = 4 * (v8 + a2); if ( (v8 + a2) >> 30 != 0 ) v9 = 0; if ( v8 > ~a2 ) v9 = 0; result = v9; __asm { SVC 0x7C ; '|' } } } else { v14 = asd_lookup_by_class(a1, a2: a3); v15 = 4 * (v14 + a2); if ( (v14 + a2) >> 30 != 0 ) v15 = 0; if ( v14 > ~a2 ) v15 = 0; __asm { SVC 0x7C ; '|' } return v15; } } return result; } /* ==== asd_reg_write_1946C_cfg0 [tier=EXACT size=48] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_reg_write_1946C. One of 0 near-identical siblings. int __fastcall asd_reg_write_1946C_cfg0(int a1, int a2, unsigned int a3, int a4, unsigned int a5) { if ( a5 >> 30 == 0 ) return asd_reg_write_1946C(a1, a2, a3); return a1; } /* ==== asd_reg_write_19524 [tier=IDA size=106] ==== */ unsigned int __fastcall asd_reg_write_19524(int a1, unsigned int a2) { unsigned int result; // r0 unsigned int D423A8; // r0 int v6; // r1 unsigned int v11; // r0 int v12; // r1 result = *((_DWORD *)off_D15F40 + 6); if ( result > a2 ) { if ( *((_DWORD *)off_D15F44 + 109) != 0 ) { result = asd_reg_read_11BE4(); if ( result != 0 ) { D423A8 = asd_tbl_get_D423A8(a1: a2); v6 = 4 * (D423A8 + a1); if ( (D423A8 + a1) >> 30 != 0 ) v6 = 0; if ( D423A8 > ~a1 ) v6 = 0; result = v6; __asm { SVC 0x7C ; '|' } } } else { v11 = asd_tbl_get_D423A8(a1: a2); v12 = 4 * (v11 + a1); if ( (v11 + a1) >> 30 != 0 ) v12 = 0; if ( v11 > ~a1 ) v12 = 0; __asm { SVC 0x7C ; '|' } return v12; } } return result; } /* ==== asd_reg_write_19600 [tier=IDA size=106] ==== */ unsigned int __fastcall asd_reg_write_19600(int a1, unsigned int a2) { unsigned int result; // r0 unsigned int D423B8; // r0 int v6; // r1 unsigned int v11; // r0 int v12; // r1 result = *((_DWORD *)off_D15F40 + 3); if ( result > a2 ) { if ( *((_DWORD *)off_D15F44 + 109) != 0 ) { result = asd_reg_read_11B00(); if ( result != 0 ) { D423B8 = asd_tbl_get_D423B8(a1: a2); v6 = 4 * (D423B8 + a1); if ( (D423B8 + a1) >> 30 != 0 ) v6 = 0; if ( D423B8 > ~a1 ) v6 = 0; result = v6; __asm { SVC 0x7C ; '|' } } } else { v11 = asd_tbl_get_D423B8(a1: a2); v12 = 4 * (v11 + a1); if ( (v11 + a1) >> 30 != 0 ) v12 = 0; if ( v11 > ~a1 ) v12 = 0; __asm { SVC 0x7C ; '|' } return v12; } } return result; } /* ==== asd_reg_write_19670 [tier=IDA size=106] ==== */ unsigned int __fastcall asd_reg_write_19670(int a1, unsigned int a2) { unsigned int result; // r0 unsigned int D423BC; // r0 int v6; // r1 unsigned int v11; // r0 int v12; // r1 result = *((_DWORD *)off_D15F40 + 1); if ( result > a2 ) { if ( *((_DWORD *)off_D15F44 + 109) != 0 ) { result = asd_reg_read_11B00(); if ( result != 0 ) { D423BC = asd_tbl_get_D423BC(a1: a2); v6 = 4 * (D423BC + a1); if ( (D423BC + a1) >> 30 != 0 ) v6 = 0; if ( D423BC > ~a1 ) v6 = 0; result = v6; __asm { SVC 0x7C ; '|' } } } else { v11 = asd_tbl_get_D423BC(a1: a2); v12 = 4 * (v11 + a1); if ( (v11 + a1) >> 30 != 0 ) v12 = 0; if ( v11 > ~a1 ) v12 = 0; __asm { SVC 0x7C ; '|' } return v12; } } return result; } /* ==== asd_reg_write_196E4 [tier=MNEM size=60] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_196E4(unsigned int a1, int a2, __int16 a3) { int result; // r0 if ( *((_DWORD *)off_D15F44 + 109) != 0 ) { result = asd_reg_read_11B00(); if ( result != 0 ) { result = 4 * a1; if ( a1 >> 30 != 0 ) result = 0; __asm { SVC 0x7C ; '|' } } } else { result = 4 * a1; if ( a1 >> 30 != 0 ) result = 0; __asm { SVC 0x7C ; '|' } } return result; } /* ==== asd_reg_write_19724 [tier=MNEM size=108] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 2 x SVC 0x7C (MMIO write). int __fastcall asd_reg_write_19724(int result, unsigned int a2, __int16 a3) { int v3; // r5 unsigned int D423C0; // r0 int v6; // r1 unsigned int v11; // r0 int v12; // r1 if ( result != 0 ) { v3 = result; result = *((_DWORD *)off_D15F40 + 1); if ( result > a2 ) { if ( *((_DWORD *)off_D15F44 + 109) != 0 ) { result = asd_reg_read_11B00(); if ( result != 0 ) { D423C0 = asd_tbl_get_D423C0(a1: a2); v6 = 4 * (D423C0 + v3); if ( (D423C0 + v3) >> 30 != 0 ) v6 = 0; if ( D423C0 > ~v3 ) v6 = 0; result = v6; __asm { SVC 0x7C ; '|' } } } else { v11 = asd_tbl_get_D423C0(a1: a2); v12 = 4 * (v11 + v3); if ( (v11 + v3) >> 30 != 0 ) v12 = 0; if ( v11 > ~v3 ) v12 = 0; __asm { SVC 0x7C ; '|' } return v12; } } } return result; } /* ==== asd_reg_write_1981C [tier=EXACT size=20] ==== */ // Display-block register accessor: 0 x SVC 0x7B (register read), 1 x SVC 0x7C (MMIO write). unsigned int __fastcall asd_reg_write_1981C(unsigned int a1) { unsigned int v1; // r2 v1 = 4 * a1; if ( a1 >> 30 != 0 ) v1 = 0; __asm { SVC 0x7C ; '|' } return v1; } /* ==== asd_revocation_check_ksv [tier=MNEM size=70] ==== */ // Opcode 0x307 (disp_revocation_check_ksv). int __fastcall asd_revocation_check_ksv(unsigned int a1) { int v2; // r0 unsigned __int8 v3; // r2 int i; // r3 int v5; // r5 int result; // r0 if ( a1 == 0 || asd_validate_ptr(a1, a2: 5u) == 0 ) return 2; v2 = 0; v3 = 0; while ( v2 != 5 ) { for ( i = *(unsigned __int8 *)(a1 + v2); i << 24 != 0; i &= i - 1 ) { v5 = ++v3; if ( (unsigned __int8)v5 != v5 ) v3 = -1; } ++v2; } result = v3 - 20; if ( v3 != 20 ) return 22; return result; } /* ==== asd_scan_pipe_regs [tier=MNEM size=278] ==== */ // Rejects when unk_D424CC bit30 is set, then scans the dword_D424BC/C0/... pipe register // group collecting per-lane status for the caller. int __fastcall asd_scan_pipe_regs(int a1, int a2, int a3) { int *v3; // r9 __int64 v4; // kr00_8 int (__fastcall *v6)(int, int, unsigned int); // r8 int *v7; // r7 __int16 v8; // r6 __int16 v9; // r0 int _13B74; // r0 int v11; // r5 __int16 v16; // [sp+0h] [bp-Ch] __int16 v17; // [sp+4h] [bp-8h] if ( a1 == 0 ) return 2; v3 = (int *)off_D09850; v4 = *(_QWORD *)(a1 + 20); if ( asd_reg_read_13B74(a1: 2, a2: *((_DWORD *)off_D09850 + 52), a3: v4) << 30 != 0 ) return 1; v6 = off_D08984; v7 = v3 + 48; v8 = off_D08984(a1: 2, a2: v3[48], a3: v4); v17 = v6(a1: 2, a2: v3[49], a3: v4); v16 = v6(a1: 2, a2: v3[50], a3: v4); v9 = v6(a1: 2, a2: v3[51], a3: v4); if ( (v8 & 7) == HIDWORD(v4) && (v8 & 0x7F00) != 0 ) goto LABEL_16; if ( (v17 & 7) == HIDWORD(v4) && (v17 & 0x7F00) != 0 ) { v7 = v3 + 49; LABEL_16: asd_reg_write_1946C(a1: 2, a2: *v7, a3: v4); goto LABEL_17; } if ( (v16 & 7) == HIDWORD(v4) && (v16 & 0x7F00) != 0 ) { v7 = v3 + 50; goto LABEL_16; } if ( (v9 & 7) == HIDWORD(v4) && (v9 & 0x7F00) != 0 ) { v7 = v3 + 51; goto LABEL_16; } LABEL_17: _13B74 = asd_reg_write_1946C(a1: 2, a2: v3[52], a3: v4); v11 = 11; while ( --v11 != 0 ) { __asm { SVC 0x56 ; 'V' } _13B74 = asd_reg_read_13B74(a1: 2, a2: v3[53], a3: v4); if ( (_13B74 & 0x30000) == 0 ) return 0; } return (_13B74 & 0x30000) != 0; } /* ==== asd_session_op57 [tier=EXACT size=16] ==== */ // Issues SVC 0x57 (object-session op) with a timeout in dword_D25A3C; returns unk_D38330. int __fastcall asd_session_op57() { *off_D0E144 = 1000; __asm { SVC 0x57 ; 'W' } return *(unsigned __int8 *)off_D0E148; } /* ==== asd_session_op57_1 [tier=EXACT size=16] ==== */ // Issues SVC 0x57 (object-session op) with a timeout in dword_D25A3C; returns unk_D38330. int __fastcall asd_session_op57_1() { int result; // r0 result = *off_D135FC + 1; if ( *off_D135FC != -1 ) { __asm { SVC 0x57 ; 'W' } return *(unsigned __int8 *)off_D13600; } return result; } /* ==== asd_session_op57_invoke [tier=MNEM size=10] ==== */ // Invokes the SVC 0x57 session-op helper and returns 0. int __fastcall asd_session_op57_invoke() { asd_session_op57_1(); return 0; } /* ==== asd_session_timeout_disable [tier=EXACT size=10] ==== */ // Sets dword_D25A3C to -1 (disables the SVC 0x57 timeout) and returns its address. int *__fastcall asd_session_timeout_disable() { int *result; // r0 result = off_D0A86C; *off_D0A86C = -1; return result; } /* ==== asd_set_D33308 [tier=EXACT size=6] ==== */ // Setter: stores the argument into unk_D33308. unsigned int __fastcall asd_set_D33308(unsigned int result) { *((_DWORD *)off_D15400 + 4) = result; return result; } /* ==== asd_set_display_params_cfg13 [tier=EXACT size=32] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_display_params. One of 0 near-identical siblings. int __fastcall asd_set_display_params_cfg13() { _DWORD var4[3]; // [sp+0h] [bp-4h] BYREF int vars8; // [sp+Ch] [bp+8h] BYREF vars8 = 0; var4[0] = dword_D0FAB8; var4[1] = dword_D0FAB8 + 12; var4[2] = dword_D0FAB8 + 20; return sub_D0FB38(a1: &vars8, a2: var4); } /* ==== asd_set_display_params_cfg16 [tier=EXACT size=32] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_display_params. One of 0 near-identical siblings. int __fastcall asd_set_display_params_cfg16() { _DWORD var4[3]; // [sp+0h] [bp-4h] BYREF int vars8; // [sp+Ch] [bp+8h] BYREF vars8 = 0; var4[0] = dword_D0F9B0; var4[1] = dword_D0F9B0 + 36; var4[2] = dword_D0F9B0 + 44; return sub_D0FB38(a1: &vars8, a2: var4); } /* ==== asd_set_display_params_cfg17 [tier=EXACT size=36] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_display_params. One of 0 near-identical siblings. int __fastcall asd_set_display_params_cfg17() { _DWORD var4[3]; // [sp+0h] [bp-4h] BYREF int vars8; // [sp+Ch] [bp+8h] BYREF vars8 = 0; var4[2] = 13532; var4[1] = 13524; var4[0] = 13508; return sub_D0FB38(a1: &vars8, a2: var4); } /* ==== asd_set_display_params_cfg18 [tier=EXACT size=32] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_display_params. One of 0 near-identical siblings. int __fastcall asd_set_display_params_cfg18() { _DWORD var4[3]; // [sp+0h] [bp-4h] BYREF int vars8; // [sp+Ch] [bp+8h] BYREF vars8 = 0; var4[0] = dword_D0FAB8; var4[1] = dword_D0FAB8 + 12; var4[2] = dword_D0FAB8 + 20; return sub_D0FB38(a1: &vars8, a2: var4); } /* ==== asd_set_display_params_cfg19 [tier=EXACT size=32] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_display_params. One of 0 near-identical siblings. int __fastcall asd_set_display_params_cfg19() { _DWORD var4[3]; // [sp+0h] [bp-4h] BYREF int vars8; // [sp+Ch] [bp+8h] BYREF vars8 = 0; var4[0] = dword_D0FAB8; var4[1] = dword_D0FAB8 + 12; var4[2] = dword_D0FAB8 + 20; return sub_D0FB38(a1: &vars8, a2: var4); } /* ==== asd_set_display_params_cfg20 [tier=EXACT size=36] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_display_params. One of 0 near-identical siblings. int __fastcall asd_set_display_params_cfg20() { _DWORD var4[3]; // [sp+0h] [bp-4h] BYREF int vars8; // [sp+Ch] [bp+8h] BYREF vars8 = 0; var4[2] = 13568; var4[1] = 13560; var4[0] = 13524; return sub_D0FB38(a1: &vars8, a2: var4); } /* ==== asd_set_display_params_cfg8 [tier=MNEM size=46] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_display_params. One of 0 near-identical siblings. int __fastcall asd_set_display_params_cfg8() { _DWORD var4[3]; // [sp+0h] [bp-4h] BYREF int vars8; // [sp+Ch] [bp+8h] BYREF vars8 = 0; var4[2] = 13524; var4[1] = 13516; var4[0] = 13500; __asm { SVC 0x8D } return sub_D0FB38(a1: &vars8, a2: var4); } /* ==== asd_set_feature_levels [tier=EXACT size=18] ==== */ // Initialises the feature-level globals unk_D447D4/D8/DC to 6 / 4 / 2. int __fastcall asd_set_feature_levels() { _DWORD *v0; // r0 v0 = off_D0FE8C; *(_DWORD *)off_D0FE8C = 6; v0[1] = 4; v0[2] = 2; return 0; } /* ==== asd_set_pair_D49838 [tier=EXACT size=20] ==== */ // Stores a caller-supplied dword pair into unk_D49838/unk_D4983C. int __fastcall asd_set_pair_D49838(int *a1) { int *v1; // r2 int v2; // r1 if ( a1 == nullptr ) return 2; v1 = (int *)off_D0F6E0; v2 = *a1; *((_DWORD *)off_D0F6E0 + 1) = a1[1]; *v1 = v2; return 0; } /* ==== asd_set_pair_D49838_cfg17 [tier=EXACT size=18] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_pair_D49838. One of 0 near-identical siblings. int __fastcall asd_set_pair_D49838_cfg17() { int vars0[4]; // [sp+0h] [bp+0h] BYREF vars0[0] = dword_D0F6B4; vars0[1] = dword_D0F6B4 + 252; return asd_set_pair_D49838(a1: vars0); } /* ==== asd_set_reg42570_field [tier=MNEM size=68] ==== */ // Reads register unk_D42570 indexed by ctx+12 and rewrites a field selected by the // (a2, a3) mode pair. int __fastcall asd_set_reg42570_field(int a1, int a2, int a3) { _DWORD *v3; // r7 int _14028; // r0 unsigned __int8 v8; // r3 unsigned int v9; // r2 char v10; // r0 if ( a1 == 0 ) return 2; v3 = off_D08BD8; _14028 = asd_reg_read_14028(a1: *((_DWORD *)off_D08BD8 + 93), a2: *(_DWORD *)(a1 + 12), a3); v9 = _14028; if ( a2 != 0 ) { if ( a3 == 1 ) { v10 = 1; goto LABEL_9; } if ( a3 == 2 ) { v10 = 2; LABEL_9: v9 = v9 & 0xFFFFFFFC | v10 & 3; } } else { v9 = _14028 & 0xFFFFFFFC; } asd_reg_rw_19798(a1: v3[93], a2: *(_DWORD *)(a1 + 12), a3: v9, a4: v8); return 0; } /* ==== asd_set_reg425E4_mode [tier=MNEM size=118] ==== */ // Reads the register pair unk_D425E4 / unk_D425E8 indexed by ctx+12 and rewrites them // according to the (a2, a3) mode selection. int __fastcall asd_set_reg425E4_mode(int a1, int a2, int a3) { _DWORD *v3; // r9 __int16 v7; // r2 __int16 _13ED0; // r0 __int16 v9; // r8 if ( a1 == 0 ) return 2; v3 = off_D09850; asd_reg_read_13E14(a1: *((_DWORD *)off_D09850 + 112), a2: *(_DWORD *)(a1 + 12)); _13ED0 = asd_reg_read_13ED0(a1: v3[113], a2: *(_DWORD *)(a1 + 12), a3: v7); v9 = _13ED0; if ( a2 != 0 ) { if ( a3 == 1 ) { v9 = _13ED0 & 0xFFFC | 1; } else if ( a3 == 2 ) { v9 = _13ED0 & 0xFFFC | 2; } } else { v9 = _13ED0 & 0xFFFC; } asd_reg_write_19670(a1: v3[112], a2: *(_DWORD *)(a1 + 12)); asd_reg_write_19724(result: v3[113], a2: *(_DWORD *)(a1 + 12), a3: v9); return 0; } /* ==== asd_set_unk_D33328 [tier=EXACT size=16] ==== */ // Stores a caller dword into unk_D33328. int __fastcall asd_set_unk_D33328(_DWORD *a1) { if ( a1 == nullptr ) return 2; *(_DWORD *)off_D0E260 = *a1; return 0; } /* ==== asd_set_unk_D33328_cfg0 [tier=EXACT size=14] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_set_unk_D33328. One of 0 near-identical siblings. int __fastcall asd_set_unk_D33328_cfg0() { int vars4; // [sp+4h] [bp+4h] BYREF vars4 = dword_D0E218; return asd_set_unk_D33328(a1: &vars4); } /* ==== asd_signal_status_check [tier=MNEM size=178] ==== */ // Per-signal status probe: type 16 tests bit30 of unk_D424B4, type 48 takes the alternate // register path. int __fastcall asd_signal_status_check(int a1, int a2, __int16 a3) { unsigned int v3; // r4 int v4; // r0 _DWORD *v5; // r6 int (__fastcall *v6)(int, unsigned int); // r7 int v7; // r5 int v8; // r0 int v9; // r5 int v10; // r0 _DWORD *v12; // r6 int (__fastcall *v13)(int, int, unsigned int); // r7 char v14; // r5 char v15; // r5 unsigned __int8 v16; // r5 if ( a1 == 0 ) return 2; v3 = *(_DWORD *)(a1 + 20); v4 = *(_DWORD *)(a1 + 40); if ( v4 != 48 ) { if ( v4 == 16 ) { v5 = off_D08860; if ( asd_reg_read_13D24(a1: *((_DWORD *)off_D08860 + 46), a2: v3) << 30 == 0 ) { v6 = off_D087BC; v7 = off_D087BC(a1: v5[43], a2: v3); v8 = v6(a1: v5[44], a2: v3); v9 = v7 & 0x100010 | v8 & 0x10 | v8 & 0x100000; v10 = v6(a1: v5[45], a2: v3); return (v10 & 0x100000 | v10 & 0x10 | v9) != 0; } return 1; } return 2; } v12 = off_D08860; if ( asd_reg_read_13B74(a1: 2, a2: *((_DWORD *)off_D08860 + 52), a3: v3) << 30 != 0 ) return 1; v13 = off_D08864; v14 = off_D08864(a1: 2, a2: v12[48], a3: v3); v15 = v14 | v13(a1: 2, a2: v12[49], a3: v3); v16 = v15 | v13(a1: 2, a2: v12[50], a3: v3); return (((unsigned __int8)v13(a1: 2, a2: v12[51], a3: v3) | v16) & 0x10) != 0; } /* ==== asd_srm_header_check [tier=EXACT size=178] ==== */ // SRM header validation + signature dispatch. // bytes[2:4] BE16 = version, must equal the caller's computed version // bytes[5:8] BE24 = SRM length field (v5) // byte0>>4 == 8 : HDCP1 SRM. Bounded: reject unless 43 <= v5 <= 5120 // (SUB #0x2B / CMP #0x13D5 / BHI), then asd_srm_verify_t8(buf, v5-35). // byte0>>4 == 9 and byte0&0xF == 1 : HDCP2 SRM. ONLY a lower bound is applied // (CMP #0x186 / BHI); v5 has NO upper bound and is never compared // against the transport length. Calls asd_srm_verify_t9(buf, v5-379). // Accepts when the verifier returns 0 OR 0xFFFF000A. int __fastcall asd_srm_header_check(int a1, int a2, unsigned __int8 *a3) { unsigned int v3; // r1 unsigned int v4; // r3 unsigned int v5; // r0 int v6; // r0 int result; // r0 int v8; // r1 bool v9; // zf v4 = *a3 | (a3[1] << 8) | ((a3[2] | (a3[3] << 8)) << 16); if ( HIBYTE(v4) + ((v4 >> 8) & 0xFF00) != a1 ) return 25; v3 = a3[4] | (a3[5] << 8) | ((a3[6] | (a3[7] << 8)) << 16); v5 = ((v3 >> 8) & 0xFF00) + ((v3 << 8) & 0xFF0000 | HIBYTE(v3)); if ( *a3 >> 4 == 9 ) { if ( (*a3 & 0xF) == 1 ) { if ( v5 > 0x186 ) { v6 = ((int (__fastcall *)(unsigned __int8 *, unsigned int))loc_D10714)(a1: a3, a2: v5 - 379); goto LABEL_12; } return 26; } return 2; } if ( *a3 >> 4 != 8 ) return 2; if ( v5 - 43 > 0x13D5 ) return 26; v6 = ((int (__fastcall *)(unsigned __int8 *, unsigned int))loc_D1058C)(a1: a3, a2: v5 - 35); LABEL_12: v8 = v6; result = 0; v9 = v8 == dword_D10540; if ( v8 != dword_D10540 ) v9 = v8 == 0; if ( !v9 ) return 24; return result; } /* ==== asd_srm_op_301 [tier=MNEM size=152] ==== */ // Opcode 0x301. int __fastcall asd_srm_op_301(unsigned int a1, unsigned int a2, int *a3, int a4, int a5, int a6, int a7) { _DWORD *v7; // r7 int result; // r0 int v12; // r3 int v13; // r1 int v14; // r3 __int64 v15; // r0 unsigned int *v16; // r2 _BYTE *v17; // r3 int v18[1024]; // [sp+0h] [bp-1408h] BYREF int v19; // [sp+1404h] [bp-4h] v7 = off_D10480; v19 = *(_DWORD *)off_D10480; bzero_core(result: v18, a2: 0x1400u); result = 2; if ( a2 - 48 <= 0x13D0 && a3 != nullptr ) { if ( asd_validate_ptr(a1: (unsigned int)a3, a2) != 0 && (*((unsigned __int8 *)off_D10484[0] + 3) | (*((unsigned __int8 *)off_D10484[0] + 2) << 8)) < a1 ) { memcpy(result: v18, a2: a3, a3: a2, a4: v12); result = asd_srm_header_check(a1, a2: v13, a3: (unsigned __int8 *)v18); if ( result == 0 ) { memcpy_aligned(result: (int *)off_D10484[0], a2: v18, a3: a2, a4: v14); *off_D10488 = a2; asd_srm_sub_12EC4(); result = 0; } } else { result = 2; } } if ( *v7 != v19 ) { v15 = ((__int64 (__fastcall *)(int, int))loc_D15FA8)(a1: result, a2: *v7 - v19); return asd_srm_store(a1: v15, a2: (int *)HIDWORD(v15), a3: v16, a4: v17); } return result; } /* ==== asd_srm_read [tier=MNEM size=96] ==== */ // Opcode 0x300 (HDCP-side disp_srm_read). int __fastcall asd_srm_read(int *a1, unsigned int a2, _DWORD *a3, _BYTE *a4) { int result; // r0 int v9; // r3 int *v10; // r1 result = 2; if ( a1 != nullptr && a3 != nullptr ) { if ( asd_validate_ptr((unsigned int)a1, a2: 4u) == 0 || asd_validate_ptr(a1: (unsigned int)a3, a2: 4u) == 0 || a4 != nullptr && asd_validate_ptr(a1: (unsigned int)a4, a2) == 0 ) { return 2; } v10 = off_D10488; *a1 = *((unsigned __int8 *)off_D10484[0] + 3) | (*((unsigned __int8 *)off_D10484[0] + 2) << 8); *a3 = *v10; result = 0; if ( a2 != 0 && a4 != nullptr ) { if ( *v10 > a2 ) return 2; memcpy(result: a4, a2: (int *)off_D10484[0], a3: *v10, a4: v9); return 0; } } return result; } /* ==== asd_srm_store [tier=MNEM size=374] ==== */ // RPC 0x308. a1=transport length (gated 48..5120), a2=caller buffer, a3/a4=outputs. // Copies a1 bytes into a 5120-byte stack buffer, then parses a 24-bit BE length from // header bytes 5..7 (v18) which is NEVER validated against a1, and uses it both as the // verification length and as the copy-out length into byte_D1F038 (also 5120 bytes). int __fastcall asd_srm_store(unsigned int a1, int *a2, unsigned int *a3, _BYTE *a4) { int v4; // r10 int v5; // r11 _DWORD *v10; // r0 unsigned int v15; // r6 int v16; // r1 int v17; // r3 int v19; // r0 int v20; // r3 int v21[1022]; // [sp+8h] [bp-1404h] BYREF int v22; // [sp+1408h] [bp-4h] v22 = loc_D15FA4; v10 = bzero_core(result: v21, a2: 0x1400u); __asm { SVC 0x8D } v15 = (unsigned int)v10; v16 = 2; if ( a1 - 48 > 0x13D0 || a2 == nullptr || a3 == nullptr ) goto LABEL_14; if ( asd_validate_ptr(a1: (unsigned int)a2, a2: a1) == 0 || asd_validate_ptr(a1: (unsigned int)a3, a2: 4u) == 0 || asd_validate_ptr(a1: (unsigned int)a4, a2: 1u) == 0 ) { v16 = 2; goto LABEL_14; } *a3 = 0xFFFF; *a4 = 0; v4 = *((unsigned __int16 *)off_D10484[0] + 1); memcpy(result: v21, a2, a3: a1, a4: v17); a2 = (int *)v21[0]; v5 = *(__int64 *)v21 >> 24; a1 = (v5 & 0xFF0000 | HIBYTE(v21[1])) + (((unsigned int)v21[1] >> 8) & 0xFF00); if ( a1 < 0x13FC ) a1 += 5; if ( (v21[0] & 0xF0) == 0x80 && v15 <= 0x14 && ((1 << v15) & 0x10000C) != 0 ) asd_sysdrv_rpc_103C(); while ( 1 ) { a2 = (int *)((((unsigned int)a2 >> 8) & 0xFF00) + (unsigned __int8)v5); v19 = asd_srm_header_check(a1: (int)a2, a2: (unsigned __int8)v5, a3: (unsigned __int8 *)v21); v16 = v19; if ( bswap32(v4 << 16) >= (unsigned int)a2 ) { if ( v19 == 0 ) *a4 = 1; } else { if ( v19 != 0 ) goto LABEL_14; *a3 = (unsigned int)a2; *a4 = 1; memcpy_aligned(result: (int *)off_D10484[0], a2: v21, a3: a1, a4: v20); *off_D10488 = a1; } v16 = 0; LABEL_14: if ( loc_D15FA4 == v22 ) return v16; ((void (__fastcall *)(int, int))loc_D15FA8)(a1: loc_D15FA4 - v22, a2: v16); } } /* ==== asd_srm_sub_10B30 [tier=EXACT size=18] ==== */ // Reachability-derived label: called only from the 'srm' RPC subsystem // (BFS over direct calls + tail calls from the named 0xsrm handlers). // Behaviour not individually identified. int __fastcall asd_srm_sub_10B30() { return (unsigned __int8)off_D0E4D4[7] + (((unsigned __int8)off_D0E4D4[6] << 8) | ((unsigned __int8)off_D0E4D4[5] << 16)); } /* ==== asd_srm_sub_12D4C [tier=MNEM size=100] ==== */ // Reachability-derived label: called only from the 'srm' RPC subsystem // (BFS over direct calls + tail calls from the named 0xsrm handlers). // Behaviour not individually identified. int __fastcall asd_srm_sub_12D4C(unsigned int *a1) { unsigned int v2; // r0 char *v4; // r8 unsigned int v5; // r9 unsigned int v6; // r7 unsigned int *v7; // r5 int v8; // r10 int i; // r6 if ( a1 == nullptr ) return 2; v2 = asd_srm_sub_10B30(); if ( v2 < 0x2B ) return 26; v4 = off_D10484[0]; v5 = v2 - 43; v6 = 0; LABEL_6: if ( v5 <= v6 ) return 0; v7 = (unsigned int *)&v4[v6 + 9]; v8 = v4[v6 + 8] & 0x7F; for ( i = v8; ; --i ) { if ( i == 0 ) { v6 += 5 * v8 + 1; goto LABEL_6; } if ( memcmp_be(a1: v7, a2: a1, a3: 5u) == 0 ) break; v7 = (unsigned int *)((char *)v7 + 5); } return 13; } /* ==== asd_srm_sub_12DB0 [tier=MNEM size=54] ==== */ // Reachability-derived label: called only from the 'srm' RPC subsystem // (BFS over direct calls + tail calls from the named 0xsrm handlers). // Behaviour not individually identified. int __fastcall asd_srm_sub_12DB0(unsigned int *a1) { unsigned int *v2; // r5 int i; // r6 if ( a1 == nullptr ) return 2; if ( asd_srm_sub_10B30() != 0 ) { v2 = (unsigned int *)(off_D101A0 + 12); for ( i = *((unsigned __int16 *)off_D101A0 + 4) >> 6; i != 0; --i ) { if ( memcmp_be(a1: v2, a2: a1, a3: 5u) == 0 ) return 23; v2 = (unsigned int *)((char *)v2 + 5); } } return 0; } /* ==== asd_srm_sub_12EC4 [tier=IDA size=594] ==== */ int asd_srm_sub_12EC4() { unsigned int v0; // r3 _DWORD *v1; // r11 unsigned int v2; // r7 unsigned int *v3; // r0 unsigned __int8 v4; // r8 int v5; // r6 unsigned __int8 v6; // r9 unsigned int v7; // r5 unsigned int v8; // r1 unsigned int v9; // r2 char *v10; // r4 char *v11; // r10 unsigned int v12; // r0 int v13; // r0 unsigned __int8 v14; // r1 unsigned int v15; // r0 unsigned int v16; // r7 unsigned int v17; // r2 int v18; // r5 char *v19; // r0 unsigned int v20; // r6 unsigned int v21; // r4 unsigned int *v22; // r0 int v23; // lr int v24; // r12 int v25; // r2 int v26; // r3 int v27; // r8 unsigned int v28; // r7 unsigned int v29; // r6 int v30; // r4 unsigned __int8 v31; // r5 char *v32; // r10 unsigned int v33; // r0 int v34; // r0 unsigned int v35; // r1 unsigned int v36; // r12 unsigned int v37; // r8 unsigned int v38; // r6 unsigned __int8 v39; // r7 unsigned int v40; // r4 int v41; // r3 int v42; // r0 int v43; // r5 int v44; // r2 unsigned int v46; // [sp+4h] [bp-208h] _DWORD v47[128]; // [sp+Ch] [bp-200h] BYREF if ( asd_feature_enabled(a1: 15) ) { v1 = off_D10118; v2 = 0; v3 = (unsigned int *)((char *)off_D10118 + 4216); v4 = 0; v5 = *((unsigned __int8 *)off_D10118 + 4232); v6 = 0; LABEL_3: v7 = *v3; v8 = (unsigned int)v1 + 5 * v2; v9 = 4233; v10 = (char *)(v8 + 4233); while ( v2 <= 0x7F && v5 != 0 ) { if ( v7 << 31 != 0 ) { if ( asd_srm_sub_13174(a1: v10, a2: v8, a3: v9, a4: v0) != 0 ) { v11 = (char *)&v1[v2]; v12 = *((_DWORD *)v11 + 926); v8 = v1[24 * v12 + 22]; if ( v8 != 0 ) { asd_link_reset(a1: v12, a2: 0); asd_hdcp1_disable(a1: *((_DWORD *)v11 + 926)); v9 = (unsigned int)v47; v8 = v4; v47[v4] = *((_DWORD *)v11 + 926); v13 = ++v4; if ( (unsigned __int8)v13 != v13 ) v4 = -1; } } --v5; } ++v2; v10 += 5; v7 >>= 1; if ( v2 << 27 == 0 ) { v14 = v6 + 1; if ( (unsigned __int8)(v6 + 1) != v6 + 1 ) v14 = -1; v6 = v14; v3 = &v1[v14 + 1054]; goto LABEL_3; } } v15 = 0; v16 = 0; v17 = 0; v18 = 0; while ( v15 <= 3 && v18 == 0 ) { v46 = v15; v19 = (char *)&v1[v15]; v20 = 0; v21 = *((_DWORD *)v19 + 1054); v22 = (unsigned int *)(v19 + 4216); v18 = 0; v8 = v21; while ( 1 ) { v0 = v4; if ( v20 >= v4 || v18 != 0 ) break; v23 = *((unsigned __int8 *)v1 + 4232); v24 = v23; while ( v24 != 0 ) { if ( v8 << 31 != 0 ) { if ( v47[v20] == v1[v16 + 926] ) { *((_BYTE *)v1 + 4232) = --v23; v21 &= ~(1 << (v17 & 0x1F)); *v22 = v21; } --v24; } v18 = 1; v25 = (unsigned __int8)v17 + 1; ++v16; v8 >>= 1; v26 = (unsigned __int8)v25; if ( (unsigned __int8)v25 != v25 ) v26 = -1; v17 = v16 & 0x1F; if ( (v16 & 0x1F) != 0 ) v17 = v26; if ( v16 >= 0x80 ) goto LABEL_35; } v18 = 0; LABEL_35: ++v20; } v15 = v46 + 1; } v27 = *((unsigned __int8 *)v1 + 3700); v28 = 0; v29 = v1[924]; v30 = 3248; v31 = 0; while ( v28 <= 0x1F && v27 != 0 ) { if ( v29 << 31 != 0 ) { if ( asd_srm_sub_131F8(a1: (char *)v1 + v30, a2: v8, a3: v17, a4: v0) != 0 ) { v32 = (char *)&v1[v28]; v33 = *((_DWORD *)v32 + 892); v8 = v1[24 * v33 + 22]; if ( v8 != 0 ) { asd_link_reset(a1: v33, a2: 0); asd_hdcp2_disable(a1: *((_DWORD *)v32 + 892)); v17 = (unsigned int)v47; v8 = *((_DWORD *)v32 + 892); v47[v31] = v8; v34 = ++v31; if ( (unsigned __int8)v34 != v34 ) v31 = -1; } } --v27; } v30 += 5; ++v28; v29 >>= 1; } v35 = v1[924]; v36 = v31; v37 = 0; v38 = 0; v39 = 0; v40 = v35; v41 = 0; while ( v37 < v36 && v41 == 0 ) { v42 = *((unsigned __int8 *)v1 + 3700); v43 = v42; while ( v43 != 0 ) { if ( v40 << 31 != 0 ) { if ( v47[v37] == v1[v38 + 892] ) { *((_BYTE *)v1 + 3700) = --v42; v35 &= ~(1 << (v39 & 0x1F)); v1[924] = v35; } --v43; } v41 = 1; v44 = v39 + 1; ++v38; v40 >>= 1; ++v39; if ( (unsigned __int8)v44 != v44 ) v39 = -1; if ( v38 >= 0x20 ) goto LABEL_61; } v41 = 0; LABEL_61: ++v37; } } return 0; } /* ==== asd_srm_sub_13174 [tier=MNEM size=102] ==== */ // Reachability-derived label: called only from the 'srm' RPC subsystem // (BFS over direct calls + tail calls from the named 0xsrm handlers). // Behaviour not individually identified. int __fastcall asd_srm_sub_13174(char *a1, unsigned int a2, unsigned int a3, unsigned int a4) { char v4; // r1 char v5; // r2 unsigned int v6; // r5 char v7; // r3 char v8; // r4 char v9; // r0 int v10; // r0 unsigned int v12[2]; // [sp+0h] [bp-10h] BYREF unsigned int v13[2]; // [sp+8h] [bp-8h] BYREF v12[0] = (unsigned int)a1; v12[1] = a2; v13[0] = a3; v13[1] = a4; if ( a1 == nullptr ) return 2; v4 = a1[4]; v5 = *a1; v6 = (unsigned __int8)*off_D10484[0]; v7 = a1[1]; v8 = a1[2]; v9 = a1[3]; LOBYTE(v13[0]) = v4; BYTE1(v13[0]) = v9; BYTE2(v13[0]) = v8; HIBYTE(v13[0]) = v7; LOBYTE(v13[1]) = v5; if ( v6 >> 4 == 9 ) { BYTE1(v12[0]) = v9; LOBYTE(v12[1]) = v5; HIBYTE(v12[0]) = v7; BYTE2(v12[0]) = v8; LOBYTE(v12[0]) = v4; v10 = asd_srm_sub_12DB0(a1: v12); } else { if ( v6 >> 4 != 8 ) return 0; v10 = asd_srm_sub_12D4C(a1: v13); } if ( v10 != 0 ) return 13; return 0; } /* ==== asd_srm_sub_131F8 [tier=MNEM size=78] ==== */ // Reachability-derived label: called only from the 'srm' RPC subsystem // (BFS over direct calls + tail calls from the named 0xsrm handlers). // Behaviour not individually identified. int __fastcall asd_srm_sub_131F8(char *a1, int a2, unsigned int a3, unsigned int a4) { unsigned int v4; // r1 char v5; // r1 char v6; // r2 char v7; // r3 char v8; // r4 int v9; // r0 unsigned int v11[2]; // [sp+0h] [bp-8h] BYREF v11[0] = a3; v11[1] = a4; if ( a1 == nullptr ) return 2; v4 = (unsigned __int8)*off_D10484[0]; if ( v4 >> 4 == 9 ) { v9 = asd_srm_sub_12DB0((unsigned int *)a1); } else { if ( v4 >> 4 != 8 ) return 0; v5 = *a1; v6 = a1[1]; v7 = a1[2]; v8 = a1[3]; LOBYTE(v11[1]) = a1[4]; LOBYTE(v11[0]) = v5; BYTE1(v11[0]) = v6; BYTE2(v11[0]) = v7; HIBYTE(v11[0]) = v8; v9 = asd_srm_sub_12D4C(a1: v11); } if ( v9 != 0 ) return 23; return 0; } /* ==== asd_srm_sub_14A88 [tier=EXACT size=26] ==== */ // Reachability-derived label: called only from the 'srm' RPC subsystem // (BFS over direct calls + tail calls from the named 0xsrm handlers). // Behaviour not individually identified. int __fastcall asd_srm_sub_14A88(char *a1, char *a2, int a3) { char *v4; // r1 char v5; // t1 if ( a1 == a2 ) return 1; v4 = a2 - 1; while ( a3 != 0 ) { v5 = *a1++; v4[a3--] = v5; } return 0; } /* ==== asd_start_link_task [tier=EXACT size=60] ==== */ // Clears dword_D33054, probes the power state, and on state 1 creates a task with // SVC 0x51; otherwise falls back to sub_D1464C. int __fastcall asd_start_link_task() { char *v0; // r5 BOOL v1; // r4 unsigned __int8 v2; // r0 v0 = off_D11604; *((_DWORD *)off_D11604 + 1) = 0; v1 = asd_probe_power_state(); if ( v1 ) { asd_full_reset(); } else if ( *((_DWORD *)v0 + 1) == 1 ) { v1 = false; v2 = (unsigned __int8)off_D1148C; __asm { SVC 0x51 ; 'Q' } *v0 = (char)off_D1148C; if ( v2 == 255 ) return 39; } return v1; } /* ==== asd_state_not_1 [tier=EXACT size=12] ==== */ // Returns dword_D33054 != 1. BOOL __fastcall asd_state_not_1() { return *((_DWORD *)off_D11604 + 1) != 1; } /* ==== asd_state_not_1_cfg0 [tier=MNEM size=34] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls asd_state_not_1. One of 0 near-identical siblings. int __fastcall asd_state_not_1_cfg0(_DWORD *a1) { int result; // r0 int v3; // r1 if ( a1 == nullptr ) return 2; a1[19] = 5; a1[16] = 6; result = asd_state_not_1(); v3 = 4; if ( result == 0 ) v3 = 2; a1[17] = v3; return result; } /* ==== asd_store_link_config [tier=MNEM size=74] ==== */ // Stores caller config: 40 bytes -> byte_D332FC and 0xD8 bytes -> byte_D42661+87. // Then returns 2 unless dword_D33310/14/18/1C are all non-zero (readiness check). // 12 call sites. int __fastcall asd_store_link_config(int *a1, int *a2, int a3, int a4) { _DWORD *v5; // r5 int v6; // r3 int result; // r0 if ( a1 == nullptr || a2 == nullptr ) return 2; v5 = off_D15140; memcpy(result: (_BYTE *)off_D15140 + 4, a2: a1, a3: 0x28u, a4); memcpy_aligned(result: (int *)dword_D15144, a2, a3: 0xD8u, a4: v6); result = 2 * (v5[9] == 0); if ( v5[8] == 0 ) result = 2; if ( v5[7] == 0 ) result = 2; if ( v5[6] == 0 ) return 2; return result; } /* ==== asd_stream_reset [tier=MNEM size=46] ==== */ // Requires ctx+64 == 6, clears state via the bzero wrapper, then calls sub_D1853C. int __fastcall asd_stream_reset(int a1) { int vars0; // [sp+0h] [bp+0h] int vars4; // [sp+4h] [bp+4h] vars0 = 0; vars4 = 0; if ( a1 == 0 || *(_DWORD *)(a1 + 64) != 6 ) return 2; if ( asd_bzero_core_cfg1() != 0 ) return 18; return asd_stream_slot_update(a1: 0, a2: 0, a3: 0, a4: 0); } /* ==== asd_stream_slot_update [tier=MNEM size=124] ==== */ // Updates the active stream slot: requires the link at unk_D33308 to be enabled and its // value at unk_D33320 to match a3, then advances the unk_D332F8 counter. int __fastcall asd_stream_slot_update(int a1, int a2, int a3, int a4) { _DWORD *v4; // r0 int v5; // r3 unsigned int v6; // r4 bool v7; // zf int v8; // r5 int result; // r0 v4 = off_D15214; if ( a4 != 0 ) { v5 = *((_DWORD *)off_D15214 + 4); if ( *(_BYTE *)(*((_DWORD *)off_D15214 + 9) + v5) != 0 && *(_DWORD *)(*((_DWORD *)off_D15214 + 10) + 4 * v5) == a3 ) { v6 = *(_DWORD *)off_D15214; v8 = *(_DWORD *)off_D15214 + 1; v7 = v8 == 0; if ( *(_DWORD *)off_D15214 != -1 ) { *(_DWORD *)off_D15214 = v8; v7 = v8 == -1; } if ( v7 ) { *v4 = 2000; LABEL_19: result = 10; goto LABEL_20; } if ( v6 > 0x7CE ) goto LABEL_19; } else { *(_DWORD *)off_D15214 = 0; } } else if ( *((_BYTE *)off_D15214 + 20) != 0 ) { v5 = *((_DWORD *)off_D15214 + 4); if ( *(_DWORD *)(*((_DWORD *)off_D15214 + 7) + 4 * v5) == a2 && *(_DWORD *)(*((_DWORD *)off_D15214 + 8) + 4 * v5) == a3 ) { goto LABEL_19; } } else { v5 = *((_DWORD *)off_D15214 + 4); } result = 10; if ( (unsigned int)(a2 - a3) <= 2 && *(_BYTE *)(*((_DWORD *)off_D15214 + 9) + v5) != 0 ) { result = 0; *((_BYTE *)off_D15214 + 20) = 0; } LABEL_20: *(_DWORD *)(*((_DWORD *)off_D15278 + 10) + 4 * v5) = a3; return result; } /* ==== asd_svc_op_202 [tier=MNEM size=242] ==== */ // Opcode 0x202. unsigned int __fastcall asd_svc_op_202(unsigned int a1, unsigned int a2, unsigned int a3, unsigned int *a4) { _DWORD *v4; // r9 int v7; // r8 int v9; // r3 int v10[4]; // [sp+18h] [bp-14h] BYREF int v11; // [sp+28h] [bp-4h] v4 = off_D117B8; v11 = *(_DWORD *)off_D117B8; if ( asd_validate_ptr(a1, a2) == 0 || asd_validate_ptr(a1: (unsigned int)a4, a2: 4u) == 0 || asd_validate_ptr(a1: a3, a2: *a4) == 0 ) { a3 = 2; goto LABEL_7; } v7 = gp_object_allocate(); asd_sysdrv_rpc_35(); if ( v7 == 0 ) goto LABEL_10; LABEL_13: asd_sysdrv_rpc_5(); LABEL_14: a3 = 1; LABEL_7: while ( *v4 != v11 ) { ((void (__fastcall *)(int))loc_D15FA8)(a1: *v4 - v11); LABEL_10: if ( gp_populate_transient_object() != 0 || gp_operation_allocate() != 0 || asd_sysdrv_rpc_3() != 0 ) goto LABEL_13; asd_sysdrv_rpc_5(); if ( gp_cipher_update() != 0 ) goto LABEL_14; memcpy(result: (_BYTE *)(a3 + 16), a2: v10, a3: 0x10u, a4: v9); a3 = 0; } return a3; } /* ==== asd_svc_op_207 [tier=MNEM size=34] ==== */ // Opcode 0x207. int __fastcall asd_svc_op_207(unsigned int a1) { void (__fastcall *v2)(unsigned int); // r1 if ( asd_validate_ptr(a1, a2: 4u) == 0 ) return 2; v2 = *((void (__fastcall **)(unsigned int))off_D11A6C + 10); if ( v2 == nullptr ) return 7; v2(a1); return 0; } /* ==== asd_svc_op_20B [tier=MNEM size=14] ==== */ // Opcode 0x20B. int __fastcall asd_svc_op_20B(BOOL *a1) { *a1 = asd_svc_sub_2794(); return 0; } /* ==== asd_svc_sub_273E [tier=EXACT size=84] ==== */ // Reachability-derived label: called only from the 'svc' RPC subsystem // (BFS over direct calls + tail calls from the named 0xsvc handlers). // Behaviour not individually identified. unsigned int __fastcall asd_svc_sub_273E(int a1, unsigned int a2) { unsigned int v2; // r2 unsigned int v3; // r1 unsigned int v4; // r3 unsigned int v5; // r4 unsigned int i; // r5 int v7; // r6 v2 = a2 >> 1; v3 = 0xFFFF; v4 = 0xFFFF; while ( v2 != 0 ) { v5 = v2; if ( v2 >= 0x168 ) v5 = 360; v2 -= v5; for ( i = 0; i < v5; ++i ) { v7 = *(unsigned __int16 *)(a1 + 2 * i); v3 += v7; v4 += v3; } a1 += 2 * v5; v4 = HIWORD(v4) + (unsigned __int16)v4; v3 = HIWORD(v3) + (unsigned __int16)v3; } return ((65537 * v4) & 0xFFFF0000) + HIWORD(v3) + (unsigned __int16)v3; } /* ==== asd_svc_sub_2794 [tier=EXACT size=34] ==== */ // Reachability-derived label: called only from the 'svc' RPC subsystem // (BFS over direct calls + tail calls from the named 0xsvc handlers). // Behaviour not individually identified. BOOL __fastcall asd_svc_sub_2794() { int *v0; // r4 int v1; // r0 void (__fastcall *v2)(int *); // r1 v0 = off_D0276C; v1 = *off_D0276C; if ( *off_D0276C == 255 ) { v2 = *((void (__fastcall **)(int *))off_D02770 + 13); if ( v2 != nullptr ) { v2(a1: off_D0276C); v1 = *v0; } else { v1 = 255; } } return v1 != 0; } /* ==== asd_sync_link_state [tier=MNEM size=46] ==== */ // Queries SYS_DRV RPC 0x1021 (verb 0, byte_D33050); on failure or a zero reply runs // sub_D1464C, otherwise drains sub_D14744 until it returns 0. void __noreturn asd_sync_link_state() { int v0; // r1 int v5; // [sp+4h] [bp-4h] BYREF v0 = (unsigned __int8)*off_D11604; v5 = 0; if ( sysdrv_rpc_1021(a1: 0, a2: v0, a3: (int)&v5) != 0 || v5 == 0 ) { asd_full_reset(); } else { while ( asd_link_state_poll() != 0 ) ; } while ( 1 ) __asm { SVC 0x56 ; 'V' } } /* ==== asd_sysdrv_feature_mask_get_cfg0 [tier=EXACT size=40] ==== */ // Thin per-instance configuration wrapper: loads constant register offsets // and tail-calls sysdrv_feature_mask_get. One of 0 near-identical siblings. int __fastcall asd_sysdrv_feature_mask_get_cfg0(int a1) { bool v1; // zf int v2; // r0 bool v3; // zf int v4; // r4 v1 = a1 == 25; if ( a1 != 25 ) v1 = a1 == 20; if ( !v1 ) return 0; v4 = 0; v2 = sysdrv_feature_mask_get(); v3 = v2 == dword_D027A0; if ( v2 != dword_D027A0 ) v3 = v2 == 0; if ( !v3 ) return 1; return v4; } /* ==== asd_sysdrv_rpc_1002 [tier=SVCOP size=100] ==== */ int __fastcall asd_sysdrv_rpc_1002(int a1, int a2, unsigned int a3, int a4, int a5, int a6) { _DWORD v14[19]; // [sp+8h] [bp-74h] BYREF bzero_core(result: v14, a2: 0x20u); if ( asd_bzero_core_cfg3() == 1 ) { v14[18] = 0; v14[16] = a5; v14[17] = a6; v14[14] = a3; v14[15] = a4; v14[12] = a1; } else { v14[4] = a6; v14[5] = a5; v14[2] = a4; v14[3] = a5; v14[0] = a1; v14[1] = a3 >> 3; } __asm { SVC 0xF2 } return 1; } /* ==== asd_sysdrv_rpc_1002_2 [tier=SVCOP size=100] ==== */ int __fastcall asd_sysdrv_rpc_1002_2(int a1, int a2, unsigned int a3, int a4, int a5, int a6) { _DWORD v14[19]; // [sp+8h] [bp-74h] BYREF bzero_core(result: v14, a2: 0x20u); if ( asd_bzero_core_cfg3() == 1 ) { v14[18] = 0; v14[16] = a5; v14[17] = a6; v14[14] = a3; v14[15] = a4; v14[12] = a1; } else { v14[4] = a6; v14[5] = a5; v14[2] = a4; v14[3] = a5; v14[0] = a1; v14[1] = a3 >> 3; } __asm { SVC 0xF2 } return 1; } /* ==== asd_sysdrv_rpc_103C [tier=SVCOP size=44] ==== */ int asd_sysdrv_rpc_103C() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== asd_sysdrv_rpc_1043 [tier=SVCOP size=44] ==== */ int asd_sysdrv_rpc_1043() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== asd_sysdrv_rpc_3 [tier=SVCOP size=42] ==== */ int asd_sysdrv_rpc_3() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== asd_sysdrv_rpc_35 [tier=SVCOP size=42] ==== */ int asd_sysdrv_rpc_35() { _DWORD v5[28]; // [sp+10h] [bp-70h] BYREF bzero_core(result: v5, a2: 0x18u); __asm { SVC 0xF2 } return 1; } /* ==== asd_sysdrv_rpc_5 [tier=SVCOP size=46] ==== */ int asd_sysdrv_rpc_5() { _DWORD v5[10]; // [sp+10h] [bp+10h] BYREF bzero_core(result: v5, a2: 0x18u); __asm { SVC 0xF2 } return 1; } /* ==== asd_sysdrv_rpc_C [tier=SVCOP size=46] ==== */ int asd_sysdrv_rpc_C() { _DWORD v5[10]; // [sp+10h] [bp+10h] BYREF bzero_core(result: v5, a2: 0x18u); __asm { SVC 0xF2 } return 1; } /* ==== asd_tbl_get_D4238C [tier=IDA size=22] REF-DERIVED-NAME ==== */ int __fastcall asd_tbl_get_D4238C(unsigned int a1) { int result; // r0 int v3; // r2 result = 0; v3 = *((_DWORD *)off_D0E4BC + 17); if ( v3 != 0 && *((_DWORD *)off_D0E4BC + 1) > a1 ) return *(_DWORD *)(v3 + 4 * a1); return result; } /* ==== asd_tbl_get_D423A8 [tier=IDA size=22] REF-DERIVED-NAME ==== */ int __fastcall asd_tbl_get_D423A8(unsigned int a1) { int result; // r0 int v3; // r2 result = 0; v3 = *((_DWORD *)off_D0E4BC + 24); if ( v3 != 0 && *((_DWORD *)off_D0E4BC + 6) > a1 ) return *(_DWORD *)(v3 + 4 * a1); return result; } /* ==== asd_tbl_get_D423B0 [tier=IDA size=22] REF-DERIVED-NAME ==== */ int __fastcall asd_tbl_get_D423B0(unsigned int a1) { int result; // r0 int v3; // r2 result = 0; v3 = *((_DWORD *)off_D0E4BC + 26); if ( v3 != 0 && *((_DWORD *)off_D0E4BC + 7) > a1 ) return *(_DWORD *)(v3 + 4 * a1); return result; } /* ==== asd_tbl_get_D423B8 [tier=IDA size=22] REF-DERIVED-NAME ==== */ int __fastcall asd_tbl_get_D423B8(unsigned int a1) { int result; // r0 int v3; // r2 result = 0; v3 = *((_DWORD *)off_D0E4BC + 28); if ( v3 != 0 && *((_DWORD *)off_D0E4BC + 3) > a1 ) return *(_DWORD *)(v3 + 4 * a1); return result; } /* ==== asd_tbl_get_D423BC [tier=IDA size=22] REF-DERIVED-NAME ==== */ int __fastcall asd_tbl_get_D423BC(unsigned int a1) { int result; // r0 int v3; // r2 result = 0; v3 = *((_DWORD *)off_D0E4BC + 29); if ( v3 != 0 && *((_DWORD *)off_D0E4BC + 1) > a1 ) return *(_DWORD *)(v3 + 4 * a1); return result; } /* ==== asd_tbl_get_D423C0 [tier=IDA size=22] REF-DERIVED-NAME ==== */ int __fastcall asd_tbl_get_D423C0(unsigned int a1) { int result; // r0 int v3; // r2 result = 0; v3 = *((_DWORD *)off_D0E4BC + 30); if ( v3 != 0 && *((_DWORD *)off_D0E4BC + 1) > a1 ) return *(_DWORD *)(v3 + 4 * a1); return result; } /* ==== asd_tbl_get_D423C8 [tier=IDA size=24] REF-DERIVED-NAME ==== */ int __fastcall asd_tbl_get_D423C8(unsigned int a1) { int result; // r0 int v3; // r2 result = 0; v3 = *((_DWORD *)off_D0E4BC + 32); if ( v3 != 0 && *((_DWORD *)off_D0E4BC + 13) > a1 ) return *(_DWORD *)(v3 + 4 * a1); return result; } /* ==== asd_tbl_get_D423CC [tier=IDA size=24] REF-DERIVED-NAME ==== */ int __fastcall asd_tbl_get_D423CC(unsigned int a1) { int result; // r0 int v3; // r2 result = 0; v3 = *((_DWORD *)off_D0E4BC + 33); if ( v3 != 0 && *((_DWORD *)off_D0E4BC + 14) > a1 ) return *(_DWORD *)(v3 + 4 * a1); return result; } /* ==== asd_test_bit [tier=EXACT size=14] ==== */ // Returns (value >> bit) & 1 for bit < 32, else 0. Used by asd_feature_level_check. unsigned int __fastcall asd_test_bit(unsigned int a1, unsigned int a2) { return (a1 >> a2) & (a2 < 0x20); } /* ==== asd_topology_remove [tier=MNEM size=56] ==== */ // Opcode 0x101 - DTM topology REMOVE. int __fastcall asd_topology_remove(unsigned int a1) { if ( !asd_feature_enabled(a1: 15) ) return 8; if ( a1 > 0x1F ) return 5; asd_hdcp1_disable(a1); asd_hdcp2_disable(a1); bzero_core(result: (_DWORD *)off_D0B290 + 24 * a1, a2: 0x60u); return 0; } /* ==== asd_validate_ptr [tier=EXACT size=52] ==== */ // Region gate for caller-supplied pointers: accepts [0x400000,0x600000) (the HDCP/DTM TA // window) or [0x4000000, 2^28). Returns 1 if (ptr,len) is inside an allowed window. int __fastcall asd_validate_ptr(unsigned int a1, unsigned int a2) { bool v3; // cc int result; // r0 unsigned int v5; // r1 v3 = a1 > 0x40000000; result = 0; if ( !v3 && a2 <= 0x10000000 ) { v5 = a2 + a1; if ( a1 >= 0x400000 && v5 < 0x600000 ) return 1; result = 0; if ( a1 >= 0x4000000 && v5 >> 28 == 0 ) return 1; } return result; } /* ==== asd_verify_reg_triplet [tier=MNEM size=98] ==== */ // Reads register unk_D4255C and, when bit31 is set, reads three words from unk_D42564 and // compares them against the caller's expected triplet. __int64 __fastcall asd_verify_reg_triplet(__int64 a1, int a2, int a3) { _DWORD *v3; // r6 unsigned int v4; // r4 int _13A54; // r8 int i; // r7 bool v7; // zf __int64 v9; // [sp+0h] [bp-10h] int v10; // [sp+8h] [bp-8h] int v11; // [sp+Ch] [bp-4h] v9 = a1; v10 = a2; v11 = a3; v3 = off_D15E48; v4 = a1; if ( asd_reg_read_13A54(a1: *((_DWORD *)off_D15E48 + 88), a2: a1) << 31 != 0 ) { _13A54 = asd_reg_read_13A54(a1: v3[90], a2: v4); for ( i = 0; i != 3; ++i ) *((_DWORD *)&v9 + i + 1) = asd_reg_read_13A54(a1: v3[90], a2: v4); v7 = HIDWORD(v9) == v10; if ( HIDWORD(v9) == v10 ) v7 = HIDWORD(v9) == _13A54; if ( !v7 || HIDWORD(v9) != v11 ) { while ( asd_reg_read_13A54(a1: v3[89], a2: v4) << 31 == 0 ) ; } } return v9; } /* ==== asd_wait_signal16_idle [tier=MNEM size=102] ==== */ // For signal type 16 only: polls register unk_D424E8 while bit28 is set, waiting with // SVC 0x56, bounded by unk_D42370 iterations. int __fastcall asd_wait_signal16_idle(int a1) { _DWORD *v1; // r6 unsigned int v2; // r5 unsigned int v3; // r4 int _13B74; // r0 _DWORD *v5; // r7 int v10; // r5 if ( a1 == 0 ) return 2; if ( *(_DWORD *)(a1 + 40) != 16 ) return 0; v1 = off_D087B8; v2 = 0; v3 = *(_DWORD *)(a1 + 20); _13B74 = asd_reg_read_13B74(a1: 0, a2: *((_DWORD *)off_D087B8 + 59), a3: v3); v5 = off_D087B4; while ( (_13B74 & 0x10000000) != 0 && v5[12] > v2 ) { __asm { SVC 0x56 ; 'V' } _13B74 = asd_reg_read_13B74(a1: 0, a2: v1[59], a3: v3); ++v2; } v10 = 0; asd_reg_read_13B74(a1: 0, a2: v1[40], a3: v3); asd_reg_write_1946C(a1: 0, a2: v1[40], a3: v3); return v10; } /* ==== asd_write_block_paged [tier=MNEM size=158] ==== */ // Writes a caller block in 64-word pages, refreshing the page base every 0x40 entries. int __fastcall asd_write_block_paged(int a1, int a2, int a3) { int result; // r0 int v6; // r9 int v7; // r7 int v8; // r4 _DWORD *v9; // r6 int v10; // r10 int v11; // r5 int _13E8C; // r0 __int16 v13; // r2 int v14; // r0 __int16 v15; // r2 result = 2; if ( a1 != 0 && a3 != 0 ) { v6 = a3 - 1; v7 = dword_D07110; v8 = 0; v9 = off_D07444; v10 = dword_D0710C; while ( v8 != v6 ) { if ( v8 != 0 && (v8 & 0x3F) == 0 ) { v11 = v7; while ( asd_reg_read_13E8C() << 31 == 0 ) { if ( v11 == 0 ) return 1; ++v11; } } _13E8C = asd_reg_read_13E8C(); asd_reg_write_196E4(a1: v9[58], a2: _13E8C & v10 | (*(unsigned __int8 *)(a2 + v8++) << 16), a3: v13); } v14 = asd_reg_read_13E8C(); asd_reg_write_196E4(a1: v9[58], a2: v14 & v10 | (*(unsigned __int8 *)(a2 + v6) << 16) | 1, a3: v15); while ( (asd_reg_read_13E8C() & 0x10) == 0 ) { if ( v7 == 0 ) return 1; ++v7; } return 0; } return result; } /* ==== asd_write_key_regs [tier=MNEM size=70] ==== */ // Runs GP crypto op 0x35 then performs 2 x 4 register writes of the derived words via // asd_reg_write_1946C using ctx+20 as the index. int __fastcall asd_write_key_regs(int a1, int a2, int a3) { int result; // r0 unsigned int i; // r8 int j; // r7 result = asd_sysdrv_rpc_35(); for ( i = 0; i <= 1; ++i ) { for ( j = 0; j != 4; ++j ) result = asd_reg_write_1946C(a1: a2, a2: a3, a3: *(_DWORD *)(a1 + 20)); } return result; } /* ==== bzero_core [tier=EXACT size=78] ==== */ // Zero-fill helper. _DWORD *__fastcall bzero_core(_DWORD *result, unsigned int a2) { bool v2; // cf unsigned int v3; // r1 _DWORD *v4; // r0 int v5; // r1 int v6; // r1 v2 = a2 >= 0x20; v3 = a2 - 32; do { if ( !v2 ) break; *result = 0; result[1] = 0; result[2] = 0; result[3] = 0; v4 = result + 4; *v4 = 0; v4[1] = 0; v4[2] = 0; v4[3] = 0; result = v4 + 4; v2 = v3 >= 0x20; v3 -= 32; } while ( v2 ); v2 = __CFSHL__(v3, 28); v5 = v3 << 28; if ( v2 ) { *result = 0; result[1] = 0; result[2] = 0; result[3] = 0; result += 4; } if ( v5 < 0 ) { *result = 0; result[1] = 0; result += 2; } v2 = __CFSHL__(v5, 2); v6 = 4 * v5; if ( v2 ) *result++ = 0; if ( v6 != 0 ) { if ( v6 < 0 ) { *(_WORD *)result = 0; result = (_DWORD *)((char *)result + 2); } if ( (v6 & 0x40000000) != 0 ) { *(_BYTE *)result = 0; return (_DWORD *)((char *)result + 1); } } return result; } /* ==== gp_asym_verify [tier=EXACT size=58] ==== */ // SVC 0xF2 -> SYS_DRV gp_crypto_dispatch opcode 0xB. Frame is 0x80 bytes: // frame[0]=opcode, frame[1]=msg class, {ptr,len} parameter pairs from frame[8]. int __fastcall gp_asym_verify() { __asm { SVC 0xF2 } return 1; } /* ==== gp_cipher_update [tier=EXACT size=50] ==== */ // SVC 0xF2 -> SYS_DRV gp_crypto_dispatch opcode 7. Frame is 0x80 bytes: // frame[0]=opcode, frame[1]=msg class, {ptr,len} parameter pairs from frame[8]. int __fastcall gp_cipher_update() { __asm { SVC 0xF2 } return 1; } /* ==== gp_digest_do_final [tier=EXACT size=50] ==== */ // SVC 0xF2 -> SYS_DRV gp_crypto_dispatch opcode 0xD. Frame is 0x80 bytes: // frame[0]=opcode, frame[1]=msg class, {ptr,len} parameter pairs from frame[8]. int __fastcall gp_digest_do_final() { __asm { SVC 0xF2 } return 1; } /* ==== gp_object_allocate [tier=EXACT size=50] ==== */ // SVC 0xF2 -> SYS_DRV gp_crypto_dispatch opcode 0x30. Frame is 0x80 bytes: // frame[0]=opcode, frame[1]=msg class, {ptr,len} parameter pairs from frame[8]. int __fastcall gp_object_allocate() { _DWORD v5[12]; // [sp+8h] [bp+8h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== gp_object_free [tier=EXACT size=38] ==== */ // SVC 0xF2 -> SYS_DRV gp_crypto_dispatch opcode 0x31. Frame is 0x80 bytes: // frame[0]=opcode, frame[1]=msg class, {ptr,len} parameter pairs from frame[8]. int __fastcall gp_object_free() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== gp_operation_allocate [tier=EXACT size=60] ==== */ // SVC 0xF2 -> SYS_DRV gp_crypto_dispatch opcode 1. Frame is 0x80 bytes: // frame[0]=opcode, frame[1]=msg class, {ptr,len} parameter pairs from frame[8]. int __fastcall gp_operation_allocate() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== gp_operation_free [tier=EXACT size=36] ==== */ // SVC 0xF2 -> SYS_DRV gp_crypto_dispatch opcode 2. Frame is 0x80 bytes: // frame[0]=opcode, frame[1]=msg class, {ptr,len} parameter pairs from frame[8]. int __fastcall gp_operation_free() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== gp_populate_transient_object [tier=EXACT size=52] ==== */ // SVC 0xF2 -> SYS_DRV gp_crypto_dispatch opcode 0x33. Frame is 0x80 bytes: // frame[0]=opcode, frame[1]=msg class, {ptr,len} parameter pairs from frame[8]. int __fastcall gp_populate_transient_object() { _DWORD v5[10]; // [sp+10h] [bp+10h] BYREF bzero_core(result: v5, a2: 0x18u); __asm { SVC 0xF2 } return 1; } /* ==== j_asd_aux_op_D1891C [tier=THUNK size=4] REF-DERIVED-NAME ==== */ // attributes: thunk int __fastcall j_asd_aux_op_D1891C(unsigned int a1, int a2) { return asd_aux_op_D1891C(a1, a2); } /* ==== j_asd_aux_op_D1891C_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_aux_op_D1891C_0(unsigned int a1, int a2) { return asd_aux_op_D1891C(a1, a2); } /* ==== j_asd_aux_op_D1891C_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_aux_op_D1891C_1(unsigned int a1, int a2) { return asd_aux_op_D1891C(a1, a2); } /* ==== j_asd_aux_op_D1891C_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_aux_op_D1891C_2(unsigned int a1, int a2) { return asd_aux_op_D1891C(a1, a2); } /* ==== j_asd_aux_op_D1891C_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_aux_op_D1891C_3(unsigned int a1, int a2) { return asd_aux_op_D1891C(a1, a2); } /* ==== j_asd_aux_op_D1891C_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_aux_op_D1891C_4(unsigned int a1, int a2) { return asd_aux_op_D1891C(a1, a2); } /* ==== j_asd_build_link_map_full [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_build_link_map_full(unsigned int *a1) { return asd_build_link_map_full(a1); } /* ==== j_asd_build_link_map_full_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_build_link_map_full_0(unsigned int *a1) { return asd_build_link_map_full(a1); } /* ==== j_asd_clear_link_outputs [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_0(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_1(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_10(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_11(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_12(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_13(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_14(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_15(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_16(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_17(int a1) { _BYTE *v1; // r1 _BYTE *v2; // r2 return asd_clear_link_outputs((struct asd_link_cfg *)a1, a2: v1, a3: v2); } /* ==== j_asd_clear_link_outputs_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_2(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_3(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_4(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_5(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_6(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_7(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_8(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_clear_link_outputs_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_clear_link_outputs_9(struct asd_link_cfg *a1, _BYTE *a2, _BYTE *a3) { return asd_clear_link_outputs(a1, a2, a3); } /* ==== j_asd_connector_enable [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_0(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_1(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_10(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_11(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_12(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_13(_DWORD *a1) { return asd_connector_enable((unsigned int)a1); } /* ==== j_asd_connector_enable_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_14(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_2(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_3(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_4(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_5(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_6(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_7(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_8(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_connector_enable_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_connector_enable_9(unsigned int a1) { return asd_connector_enable(a1); } /* ==== j_asd_dio_current_instance_op [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_current_instance_op(int a1) { return asd_dio_current_instance_op(a1); } /* ==== j_asd_dio_current_instance_op_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_current_instance_op_0(int a1) { return asd_dio_current_instance_op(a1); } /* ==== j_asd_dio_current_instance_op_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_current_instance_op_2(int a1) { return asd_dio_current_instance_op(a1); } /* ==== j_asd_dio_current_instance_op_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_current_instance_op_3(int a1) { return asd_dio_current_instance_op(a1); } /* ==== j_asd_dio_current_instance_op_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_current_instance_op_4(int a1) { return asd_dio_current_instance_op(a1); } /* ==== j_asd_dio_current_instance_op_5 [tier=THUNK size=4] ==== */ // attributes: thunk void __fastcall j_asd_dio_current_instance_op_5() { int v0; // r0 asd_dio_current_instance_op(a1: v0); } /* ==== j_asd_dio_disable_all [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_disable_all(int a1) { return asd_dio_disable_all(a1); } /* ==== j_asd_dio_disable_all_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_disable_all_0(int a1) { return asd_dio_disable_all(a1); } /* ==== j_asd_dio_disable_all_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_disable_all_1(int a1) { return asd_dio_disable_all(a1); } /* ==== j_asd_dio_disable_all_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_disable_all_2(int a1) { return asd_dio_disable_all(a1); } /* ==== j_asd_dio_enable_all [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_enable_all(int a1) { return asd_dio_enable_all(a1); } /* ==== j_asd_dio_enable_all_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_enable_all_0(int a1) { return asd_dio_enable_all(a1); } /* ==== j_asd_dio_enable_all_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_enable_all_1(int a1) { return asd_dio_enable_all(a1); } /* ==== j_asd_dio_enable_all_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_enable_all_2(int a1) { return asd_dio_enable_all(a1); } /* ==== j_asd_dio_idle_check [tier=THUNK size=4] ==== */ // attributes: thunk BOOL __fastcall j_asd_dio_idle_check(unsigned int a1) { return asd_dio_idle_check(a1); } /* ==== j_asd_dio_idle_check_0 [tier=THUNK size=4] ==== */ // attributes: thunk BOOL __fastcall j_asd_dio_idle_check_0(unsigned int a1) { return asd_dio_idle_check(a1); } /* ==== j_asd_dio_idle_check_1 [tier=THUNK size=4] ==== */ // attributes: thunk BOOL __fastcall j_asd_dio_idle_check_1(unsigned int a1) { return asd_dio_idle_check(a1); } /* ==== j_asd_dio_idle_check_2 [tier=THUNK size=4] ==== */ // attributes: thunk BOOL __fastcall j_asd_dio_idle_check_2(unsigned int a1) { return asd_dio_idle_check(a1); } /* ==== j_asd_dio_idle_check_3 [tier=THUNK size=4] ==== */ // attributes: thunk BOOL __fastcall j_asd_dio_idle_check_3(unsigned int a1) { return asd_dio_idle_check(a1); } /* ==== j_asd_dio_idle_check_4 [tier=THUNK size=4] ==== */ // attributes: thunk BOOL __fastcall j_asd_dio_idle_check_4(unsigned int a1) { return asd_dio_idle_check(a1); } /* ==== j_asd_dio_read_block [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_block(struct asd_link_caps *a1, unsigned int a2) { return asd_dio_read_block(a1, a2); } /* ==== j_asd_dio_read_block10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_block10(_DWORD *a1, unsigned int a2) { return asd_dio_read_block10(a1, a2); } /* ==== j_asd_dio_read_block10_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_block10_0(_DWORD *a1, unsigned int a2) { return asd_dio_read_block10(a1, a2); } /* ==== j_asd_dio_read_block10_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_block10_1(_DWORD *a1, unsigned int a2) { return asd_dio_read_block10(a1, a2); } /* ==== j_asd_dio_read_block_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_block_0(struct asd_link_caps *a1, unsigned int a2) { return asd_dio_read_block(a1, a2); } /* ==== j_asd_dio_read_block_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_block_1(struct asd_link_caps *a1, unsigned int a2) { return asd_dio_read_block(a1, a2); } /* ==== j_asd_dio_read_pair [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_pair(unsigned int a1, char *a2, _BYTE *a3) { return asd_dio_read_pair(a1, a2, a3); } /* ==== j_asd_dio_read_pair_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_pair_0(unsigned int a1, char *a2, _BYTE *a3) { return asd_dio_read_pair(a1, a2, a3); } /* ==== j_asd_dio_read_pair_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_pair_1(unsigned int a1, char *a2, _BYTE *a3) { return asd_dio_read_pair(a1, a2, a3); } /* ==== j_asd_dio_read_pair_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_pair_2(unsigned int a1, char *a2, _BYTE *a3) { return asd_dio_read_pair(a1, a2, a3); } /* ==== j_asd_dio_read_pair_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_pair_3(unsigned int a1, char *a2, _BYTE *a3) { return asd_dio_read_pair(a1, a2, a3); } /* ==== j_asd_dio_read_pair_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_read_pair_4(unsigned int a1, char *a2, _BYTE *a3) { return asd_dio_read_pair(a1, a2, a3); } /* ==== j_asd_dio_set_pair [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_set_pair(unsigned int a1, int a2, int a3) { return asd_dio_set_pair(a1, a2, a3); } /* ==== j_asd_dio_set_pair_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_set_pair_0(unsigned int a1, int a2, int a3) { return asd_dio_set_pair(a1, a2, a3); } /* ==== j_asd_dio_set_pair_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_set_pair_2(unsigned int a1, int a2, int a3) { return asd_dio_set_pair(a1, a2, a3); } /* ==== j_asd_dio_set_pair_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_set_pair_3(unsigned int a1, int a2, int a3) { return asd_dio_set_pair(a1, a2, a3); } /* ==== j_asd_dio_set_pair_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_set_pair_4(unsigned int a1, int a2, int a3) { return asd_dio_set_pair(a1, a2, a3); } /* ==== j_asd_dio_set_pair_5 [tier=THUNK size=4] ==== */ // attributes: thunk void __fastcall j_asd_dio_set_pair_5() { unsigned int v0; // r0 int v1; // r1 int v2; // r2 asd_dio_set_pair(a1: v0, a2: v1, a3: v2); } /* ==== j_asd_dio_write_packed [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_write_packed(unsigned int a1, unsigned __int8 *a2) { return asd_dio_write_packed(a1, a2); } /* ==== j_asd_dio_write_packed_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_write_packed_0(unsigned int a1, unsigned __int8 *a2) { return asd_dio_write_packed(a1, a2); } /* ==== j_asd_dio_write_packed_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_write_packed_1(unsigned int a1, unsigned __int8 *a2) { return asd_dio_write_packed(a1, a2); } /* ==== j_asd_dio_write_packed_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_dio_write_packed_2(unsigned int a1, unsigned __int8 *a2) { return asd_dio_write_packed(a1, a2); } /* ==== j_asd_encoder_enable_seq [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_0(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_1(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_10(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_11(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_12(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_13(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_14(int a1, int a2, int a3) { return asd_encoder_enable_seq((struct asd_link_cfg *)a1, (char *)a2, (char *)a3); } /* ==== j_asd_encoder_enable_seq_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_2(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_3(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_4(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_5(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_6(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_7(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_8(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_9(struct asd_link_cfg *a1, char *a2, char *a3) { return asd_encoder_enable_seq(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_v3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_v3(struct asd_link_cfg *a1, int a2, __int16 a3) { return asd_encoder_enable_seq_v3(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_v3_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_v3_0(struct asd_link_cfg *a1, int a2, __int16 a3) { return asd_encoder_enable_seq_v3(a1, a2, a3); } /* ==== j_asd_encoder_enable_seq_v3_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_enable_seq_v3_2(int a1, _BYTE *a2, _BYTE *a3) { return asd_encoder_enable_seq_v3((struct asd_link_cfg *)a1, (int)a2, (__int16)a3); } /* ==== j_asd_encoder_query [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_encoder_query(_DWORD *a1, int a2, __int16 a3) { return asd_encoder_query(a1, a2, a3); } /* ==== j_asd_get_link_caps_full [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full(struct asd_link_caps *a1) { return asd_get_link_caps_full(a1); } /* ==== j_asd_get_link_caps_full_v2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_0(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_1(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_10(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_11(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_12(int a1, int a2, int a3, int a4) { return asd_get_link_caps_full_v2((struct asd_link_caps *)a1); } /* ==== j_asd_get_link_caps_full_v2_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_13(int a1) { return asd_get_link_caps_full_v2((struct asd_link_caps *)a1); } /* ==== j_asd_get_link_caps_full_v2_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_14(int a1, _DWORD *a2) { return asd_get_link_caps_full_v2((struct asd_link_caps *)a1); } /* ==== j_asd_get_link_caps_full_v2_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_2(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_3(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_4(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_5(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_6(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_7(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_8(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_caps_full_v2_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_caps_full_v2_9(struct asd_link_caps *a1) { return asd_get_link_caps_full_v2(a1); } /* ==== j_asd_get_link_reg_offsets [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_reg_offsets(_DWORD *a1, unsigned int a2) { return asd_get_link_reg_offsets(a1, a2); } /* ==== j_asd_get_link_reg_offsets_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_reg_offsets_0(_DWORD *a1, unsigned int a2) { return asd_get_link_reg_offsets(a1, a2); } /* ==== j_asd_get_link_reg_offsets_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_link_reg_offsets_1(_DWORD *a1, unsigned int a2) { return asd_get_link_reg_offsets(a1, a2); } /* ==== j_asd_get_pair_D49838 [tier=THUNK size=4] REF-DERIVED-NAME ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_0(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_1(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_10(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_11(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_12(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_2(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_3(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_4(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_5(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_6(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_7(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_8(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_pair_D49838_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_pair_D49838_9(_DWORD *a1) { return asd_get_pair_D49838(a1); } /* ==== j_asd_get_signal_reg [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_0(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_1(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_10(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_11(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_12(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_13(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_14(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_15(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_16(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_17(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_2(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_3(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_4(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_5(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_6(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_7(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_8(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_get_signal_reg_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_get_signal_reg_9(int a1) { return asd_get_signal_reg(a1); } /* ==== j_asd_link_program_timing [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_0(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_1(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_10(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_11(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_12(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_13(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_14(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_15(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_16(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_17(int a1) { unsigned __int8 *v1; // r1 unsigned __int8 *v2; // r2 return asd_link_program_timing(a1, a2: v1, a3: v2); } /* ==== j_asd_link_program_timing_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_2(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_3(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_4(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_5(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_6(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_7(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_8(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_program_timing_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_program_timing_9(int a1, unsigned __int8 *a2, unsigned __int8 *a3) { return asd_link_program_timing(a1, a2, a3); } /* ==== j_asd_link_query_a [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_a(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_a(a1, a2, a3); } /* ==== j_asd_link_query_a_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_a_0(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_a(a1, a2, a3); } /* ==== j_asd_link_query_b [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_0(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_1(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_10(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_11(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_12(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_13(int a1) { int v1; // r1 __int16 v2; // r2 return asd_link_query_b((_DWORD *)a1, a2: v1, a3: v2); } /* ==== j_asd_link_query_b_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_14(int a1, int a2, int a3) { return asd_link_query_b((_DWORD *)a1, a2, a3); } /* ==== j_asd_link_query_b_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_2(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_3(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_4(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_5(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_6(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_7(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_8(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_query_b_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_query_b_9(_DWORD *a1, int a2, __int16 a3) { return asd_link_query_b(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_0(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_1(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_10(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_11(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_12(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_13(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_14(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_15(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_16(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_17(int a1) { _BYTE *v1; // r1 _BYTE *v2; // r2 return asd_link_read_pair_regs(a1, a2: v1, a3: v2); } /* ==== j_asd_link_read_pair_regs_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_2(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_3(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_4(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_5(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_6(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_7(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_8(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_read_pair_regs_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_read_pair_regs_9(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_read_pair_regs(a1, a2, a3); } /* ==== j_asd_link_ready_full_check [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_0(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_1(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_10(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_11(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_12(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_13(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_14(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_15(int a1, int a2) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_16(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_17(unsigned int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_2(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_3(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_4(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_5(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_6(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_7(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_8(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_ready_full_check_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_ready_full_check_9(int a1) { return asd_link_ready_full_check(a1); } /* ==== j_asd_link_reset_seq [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_0(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_1(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_10(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_11(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_12(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_13(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_14(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_15(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_16 [tier=THUNK size=4] ==== */ // local variable allocation has failed, the output may be wrong! // attributes: thunk int __fastcall j_asd_link_reset_seq_16(_DWORD *a1) { int v1; // r2 int v2; // r3 return asd_link_reset_seq(a1: *(__int64 *)&a1, a2: v1, a3: v2); } /* ==== j_asd_link_reset_seq_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_17() { __int64 v0; // r0 int v1; // r2 int v2; // r3 return asd_link_reset_seq(a1: v0, a2: v1, a3: v2); } /* ==== j_asd_link_reset_seq_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_2(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_3(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_4(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_5(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_6(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_7(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_8(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_reset_seq_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_reset_seq_9(__int64 a1, int a2, int a3) { return asd_link_reset_seq(a1, a2, a3); } /* ==== j_asd_link_set_reg42468_field [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_0(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_1(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_10(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_11(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_12(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_13(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_14(int a1) { int v1; // r1 return asd_link_set_reg42468_field(a1, a2: v1); } /* ==== j_asd_link_set_reg42468_field_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_15(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_set_reg42468_field(a1, (int)a2); } /* ==== j_asd_link_set_reg42468_field_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_16(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_17(_DWORD *a1) { int v1; // r1 return asd_link_set_reg42468_field((int)a1, a2: v1); } /* ==== j_asd_link_set_reg42468_field_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_2(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_3(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_4(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_5(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_6(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_7(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_8(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg42468_field_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg42468_field_9(int a1, int a2) { return asd_link_set_reg42468_field(a1, a2); } /* ==== j_asd_link_set_reg4248C_half [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_0(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_1(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_10(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_11(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_12(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_13(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_14(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_15(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_16(int a1, int a2, int a3) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_17(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_2(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_3(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_4(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_5(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_6(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_7(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_8(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_set_reg4248C_half_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_set_reg4248C_half_9(int a1, int a2) { return asd_link_set_reg4248C_half(a1, a2); } /* ==== j_asd_link_train_status [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_0(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_1(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_10(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_11(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_12(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_13(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_14(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_15(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_16(int a1, _DWORD *a2) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_17(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_2(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_3(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_4(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_5(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_6(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_7(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_8(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_train_status_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_train_status_9(int a1) { return asd_link_train_status(a1); } /* ==== j_asd_link_wait_and_set [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_0(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_1(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_10(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_11(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_12(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_13(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_14(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_15() { int v0; // r0 int v1; // r1 int v2; // r2 return asd_link_wait_and_set(a1: v0, a2: v1, a3: v2); } /* ==== j_asd_link_wait_and_set_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_16(int a1, _BYTE *a2, _BYTE *a3) { return asd_link_wait_and_set(a1, (int)a2, (int)a3); } /* ==== j_asd_link_wait_and_set_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_17(_DWORD *a1) { int v1; // r1 int v2; // r2 return asd_link_wait_and_set((int)a1, a2: v1, a3: v2); } /* ==== j_asd_link_wait_and_set_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_2(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_3(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_4(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_5(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_6(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_7(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_8(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_wait_and_set_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_wait_and_set_9(int a1, int a2, int a3) { return asd_link_wait_and_set(a1, a2, a3); } /* ==== j_asd_link_write_quad [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_0(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_1(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_10(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_11(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_12(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_13(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_14(_DWORD *a1, int *a2) { return asd_link_write_quad((int)a1, a2); } /* ==== j_asd_link_write_quad_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_15(int a1, int a2, int a3) { return asd_link_write_quad(a1, (_DWORD *)a2); } /* ==== j_asd_link_write_quad_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_16(int a1) { _DWORD *v1; // r1 return asd_link_write_quad(a1, a2: v1); } /* ==== j_asd_link_write_quad_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_17(_DWORD *a1, int *a2) { return asd_link_write_quad((int)a1, a2); } /* ==== j_asd_link_write_quad_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_2(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_3(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_4(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_5(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_6(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_7(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_8(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_link_write_quad_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_link_write_quad_9(int a1, _DWORD *a2) { return asd_link_write_quad(a1, a2); } /* ==== j_asd_pipe_enable [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_0(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_1(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_10(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_11(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_12(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_13(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_14(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_15(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_16(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_17(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_2(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_3(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_4(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_5(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_6(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_7(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_8(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_enable_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_enable_9(int a1, int a2, int a3) { return asd_pipe_enable(a1, a2, a3); } /* ==== j_asd_pipe_lookup [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_0(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_1(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_10(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_11(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_12(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_13(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_14(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_15(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_16(int a1) { int v1; // r1 __int16 v2; // r2 return asd_pipe_lookup((_DWORD *)a1, a2: v1, a3: v2); } /* ==== j_asd_pipe_lookup_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_17(int a1, _BYTE *a2, _BYTE *a3) { return asd_pipe_lookup((_DWORD *)a1, (int)a2, (__int16)a3); } /* ==== j_asd_pipe_lookup_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_2(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_3(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_4(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_5(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_6(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_7(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_8(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_pipe_lookup_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_pipe_lookup_9(_DWORD *a1, int a2, __int16 a3) { return asd_pipe_lookup(a1, a2, a3); } /* ==== j_asd_program_key_regs [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_0(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_1(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_10(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_11(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_12(int a1, _BYTE *a2, _BYTE *a3) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_13(_DWORD *a1) { return asd_program_key_regs((int)a1); } /* ==== j_asd_program_key_regs_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_14(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_2(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_3(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_4(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_5(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_6(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_7(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_8(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_key_regs_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_key_regs_9(int a1) { return asd_program_key_regs(a1); } /* ==== j_asd_program_link_by_signal [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_0(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_1(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_10(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_11(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_12(int a1) { int v1; // r1 int v2; // r2 int v3; // r3 return asd_program_link_by_signal((struct asd_link_cfg *)a1, a2: v1, a3: v2, a4: v3); } /* ==== j_asd_program_link_by_signal_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_2(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_3(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_4(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_5(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_6(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_7(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_8(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_9(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_v2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_v2(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal_v2(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_v2_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_v2_0(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal_v2(a1, a2, a3, a4); } /* ==== j_asd_program_link_by_signal_v3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_program_link_by_signal_v3(struct asd_link_cfg *a1, int a2, int a3, int a4) { return asd_program_link_by_signal_v3(a1, a2, a3, a4); } /* ==== j_asd_query_link_config [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_0(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_1(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_10(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_11(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_12(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_13(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_14(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_15(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_16(int a1, int a2) { return asd_query_link_config((_DWORD *)a1, (int *)a2); } /* ==== j_asd_query_link_config_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_17(int a1, int a2, int a3) { return asd_query_link_config((_DWORD *)a1, (int *)a2); } /* ==== j_asd_query_link_config_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_2(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_3(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_4(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_5(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_6(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_7(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_8(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_query_link_config_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_query_link_config_9(_DWORD *a1, int *a2) { return asd_query_link_config(a1, a2); } /* ==== j_asd_reg_read_13B74_cfg2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_0(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_1(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_10(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_11(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_12(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_13(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_14(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_15(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_16(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_17(int a1, int a2, int a3) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_2(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_3(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_4(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_5(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_6(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_7(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_8(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg2_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg2_9(int a1) { return asd_reg_read_13B74_cfg2(a1); } /* ==== j_asd_reg_read_13B74_cfg3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_0(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_1(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_10(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_11(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_12(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_13(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_14(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_15(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_16() { int v0; // r0 _BYTE *v1; // r1 _BYTE *v2; // r2 return asd_reg_read_13B74_cfg3(a1: v0, a2: v1, a3: v2); } /* ==== j_asd_reg_read_13B74_cfg3_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_17() { int v0; // r0 _BYTE *v1; // r1 _BYTE *v2; // r2 return asd_reg_read_13B74_cfg3(a1: v0, a2: v1, a3: v2); } /* ==== j_asd_reg_read_13B74_cfg3_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_2(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_3(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_4(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_5(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_6(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_7(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_8(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13B74_cfg3_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13B74_cfg3_9(int a1, _BYTE *a2, _BYTE *a3) { return asd_reg_read_13B74_cfg3(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_0(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_1(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_10(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_11(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_12(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_13(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_14(int a1, int a2, int a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_15(int a1, int a2) { __int16 v2; // r2 return asd_reg_read_13D24_cfg0(a1, a2, a3: v2); } /* ==== j_asd_reg_read_13D24_cfg0_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_16(int a1) { int v1; // r1 __int16 v2; // r2 return asd_reg_read_13D24_cfg0(a1, a2: v1, a3: v2); } /* ==== j_asd_reg_read_13D24_cfg0_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_2(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_3(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_4(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_5(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_6(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_7(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_8(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg0_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg0_9(unsigned int a1, int a2, __int16 a3) { return asd_reg_read_13D24_cfg0(a1, a2, a3); } /* ==== j_asd_reg_read_13D24_cfg1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_reg_read_13D24_cfg1(unsigned int a1) { return asd_reg_read_13D24_cfg1(a1); } /* ==== j_asd_session_op57_invoke [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_session_op57_invoke() { return asd_session_op57_invoke(); } /* ==== j_asd_session_op57_invoke_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_session_op57_invoke_0() { return asd_session_op57_invoke(); } /* ==== j_asd_session_op57_invoke_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_session_op57_invoke_1() { return asd_session_op57_invoke(); } /* ==== j_asd_session_op57_invoke_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_session_op57_invoke_2() { return asd_session_op57_invoke(); } /* ==== j_asd_session_op57_invoke_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_session_op57_invoke_3() { return asd_session_op57_invoke(); } /* ==== j_asd_session_op57_invoke_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_session_op57_invoke_4() { return asd_session_op57_invoke(); } /* ==== j_asd_set_reg42570_field [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg42570_field(int a1, int a2, int a3) { return asd_set_reg42570_field(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_0(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_1(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_10(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_11(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_12(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_13(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_14(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_15(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_16(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_2(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_3(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_4(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_5(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_6(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_7(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_8(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_set_reg425E4_mode_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_set_reg425E4_mode_9(int a1, int a2, int a3) { return asd_set_reg425E4_mode(a1, a2, a3); } /* ==== j_asd_signal_status_check [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_0(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_1(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_10(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_11(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_12(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_13(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_14(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_15(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_16(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_17(int a1, int a2, int a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_2(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_3(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_4(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_5(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_6(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_7(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_8(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_signal_status_check_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_signal_status_check_9(int a1, int a2, __int16 a3) { return asd_signal_status_check(a1, a2, a3); } /* ==== j_asd_state_not_1_cfg0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_0(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_1(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_2(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_3(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_4(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_5(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_6(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_7(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_8(_DWORD *a1) { return asd_state_not_1_cfg0(a1); } /* ==== j_asd_state_not_1_cfg0_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_state_not_1_cfg0_9(unsigned int a1, int a2) { return asd_state_not_1_cfg0((_DWORD *)a1); } /* ==== j_asd_stream_reset [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_stream_reset(int a1) { return asd_stream_reset(a1); } /* ==== j_asd_stream_reset_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_stream_reset_0(int a1) { return asd_stream_reset(a1); } /* ==== j_asd_stream_reset_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_stream_reset_1(int a1) { return asd_stream_reset(a1); } /* ==== j_asd_stream_reset_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_stream_reset_2(int a1) { return asd_stream_reset(a1); } /* ==== j_asd_stream_reset_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_stream_reset_3(int a1) { return asd_stream_reset(a1); } /* ==== j_asd_svc_sub_2794 [tier=THUNK size=4] ==== */ // attributes: thunk BOOL __fastcall j_asd_svc_sub_2794() { return asd_svc_sub_2794(); } /* ==== j_asd_write_block_paged [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_0 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_0(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_1 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_1(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_10 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_10(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_11 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_11(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_12 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_12(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_13 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_13(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_14 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_14(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_15 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_15(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_16 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_16(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_17 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_17(int a1, _DWORD *a2) { int v2; // r2 return asd_write_block_paged(a1, (int)a2, a3: v2); } /* ==== j_asd_write_block_paged_2 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_2(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_3 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_3(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_4 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_4(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_5 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_5(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_6 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_6(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_7 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_7(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_8 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_8(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== j_asd_write_block_paged_9 [tier=THUNK size=4] ==== */ // attributes: thunk int __fastcall j_asd_write_block_paged_9(int a1, int a2, int a3) { return asd_write_block_paged(a1, a2, a3); } /* ==== memcmp_be [tier=EXACT size=88] ==== */ // Big-endian memcmp: compares 4 bytes at a time via bswap32, falling back to a // byte loop. Same SDK slot as HDCP's memcmp_be (module base + 0x1000). int __fastcall memcmp_be(unsigned int *a1, unsigned int *a2, unsigned int a3) { unsigned int v3; // r4 unsigned int v4; // r3 int v6; // r3 int v7; // t1 int v8; // t1 int v9; // r3 int v10; // r3 int v11; // t1 int v12; // t1 if ( ((unsigned int)a1 | (unsigned int)a2) << 30 == 0 ) { while ( a3 >= 4 ) { v3 = *a1++; v4 = *a2++; a3 -= 4; if ( v3 != v4 ) { if ( bswap32(v3) <= bswap32(v4) ) return -1; else return 1; } } } if ( a3 == 0 ) return 0; if ( a3 << 31 == 0 ) goto LABEL_11; ++a3; do { v11 = *(unsigned __int8 *)a1; a1 = (unsigned int *)((char *)a1 + 1); v10 = v11; v12 = *(unsigned __int8 *)a2; a2 = (unsigned int *)((char *)a2 + 1); v9 = v10 - v12; if ( v9 != 0 ) break; a3 -= 2; if ( a3 == 0 ) break; LABEL_11: v7 = *(unsigned __int8 *)a1; a1 = (unsigned int *)((char *)a1 + 1); v6 = v7; v8 = *(unsigned __int8 *)a2; a2 = (unsigned int *)((char *)a2 + 1); v9 = v6 - v8; } while ( v9 == 0 ); return v9; } /* ==== memcpy [tier=EXACT size=136] ==== */ // ARM-mode memcpy (callers use BLX). Was mis-decoded as Thumb; T forced to 0. _BYTE *__fastcall memcpy(_BYTE *result, int *a2, unsigned int a3, int a4) { unsigned int v4; // r12 char v5; // r3 char v6; // t1 bool v7; // cf bool v8; // cc unsigned int v9; // r2 char v10; // t1 char v11; // t1 bool v12; // cf unsigned int v13; // r2 int *v14; // r1 int v15; // t1 int v16; // t1 int v17; // t1 bool v18; // cf bool v19; // nf signed int v20; // r2 char *v21; // r1 char v22; // t1 char v23; // t1 _BYTE *v24; // r0 if ( a3 > 3 ) { v4 = (unsigned __int8)result & 3; if ( ((unsigned __int8)result & 3) != 0 ) { v6 = *(_BYTE *)a2; a2 = (int *)((char *)a2 + 1); v5 = v6; v7 = v4 >= 2; v8 = ((unsigned __int8)result & 3) == 3; v9 = a3 + v4; if ( ((unsigned __int8)result & 3) != 3 ) { v10 = *(_BYTE *)a2; a2 = (int *)((char *)a2 + 1); LOBYTE(v4) = v10; } *result++ = v5; if ( !v7 ) { v11 = *(_BYTE *)a2; a2 = (int *)((char *)a2 + 1); v5 = v11; } a3 = v9 - 4; if ( !v8 ) *result++ = v4; if ( !v7 ) *result++ = v5; } LOBYTE(a4) = (unsigned __int8)a2 & 3; if ( ((unsigned __int8)a2 & 3) == 0 ) return memcpy_aligned((int *)result, a2, a3, a4: 0); v12 = a3 >= 8; v13 = a3 - 8; while ( v12 ) { v15 = *a2; v14 = a2 + 1; a4 = v15; v12 = v13 >= 8; v13 -= 8; v16 = *v14; a2 = v14 + 1; LOBYTE(v4) = v16; *(_DWORD *)result = a4; *((_DWORD *)result + 1) = v16; result += 8; } a3 = v13 + 4; if ( (a3 & 0x80000000) == 0 ) { v17 = *a2++; LOBYTE(a4) = v17; *(_DWORD *)result = v17; result += 4; } } v18 = __CFSHL__(a3, 31); v20 = a3 << 31; v19 = v20 < 0; if ( v18 ) { v22 = *(_BYTE *)a2; v21 = (char *)a2 + 1; LOBYTE(a4) = v22; v23 = *v21; a2 = (int *)(v21 + 1); LOBYTE(v4) = v23; } if ( v20 < 0 ) LOBYTE(v20) = *(_BYTE *)a2; if ( v18 ) { *result = a4; v24 = result + 1; *v24 = v4; result = v24 + 1; } if ( v19 ) *result++ = v20; return result; } /* ==== memcpy_aligned [tier=EXACT size=100] ==== */ // ARM-mode block copy. int *__fastcall memcpy_aligned(int *result, int *a2, unsigned int a3, int a4) { unsigned int i; // r2 int *v5; // r1 int v6; // r3 int v7; // r4 int v8; // r12 int v9; // lr int *v10; // r0 int v11; // r4 int v12; // r12 int v13; // lr int v14; // r4 int v15; // r12 int v16; // lr int v17; // r4 int v18; // t1 bool v19; // cf bool v20; // nf int v21; // r2 __int16 v22; // t1 v19 = a3 >= 0x20; for ( i = a3 - 32; v19; i -= 32 ) { v6 = *a2; v7 = a2[1]; v8 = a2[2]; v9 = a2[3]; v5 = a2 + 4; *result = v6; result[1] = v7; result[2] = v8; result[3] = v9; v10 = result + 4; a4 = *v5; v11 = v5[1]; v12 = v5[2]; v13 = v5[3]; a2 = v5 + 4; *v10 = a4; v10[1] = v11; v10[2] = v12; v10[3] = v13; result = v10 + 4; v19 = i >= 0x20; } if ( __CFSHL__(i, 28) ) { a4 = *a2; v14 = a2[1]; v15 = a2[2]; v16 = a2[3]; a2 += 4; *result = a4; result[1] = v14; result[2] = v15; result[3] = v16; result += 4; } if ( (i & 8) != 0 ) { a4 = *a2; v17 = a2[1]; a2 += 2; *result = a4; result[1] = v17; result += 2; } if ( __CFSHL__(i, 30) ) { v18 = *a2++; LOWORD(a4) = v18; *result++ = v18; } if ( i << 30 != 0 ) { v19 = __CFSHL__(i, 31); v21 = i << 31; v20 = v21 < 0; if ( v19 ) { v22 = *(_WORD *)a2; a2 = (int *)((char *)a2 + 2); LOWORD(a4) = v22; } if ( v21 < 0 ) LOBYTE(v21) = *(_BYTE *)a2; if ( v19 ) { *(_WORD *)result = a4; result = (int *)((char *)result + 2); } if ( v20 ) { *(_BYTE *)result = v21; return (int *)((char *)result + 1); } } return result; } /* ==== sysdrv_dram_window_describe [tier=EXACT size=54] ==== */ // SVC 0xF2 -> SYS_DRV RPC 0x1095. int __fastcall sysdrv_dram_window_describe() { _DWORD v5[12]; // [sp+8h] [bp+8h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== sysdrv_feature_commit [tier=EXACT size=56] ==== */ // SVC 0xF2 -> SYS_DRV RPC 0x1087. int __fastcall sysdrv_feature_commit() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== sysdrv_feature_mask_get [tier=EXACT size=52] ==== */ // SVC 0xF2 -> SYS_DRV RPC 0x109A (feature_mask_get). int __fastcall sysdrv_feature_mask_get() { _DWORD v5[12]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v5, a2: 0x20u); __asm { SVC 0xF2 } return 1; } /* ==== sysdrv_get_chip_id_pair [tier=EXACT size=44] ==== */ // SVC 0xF2 -> SYS_DRV RPC 0x109B. int __fastcall sysdrv_get_chip_id_pair() { _DWORD v5[28]; // [sp+10h] [bp-70h] BYREF bzero_core(result: v5, a2: 0x18u); __asm { SVC 0xF2 } return 1; } /* ==== sysdrv_rpc_1021 [tier=EXACT size=60] ==== */ // SVC 0xF2 -> SYS_DRV RPC opcode 0x1021. Marshals (verb, arg, out-ptr) into the frame; // the third slot is only populated when the mode probe returns 1. int __fastcall sysdrv_rpc_1021(int a1, int a2, int a3) { int v6; // r0 _DWORD v12[30]; // [sp+8h] [bp-78h] BYREF bzero_core(result: v12, a2: 0x20u); v6 = asd_bzero_core_cfg3(); v12[12] = a1; v12[13] = a2; if ( v6 == 1 ) { v12[14] = a3; } else { v12[0] = a3; v12[1] = 4; } __asm { SVC 0xF2 } return 1; }