From 3b1bbc1751fe57fa2b6bbf1ccea63726e9efc3ca Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 17 Oct 2019 15:38:11 -0400 Subject: [PATCH] zasm: support negative displacement for IX/IY Needed by #30. --- apps/zasm/instr.asm | 22 +- tools/tests/zasm/allinstrs.asm | 296 ++++++++++++++++++++++++ tools/tests/zasm/allinstrs.asm.expected | Bin 4380 -> 5404 bytes tools/tests/zasm/geninstrs.py | 2 +- tools/tests/zasm/test1.asm | 2 +- tools/tests/zasm/test1.asm.expected | Bin 80 -> 80 bytes 6 files changed, 318 insertions(+), 4 deletions(-) diff --git a/apps/zasm/instr.asm b/apps/zasm/instr.asm index 20f8455..5bbc268 100644 --- a/apps/zasm/instr.asm +++ b/apps/zasm/instr.asm @@ -109,7 +109,7 @@ getInstID: ret ; Parse the string at (HL) and check if it starts with IX+, IY+, IX- or IY-. -; Sets Z if yes, unset if no. +; Sets Z if yes, unset if no. On success, A contains either '+' or '-'. parseIXY: push hl ld a, (hl) @@ -180,13 +180,15 @@ parseArg: ld a, 'N' jr .end .withParens: + ld b, 0 ; make sure it doesn't hold '-' ld c, 'M' ; C holds the argspec type until we reach ; .numberInParens ; We have parens. First, let's see if we have a (IX+d) type of arg. call parseIXY jr nz, .parseNumberInParens ; not I{X,Y}. just parse number. ; We have IX+/IY+/IX-/IY-. - ; note: the "-" part isn't supported yet. + ; A contains either '+' or '-'. Save it for later, in B. + ld b, a inc hl ; (HL) now points to X or Y ld a, (hl) call upcase @@ -202,6 +204,22 @@ parseArg: call .maybeParseExpr jr nz, .nomatch ; We have a proper number in parens. Number in IX + ; is '-' in B? if yes, we need to negate the low part of IX + ld a, b + cp '-' + jr nz, .dontNegateIX + ; we need to negate the low part of IX + ; TODO: when parsing routines properly support unary negative numbers, + ; We could replace this complicated scheme below with a nice hack where + ; we start parsing our displacement number at the '+' and '-' char. + + ; HL isn't needed anymore and can be destroyed. + push ix \ pop hl + ld a, l + neg + ld l, a + push hl \ pop ix +.dontNegateIX: ld a, c ; M, x, or y jr .end .nomatch: diff --git a/tools/tests/zasm/allinstrs.asm b/tools/tests/zasm/allinstrs.asm index 5e921f1..de3e592 100644 --- a/tools/tests/zasm/allinstrs.asm +++ b/tools/tests/zasm/allinstrs.asm @@ -48,14 +48,22 @@ ADD IY, IY ADD IY, SP ADD A, (IX) ADD A, (IX+1) +ADD A, (IX-1) ADD A, (IX+10) +ADD A, (IX-10) ADD A, (IX+100) +ADD A, (IX-100) ADD A, (IX+127) +ADD A, (IX-127) ADD A, (IY) ADD A, (IY+1) +ADD A, (IY-1) ADD A, (IY+10) +ADD A, (IY-10) ADD A, (IY+100) +ADD A, (IY-100) ADD A, (IY+127) +ADD A, (IY-127) AND (HL) AND B AND C @@ -73,46 +81,78 @@ AND 32 AND 64 AND 128 AND (IX+1) +AND (IX-1) AND (IX+10) +AND (IX-10) AND (IX+100) +AND (IX-100) AND (IX+127) +AND (IX-127) AND (IY+1) +AND (IY-1) AND (IY+10) +AND (IY-10) AND (IY+100) +AND (IY-100) AND (IY+127) +AND (IY-127) BIT 1, (HL) BIT 2, (HL) BIT 4, (HL) BIT 1, (IX) BIT 1, (IX+1) +BIT 1, (IX-1) BIT 1, (IX+10) +BIT 1, (IX-10) BIT 1, (IX+100) +BIT 1, (IX-100) BIT 1, (IX+127) +BIT 1, (IX-127) BIT 2, (IX) BIT 2, (IX+1) +BIT 2, (IX-1) BIT 2, (IX+10) +BIT 2, (IX-10) BIT 2, (IX+100) +BIT 2, (IX-100) BIT 2, (IX+127) +BIT 2, (IX-127) BIT 4, (IX) BIT 4, (IX+1) +BIT 4, (IX-1) BIT 4, (IX+10) +BIT 4, (IX-10) BIT 4, (IX+100) +BIT 4, (IX-100) BIT 4, (IX+127) +BIT 4, (IX-127) BIT 1, (IY) BIT 1, (IY+1) +BIT 1, (IY-1) BIT 1, (IY+10) +BIT 1, (IY-10) BIT 1, (IY+100) +BIT 1, (IY-100) BIT 1, (IY+127) +BIT 1, (IY-127) BIT 2, (IY) BIT 2, (IY+1) +BIT 2, (IY-1) BIT 2, (IY+10) +BIT 2, (IY-10) BIT 2, (IY+100) +BIT 2, (IY-100) BIT 2, (IY+127) +BIT 2, (IY-127) BIT 4, (IY) BIT 4, (IY+1) +BIT 4, (IY-1) BIT 4, (IY+10) +BIT 4, (IY-10) BIT 4, (IY+100) +BIT 4, (IY-100) BIT 4, (IY+127) +BIT 4, (IY-127) BIT 1, B BIT 1, C BIT 1, D @@ -297,14 +337,22 @@ CP 64 CP 128 CP (IX) CP (IX+1) +CP (IX-1) CP (IX+10) +CP (IX-10) CP (IX+100) +CP (IX-100) CP (IX+127) +CP (IX-127) CP (IY) CP (IY+1) +CP (IY-1) CP (IY+10) +CP (IY-10) CP (IY+100) +CP (IY-100) CP (IY+127) +CP (IY-127) CPD CPDR CPI @@ -315,15 +363,23 @@ DEC (HL) DEC IX DEC (IX) DEC (IX+1) +DEC (IX-1) DEC (IX+10) +DEC (IX-10) DEC (IX+100) +DEC (IX-100) DEC (IX+127) +DEC (IX-127) DEC IY DEC (IY) DEC (IY+1) +DEC (IY-1) DEC (IY+10) +DEC (IY-10) DEC (IY+100) +DEC (IY-100) DEC (IY+127) +DEC (IY-127) DEC B DEC C DEC D @@ -380,15 +436,23 @@ INC (HL) INC IX INC (IX) INC (IX+1) +INC (IX-1) INC (IX+10) +INC (IX-10) INC (IX+100) +INC (IX-100) INC (IX+127) +INC (IX-127) INC IY INC (IY) INC (IY+1) +INC (IY-1) INC (IY+10) +INC (IY-10) INC (IY+100) +INC (IY-100) INC (IY+127) +INC (IY-127) INC B INC C INC D @@ -1125,6 +1189,14 @@ LD (IX+1), 16 LD (IX+1), 32 LD (IX+1), 64 LD (IX+1), 128 +LD (IX-1), 1 +LD (IX-1), 2 +LD (IX-1), 4 +LD (IX-1), 8 +LD (IX-1), 16 +LD (IX-1), 32 +LD (IX-1), 64 +LD (IX-1), 128 LD (IX+10), 1 LD (IX+10), 2 LD (IX+10), 4 @@ -1133,6 +1205,14 @@ LD (IX+10), 16 LD (IX+10), 32 LD (IX+10), 64 LD (IX+10), 128 +LD (IX-10), 1 +LD (IX-10), 2 +LD (IX-10), 4 +LD (IX-10), 8 +LD (IX-10), 16 +LD (IX-10), 32 +LD (IX-10), 64 +LD (IX-10), 128 LD (IX+100), 1 LD (IX+100), 2 LD (IX+100), 4 @@ -1141,6 +1221,14 @@ LD (IX+100), 16 LD (IX+100), 32 LD (IX+100), 64 LD (IX+100), 128 +LD (IX-100), 1 +LD (IX-100), 2 +LD (IX-100), 4 +LD (IX-100), 8 +LD (IX-100), 16 +LD (IX-100), 32 +LD (IX-100), 64 +LD (IX-100), 128 LD (IX+127), 1 LD (IX+127), 2 LD (IX+127), 4 @@ -1149,6 +1237,14 @@ LD (IX+127), 16 LD (IX+127), 32 LD (IX+127), 64 LD (IX+127), 128 +LD (IX-127), 1 +LD (IX-127), 2 +LD (IX-127), 4 +LD (IX-127), 8 +LD (IX-127), 16 +LD (IX-127), 32 +LD (IX-127), 64 +LD (IX-127), 128 LD (IY), 1 LD (IY), 2 LD (IY), 4 @@ -1165,6 +1261,14 @@ LD (IY+1), 16 LD (IY+1), 32 LD (IY+1), 64 LD (IY+1), 128 +LD (IY-1), 1 +LD (IY-1), 2 +LD (IY-1), 4 +LD (IY-1), 8 +LD (IY-1), 16 +LD (IY-1), 32 +LD (IY-1), 64 +LD (IY-1), 128 LD (IY+10), 1 LD (IY+10), 2 LD (IY+10), 4 @@ -1173,6 +1277,14 @@ LD (IY+10), 16 LD (IY+10), 32 LD (IY+10), 64 LD (IY+10), 128 +LD (IY-10), 1 +LD (IY-10), 2 +LD (IY-10), 4 +LD (IY-10), 8 +LD (IY-10), 16 +LD (IY-10), 32 +LD (IY-10), 64 +LD (IY-10), 128 LD (IY+100), 1 LD (IY+100), 2 LD (IY+100), 4 @@ -1181,6 +1293,14 @@ LD (IY+100), 16 LD (IY+100), 32 LD (IY+100), 64 LD (IY+100), 128 +LD (IY-100), 1 +LD (IY-100), 2 +LD (IY-100), 4 +LD (IY-100), 8 +LD (IY-100), 16 +LD (IY-100), 32 +LD (IY-100), 64 +LD (IY-100), 128 LD (IY+127), 1 LD (IY+127), 2 LD (IY+127), 4 @@ -1189,6 +1309,14 @@ LD (IY+127), 16 LD (IY+127), 32 LD (IY+127), 64 LD (IY+127), 128 +LD (IY-127), 1 +LD (IY-127), 2 +LD (IY-127), 4 +LD (IY-127), 8 +LD (IY-127), 16 +LD (IY-127), 32 +LD (IY-127), 64 +LD (IY-127), 128 LD (IX), B LD (IX), C LD (IX), D @@ -1203,6 +1331,13 @@ LD (IX+1), E LD (IX+1), H LD (IX+1), L LD (IX+1), A +LD (IX-1), B +LD (IX-1), C +LD (IX-1), D +LD (IX-1), E +LD (IX-1), H +LD (IX-1), L +LD (IX-1), A LD (IX+10), B LD (IX+10), C LD (IX+10), D @@ -1210,6 +1345,13 @@ LD (IX+10), E LD (IX+10), H LD (IX+10), L LD (IX+10), A +LD (IX-10), B +LD (IX-10), C +LD (IX-10), D +LD (IX-10), E +LD (IX-10), H +LD (IX-10), L +LD (IX-10), A LD (IX+100), B LD (IX+100), C LD (IX+100), D @@ -1217,6 +1359,13 @@ LD (IX+100), E LD (IX+100), H LD (IX+100), L LD (IX+100), A +LD (IX-100), B +LD (IX-100), C +LD (IX-100), D +LD (IX-100), E +LD (IX-100), H +LD (IX-100), L +LD (IX-100), A LD (IX+127), B LD (IX+127), C LD (IX+127), D @@ -1224,6 +1373,13 @@ LD (IX+127), E LD (IX+127), H LD (IX+127), L LD (IX+127), A +LD (IX-127), B +LD (IX-127), C +LD (IX-127), D +LD (IX-127), E +LD (IX-127), H +LD (IX-127), L +LD (IX-127), A LD (IY), B LD (IY), C LD (IY), D @@ -1238,6 +1394,13 @@ LD (IY+1), E LD (IY+1), H LD (IY+1), L LD (IY+1), A +LD (IY-1), B +LD (IY-1), C +LD (IY-1), D +LD (IY-1), E +LD (IY-1), H +LD (IY-1), L +LD (IY-1), A LD (IY+10), B LD (IY+10), C LD (IY+10), D @@ -1245,6 +1408,13 @@ LD (IY+10), E LD (IY+10), H LD (IY+10), L LD (IY+10), A +LD (IY-10), B +LD (IY-10), C +LD (IY-10), D +LD (IY-10), E +LD (IY-10), H +LD (IY-10), L +LD (IY-10), A LD (IY+100), B LD (IY+100), C LD (IY+100), D @@ -1252,6 +1422,13 @@ LD (IY+100), E LD (IY+100), H LD (IY+100), L LD (IY+100), A +LD (IY-100), B +LD (IY-100), C +LD (IY-100), D +LD (IY-100), E +LD (IY-100), H +LD (IY-100), L +LD (IY-100), A LD (IY+127), B LD (IY+127), C LD (IY+127), D @@ -1259,76 +1436,139 @@ LD (IY+127), E LD (IY+127), H LD (IY+127), L LD (IY+127), A +LD (IY-127), B +LD (IY-127), C +LD (IY-127), D +LD (IY-127), E +LD (IY-127), H +LD (IY-127), L +LD (IY-127), A LD B, (IX) LD B, (IX+1) +LD B, (IX-1) LD B, (IX+10) +LD B, (IX-10) LD B, (IX+100) +LD B, (IX-100) LD B, (IX+127) +LD B, (IX-127) LD C, (IX) LD C, (IX+1) +LD C, (IX-1) LD C, (IX+10) +LD C, (IX-10) LD C, (IX+100) +LD C, (IX-100) LD C, (IX+127) +LD C, (IX-127) LD D, (IX) LD D, (IX+1) +LD D, (IX-1) LD D, (IX+10) +LD D, (IX-10) LD D, (IX+100) +LD D, (IX-100) LD D, (IX+127) +LD D, (IX-127) LD E, (IX) LD E, (IX+1) +LD E, (IX-1) LD E, (IX+10) +LD E, (IX-10) LD E, (IX+100) +LD E, (IX-100) LD E, (IX+127) +LD E, (IX-127) LD H, (IX) LD H, (IX+1) +LD H, (IX-1) LD H, (IX+10) +LD H, (IX-10) LD H, (IX+100) +LD H, (IX-100) LD H, (IX+127) +LD H, (IX-127) LD L, (IX) LD L, (IX+1) +LD L, (IX-1) LD L, (IX+10) +LD L, (IX-10) LD L, (IX+100) +LD L, (IX-100) LD L, (IX+127) +LD L, (IX-127) LD A, (IX) LD A, (IX+1) +LD A, (IX-1) LD A, (IX+10) +LD A, (IX-10) LD A, (IX+100) +LD A, (IX-100) LD A, (IX+127) +LD A, (IX-127) LD B, (IY) LD B, (IY+1) +LD B, (IY-1) LD B, (IY+10) +LD B, (IY-10) LD B, (IY+100) +LD B, (IY-100) LD B, (IY+127) +LD B, (IY-127) LD C, (IY) LD C, (IY+1) +LD C, (IY-1) LD C, (IY+10) +LD C, (IY-10) LD C, (IY+100) +LD C, (IY-100) LD C, (IY+127) +LD C, (IY-127) LD D, (IY) LD D, (IY+1) +LD D, (IY-1) LD D, (IY+10) +LD D, (IY-10) LD D, (IY+100) +LD D, (IY-100) LD D, (IY+127) +LD D, (IY-127) LD E, (IY) LD E, (IY+1) +LD E, (IY-1) LD E, (IY+10) +LD E, (IY-10) LD E, (IY+100) +LD E, (IY-100) LD E, (IY+127) +LD E, (IY-127) LD H, (IY) LD H, (IY+1) +LD H, (IY-1) LD H, (IY+10) +LD H, (IY-10) LD H, (IY+100) +LD H, (IY-100) LD H, (IY+127) +LD H, (IY-127) LD L, (IY) LD L, (IY+1) +LD L, (IY-1) LD L, (IY+10) +LD L, (IY-10) LD L, (IY+100) +LD L, (IY-100) LD L, (IY+127) +LD L, (IY-127) LD A, (IY) LD A, (IY+1) +LD A, (IY-1) LD A, (IY+10) +LD A, (IY-10) LD A, (IY+100) +LD A, (IY-100) LD A, (IY+127) +LD A, (IY-127) LDD LDDR LDI @@ -1353,14 +1593,22 @@ OR 64 OR 128 OR (IX) OR (IX+1) +OR (IX-1) OR (IX+10) +OR (IX-10) OR (IX+100) +OR (IX-100) OR (IX+127) +OR (IX-127) OR (IY) OR (IY+1) +OR (IY-1) OR (IY+10) +OR (IY-10) OR (IY+100) +OR (IY-100) OR (IY+127) +OR (IY-127) OTDR OTIR OUT (1), A @@ -1395,34 +1643,58 @@ RES 2, (HL) RES 4, (HL) RES 1, (IX) RES 1, (IX+1) +RES 1, (IX-1) RES 1, (IX+10) +RES 1, (IX-10) RES 1, (IX+100) +RES 1, (IX-100) RES 1, (IX+127) +RES 1, (IX-127) RES 2, (IX) RES 2, (IX+1) +RES 2, (IX-1) RES 2, (IX+10) +RES 2, (IX-10) RES 2, (IX+100) +RES 2, (IX-100) RES 2, (IX+127) +RES 2, (IX-127) RES 4, (IX) RES 4, (IX+1) +RES 4, (IX-1) RES 4, (IX+10) +RES 4, (IX-10) RES 4, (IX+100) +RES 4, (IX-100) RES 4, (IX+127) +RES 4, (IX-127) RES 1, (IY) RES 1, (IY+1) +RES 1, (IY-1) RES 1, (IY+10) +RES 1, (IY-10) RES 1, (IY+100) +RES 1, (IY-100) RES 1, (IY+127) +RES 1, (IY-127) RES 2, (IY) RES 2, (IY+1) +RES 2, (IY-1) RES 2, (IY+10) +RES 2, (IY-10) RES 2, (IY+100) +RES 2, (IY-100) RES 2, (IY+127) +RES 2, (IY-127) RES 4, (IY) RES 4, (IY+1) +RES 4, (IY-1) RES 4, (IY+10) +RES 4, (IY-10) RES 4, (IY+100) +RES 4, (IY-100) RES 4, (IY+127) +RES 4, (IY-127) RES 1, B RES 1, C RES 1, D @@ -1505,34 +1777,58 @@ SET 2, (HL) SET 4, (HL) SET 1, (IX) SET 1, (IX+1) +SET 1, (IX-1) SET 1, (IX+10) +SET 1, (IX-10) SET 1, (IX+100) +SET 1, (IX-100) SET 1, (IX+127) +SET 1, (IX-127) SET 2, (IX) SET 2, (IX+1) +SET 2, (IX-1) SET 2, (IX+10) +SET 2, (IX-10) SET 2, (IX+100) +SET 2, (IX-100) SET 2, (IX+127) +SET 2, (IX-127) SET 4, (IX) SET 4, (IX+1) +SET 4, (IX-1) SET 4, (IX+10) +SET 4, (IX-10) SET 4, (IX+100) +SET 4, (IX-100) SET 4, (IX+127) +SET 4, (IX-127) SET 1, (IY) SET 1, (IY+1) +SET 1, (IY-1) SET 1, (IY+10) +SET 1, (IY-10) SET 1, (IY+100) +SET 1, (IY-100) SET 1, (IY+127) +SET 1, (IY-127) SET 2, (IY) SET 2, (IY+1) +SET 2, (IY-1) SET 2, (IY+10) +SET 2, (IY-10) SET 2, (IY+100) +SET 2, (IY-100) SET 2, (IY+127) +SET 2, (IY-127) SET 4, (IY) SET 4, (IY+1) +SET 4, (IY-1) SET 4, (IY+10) +SET 4, (IY-10) SET 4, (IY+100) +SET 4, (IY-100) SET 4, (IY+127) +SET 4, (IY-127) SET 1, B SET 1, C SET 1, D diff --git a/tools/tests/zasm/allinstrs.asm.expected b/tools/tests/zasm/allinstrs.asm.expected index c4df1434513bdc407dcacd3efece79c1ae553ff7..bc7fdbf8bf2822e425ee9f4b639a54b22d6f5a13 100644 GIT binary patch delta 1927 zcmW;Mzw2aY702;=O@!rfce9P8ki}>a!8OrhZW>t#5pH=az2z$#!)c~m z3`0_#M#KS|Kv)>CnSbC5YnSfRrdu23RDO8;nBp}IU*0_D%(poHQ~$-EfA?|4IpG{Q zXPh19g0u15@Z9oTc}_eB&zWcEx$tbC|M7XLxF%c!*Nm&h0pl7wV&DPq#-tq+yE0UccY|x7GjSo^TJ`GwzOi!QFUo zcyD>HyeHm+_sqNVUU;{+e}DUrw|{y2^{;;3;RU(|U5l=wOXvb!M(5}XI^zp=4ZD_I zWtZ3myUfnn6?XRhCqI1tvyWc>;72ch^Y6}sz$##LTw`N$|HFuAIPV2`Rcn( zs7*vgs0bCIB2>iX&3Btnn}`Zm;VN8(tMJRevPd<8Cv8mWr z>?-yZhl*pxI$@KrP1q&u6AlT-gmqvO*amiiec%u{#$|Z&{!7Qkv32Ymd&j|XbgT1sM!M@;7a4c9GHioTXXV@DKhNE5n^yHVNa#Ojj+*R%?50%Htb>b#*o48BdCms@y ziR<7dxDD=t``{sX46ZXbncK`==05X~dCXipH_okd=iECF&ZBc(xGCHg?h5yXhr(mw z+VofB*0?k7jR)h=&^PE?^c8(VALuiBM_e4a4?Py z$ChK|m^cQ<%+Wa(j>f6s)N-nv5~tvlIXS1o$v8KhTh5hp;vAeaXXjiv8<&Pl%cXKj zT!KsH;#>+BXp`j&7D+%j&CTfxnEYj|sUtGp%N zg15|@^HzAX%YUAJR_ZGqNeRi~QpBYBQrA|hBniplQpBXWs*x&5LbA9Nv8#^cD;-Ix zk|ZRHzv7@_I+D_SsYt3M3CZG8#H7(y?zJFs&PuOD97ziZ-S^|4_bFpd}t#)`3Zuiw0V zcl7?akNuf`rl0K>`qlns|H!-Oop`6-8M=s0&?!1gc`8!nDde6a2`L$cf*A=Z83lGD z$t^yVtOAF@VQ?5628Wpy%t%PdD6ktzNXb4P$A582e5yV*OarD7Q^8a*wf6VfOP9q* z>LbG%MggOUkzk}4S-UiIpFa-OhlZ;d1`H#Hf}vu_tuyPh?YY5fdz+pPR@%>l_4eA_ zYWt8r%&oM4=WZ;DZ-{S-Z;5Y)v2Mfz)*f4AwwhY^b9mB497CeidiD&AWc^*8Eo{Q(|xp@)1h+c>n>VWv}eUz$Z^f=rPa@_;-d7vzfEPy`ea zg`iLrhBBaxCI{Hi~_rngp{mHPtw!$ zEIm&z(#!NJ?WgwM;$xE&?k1yf%J-3wl2PcHk&u%0+WzNM7DryuEO`jy&G7a#lwTR{1$ diff --git a/tools/tests/zasm/geninstrs.py b/tools/tests/zasm/geninstrs.py index 819fd8b..fd929e3 100755 --- a/tools/tests/zasm/geninstrs.py +++ b/tools/tests/zasm/geninstrs.py @@ -103,7 +103,7 @@ def genargs(argspec): argspec = argspec.upper() for n in [1, 10, 100, 127]: result.append(f"(I{argspec}+{n})") - # TODO: support minus + result.append(f"(I{argspec}-{n})") return result if argspec in argspecTbl: return [argspecTbl[argspec]] diff --git a/tools/tests/zasm/test1.asm b/tools/tests/zasm/test1.asm index 04b1691..25aa9b0 100644 --- a/tools/tests/zasm/test1.asm +++ b/tools/tests/zasm/test1.asm @@ -17,7 +17,7 @@ label2: .dw 0x42 ld ix, 1234 ld iy, 2345 ld (ix+1), l - ld l, (ix+1) + ld l, (ix-1) ld hl, 0x100 .equ baz 0x20 ; accept space before comma diff --git a/tools/tests/zasm/test1.asm.expected b/tools/tests/zasm/test1.asm.expected index c587faed107e723b116aa866ce853533dc0e5a5e..ca15e7e059e2b40bd93a3cb1a3c3a4dfd9e1aa4a 100644 GIT binary patch delta 9 QcmWFtn4re^f1