хочу сделать чтение с сидирома в AHCI режиме, программу запускаю в DOS-е. сейчас для тестов пробую послать команду выдвигания лотка сидирома, но безуспешно. вот часть кода Код (Text): typedef struct _ComandHead { word CFL:5; word A:1; word W:1; word P:1; word R:1; word B:1; word C:1; word RR:1; word PMP:4; word PRDT_Length:16; dword PRD_Byte_Count; dword CTBALo; dword CTBAHi; dword dw4; dword dw5; dword dw6; dword dw7; } ComandHead; typedef struct _PRDT { dword Base_addressLo; dword Base_addressHi; dword r; word Byte_CountLo; word Byte_CountHi:6; word r1:9; word Interrupt:1; } PRDT; typedef struct _Command_Table { byte CFIS[64]; byte ACMD[16]; byte Reserv[0x30]; PRDT prdt[1]; } Command_Table; int cdrom( void ) { void * CommandTableOrig; Command_Table * CommandTable; void * ComandListOrig; ComandHead * ComandList; void * FISOrig; void * FIS; dword t; GetPciList(); DiskInfo(); ToUnrealMode(); FindCDroms(); ComandListOrig = malloc( sizeof( ComandHead ) * 32 + 1023 ); ComandList = (void*)( ( (dword)ComandListOrig + 1023 ) & ( ~(dword)1023 ) ); CommandTableOrig = malloc( sizeof( Command_Table ) + 127 ); CommandTable = (void*)( ( (dword)CommandTableOrig + 127 ) & ( ~(dword)127 ) ); FISOrig = malloc( 256 + 4095 ); FIS = (void*)( ( (dword)FISOrig + 4095 ) & ( ~(dword)4095 ) ); memset( ComandList, 0, sizeof( ComandHead ) * 32 ); memset( CommandTable, 0, sizeof( Command_Table ) ); memset( FIS, 0, 256 ); ComandList[ 0 ].PRDT_Length = 1; ComandList[ 0 ].CTBALo = (dword)CommandTable; CommandTable->ACMD[ 0 ] = 0x1B; CommandTable->ACMD[ 4 ] = 0x02; // 2 - open, 3 - close memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x18, 0x0104000D ); memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x2C, 1 ); sleep( 1 ); memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x18, 0x0104000E ); sleep( 1 ); memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x00, (dword)ComandList ); memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x04, 0 ); memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x08, (dword)FIS ); memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x0C, 0 ); sleep( 1 ); memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x38, 0x00000001 ); sleep( 1 ); return g_CDCount; } помогите плз разобраться что я тут делаю не так, спецификации у меня есть, курю я их уже пару недель, но пока безуспешно, нехватает небольшого примера работы в этом режиме, сорцы линуха, опенсоляриса и бсд я смотрел, но там много написано, сложно понять где что происходит, а я хочу начать с малого чтобы разобраться.