NOP.PLD

from CPU !rd --> _1 ---------- 24 -- VCC  
  !nop --> 2 23 ->- !kbd to KEYFIX pld
from keyboard or KEYFIX pld id0 --> 3 22 --X outputenable not connected
from keyboard or KEYFIX pld id1 --> 4 21 --> d4 to CPU
from keyboard or KEYFIX pld id2 --> 5 20 --> d3 to CPU
from keyboard or KEYFIX pld id3 --> 6 19 --> d5 to CPU
from keyboard or KEYFIX pld id4 --> 7 18 --> d6 to CPU
not connected id5 --> 8 17 --> d2 to CPU
from SW6 id6 --> 9 16 --> d7 to CPU
from cassette input circuit id7 --> 10 15 --> d0 to CPU
from CPU !iorq --> 11 14 --> d1 to CPU
  GND -- 12 13 <-- a0 from CPU

This has two functions. It forces NOP codes on the data bus during video access cycles, and buffers inputs from the keyboard and tape input.

Comments in green below were added by me


                PARTNO    nop;
                NAME      nop;
                DATE      12/11/98;
                REV       01 ;
                DESIGNER  isb ;
device g22v10;
pin 1 = !rd;    /* from CPU */
pin 2 = !nop;   /* from CPU */
pin 3 = id0;    /* from keyboard or KEYFIX pld */
pin 4 = id1;    /* from keyboard or KEYFIX pld */
pin 5 = id2;    /* from keyboard or KEYFIX pld */
pin 6 = id3;    /* from keyboard or KEYFIX pld */
pin 7 = id4;    /* from keyboard or KEYFIX pld */
pin 8 = id5;    /* not connected */
pin 9 = id6;    /* from SW6 */
pin 10 = id7;   /* from cassette input circuit */
pin 11 = !iorq; /* from CPU */
pin 23 = !kbd;         /* to KEYFIX pld */
pin 22 = outputenable; /* not connected */
pin 21 = d4;	       /* to CPU */
pin 20 = d3;	       /* to CPU */
pin 19 = d5;	       /* to CPU */
pin 18 = d6;	       /* to CPU */
pin 17 = d2;	       /* to CPU */
pin 16 = d7;	       /* to CPU */
pin 15 = d0;	       /* to CPU */
pin 14 = d1;	       /* to CPU */
pin 13 = a0;	       /* from CPU */
// The keyboard is read at the standard ZX81 address, 
// i.e. when doing an I/O read with A0 low.
kbd = iorq & rd & !a0;
// The data bus is driven if the keyboard is being read
// or the NOP signal is asserted (during video)
outputenable = kbd # nop;
d0.oe=outputenable;
d1.oe=outputenable;
d2.oe=outputenable;
d3.oe=outputenable;
d4.oe=outputenable;
d5.oe=outputenable;
d6.oe=outputenable;
d7.oe=outputenable;
// This is a good way to conserve pins.
// If not a nop cycle, the data is simply the input pins,
// If it is a nop cycle, the data is zero.
d0 = !nop & id0;
d1 = !nop & id1;
d2 = !nop & id2;
d3 = !nop & id3;
d4 = !nop & id4;
d5 = !nop & id5;
d6 = !nop & id6;
d7 = !nop & id7;