$SAVE NOLIST

/****************************************************************************/
/*                                                                          */
/*                                MPC.LIT                                   */
/*                                                                          */
/*  LITERALS FOR THE 82389 MULTIBUS II MESSAGE PASSING COPROCESSOR (MPC).   */
/*                                                                          */
/*                 LAST UPDATE: MARCH 21, 1988 (20:31:28)                   */
/*                                                                          */
/****************************************************************************/

DECLARE

/****************************************************************************/
/* NOTE: IN A NUMBER OF CASES, THE VALUES WRITTEN TO SPECIFIC PORTS OF THE  */
/* MPC DO NOT MATTER (THE VERY ACT OF WRITING TO THE PORT IS THE ACTION     */
/* REQUIRED). IN ALL OF THESE CASES, THE RECOMMENDED VALUE (ZERO) SHOULD BE */
/* THE VALUE WRITTEN. THIS ENSURES UPWARD COMPATIBILITY WITH FUTURE         */
/* RELEASES OF THE MPC.                                                     */
/****************************************************************************/

/****************************************************************************/
/* MESSAGE STATUS REGISTER - IS AN 8-BIT READ-ONLY REGISTER WHICH PROVIDES  */
/* STATUS INFORMATION TO THE CPU                                            */
/****************************************************************************/

    MPC_MSG_STATUS_REG                      LITERALLY '000H',

        MPC_UNSOL_OUT_FIFO_EMPTY            LITERALLY '001H',
        MPC_UNSOL_IN_FIFO_NOT_EMPTY         LITERALLY '002H',
        MPC_UNSOL_OUT_FAILED                LITERALLY '004H',
        MPC_SOL_OUT_COMPLETE                LITERALLY '008H',
        MPC_SOL_IN_COMPLETE                 LITERALLY '010H',
        MPC_INITIALISATION_COMPLETE         LITERALLY '080H',

/****************************************************************************/
/* MESSAGE RESET PORT - IS USED TO FORCE THE MPC TO RESET ALL OF THE STATES */
/* ASSOCIATED WITH MESSAGE SPACE OPERATIONS. THE VALUE WRITTEN SHOULD BE    */
/* A BYTE CONTAINING THE VALUE ZERO.                                        */
/****************************************************************************/

    MPC_MSG_RESET_PORT                      LITERALLY '000H',

/****************************************************************************/
/* MESSAGE ID REGISTER - IS AN 8-BIT REGISTER USED TO STORE THE MESSAGE     */
/* ADDRESS TO BE RECOGNIZED AS VALID BY THIS AGENT ON THE PSB BUS. IT MAY   */
/* BE WRITTEN ONLY ONCE (AFTER A HARDWARE OR SOFTWARE RESET). IT CAN BE     */
/* READ ANYTIME.                                                            */
/****************************************************************************/

    MPC_MSG_ID_REG                          LITERALLY '004H',

/****************************************************************************/
/* INTERRUPT RESET PORT - IS USED TO FORCE THE MPC TO DE-ASSERT ITS         */
/* INTERRUPT SIGNAL FOR THE DURATION OF THE WRITE PULSE. THIS CAN BE USED   */
/* TO GUARANTEE A RISING EDGE IN THE INTERRUPT SIGNAL FOR USE WITH          */
/* EDGE-SENSITIVE INTERRUPT CONTROLLERS. THE VALUE WRITTEN SHOULD BE A BYTE */
/* CONTAINING THE VALUE ZERO. BECAUSE THIS PORT MAPS ON TO THE MESSAGE ID   */
/* REGISTER, THE FIRST WRITE MADE TO IT (WHICH IS ACTUALLY THE WRITE OF THE */
/* MESSAGE ID) DOES NOT AFFECT THE INTERRUPT SIGNAL.                        */
/****************************************************************************/

    MPC_INT_RESET_PORT                      LITERALLY '004H',

