DECODE.PLD

from HSYNC pld hsync --> _1 ---------- 24 -- VCC  
from CPU a13 --> 2 23 --> !addressenable to SHIFT pld
from CPU a14 --> 3 22 --> _a0 to EPROM/RAM address line
from CPU a15 --> 4 21 --> _a1 to EPROM/RAM address line
from CPU !halt --> 5 20 --> _a2 to EPROM/RAM address line
from CPU !m1 --> 6 19 --> !romselect to EPROM CE and OE
from CPU _d6 --> 7 18 --> !ramselect to RAM CE and OE
from CPU !rd --> 8 17 --> !nop to SHIFT pld and NOP pld
from CPU !rfsh --> 9 16 --> !wait to CPU
from CPU !mreq --> 10 15 -- spare  
from HSYNC pld !vsync --> 11 14 <-- !nmienable from HSYNC pld
  GND -- 12 13 <-- !nmi from HSYNC pld

The memory map decoder. Also, during character font data fetch cycles, pins 20-21 drive the LS bits of the memory bus to select one of the eight rows within a character cell.

Comments in green below were added by me


                PARTNO    decode;
                NAME      decode;
                DATE      12/11/98;
                REV       01 ;
                DESIGNER  isb ;
device g22v10;
pin 1 = hsync;   /* from HSYNC pld */
pin 2 = a13;     /* from CPU */
pin 3 = a14;     /* from CPU */
pin 4 = a15;     /* from CPU */
pin 5 = !halt;   /* from CPU */
pin 6 = !m1;     /* from CPU */
pin 7 = _d6;     /* from SHIFT pld */
pin 8 = !rd;     /* from CPU */
pin 9 = !rfsh;   /* from CPU */
pin 10 = !mreq;  /* from CPU */
pin 11 = !vsync; /* from HSYNC pld */
pin 23 = !addressenable;  /* to SHIFT pld */
pin 22 = _a0;             /* to EPROM/RAM address line */
pin 21 = _a1;             /* to EPROM/RAM address line */
pin 20 = _a2;             /* to EPROM/RAM address line */
pin 19 = !romselect;      /* to EPROM CE and OE */ 
pin 18 = !ramselect;      /* to RAM CE and OE */ 
pin 17 = !nop;            /* to SHIFT pld and NOP pld */ 
pin 16 = !wait;           /* to CPU */
/*pin 15 = spare;*/
pin 14 = !nmienable;      /* from HSYNC pld */
pin 13 = !nmi;            /* from HSYNC pld */
/* the character cell row counter output is enabled 
when the refresh signal is asserted 
and addressenable indicates the system is in character display mode
*/
_a0.oe = rfsh & addressenable;
_a1.oe = rfsh & addressenable;
_a2.oe = rfsh & addressenable;
/* the character cell row counter output is Asynchronously Reset
when the vertical sync signal is asserted.
This ensures it is starts from zero at the top of each video frame.
*/
_a0.ar = vsync;
_a1.ar = vsync;
_a2.ar = vsync;
/* the character cell row counter output is Synchronously Preset
when the non-maskable interrupt signal is asserted.
This .
*/
_a0.sp = nmienable;
_a1.sp = nmienable;
_a2.sp = nmienable;
/* The counter implementation.
A0 simply toggles on each clock cycle.
*/
_a0.d = !_a0;
_a1.d = _a1 $ _a0;
_a2.d = (_a2 $ (_a0 & _a1));
/* The expressions below compress the logic expressions.
They are not signals but more like #defines in C,
which are substituted into the logic equations above.
*/
romselect = (rfsh # mreq) & !a13 & !a14 & !a15; /*  0-8k */
ramselect = (rfsh # mreq) &  a13 & !a14         /*  8-16k & 40-48k */
          # (rfsh # mreq) &  a14                /* 16-32k & 48-64k */
          # (rfsh # mreq) & !a13 & !a14 &  a15; /* 32-40k */
addressenable = !a14 & !a15;  /* only char bitmaps in first 16k */
                              /* so true hires works above 16k  */
nop = !halt & m1 & !_d6 & a14 & a15;            /* force NOPs in 48-64k */
wait = !halt & nmi;