############################################# # POWMOD without Montgomery # R14R15 = R8R9 ^ R10R11 mod R6R7 # 2017/6/15 Ver0.6 # 2018/8/8 Ver0.7 # Naoki Hirayama ############################################# $R8 = 857807EAF1A419F6CC3392F86306AB901059ECA4EB23BF567397ED337B2FE80FA9F3FD9D8AE3B68995E3475B1CF8A4D3788C2B5DB99A7D683D9C128098637B806417804DE378462CBC1E457196E7576A18E1E50F4349B206F9C89AB8084F67665128D36577317B9C88E89AB974BDE3724A76D0770A687584D8D93B35BE2B3A85 $R9 = 9F431EFDCF5D22597C59862BDF8C823A94FF38D75A9683DCABEB012C99D2B764DC6984D42939583CFF2AF5A1F167D85CCFF74A2DE96A9424262956C75A3776AA3B46023A677BE8626BEFFA5C12A85DF31C29242B0955BF88E0AF1C0BC1A3456AAB0C60D7A067BCF3BEE7C545A37C5599259A19E14A2D2B8DAF95928F79FF8BA3 $R10 = 3AB714582D1463E93E0D31B32750ABED37A176A90C3B508884BF5DA02F618A5CC833E34C2A352BCBE6A9266194392AC6CF99A204048A85FE6A904CA56E10DF49AE0DE6BE34627EC4EAC7FEC66CB6F181660081C0456A70743A1A2420DF2A01ECF7B77E829FD122444B7E981B87B2D47541A64277162532EACC9280B73365D870 $R11 = B747DF54F6D3599AC76233F8FF05BD4A61F2149F64FA604A86D1960E068FB50097CEFE6F2B5F46DA694B6C2354F698992ACFBBEF57A4C4F0B23E4D528B8718596349E2BBCCDD99D8F411E5C3E6619A66BA4878306798CAE7EF29FFCCF003C84B86FE1711EAB7CC91594888D98D5AC0FC3516523D706700F6A31FCEEA03B90F4D $R6 = AFAB188B9AA88F1CD4BA90CDCB266DDADAA529639809C77509025A79642427F308C2E23BF89531B178480CBF46123E3E697D920BD56569B1EA45572541166566C12DAB756E45FE8545772A58A67BB22B7224E7747F0B4CB55CDB2D704460D390FE8B673530CA28E5B0AE210D43252181D48AEF32C95216CA0F2F49CC8257FFFD $R7 = 616D7D67C2D74B391F45391D6510647E80C3A851B1751808BA5692B32A86109615E805270B5985C559991DCD8D9CB968D7A796620036B6E8902EA58BC877D07004366A1BBA7E4D57B3C97F3D4262E84B53919F3F17194FDC4E4D22690FBD4839ABF54DFB9CE4D79EBFFE8BE84D28A51A509E5EA38B233821703438FAF64673F5 JPOW: A=SEL1 R14=A;SUB;A=SEL1 R15=A X=11 SEL(X);C=SEL2 JPOW1: BC(JPOW2) NOP CALL(MUL) B=SEL2;X=9 CALL(FMOD) X=4 X=0 R15=A;SEL(X);A=SEL1 R14=A JPOW2: CALL(SQR) B=SEL2;X=9 CALL(FMOD) X=4 X=0 R9=A;SEL(X);A=SEL1 R8=A # R10R11 >> 1 X=10 SEL(X);B=SEL2;X=11 SEL(X);C=SEL2 B=SEL1;ADDR=B;C=SEL1 ADDR=B;A=SEL1;D=SEL2 D=SEL3;ADDR=C;R10=A TESTD BZF(JPOW3);ADDR=C;A=SEL1;C=SEL2 R11=A B(JPOW1) NOP JPOW3: END(0);@R14;@R15 NOP ############################################# # MUL:R2R3R4R5 = R8R9*R14R15 # A B R4R5 = R8R9*R14R15 ############################################# MUL: # CALL Delay Slot: B=SEL2;X=9 SEL(X);A=SEL1;X=15 SEL(X);C=SEL2;J=512 MUL1: ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1;BJ(MUL1) ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1 ADDR=C;D=SEL2;X=14 SEL(X);C=SEL2;J=512 MUL2: ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1;BJ(MUL2) ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1;X=15 SEL(X);A=SEL1 D=SEL1;ADDR=D;A=SEL1 R5=A;ADDR=D;A=SEL1 ADDR=B;D=SEL2 ADDR=C;B=SEL2;X=8 SEL(X);C=SEL2;J=512 MUL3: ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1;BJ(MUL3) ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1 A=SEL1;ADDR=C;X=14 SEL(X);C=SEL2;X=8 R4=A;SEL(X);A=SEL1;J=512 MUL4: ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1;BJ(MUL4) ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1 ADDR=D;A=SEL1 ADDL=A;ADDR=C;A=SEL1;C=SEL2 BCF(MUL5) R3=A;ADDR=B;A=SEL1 RET R2=A;ADDR=C;B=SEL2 MUL5: RET;ADDR=B;SUB;A=SEL1 R2=A;ADDR=C;B=SEL2 ############################################# # SQR:R2R3R4R5 = R8R9*R8R9 # A B R4R5 = R8R9*R8R9 ############################################# SQR: # CALL Delay Slot : B=SEL2;X=9 SEL(X);A=SEL1;C=SEL2;J=512 SQR1: ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1;BJ(SQR1) ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1 ADDR=C;A=SEL1;D=SEL1;X=8 R5=A;SEL(X);C=SEL2; ADDR=D;A=SEL1 ADDR=B;D=SEL2 B=SEL2;J=512 SQR2: ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1;BJ(SQR2) ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1 A=SEL1 A=SEL2;B=SEL3;C=SEL3 A=SEL1;ADDR=D;D=SEL1 ADDL=A;ADDR=C;A=SEL1;C=SEL3 R4=A;A=SEL1;SUB ADDL=A;ADDR=B;MUL;B=SEL2;C=SEL3 ADDL=A;ADDR=D;MUL;D=SEL2;X=8 SEL(X);A=SEL1;C=SEL2;J=512 SQR3: ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1;BJ(SQR3) ADDL=A;ADDR=B;MUL;B=SEL1;C=SEL1 ADDR=C;A=SEL1 R3=A;ADDR=B;A=SEL1 RET;ADDR=D;ADDL=A;A=SEL1 R2=A;ADDR=C;B=SEL2 ##################################### # FAST MOD # R0R1 = R2R3R4R5 % R6R7 # R0 A = R2R3R4R5 % R6R7 # (R2R3R4R5 < R6R7^2 , R6>0) # (A = R2 , B = R3) ##################################### FMOD: # CALL Delay Slot : X=4 SEL(X);C=SEL2;X=6;J=1024 FMOD1: SEL(X);D=SEL2 ADDL=DIVA;ADDR=D;CMP;SUB;INV;A=SEL3;B=SEL3;C=SEL3 BC(FMOD2);D=SEL1 TESTD ADDR=B;A=SEL1;X=7 BZF(MOD);SEL(X);B=SEL2 ADDL=A;ADDR=B;SUB;INV;A=SEL1 BCF(FMOD3);ADDL=A;B=SEL2 A=SEL1;ADDR=D ADDL=A;INV;D=SEL2 FMOD2: BZF(MOD) NOP FMOD3: BJ(FMOD1);A=SEL1;ADDR=D X=6 X=5 SEL(X);C=SEL2;X=6;J=1024 FMOD4: SEL(X);D=SEL2 ADDL=DIVA;ADDR=D;CMP;SUB;INV;A=SEL3;B=SEL3;C=SEL3 BC(FMOD5);D=SEL1 TESTD ADDR=B;A=SEL1;X=7 BZF(MOD);SEL(X);B=SEL2 ADDL=A;ADDR=B;SUB;INV;A=SEL1 BCF(FMOD6);ADDL=A;B=SEL2 A=SEL1;ADDR=D ADDL=A;INV;D=SEL2 FMOD5: BZF(MOD) NOP FMOD6: BJ(FMOD4);A=SEL1;ADDR=D X=6 RET;R0=A;ADDR=B;A=SEL1 R1=A ##################################### # R0R1 = R2R3R4R5 % R6R7 # R0 A = R2R3R4R5 % R6R7 # (R2R3R4R5 < R6R7^2 , R6>0) ##################################### MOD: X=2 SEL(X);A=SEL1;X=3 SEL(X);B=SEL2;X=4 SEL(X);C=SEL2;J=1024 ADDL=DIVA;D=SEL2 TESTD;X=6 MOD1: SEL(X);D=SEL2 BZF(MOD4) ADDL=DIVA;ADDR=D;CMP;SUB;INV;A=SEL3;B=SEL3;C=SEL3 D=SEL1;ADDR=B;A=SEL1 TESTD;X=7 BZF(MOD2);SEL(X);B=SEL2 NOP BC(MOD3) NOP ADDL=A;ADDR=B;SUB;INV;A=SEL1 BCF(MOD3) NOP D=SEL1;ADDR=D;A=SEL1 B(MOD3);ADDL=A;INV;A=SEL1 D=SEL1;ADDR=D;A=SEL1 MOD2: ADDL=A;ADDR=B;CMP;SUB;INV;A=SEL1 BCF(MOD3) X=6 SEL(X);D=SEL2 MOD3: ADDL=A;B=SEL2 A=SEL1;ADDR=D MOD4: BJ(MOD1);ADDL=DIVA;D=SEL2 TESTD;X=6 ## 2nd loop X=5 SEL(X);C=SEL2;J=1024 ADDL=DIVA;D=SEL2 TESTD;X=6 MOD5: SEL(X);D=SEL2 BZF(MOD8) ADDL=DIVA;ADDR=D;CMP;SUB;INV;A=SEL3;B=SEL3;C=SEL3 D=SEL1;ADDR=B;A=SEL1 TESTD;X=7 BZF(MOD6);SEL(X);B=SEL2 NOP BC(MOD7) NOP ADDL=A;ADDR=B;SUB;INV;A=SEL1 BCF(MOD7) NOP D=SEL1;ADDR=D;A=SEL1 B(MOD7);ADDL=A;INV;A=SEL1 D=SEL1;ADDR=D;A=SEL1 MOD6: ADDL=A;ADDR=B;CMP;SUB;INV;A=SEL1 BCF(MOD7) X=6 SEL(X);D=SEL2 MOD7: ADDL=A;B=SEL2 A=SEL1;ADDR=D MOD8: BJ(MOD5);ADDL=DIVA;D=SEL2 TESTD;X=6 RET;R0=A;ADDR=B;A=SEL1 R1=A