/****************************************************************************/
/* MESSAGE CONFIGURATION REGISTER - IS AN 8-BIT REGISTER USED TO ESTABLISH  */
/* THE CHARACTERISTICS OF THE MPC'S MESSAGE INTERFACE. IMMEDIATELY AFTER A  */
/* HARDWARE OR SOFTWARE RESET, THIS IS A READ/WRITE REGISTER. AFTER THE     */
/* MESSAGE ID REGISTER HAS BEEN WRITTEN, THIS REGISTER BECOMES READ-ONLY.   */
/****************************************************************************/

    MPC_MSG_CONFIG_REG                      LITERALLY '008H',

        MPC_8_BIT_DMA_BUFFERS               LITERALLY '000H',
        MPC_16_BIT_DMA_BUFFERS              LITERALLY '001H',
        MPC_32_BIT_DMA_BUFFERS              LITERALLY '002H',

        MPC_8_BIT_FIFO_BUFFERS              LITERALLY '000H',
        MPC_16_BIT_FIFO_BUFFERS             LITERALLY '004H',
        MPC_32_BIT_FIFO_BUFFERS             LITERALLY '008H',

        MPC_INT_MSG_SUPPORT                 LITERALLY '000H',
        MPC_FULL_MSG_SUPPORT                LITERALLY '080H',

/****************************************************************************/
/* MESSAGE CONTROL REGISTER - IS AN 8-BIT READ/WRITE REGISTER WHICH         */
/* PROVIDES CONTROL FOR EACH MESSAGE INTERRUPT SOURCE IN THE MPC.           */
/****************************************************************************/

    MPC_MSG_CONTROL_REG                     LITERALLY '00CH',

        MPC_ENABLE_UNSOL_OUT_INT            LITERALLY '001H',
        MPC_ENABLE_UNSOL_IN_INT             LITERALLY '002H',
        MPC_ENABLE_UNSOL_OUT_ERROR_INT      LITERALLY '004H',
        MPC_ENABLE_SOL_OUT_INT              LITERALLY '008H',
        MPC_ENABLE_SOL_IN_INT               LITERALLY '010H',

/****************************************************************************/
/* MESSAGE DATA PORT - PROVIDES ACCESS TO THE UNSOLICITED MESSAGE BUFFERS   */
/* CONTAINED WITHIN THE MPC. A WRITE OPERATION ACCESSES AN 8-, 16-, OR      */
/* 32-BIT VALUE WITHIN THE 32-BYTE TRANSMIT FIFO BUFFER, DEPENDING UPON THE */
/* BUFFER WIDTH DEFINED IN THE MESSAGE CONFIGURATION REGISTER. FOR EACH     */
/* MESSAGE RECEIVED, THE FIRST READ OF THIS PORT PROVIDES AN 8-BIT LENGTH   */
/* FOR THE MESSAGE. SUBSEQUENT READ OPERATIONS ACCESS 8-, 16-, OR 32-BIT    */
/* VALUES IN THE MESSAGE, DEPENDING UPON THE BUFFER WIDTH DEFINED IN THE    */
/* MESSAGE CONFIGURATION REGISTER.                                          */
/****************************************************************************/

    MPC_MSG_DATA_PORT                       LITERALLY '010H',

/****************************************************************************/
/* MESSAGE ERROR DATA PORT - PROVIDES READ-ONLY ACCESS TO THE 32-BYTE ERROR */
/* FIFO BUFFER IN THE MPC. WHENEVER AN ERROR OCCURS DURING THE TRANSMISSION */
/* OF AN UNSOLICITED MESSAGE, THE MESSAGE IS PLACED IN THIS BUFFER. IT IS   */
/* READ IN A FASHION SIMILAR TO THAT FOR READING RECEIVED MESSAGES VIA THE  */
/* MESSAGE DATA PORT.                                                       */
/****************************************************************************/

    MPC_MSG_ERROR_DATA_PORT                 LITERALLY '014H',

/****************************************************************************/
/* MESSAGE ERROR RESET PORT - IS USED TO INDICATE TO THE MPC THAT THE CPU   */
/* HAS FINISHED RETRIEVING THE MESSAGE IN THE ERROR FIFO BUFFER. THE VALUE  */
/* WRITTEN SHOULD BE A BYTE CONTAINING THE VALUE ZERO.                      */
/****************************************************************************/

    MPC_MSG_ERROR_RESET_PORT                LITERALLY '014H',

