module twoinhaf Title 'Find Two Xs and an empty cell in a row, column, or diagonal' "TWOINHAF device 'P22V10'; " Inputs and Outputs X11, X12, X13, X21, X22, X23, X31, X32, X33 pin 1..9; Y11, Y12, Y13, Y21, Y22, Y23, Y31, Y32, Y33 pin 10..11, 13..15, 20..23; MOVE3..MOVE0 pin 16..19 istype 'com'; " MOVE output encodings MOVE = [MOVE3..MOVE0]; MOVE11 = [1,0,0,0]; MOVE12 = [0,1,0,0]; MOVE13 = [0,0,1,0]; MOVE21 = [0,0,0,1]; MOVE22 = [1,1,0,0]; MOVE23 = [0,1,1,1]; MOVE31 = [1,0,1,1]; MOVE32 = [1,1,0,1]; MOVE33 = [1,1,1,0]; NONE = [0,0,0,0]; " Find moves in rows. Rxy ==> a move exists in cell xy R11 = X12 & X13 & !X11 & !Y11; R12 = X11 & X13 & !X12 & !Y12; R13 = X11 & X12 & !X13 & !Y13; R21 = X22 & X23 & !X21 & !Y21; R22 = X21 & X23 & !X22 & !Y22; R23 = X21 & X22 & !X23 & !Y23; R31 = X32 & X33 & !X31 & !Y31; R32 = X31 & X33 & !X32 & !Y32; R33 = X31 & X32 & !X33 & !Y33; " Find moves in columns. Cxy ==> a move exists in cell xy C11 = X21 & X31 & !X11 & !Y11; C12 = X22 & X32 & !X12 & !Y12; C13 = X23 & X33 & !X13 & !Y13; C21 = X11 & X31 & !X21 & !Y21; C22 = X12 & X32 & !X22 & !Y22; C23 = X13 & X33 & !X23 & !Y23; C31 = X11 & X21 & !X31 & !Y31; C32 = X12 & X22 & !X32 & !Y32; C33 = X13 & X23 & !X33 & !Y33; " Find moves in diagonals. Dxy or Exy ==> a move exists in cell xy D11 = X22 & X33 & !X11 & !Y11; D22 = X11 & X33 & !X22 & !Y22; D33 = X11 & X22 & !X33 & !Y33; E13 = X22 & X31 & !X13 & !Y13; E22 = X13 & X31 & !X22 & !Y22; E31 = X13 & X22 & !X31 & !Y31; " Combine moves for each cell. Gxy ==> a move exists in cell xy G11 = R11 # C11 # D11; G12 = R12 # C12; G13 = R13 # C13 # E13; G21 = R21 # C21; G22 = R22 # C22 # D22 # E22; G23 = R23 # C23; G31 = R31 # C31 # E31; G32 = R32 # C32; G33 = R33 # C33 # D33; Equations " Only look in cells 11, 12, 13, 21, 22 WHEN G22 THEN MOVE= MOVE22; ELSE WHEN G11 THEN MOVE = MOVE11; ELSE WHEN G13 THEN MOVE = MOVE13; "ELSE WHEN G31 THEN MOVE = MOVE31; "ELSE WHEN G33 THEN MOVE = MOVE33; ELSE WHEN G12 THEN MOVE = MOVE12; ELSE WHEN G21 THEN MOVE = MOVE21; "ELSE WHEN G23 THEN MOVE = MOVE23; "ELSE WHEN G32 THEN MOVE = MOVE32; ELSE MOVE = NONE; end twoinhaf