Comp24
My computer for year 2024
CPLD ATF1
2026.06.13 20:18:40 end HW Gilhad

1   CPLD ATF1

  • Pokud je HALT režim (tedy platí BA=1), dekóduje pouze Rw a E na Read a Write a MR nastaví na 0000 (native RAM), jinak nemá výstupy
  • Pokud není HALT režim (tedy platí BA=0), ATF1 dekóduje adresy, stará se o jednoduchá zařízení na adresách A020..A0FF a o RAM a ROM signály mimo EMS oblasti
    • !Read = E & Rw
    • !Write = E & !Rw
    • podle jumperu BootFrom (BootSrc) při restartu nastaví, zda bude ROM defaultně připojená na horních adresách
    • podle registru A006 rozhoduje, zda bude ROM aktuálně připojená na horních adresách - xxx xxBR (B readonly BootSrc, R RomMapped)
    • podle registru A007 rozhoduje, kolik ROM bude zabírat prostoru - xxxx xVAL (VAL default 000 ( = 24.75kB), dále viz kód)
    • default po resetu je RomMapped nastaven podle BootFrom a velikost ROM maximální - VAL=000, tedy ROM je 24.75 kB (A100..FFFF)
    • MR je nastavováno i s ohledem na tyto registry
    • v EMS1 a EMS2 oblastech NEgeneruje ROM ani RAM signaly a přepne je do HiZ

2   CODE

Name     ATF1_GLUE;
PartNo   0001;
Date     2026-06-13;
Revision 0.2;
Designer ChatGPT;
Company  None ;
Assembly None ;
Location ;
Device  f1504isptqfp100;

/*
Skutecna jmena signalu a cisla pinu, pokud je pred jmenem !, je signal aktivni v LOW:
*/
/************************************************************/
/* INPUTS                                                   */
/************************************************************/

PIN 6   = CA0;
PIN 8   = CA1;
PIN 9   = CA2;
PIN 10  = CA3;
PIN 12  = CA4;
PIN 13  = CA5;
PIN 14  = CA6;
PIN 16  = CA7;
PIN 17  = CA8;
PIN 19  = CA9;
PIN 20  = CA10;
PIN 21  = CA11;

PIN 23  = CA12;
PIN 25  = CA13;
PIN 29  = CA14;
PIN 30  = CA15;

PIN 31  = Rw;
PIN 32  = !HALT;
PIN 33  = BA;
PIN 35  = !NMI;
PIN 36  = !IRQ;
PIN 37  = !FIRQ;
PIN 40  = !DMA_BREQ;
PIN 41  = MRDY;
PIN 42  = BS;

/*
        unused so far

Pin 44  = IO_26;
Pin 45  = IO_27;
Pin 46  = IO_28;
Pin 47  = IO_29;
Pin 48  = IO_30;
Pin 52  = IO_31;
Pin 54  = IO_32;
Pin 56  = IO_33;
Pin 57  = IO_34;
*/


Pin 71  = BootSrc;      /* 1=ROM, 0=RAM */

/***** Input Only ****/

/* Pin 85 = IO_52;      /* INPUT/GCLK3 */
Pin 87 = E;      /* INPUT/GCLK1 */
Pin 88 = xIO_62; /* INPUT/OE1 - 12V Vpp */
Pin 89 = !Reset; /* INPUT/GCLR */
Pin 90 = Q;      /* INPUT/OE2/GCLK2 */


/************************************************************/
/* OUTPUTS                                                  */
/************************************************************/
Pin 69  = RomMapped;
Pin 75  = !ROM;

PIN 76  = !Dev_Sel_7;
PIN 79  = !Dev_Sel_6;
PIN 80  = !Dev_Sel_5;
PIN 81  = !Dev_Sel_4;
PIN 83  = !Dev_Sel_3;
PIN 84  = !Dev_Sel_2;
PIN 92  = !Dev_Sel_1;
PIN 93  = !RAM;

PIN 94  = !Write;
PIN 96  = !Read;

PIN 97  = MR3;
PIN 98  = MR2;
PIN 99  = MR1;
PIN 100 = MR0;


/************************************************************/
/* BIDIRECTIONAL  (data)                                    */
/************************************************************/
Pin [58,60,61,63, 64,65,67,68] = [D0..7];
/*
Pin 58  = IO_35;
Pin 60  = IO_36;
Pin 61  = IO_37;
Pin 63  = IO_38;
Pin 64  = IO_39;
Pin 65  = IO_40;
Pin 67  = IO_41;
Pin 68  = IO_42;
*/

/************************************************************/
/* vytazeni vnitrnich vyrazu pro testy                      */
/************************************************************/


