Below are examples of functions used to read/write the indexed array. It is assumed that the indexed array has been properly banked into position. Since it is likely that the 8254 registers will not be regularly accessed in most situations, one could arrange to check/set the banking bit RB when one needs to read/write the 8254 register.
/***************************************************************** / INDEXED ARRAY DATA BYTE READ */ static unsigned char STX104_Read_Indexed_Data_Byte( int board, unsigned char index ) { unsigned char value; outp( stx104_base_address[board] + STX104_INDEX_POINTER, index ); value = (unsigned char) inp( stx104_base_address[board] + STX104_INDEX_DATA ); return( value ); } /***************************************************************** / INDEXED ARRAY DATA WORD READ */ static unsigned int STX104_Read_Indexed_Data_Word( int board, unsigned char index ) { unsigned int value; outp( stx104_base_address[board] + STX104_INDEX_POINTER, index ); value = inpw( stx104_base_address[board] + STX104_INDEX_DATA ); return( value ); } /***************************************************************** / INDEXED ARRAY DATA DWORD READ */ static unsigned long STX104_Read_Indexed_Data_Dword( int board, unsigned char index ) { union{ unsigned long dword; unsigned int word[2]; } dvalue; outp( stx104_base_address[board] + STX104_INDEX_POINTER, index ); dvalue.word[0] = inpw( stx104_base_address[board] + STX104_INDEX_DATA ); dvalue.word[1] = inpw( stx104_base_address[board] + STX104_INDEX_DATA ); return( dvalue.dword ); } /***************************************************************** / INDEXED ARRAY DATA BYTE WRITE */ static void STX104_Write_Indexed_Data_Byte( int board, unsigned char index, unsigned char value ) { outp( stx104_base_address[board] + STX104_INDEX_POINTER, index ); outp( stx104_base_address[board] + STX104_INDEX_DATA, (unsigned int) value ); } /***************************************************************** / INDEXED ARRAY DATA WORD WRITE */ static void STX104_Write_Indexed_Data_Word( int board, unsigned char index, unsigned int value ) { outp( stx104_base_address[board] + STX104_INDEX_POINTER, index ); outpw( stx104_base_address[board] + STX104_INDEX_DATA, value ); } /***************************************************************** / INDEXED ARRAY DATA DWORD WRITE */ static void STX104_Write_Indexed_Data_Dword( int board, unsigned char index, unsigned long value ) { union{ unsigned long dword; unsigned int word[2]; } dvalue; dvalue.dword = value; outp( stx104_base_address[board] + STX104_INDEX_POINTER, index ); outpw( stx104_base_address[board] + STX104_INDEX_DATA, dvalue.word[0] ); outpw( stx104_base_address[board] + STX104_INDEX_DATA, dvalue.word[1] ); }