--*************************************************************************/ -- */ --C025953PAL16L8 - replacement for C025953 Atari 130XE chip using */ -- the placement option on the 130XE PCB: */ -- PAL/GAL16L8/16V8 and a 74LS95 as U35 */ -- */ -- The circuit diagramm of the 130XE is wrong with */ -- regard to the U35 pinout. Here is the correct */ -- U35 pinout: */ -- */ -- pin 1: HALT from U7 pin 9 */ -- pin 2-7: GND */ -- pin 8: GND */ -- pin 9: Bphi2 (buffered phi2) */ -- pin 10-12 NC */ -- pin 13: mhalt (to U34 pin 11) */ -- pin 14: VCC (+5V) */ -- */ --HALT is being latched using a 74LS95 shift register (U35) with the */ --falling edge of phi2. That provides a delayed variant of the ANTIC */ --HALT signal (mhalt) which gets active (low) in the particular bus cycle */ --that */ --ANTIC wants to take over. This is necessary because the original HALT */ --from ANTIC is set active (low) the bus cycle BEFORE the particular */ --bus cycle that ANTIC wants to take over (see logic analyser screenshots */ --on http://home.cablesurf.de/christopher.lang/atari-8-bit/). */ -- */ --In other words: */ --mhalt is the latched halt signal. It is being latched with the falling */ --edge of phi2. That brings mhalt exactly into the bus cycle that ANTIC */ --just asked for and now can be used to distiguish between CPU bus cycles */ --and ANTIC bus cycles. */ -- */ --cas is being let gone to either casb or casm only when phi 2 is high */ --(the 2nd half of the 6502 bus cycle). This prevents from junk on the */ --casm and casb lines because the original cas signal is longer than the */ --actual 6502 bus cycle and crosses over into the next 6502 bus cycle */ --catching all kinds of junk. This shortens the cas signals a bit but */ --still works properly. */ -- */ --The original C025953 lets the full length cas signal pass, so it */ --actually latches the cas pass through with the rising edge of phi2 */ --in order to avoid junk on the cas lines. */ -- */ --This design adds a mode pin: pin 12 of the GAL/PAL. */ -- */ --mode pin set to 0 chooses 130XE compatibility mode, */ --mode pin set to 1 chooses 800XL mode */ -- */ --many thanks to http://www.s-direktnet.de/homepages/k_nadj/xebanks.html */ --thanks as well to http://cat.asw.cz/~kubecj/achemmu.htm */ -- */ --IMPORTANT NOTE: for this design to work you have to set AC1 for pin 13 */ --of this damned GAL 16V8 to '1' manually after compiling it into a JEDEC */ --to make pin 13 an input. */ --Othervise the pin 13 output of the GAL collides with the halt signal */ --that is present on pin 13. This Lattice VHDL compiler keeps optimizing */ --away any settings for pin 13 if it is unused in the design. */ --Usually a GAL programmer offers the possibility to modify */ --the fuse bits of the GAL before burning... */ -- */ --*************************************************************************/ -- */ --Created by: */ --Christopher Lang, Jul. 2002, christopher.lang@plus.cablesurf.de */ -- */ --*************************************************************************/ library ieee; use ieee.std_logic_1164.all; entity C025953PAL16L8_Entity is port (phi2, cas, halt, mhalt, cbe_pb4, vbe_pb5, ba14_pb2, ba15_pb3, mode: in std_logic; a: in std_logic_vector (15 downto 14); casmain, casbank: out std_logic; fa: out std_logic_vector (15 downto 14) ); attribute LOC: string; attribute LOC of phi2: signal is "P19"; attribute LOC of a: signal is "P2;P1"; attribute LOC of ba14_pb2: signal is "P3"; attribute LOC of ba15_pb3: signal is "P4"; attribute LOC of cbe_pb4: signal is "P5"; attribute LOC of cas: signal is "P6"; attribute LOC of mhalt: signal is "P11"; attribute LOC of halt: signal is "P13"; attribute LOC of casbank: signal is "P14"; attribute LOC of casmain: signal is "P15"; attribute LOC of vbe_pb5: signal is "P18"; attribute LOC of mode: signal is "P12"; end; --ssome stuff still from the Tango PLD version --ggroup bnksel_130[ba15_pb3, ba14_pb2]; /* 64kb exp. (130XE) --ggroup bnksel_pb6[pb6, ba15_pb3, ba14_pb2]; /* 128kb exp. (PB6 only mode) --ggroup bnksel_ger[pb7, pb6, ba15_pb3, ba14_pb2]; /* 256kb exp. ("German" or "Compy Shop" 320k) --ggroup bnksel_usa[pb6, vbe_pb5, ba15_pb3, ba14_pb2]; /* 256kb exp. ("American 320k") --ggroup bnksel_448[pb7, pb6, vbe_pb5, ba15_pb3, ba14_pb2]; /* 448kb exp. ("Chris's full 512k", 2 rows 256kbit chips architecture C025953PAL16L8_Architecture of C025953PAL16L8_Entity is signal casmain_through: std_logic; -- lets make this low active signal casbank_through: std_logic; -- lets make this low active constant high: std_logic := '1'; constant low: std_logic := '0'; constant bank_page: std_logic_vector := "01"; constant mode_130xe: std_logic := '0'; constant mode_800xl: std_logic := '1'; begin output_cas_signals: process (casmain_through, casbank_through, cas, phi2) begin if casmain_through = low and phi2 = high then casmain <= cas; else casmain <= high; end if; if casbank_through = low and phi2 = high then casbank <= cas; else casbank <= high; end if; end process output_cas_signals; decode: process (cbe_pb4, vbe_pb5, ba14_pb2, ba15_pb3, a, mhalt, mode) begin if a = bank_page then -- access on $4000 to $7FFF occured case mode is --ggroup bnksel_130[ba15_pb3, ba14_pb2]; /* 64kb exp. (130XE) */ when mode_130xe => -- mode 130xe ******************************/ if ( mhalt = high and cbe_pb4 = high ) -- CPU access on base RAM **/ or ( mhalt = low and vbe_pb5 = high ) then -- Antic access on base RAM fa <= a; casmain_through <= low; casbank_through <= high; else -- access on extended RAM */ fa <= ba15_pb3 & ba14_pb2; casmain_through <= high; casbank_through <= low; end if; --ggroup bnksel_800xl when mode_800xl => -- mode 800xl only 64kb ********************/ fa <= a; casmain_through <= low; casbank_through <= high; --ggroup bnksel_130[ba15_pb3, ba14_pb2]; /* 64kb exp. (130XE) */ when others => -- mode 130xe ******************************/ if ( mhalt = high and cbe_pb4 = high ) -- CPU access on base ram **/ or ( mhalt = low and vbe_pb5 = high ) then -- Antic access on base RAM fa <= a; casmain_through <= low; casbank_through <= high; else -- access on extended RAM */ fa <= ba15_pb3 & ba14_pb2; casmain_through <= high; casbank_through <= low; end if; end case; else fa <= a; casmain_through <= low; casbank_through <= high; end if; end process decode; end C025953PAL16L8_Architecture;