/****************************************************************************/
/* MESSAGE COMMAND PORT - IS USED TO INDICATE CERTAIN STATUS INFORMATION TO */
/* THE MPC. READING A BYTE FROM THIS PORT INDICATES TO THE MPC THAT A       */
/* MESSAGE HAS BEEN FULLY RETRIEVED FROM THE RECEIVE FIFO BUFFERS. THE BYTE */
/* VALUE READ IS NOT IMPORTANT AND CAN BE DISCARDED. WRITING A BYTE TO THIS */
/* PORT INDICATES TO THE MPC THAT A MESSAGE HAS BEEN FULLY LOADED INTO THE  */
/* TRANSMIT FIFO BUFFER AND THAT ITS TRANSMISSION SHOULD BE INITIATED. THE  */
/* VALUE WRITTEN SHOULD BY A BYTE CONTAINING THE VALUE ZERO.                */
/****************************************************************************/

    MPC_MSG_COMMAND_PORT                    LITERALLY '01CH',

/****************************************************************************/
/* SOLICITED MESSAGE OUTPUT COMPLETION PORT - PROVIDES INFORMATION ABOUT    */
/* THE LAST SOLICITED MESSAGE TRANSMITTED BY THIS AGENT. THE CONTENTS OF    */
/* THE PORT ARE ONLY VALID WHEN THE SOLICITED OUTPUT COMPLETION BIT IS SET  */
/* IN THE MESSAGE STATUS REGISTER AND, SINCE THAT BIT IS RESET WHEN THIS    */
/* PORT IS READ, THE PORT CAN ONLY BE READ ONCE FOR ANY GIVEN MESSAGE.      */
/****************************************************************************/

    MPC_SOL_MSG_OUT_COMPLETION_PORT         LITERALLY '020H',

        MPC_SOL_MSG_OUT_REQUEST_ID_MASK     LITERALLY '00FH',
        MPC_SOL_MSG_OUT_OP_CANCELLED        LITERALLY '010H',
        MPC_SOL_MSG_OUT_OP_TIMED_OUT        LITERALLY '020H',
        MPC_SOL_MSG_OUT_TRANSMIT_ERROR      LITERALLY '040H',
        MPC_SOL_MSG_OUT_PROTOCOL_ERROR      LITERALLY '080H',

/****************************************************************************/
/* SOLICITED MESSAGE OUTPUT CANCEL PORT - IS USED TO CANCEL A SOLICITED     */
/* MESSAGE OUTPUT OPERATION. THE REQUEST ID OF THE OUTPUT OPERATION TO BE   */
/* CANCELLED SHOULD BE WRITTEN (IN A BYTE OPERATION).                       */
/****************************************************************************/

    MPC_SOL_MSG_OUT_CANCEL_PORT             LITERALLY '020H',

/****************************************************************************/
/* SOLICITED MESSAGE INPUT COMPLETION PORT - PROVIDES INFORMATION ABOUT THE */
/* LAST SOLICITED MESSAGE RECEIVED BY THIS AGENT. THE CONTENTS OF THE PORT  */
/* ARE ONLY VALID WHEN THE SOLICITED INPUT COMPLETION BIT IS SET IN THE     */
/* MESSAGE STATUS REGISTER AND, SINCE THAT BIT IS RESET WHEN THIS PORT IS   */
/* READ, THE PORT CAN ONLY BE READ ONCE FOR ANY GIVEN MESSAGE.              */
/****************************************************************************/

    MPC_SOL_MSG_IN_COMPLETION_PORT          LITERALLY '024H',

        MPC_SOL_MSG_IN_REQUEST_ID_MASK      LITERALLY '00FH',
        MPC_SOL_MSG_IN_OP_CANCELLED         LITERALLY '010H',
        MPC_SOL_MSG_IN_OP_TIMED_OUT         LITERALLY '020H',

/****************************************************************************/
/* SOLICITED MESSAGE INPUT CANCEL PORT - IS USED TO CANCEL A SOLICITED      */
/* MESSAGE INPUT OPERATION. THE REQUEST ID OF THE INPUT OPERATION TO BE     */
/* CANCELLED SHOULD BE WRITTEN (IN A BYTE OPERATION).                       */
/****************************************************************************/

    MPC_SOL_MSG_IN_CANCEL_PORT              LITERALLY '024H',

