Участник:Dim568/Silmarils IO DOS: различия между версиями
Перейти к навигации
Перейти к поиску
Dim568 (обсуждение | вклад) (Новая страница: «== Header == === Base === {| class="wikitable" style="text-align:center;" | |- | 0|| 1 || 2 || 3 || 4 || 5 |- | colspan="2" | H0 || colspan="2" | H1 || colspan…») |
Dim568 (обсуждение | вклад) |
||
(не показано 6 промежуточных версий этого же участника) | |||
Строка 20: | Строка 20: | ||
=== Base === | === Base === | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
+ | /* blancpc.io обрабатывается отдельно от основной логики */ | ||
ReadBaseHeader(); | ReadBaseHeader(); | ||
+ | int8_t control = (H1 >> 8) & 0xFE8; //старшие 7 бит | ||
if( H2 != 0 ){ | if( H2 != 0 ){ | ||
− | if( | + | if( control < 0){ |
+ | if( control == 0xA0 ){ | ||
+ | /* базовый кейс, часть данных пишется в сегмент кода o_0 */ | ||
+ | }else{ | ||
+ | /* Нужно найти файлы подходящие под этот кейс */ | ||
+ | } | ||
}else{ | }else{ | ||
+ | /* кейс похож на несжатые данные, но под него попадают только monstre.io и telep.io в первой Ishar */ | ||
} | } | ||
}else{ | }else{ | ||
+ | /* Кейс похож на хранение системной информации, явный пример main.io */ | ||
ReadExtendedPart(); | ReadExtendedPart(); | ||
− | if( | + | if( control < 0){ |
+ | if( control == 0xA0 ){ | ||
+ | }else{ | ||
+ | } | ||
}else{ | }else{ | ||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | ==H2 равен 0== | ||
+ | Дочитываются дополнительные 16 байт заголовка | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | uint16_t VAL01 = ((H3/4)+1)*16; | ||
+ | VAL1 += 0; // Нужно проверить, при запуске равен нулю, но бывает ли иным? | ||
+ | uint16_t VAL02 = (H4*6)+VAL01; | ||
+ | uint16_t VAL03 = ES_REG_VAL; // Портит всю малину, нужно понять можно ли без значения регистра | ||
+ | VAL03 += (H7/16)+1 | ||
+ | uint16_t VAL04 = VAL03 + (((H9+3)*0x26)/16)+1; // Значение используется в алгоритме когда H2 равен 1, нужно проследить дальше | ||
+ | uint16_t VAL05 = ((H6&0x0F)<<12); | ||
+ | uint16_t VAL06 = H5/16; | ||
+ | VAL05 += VAL06; | ||
+ | uint16_t VAL07 = VAL04 + VAL05; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Заметки на полях == | ||
+ | === Первая базовая механика === | ||
+ | Старшие биты базового слова копируются в младшие биты слова приемника. | ||
+ | {{cut | ||
+ | | Оригинальная реализация | ||
+ | |<syntaxhighlight lang="cpp"> | ||
+ | void SilmarilsIORotate(uint16_t* recipient, uint16_t* base, uint8_t count){ | ||
+ | uint32_t tmp = 0; | ||
+ | // Input check | ||
+ | if( recipient == NULL || base == NULL) | ||
+ | return; | ||
+ | // Do work | ||
+ | while(count > 0){ | ||
+ | tmp = (*base)&0x8000; | ||
+ | (*base) <<= 1; | ||
+ | (*recipient) <<= 1; | ||
+ | if(tmp) | ||
+ | (*recipient) |= 1; | ||
+ | count -= 1; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | }} | ||
+ | |||
+ | |||
+ | {{cut | ||
+ | | Оптимальная реализация для X32 | ||
+ | |<syntaxhighlight lang="cpp"> | ||
+ | void SilmarilsIORotate(uint16_t* recipient, uint16_t* base, uint8_t count){ | ||
+ | uint32_t blob = 0; | ||
+ | // Input check | ||
+ | if( recipient == NULL || base == NULL) | ||
+ | return; | ||
+ | // Make blob | ||
+ | blob = (uint32_t)((*recipient) << 16) | (uint32_t)*base; | ||
+ | // Do work | ||
+ | while(count > 0){ | ||
+ | blob <<= 1; | ||
+ | count -= 1; | ||
+ | } | ||
+ | // Write result | ||
+ | *recipient = (blob&0xFFFF0000) >> 16; | ||
+ | *base = (blob&0x0000FFFF); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | }} |
Текущая версия на 00:02, 11 сентября 2020
Header
Base
0 | 1 | 2 | 3 | 4 | 5 |
H0 | H1 | H2 |
Extend
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
H3 | H4 | H5 | H6 | H7 | ?? | H9 |
Logic
Base
/* blancpc.io обрабатывается отдельно от основной логики */
ReadBaseHeader();
int8_t control = (H1 >> 8) & 0xFE8; //старшие 7 бит
if( H2 != 0 ){
if( control < 0){
if( control == 0xA0 ){
/* базовый кейс, часть данных пишется в сегмент кода o_0 */
}else{
/* Нужно найти файлы подходящие под этот кейс */
}
}else{
/* кейс похож на несжатые данные, но под него попадают только monstre.io и telep.io в первой Ishar */
}
}else{
/* Кейс похож на хранение системной информации, явный пример main.io */
ReadExtendedPart();
if( control < 0){
if( control == 0xA0 ){
}else{
}
}else{
}
}
H2 равен 0
Дочитываются дополнительные 16 байт заголовка
uint16_t VAL01 = ((H3/4)+1)*16;
VAL1 += 0; // Нужно проверить, при запуске равен нулю, но бывает ли иным?
uint16_t VAL02 = (H4*6)+VAL01;
uint16_t VAL03 = ES_REG_VAL; // Портит всю малину, нужно понять можно ли без значения регистра
VAL03 += (H7/16)+1
uint16_t VAL04 = VAL03 + (((H9+3)*0x26)/16)+1; // Значение используется в алгоритме когда H2 равен 1, нужно проследить дальше
uint16_t VAL05 = ((H6&0x0F)<<12);
uint16_t VAL06 = H5/16;
VAL05 += VAL06;
uint16_t VAL07 = VAL04 + VAL05;
Заметки на полях
Первая базовая механика
Старшие биты базового слова копируются в младшие биты слова приемника.
Оригинальная реализация |
---|
void SilmarilsIORotate(uint16_t* recipient, uint16_t* base, uint8_t count){
uint32_t tmp = 0;
// Input check
if( recipient == NULL || base == NULL)
return;
// Do work
while(count > 0){
tmp = (*base)&0x8000;
(*base) <<= 1;
(*recipient) <<= 1;
if(tmp)
(*recipient) |= 1;
count -= 1;
}
}
|
Оптимальная реализация для X32 |
---|
void SilmarilsIORotate(uint16_t* recipient, uint16_t* base, uint8_t count){
uint32_t blob = 0;
// Input check
if( recipient == NULL || base == NULL)
return;
// Make blob
blob = (uint32_t)((*recipient) << 16) | (uint32_t)*base;
// Do work
while(count > 0){
blob <<= 1;
count -= 1;
}
// Write result
*recipient = (blob&0xFFFF0000) >> 16;
*base = (blob&0x0000FFFF);
}
|