RSEG CODE:CODE:NOROOT(1) // 11 unsigned int queens(unsigned int N, unsigned int count) queens: // 12 { ST -Y, R11 ST -Y, R10 ST -Y, R9 ST -Y, R8 ST -Y, R7 ST -Y, R6 ST -Y, R5 ST -Y, R4 ST -Y, R26 ST -Y, R25 ST -Y, R24 REQUIRE ?Register_R4_is_cg_reg REQUIRE ?Register_R5_is_cg_reg REQUIRE ?Register_R6_is_cg_reg REQUIRE ?Register_R7_is_cg_reg REQUIRE ?Register_R8_is_cg_reg REQUIRE ?Register_R9_is_cg_reg REQUIRE ?Register_R10_is_cg_reg REQUIRE ?Register_R11_is_cg_reg SUBI R29, 2 MOVW R9:R8, R17:R16 MOVW R3:R2, R19:R18 // 13 QA a[32]; // 14 QV poss, place, val = (1<>(N/2); MOVW R21:R20, R9:R8 LSR R21 ROR R20 MOVW R17:R16, R25:R24 MOV R18, R26 MOV R19, R26 CALL ?UL_SHR_L03 STD Y+28, R16 STD Y+29, R17 STD Y+30, R18 STD Y+31, R19 // 19 // 20 while(pos) // 21 { // 22 QA *p=a+pos; ??queens_0: LDI R20, 16 MUL R10, R20 MOVW R21:R20, R1:R0 MOVW R1:R0, R29:R28 ADD R0, R20 ADC R1, R21 // 23 if(poss) MOV R20, R16 OR R20, R17 OR R20, R18 OR R20, R19 BRNE $+2+2 RJMP ??queens_1 // 24 { // 25 place = poss & -poss; MOVW R5:R4, R17:R16 MOVW R7:R6, R19:R18 COM R5 COM R6 COM R7 LDI R20, 255 NEG R4 SBC R5, R20 SBC R6, R20 SBC R7, R20 MOVW R21:R20, R17:R16 MOVW R23:R22, R19:R18 AND R20, R4 AND R21, R5 AND R22, R6 AND R23, R7 // 26 poss &= ~place; MOVW R5:R4, R21:R20 MOVW R7:R6, R23:R22 COM R4 COM R5 COM R6 COM R7 AND R16, R4 AND R17, R5 AND R18, R6 AND R19, R7 // 27 if(pos==1 && !poss && (N & 1))count<<=1; LDI R30, 1 CP R10, R30 BRNE ??queens_2 MOV R30, R16 OR R30, R17 OR R30, R18 OR R30, R19 BRNE ??queens_2 SBRS R8, 0 RJMP ??queens_2 LSL R2 ROL R3 // 28 if(pos!=N) ??queens_2: CLR R11 CP R10, R8 CPC R11, R9 BRNE $+2+2 RJMP ??queens_3 // 29 { // 30 p[0].aposs=poss; MOVW R31:R30, R1:R0 STD Z+12, R16 STD Z+13, R17 STD Z+14, R18 STD Z+15, R19 // 31 poss=p[1].arow=p[0].arow|place; LD R16, Z LDD R17, Z+1 LDD R18, Z+2 LDD R19, Z+3 OR R16, R20 OR R17, R21 OR R18, R22 OR R19, R23 STD Z+16, R16 STD Z+17, R17 STD Z+18, R18 STD Z+19, R19 LDD R16, Z+16 LDD R17, Z+17 LDD R18, Z+18 // 32 poss|=p[1].aleft=(p[0].aleft|place)<<1; LDD R4, Z+4 LDD R5, Z+5 LDD R6, Z+6 LDD R7, Z+7 OR R4, R20 OR R5, R21 OR R6, R22 OR R7, R23 LSL R4 ROL R5 ROL R6 ROL R7 STD Z+20, R4 STD Z+21, R5 STD Z+22, R6 STD Z+23, R7 LDD R4, Z+20 LDD R5, Z+21 LDD R6, Z+22 OR R16, R4 OR R17, R5 OR R18, R6 OR R19, R7 // 33 poss|=p[1].aright=(p[0].aright|place)>>1; LDD R4, Z+8 LDD R5, Z+9 LDD R6, Z+10 LDD R7, Z+11 OR R4, R20 OR R5, R21 OR R6, R22 OR R7, R23 LSR R7 ROR R6 ROR R5 ROR R4 STD Z+24, R4 STD Z+25, R5 STD Z+26, R6 STD Z+27, R7 // 34 p[1].aposs=poss=~(poss) & val; LDD R20, Z+24 LDD R21, Z+25 LDD R22, Z+26 OR R16, R20 OR R17, R21 OR R18, R22 OR R19, R7 COM R16 COM R17 COM R18 COM R19 AND R16, R24 AND R17, R25 AND R18, R26 AND R19, R26 STD Z+28, R16 STD Z+29, R17 STD Z+30, R18 STD Z+31, R19 // 35 pos++; INC R10 RJMP ??queens_4 // 36 } // 37 else // 38 { // 39 ++count; ??queens_3: LDI R20, 1 ADD R2, R20 ADC R3, R11 RJMP ??queens_0 // 40 } // 41 } // 42 else // 43 { // 44 poss=p[-1].aposs; ??queens_1: LDI R16, 252 ADD R0, R16 LDI R16, 255 ADC R1, R16 MOVW R31:R30, R1:R0 LD R16, Z LDD R17, Z+1 LDD R18, Z+2 LDD R19, Z+3 // 45 pos--; DEC R10 // 46 } // 47 } ??queens_4: TST R10 BREQ $+2+2 RJMP ??queens_0 // 48 return count; MOVW R17:R16, R3:R2 SUBI R29, 254 LD R24, Y+ LD R25, Y+ LD R26, Y+ LD R4, Y+ LD R5, Y+ LD R6, Y+ LD R7, Y+ LD R8, Y+ LD R9, Y+ LD R10, Y+ LD R11, Y+ RET // 49 }