/*  {{{ pin numbers

***** PWR, NC, JTAG *****

Pin 1  = NC;
Pin 2  = NC;
Pin 3  = VCC;
Pin 4  = TDI;
Pin 5  = NC;
Pin 7  = NC;
Pin 11 = GND;
Pin 15 = TMS;
Pin 18 = VCC;
Pin 22 = NC;
Pin 24 = NC;
Pin 26 = GND;
Pin 27 = NC;
Pin 28 = NC;
Pin 34 = VCC;
Pin 38 = GND;
Pin 39 = VCC;
Pin 43 = GND;
Pin 49 = NC;
Pin 50 = NC;
Pin 51 = VCC;
Pin 53 = NC;
Pin 55 = NC;
Pin 59 = GND;
Pin 62 = TCK;
Pin 66 = VCC;
Pin 70 = NC;
Pin 72 = NC;
Pin 73 = TDO;
Pin 74 = GND;
Pin 77 = NC;
Pin 78 = NC;
Pin 82 = VCC;
Pin 86 = GND;
Pin 91 = VCC;
Pin 95 = GND;

***** I/O pins *****

Pin 6  = IO_1;
Pin 8  = IO_2;
Pin 9  = IO_3;
Pin 10 = IO_4;
Pin 12 = IO_5;
Pin 13 = IO_6;
Pin 14 = IO_7;
Pin 16 = IO_8;
Pin 17 = IO_9;
Pin 19 = IO_10;
Pin 20 = IO_11;
Pin 21 = IO_12;
Pin 23 = IO_13;
Pin 25 = IO_14;
Pin 29 = IO_15;
Pin 30 = IO_16;
Pin 31 = IO_17;
Pin 32 = IO_18;
Pin 33 = IO_19;
Pin 35 = IO_20;
Pin 36 = IO_21;
Pin 37 = IO_22;
Pin 40 = IO_23;
Pin 41 = IO_24;
Pin 42 = IO_25;
Pin 44 = IO_26;
Pin 45 = IO_27;
Pin 46 = IO_28;
Pin 47 = IO_29;
Pin 48 = IO_30;
Pin 52 = IO_31;
Pin 54 = IO_32;
Pin 56 = IO_33;
Pin 57 = IO_34;
Pin 58 = IO_35;
Pin 60 = IO_36;
Pin 61 = IO_37;
Pin 63 = IO_38;
Pin 64 = IO_39;
Pin 65 = IO_40;
Pin 67 = IO_41;
Pin 68 = IO_42;
Pin 69 = IO_43;
Pin 71 = IO_44;
Pin 75 = IO_45;
Pin 76 = IO_46;
Pin 79 = IO_47;
Pin 80 = IO_48;
Pin 81 = IO_49;
Pin 83 = IO_50;
Pin 84 = IO_51;
Pin 92 = IO_53;
Pin 93 = IO_54;
Pin 94 = IO_55;
Pin 96 = IO_56;
Pin 97 = IO_57;
Pin 98 = IO_58;
Pin 99 = IO_59;
Pin 100 = IO_60;

***** Input Only ****

Pin 85 = IO_52;  /* INPUT/GCLK3 /
Pin 87 = xIO_61; /* INPUT/GCLK1 /
Pin 88 = xIO_62; /* INPUT/OE1 - 12V Vpp/
Pin 89 = xIO_63; /* INPUT/GCLR /
Pin 90 = xIO_64; /* INPUT/OE2/GCLK2 /

 }}} */

/************************************************************/
/* REG7 ROM_SIZE                                            */
/************************************************************/
NODE [ROM_SIZE2..0];
FIELD ROM_SIZE = [ROM_SIZE2..0];

/*

4+ = vypnuto
3 = 4k
2 = 8k
1 = 16k
0 = 24.75 kB
*/
/************************************************************/

FIELD CA = [CA15..CA0];

/************************************************************/
/* ADDRESS DECODE                                           */
/************************************************************/

NATIVE_RAM_LO = CA:[0000..7FFF];

EMS1_WINDOW = CA:[8000..8FFF];

EMS2_WINDOW = CA:[9000..9FFF];

/* ATF2 registry */
REG0 = (CA:A000); /* EMS1_PAGE */
REG1 = (CA:A001); /* EMS1_STATUS */
REG2 = (CA:A002); /* EMS2_PAGE */
REG3 = (CA:A003); /* EMS2_STATUS */
REG4 = (CA:A004); /* CHIPA_STATUS */
REG5 = (CA:A005); /* CHIPB_STATUS */

REG_MIRROR = CA:[A006..A01F];
/* nasleduji ATF1 registry */
REG6 = (CA:A006); /* ROM_STATUS */
REG7 = (CA:A007); /* ROM_SIZE */

DEVICE_AREA = CA:[A020..A0FF];

