;@ ins k k k k
;@ outs k k
opcode Gate, 0, kkkkkkkk
kType1,kType2,kin1,kin2,kin3,kin4,ko1,ko2 xin
  ky1 zkr kin1
  ky2 zkr kin2
  ky3 zkr kin3
  ky4 zkr kin4

  ky1 K2Y ky1
  ky2 K2Y ky2
  ky3 K2Y ky3
  ky4 K2Y ky4

; FIRST GATE
  if (kType1 == 0) then ;AND
  	kOut1 = ky1*ky2
  elseif (kType1 == 1) then ; NAND
  	kOut1 = -ky1*ky2+1
  elseif (kType1 == 2) then ; OR
  	kOut1 limit ky1+ky2, 0, 1
  elseif (kType1 == 3) then ; NOR
  	kOut1 limit ky1+ky2, 0, 1
  	kOut1 = -kOut1+1
  elseif (kType1 == 4) then ; XOR
  	kOut1 = (ky1+ky2)%2
  elseif (kType1 == 5) then ; XNOR
  	kOut1 = (ky1+ky2)%2
  	kOut1 = -kOut1+1
  endif

; SECOND GATE
  if (kType2 == 0) then ;AND
  	kOut2 = ky3*ky4
  elseif (kType1 == 1) then ; NAND
  	kOut2 = -ky3*ky4+1
  elseif (kType2 == 2) then ; OR
  	kOut2 limit ky3+ky4, 0, 1
  elseif (kType2 == 3) then ; NOR
  	kOut2 limit ky3+ky4, 0, 1
  	kOut2 = -kOut2+1
  elseif (kType2 == 4) then ; XOR
  	kOut2 = (ky3+ky4)%2
  elseif (kType2 == 5) then ; XNOR
  	kOut2 = (ky3+ky4)%2
  	kOut2 = -kOut2+1
  endif

  zkw kOut1, ko1
  zkw kOut2, ko2
endop

;@ ins a a a a
;@ outs k k
opcode Gate, 0, kkkkkkkk
setksmps 1
kType1,kType2,kin1,kin2,kin3,kin4,ko1,ko2 xin
  ay1 zkr kin1
  ay2 zkr kin2
  ay3 zkr kin3
  ay4 zkr kin4

  ky1 = k(ay1)
  ky2 = k(ay2)
  ky3 = k(ay3)
  ky4 = k(ay4)

  ky1 K2Y ky1
  ky2 K2Y ky2
  ky3 K2Y ky3
  ky4 K2Y ky4

; FIRST GATE
  if (kType1 == 0) then ;AND
  	kOut1 = ky1*ky2
  elseif (kType1 == 1) then ; NAND
  	kOut1 = -ky1*ky2+1
  elseif (kType1 == 2) then ; OR
  	kOut1 limit ky1+ky2, 0, 1
  elseif (kType1 == 3) then ; NOR
  	kOut1 limit ky1+ky2, 0, 1
  	kOut1 = -kOut1+1
  elseif (kType1 == 4) then ; XOR
  	kOut1 = (ky1+ky2)%2
  elseif (kType1 == 5) then ; XNOR
  	kOut1 = (ky1+ky2)%2
  	kOut1 = -kOut1+1
  endif

; SECOND GATE
  if (kType2 == 0) then ;AND
  	kOut2 = ky3*ky4
  elseif (kType1 == 1) then ; NAND
  	kOut2 = -ky3*ky4+1
  elseif (kType2 == 2) then ; OR
  	kOut2 limit ky3+ky4, 0, 1
  elseif (kType2 == 3) then ; NOR
  	kOut2 limit ky3+ky4, 0, 1
  	kOut2 = -kOut2+1
  elseif (kType2 == 4) then ; XOR
  	kOut2 = (ky3+ky4)%2
  elseif (kType2 == 5) then ; XNOR
  	kOut2 = (ky3+ky4)%2
  	kOut2 = -kOut2+1
  endif

  zaw a(kOut1), ko1
  zaw a(kOut2), ko2
endop