/****************************************************************************/
/* INTERCONNECT ADDRESS REGISTERS - ARE 8-BIT READ/WRITE REGISTERS WHICH    */
/* HOLD THE 16-BIT ADDRESS FOR AN INTERCONNECT SPACE OPERATION. BITS 7 - 0  */
/* ARE HELD IN THE "LOW" REGISTER WHILE BITS 15 - 8 ARE HELD IN THE "HIGH"  */
/* REGISTER.                                                                */
/*                                                                          */
/* BITS 15 - 11 CARRY A 5-BIT BINARY CODE THAT DEFINES THE SLOT ID FOR THE  */
/* REFERENCE (SLOT IDS 0 - 23 CORRESPOND TO CARDSLOTS ON THE PSB BUS; SLOT  */
/* IDS 24 - 30 ARE MAPPED TO THE LBX BUS; SLOT ID 31 CORRESPONDS TO LOCAL   */
/* INTERCONNECT SPACE). BITS 10 - 2 CONTAIN THE ACTUAL ADDRESS OF THE       */
/* REGISTER BEING ACCESSED WITHIN THE INTERCONNECT SPACE. BITS 1 - 0 SHOULD */
/* ALWAYS BE ZEROES AND ARE NOT INVOLVED IN INTERCONNECT SPACE OPERATIONS.  */
/****************************************************************************/

    MPC_IC_ADDRESS_LOW_REG                  LITERALLY '030H',
    MPC_IC_ADDRESS_HIGH_REG                 LITERALLY '034H',

    THIS_SLOT                               LITERALLY '31',
    MAX_PSB_SLOT                            LITERALLY '23',

/****************************************************************************/
/* INTERCONNECT DATA REGISTER - IS AN 8-BIT READ/WRITE REGISTER USED TO     */
/* PERFORM INTERCONNECT SPACE REFERENCES FROM THE LOCAL BUS. THE OPERATION  */
/* IS PERFORMED TO THE ADDRESS SPECIFIED IN THE INTERCONNECT ADDRESS        */
/* REGISTERS.                                                               */
/****************************************************************************/

    MPC_IC_DATA_REG                         LITERALLY '03CH',

/****************************************************************************/
/* COMMON FIELDS IN UNSOLICITED MESSAGES                                    */
/****************************************************************************/

    MPC_COMMON_MSG_FIELDS_DESCR             LITERALLY
       'DESTINATION_ADDRESS                 BYTE,
        SOURCE_ADDRESS                      BYTE,
        MESSAGE_TYPE                        BYTE,
        REQUEST_ID                          BYTE',

/****************************************************************************/
/* GENERAL INTERRUPT AND BROADCAST INTERRUPT UNSOLICITED MESSAGES           */
/****************************************************************************/

    MPC_GENERAL_INT_MSG_DESCR               LITERALLY 'STRUCTURE(
        MPC_COMMON_MSG_FIELDS_DESCR,
        DATA_BYTE (28)                      BYTE)',

/****************************************************************************/
/* BUFFER REQUEST UNSOLICITED MESSAGE (USED TO INITIATE NEGOTIATION FOR A   */
/* SOLICITED DATA TRANSFERS)                                                */
/****************************************************************************/

    MPC_BUFFER_REQUEST_MSG_DESCR1           LITERALLY
       'RESERVED_0                          BYTE,
        LENGTH_0                            BYTE,
        LENGTH_1                            BYTE,
        LENGTH_2                            BYTE',

    MPC_BUFFER_REQUEST_MSG_DESCR            LITERALLY 'STRUCTURE(
        MPC_COMMON_MSG_FIELDS_DESCR,
        MPC_BUFFER_REQUEST_MSG_DESCR1,
        DATA_BYTE (24)                      BYTE)',

/****************************************************************************/
/* BUFFER GRANT UNSOLICITED MESSAGE (USED TO SIGNAL AGREEMENT TO SOLICITED  */
/* DATA TRANSFER)                                                           */
/****************************************************************************/

    MPC_BUFFER_GRANT_MSG_DESCR1             LITERALLY
       'RESERVED_0                          BYTE,
        LIAISON_ID                          BYTE,
        DUTY_CYCLE                          BYTE,
        LENGTH_0                            BYTE',

    MPC_BUFFER_GRANT_MSG_DESCR              LITERALLY 'STRUCTURE(
        MPC_COMMON_MSG_FIELDS_DESCR,
        MPC_BUFFER_GRANT_MSG_DESCR1)',