ROM_24K = CA:[A100..FFFF];
ROM_16K = CA:[C000..FFFF];
ROM_8K  = CA:[E000..FFFF];
ROM_4K  = CA:[F000..FFFF];


ROM_AREA =
        RomMapped &
        (
                  ((ROM_SIZE:0) & ROM_24K)
                # ((ROM_SIZE:1) & ROM_16K)
                # ((ROM_SIZE:2) & ROM_8K)
                # ((ROM_SIZE:3) & ROM_4K)
                /* ROM_SIZE 4+ == zadna ROM */
        )
        ;

NATIVE_RAM_HI = ROM_24K & !ROM_AREA;





/************************************************************/
/* MEMORY REGION BUS                                        */
/************************************************************/

MR0 =
      EMS1_WINDOW
    # ROM_AREA
    # REG1
    # REG3
    # REG5
    # REG_MIRROR;

MR1 =
      EMS2_WINDOW
    # ROM_AREA
    # DEVICE_AREA
    # REG2
    # REG3
    # REG_MIRROR;

MR2 =
      DEVICE_AREA
    # REG4
    # REG5
    # REG_MIRROR;

MR3 =
      REG0
    # REG1
    # REG2
    # REG3
    # REG4
    # REG5
    # REG_MIRROR;

/*
        NATIVE_RAM_LO   MR = 0;         0000
        NATIVE_RAM_HI   MR = 0;         0000
        EMS1_WINDOW     MR = 1;         0001
        EMS2_WINDOW     MR = 2;         0010

        REG0            MR = 8;         1000
        REG1            MR = 9;         1001
        REG2            MR = 10;        1010
        REG3            MR = 11;        1011
        REG4            MR = 12;        1100
        REG5            MR = 13;        1101

        REG_MIRROR      MR = 15;        1111

        DEVICE_AREA     MR = 4;         0100

        ROM_AREA        MR = 3;         0011
*/

/************************************************************/
/* READ / WRITE                                             */
/************************************************************/

Read  = E &  Rw;
Write = E & !Rw;

/************************************************************/
/* DEVICE SELECTS                                           */
/************************************************************/

/*
 * EMS windows:
 *   ATF1 releases DEV0
 *   ATF2 drives DEV0
 */

RAM             = NATIVE_RAM_LO
                # NATIVE_RAM_HI
                ;

ROM             = ROM_AREA;

EMS_WINDOW      = EMS1_WINDOW # EMS2_WINDOW;

RAM.OE  = !EMS_WINDOW & !BA; /* managed by ATF2 */
ROM.OE  = !EMS_WINDOW & !BA; /* managed by ATF2 */

/************************************************************/
/* DEVICE BLOCK                                             */
/************************************************************/

Dev_Sel_1 = CA:[A020..A03F] & !BA;
Dev_Sel_2 = CA:[A040..A05F] & !BA;
Dev_Sel_3 = CA:[A060..A07F] & !BA;
Dev_Sel_4 = CA:[A080..A09F] & !BA;
Dev_Sel_5 = CA:[A0A0..A0BF] & !BA;
Dev_Sel_6 = CA:[A0C0..A0DF] & !BA;
Dev_Sel_7 = CA:[A0E0..A0FF] & !BA;


/************************************************************/
/* ATF1 Registers Write                                     */
/************************************************************/

/************************************************************/
/* REG6 ROM_STATUS                                          */
/************************************************************/

/* RomMapped se pri resetu nastavi na BootSrc,
        pri zapisu zmeni hodnotu na zapsanou */
/*
RomMapped.d =
       Reset & BootSrc
    # !Reset & D0;

RomMapped.CK = E;
RomMapped.CE =    Reset
                # REG6 & !Rw;

*/

RomMapped.d = D0;

RomMapped.CK = !Q;
RomMapped.AR = Reset & !BootSrc;
RomMapped.AP = Reset & BootSrc;
RomMapped.CE = REG6 & !Rw & !BA;


/************************************************************/
/* REG7 ROM_SIZE                                            */
/************************************************************/

ROM_SIZE.d=[D2..D0];

ROM_SIZE.CK=!Q;
ROM_SIZE.AR=Reset;
ROM_SIZE.CE = REG7 & !Rw & !BA;


/************************************************************/
/* ATF1 Registers Read                                      */
/************************************************************/

[D7..D0].OE = E & Rw & ( REG6 # REG7 ) & !BA; /* write full D */

[D7..D3] = E & !E;              /* 0 for unused */

[D2]  = REG7 & ROM_SIZE2
        # REG6 & !REG6;                 /* 0 for REG6 */

[D1]  = REG7 & ROM_SIZE1
        # REG6 & BootSrc;

[D0]  = REG7 & ROM_SIZE0
        # REG6 & RomMapped;