The below is not tested, but the logic seems good. It will only allow the x10 setting subroutines to happen once per minute (can be altered in line 6). This prevents flooding the house wire with x10 signals but still give you plenty of repeats just in case an x10 signal is lost. It will always put the relays into the same on/off status at any given 15 minute block no matter when the unit is powered on. CTS divided by 15 minutes will always be even at the top of every hour and stay even (with a remainder which is ignored) until 15 minutes past the hour. The same holds true at the bottom of the hour.
START
TSTLT CYEAR 2013 * waits for clock to bet set before proceeding
GOTO START
SET RAM2 CTS * sets ram2 to current total seconds at startup
LOOP:
TSTLT CTS RAM2 * program loops until cts catches up to ram2 (60 seconds here)
GOTO LOOP
ADD RAM2 60 RAM2 * pushes ram2 60 seconds into future
SET RAM1 0 * clears ram1 so first 2 bits can be flags
TSTGE CH 20
ORB RAM1 1 RAM1 * sets first flag if after 20 hours
TSTLT CH 6
ORB RAM1 2 RAM1 * sets second flag if before 6 hours
ANDB RAM1 3 * tests if either of above flags set
CZ RESET * if neither flag set (zero bit 0), shuts off relays
ANDB RAM1 3 * tests if either of above flags set, might not be needed, depends if "x10" changes 0 bit
CNZ RELAY * if either flag set (zero bit not 0), runs the relay sub
GOTO LOOP
END
RELAY:
DIV CTS 900 RAM1 *divides cts by 15 minutes (60 seconds time 15)
ANDB RAM1 1 * checks if above is even or odd
BZ RELAY1 * if even, branches, if odd it finishes this subroutine
X10 0 0 OFF * sets x10 A1 off
X10 0 1 ON * sets x10 A2 on
RET
RELAY1:
X10 0 0 ON
X10 0 1 OFF
RET
RESET:
X10 0 0 OFF
X10 0 1 OFF
RET