/****************************************************************************/
/* BUFFER REJECT UNSOLICITED MESSAGE (USED TO SIGNAL OBJECTION TO SOLICITED */
/* DATA TRANSFER)                                                           */
/****************************************************************************/

    MPC_BUFFER_REJECT_MSG_DESCR1            LITERALLY
       'RESERVED_0                          BYTE,
        LIAISON_ID                          BYTE,
        RESERVED_1                          BYTE,
        RESERVED_2                          BYTE',

    MPC_BUFFER_REJECT_MSG_DESCR             LITERALLY 'STRUCTURE(
        MPC_COMMON_MSG_FIELDS_DESCR,
        MPC_BUFFER_REJECT_MSG_DESCR1)',

/****************************************************************************/
/* BASIC LITERALS FOR FIELDS WITHIN THE VARIOUS UNSOLICITED MESSAGES        */
/****************************************************************************/

    /* DESTINATION ADDRESS */

    MPC_BROADCAST_ADDRESS                   LITERALLY '0FFH',

    /* MESSAGE TYPE */

    MPC_GENERAL_INTERRUPT_MSG               LITERALLY '000H',
    MPC_BROADCAST_INTERRUPT_MSG             LITERALLY '001H',
    MPC_BUFFER_REQUEST_MSG                  LITERALLY '024H',
    MPC_BUFFER_REJECT_MSG                   LITERALLY '034H',
    MPC_BUFFER_GRANT_MSG                    LITERALLY '035H',

    /* REQUEST ID */

    MPC_DISABLE_FAILSAFE_COUNTER            LITERALLY '080H',

    /* DUTY CYCLE VALUES FOR 80186 DMA CHANNELS */

    MPC_DUTY_CYCLE_80186_DMA_100            LITERALLY '08AH',
    MPC_DUTY_CYCLE_80186_DMA_75             LITERALLY '08EH',
    MPC_DUTY_CYCLE_80186_DMA_50             LITERALLY '094H',
    MPC_DUTY_CYCLE_80186_DMA_25             LITERALLY '0CAH',
    
    /* DUTY CYCLE VALUES FOR ADMA CHANNELS WHEN DATA IS EVEN BYTE ALIGNED */
    
    MPC_DUTY_CYCLE_ADMA_EVEN_100            LITERALLY '059H',
    MPC_DUTY_CYCLE_ADMA_EVEN_75             LITERALLY '089H',
    MPC_DUTY_CYCLE_ADMA_EVEN_50             LITERALLY '08DH',
    MPC_DUTY_CYCLE_ADMA_EVEN_25             LITERALLY '099H',
    
    /* DUTY CYCLE VALUES FOR ADMA CHANNELS WHEN DATA IS ODD BYTE ALIGNED */
    
    MPC_DUTY_CYCLE_ADMA_ODD_100             LITERALLY '08AH',
    MPC_DUTY_CYCLE_ADMA_ODD_75              LITERALLY '08EH',
    MPC_DUTY_CYCLE_ADMA_ODD_50              LITERALLY '094H',
    MPC_DUTY_CYCLE_ADMA_ODD_25              LITERALLY '0CAH',
    
    /* DUTY CYCLE VALUES FOR ADMA CHANNELS IN SINGLE-CYCLE MODE */
    
    MPC_DUTY_CYCLE_ADMA_SINGLE_100          LITERALLY '01EH',
    MPC_DUTY_CYCLE_ADMA_SINGLE_75           LITERALLY '04AH',
    MPC_DUTY_CYCLE_ADMA_SINGLE_50           LITERALLY '04FH',
    MPC_DUTY_CYCLE_ADMA_SINGLE_25           LITERALLY '05EH',

/****************************************************************************/
/* BASIC LITERALS USED TO EXTRACT ERROR INFORMATION (AND THE REQUEST ID !!) */
/* FROM THE REQUEST ID FIELD OF MESSAGES PLACED IN THE ERROR FIFO BUFFER    */
/****************************************************************************/

    MPC_REQUEST_ID_MASK                     LITERALLY '00FH',
    MPC_STATUS_FIELDS_MASK                  LITERALLY '0F0H',
    MPC_MSG_RETRY_LIMIT_EXCEEDED            LITERALLY '010H',
    MPC_MSG_RESOURCES_UNAVAILABLE           LITERALLY '020H',
    MPC_MSG_BUS_ERROR                       LITERALLY '040H',
    MPC_MSG_TIME_OUT                        LITERALLY '080H';

$RESTORE
