Результаты поиска потегупрограммирование

Дополнительные фильтры
Теги:
программированиеновый тег
Автор поста
Рейтинг поста:
-∞050100200300400+
Найдено: 703
Сортировка:

Псевдоанимация

Пощу заново, старый пост удалил, из-за тегов он скатился в фендом.

Позадротствовал чутка и наколхозил всратый алгоритм, для превращения картинки в кучку ноликов(строка).
Вот второй результат анимации. Сегодня завтра может чутка поменяю алгоритм работы и увеличу "разрешение" со 128 в длину до 192 или 256, для большей детализации.




Первая анимация была на основе этого поста http://mspa.reactor.cc/post/4214465#comment20589740

Урок ОСдева №6: минидрайвер флоппи-привода.

В предыдущем посте мы вычислили значения, нужные для работы с FAT12. Пора писать драйвер!
Начнём с постановки задачи. Что должен уметь драйвер FAT12 для первичного загрузчика?
Очень просто: загружать файлы. Больше ничего.

Для этого мы будем использовать прерывание BIOS. Кстати, про прерывания мы ещё не
говорили. Пока давайте считать, что это функции, предоставляемые для нашего удобства
BIOS. Подробно об этом говорить будем позднее, так как тема очень большая. Кроме того,
позже мы напишем полноценный драйвер, который будет работать с флоппи-приводом напрямую,
без посредства BIOS. Сделать это прямо сейчас мы не можем из-за ограничения по размеру
программы: первичный загрузчик должен занимать не больше 512 байт - полновесный драйвер
флоппи-привода в такой объём не влезет.

Прерывания вызываются командой int, после которой идёт номер. Стандартное
прерывание BIOS для работы с дисками - 13h. Соответственно, команда выглядит так: int 13h.
Как правило прерывания требуют передачи параметров через определённые регистры. Так,
int 13h нужен номер функции в AH. Прерывание 13h - это целый набор функций для работы
с различными видами съёмных и постоянных носителей. Нас интересует функция 2, чтение
секторов с диска. Она в свою очередь требует указать количество считываемых секторов в AL,
номер цилиндра в CH, номер начального сектора в CL, головку в DH, привод в DL и адрес
в памяти, куда будут считаны данные, в ES:BX.

Итак, ещё раз: в нашем случае int 13h вызывается со следующими параметрами:
AH = 2 (номер функции)
AL = число секторов
CH = номер цилиндра
CL = номер начального сектора
DH = номер головки
DL = 0 (номер привода)
ES:BX = сегмент:смещение области для загрузки

Прерывание int 13h у нас будет вызываться в процедуре read_sectors. Этой последней нужно
будет передать три параметра: LBA в AX, число секторов в CX и адрес для загрузки в ES:BX.
Что такое LBA мы уже знаем: это более современная линейная схема адресации секторов. К сожалению,
прерывание 13h работает с устаревшим форматом CHS, так что придётся делать конверсию
внутри процедуры.

Кстати, стоит сразу остановиться на том, как оформляются и что представляют собой процедуры
в TASM. В коде процедура выглядит так:

(имя процедуры) proc
     (тело процедуры)
(имя процедуры) endp

Обе эти инструкции нужны только компилятору и в исполняемый файл не попадают. В случае
"плоского" бинарного файла процедура окажется именно там, где она расположена в тексте
программы - никакой отдельной области памяти для неё создаваться не будет. Процедура
вызывается инструкцией call (имя процедуры). Предварительно, конечно, надо поместить
нужные параметры в нужные регистры.

Теперь немного о внутреннем устройстве FAT12. Для того, чтобы загрузить файл в память,
нам нужно проделать следующие вещи:

1. Загрузить в память Корневую Директорию диска.
2. Найти в КД запись, соответствующую файлу.
3. Считать из записи номер первого кластера файла в FAT.
4. Загрузить в память FAT.
5. Загрузить в память цепочку кластеров, которую занимает файл.

В этот раз мы ограничимся только первым пунктом, всё остальное будет в финальной статье
про первичный загрузчик. Давайте вспомним, как выглядела программа в конце прошлого поста:

.386p
CSEG segment use16
ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG
begin:                              jmp short execute;Точка входа. Перейти к исполняемой части.
                                       nop;Пустой оператор. Заполняет 3-й байт перед BPB.



;БЛОК ПАРАМЕТРОВ BIOS==========================================================;

     ;=======================================;
     ;Блок параметров BIOS, 33 байта.                                         ;
     ;Здесь хранятся характеристики                                            ;
     ;носителя. Должен быть в 3 байтах                                       ;
     ;от начала загрузочного сектора.                                          ;
     ;=======================================;
     BPB_OEMnamedb 'BOOTDISK';0-7. Имя производителя. Может быть любым.
     BPB_bytespersecdw 512;8-9. Размер сектора в байтаx.
     BPB_secperclustdb 1;10. Количество секторов в кластере.
     BPB_reserveddw 1;11-12. Число зарезервированныx секторов (1, загрузочный).
     BPB_numFATsdb 2;13. Число FAT.
     BPB_RDentriesdw 224;14-15. Число записей Корневой Директории.
     BPB_sectotaldw 2880;16-17. Всего секторов на носителе.
     BPB_mediatypedb 0F0h;18. Тип носителя. 0F0 - 3,5-дюймовая дискета с 18 секторами в дорожке.
     BPB_FATsizedw 9;19-20. Размер FAT в сектораx.
     BPB_secpertrackdw 18;21-22. Число секторов в дорожке.
     BPB_numheadsdw 2;23-24. Число головок (поверxностей).
     BPB_hiddensecdd 0;25-28. Число скрытыx секторов перед загрузочным.
     BPB_sectotal32dd 0;29-32. Число секторов, если иx больше 65535.

     ;===============================================;
     ;Расширенный блок параметров BIOS, 26 байт.                                         ;
     ;Этот раздел используется в DOS 4.0.                                                       ;
     ;===============================================;
     EBPB_drivenumdb 0;0. Номер привода.
     EBPB_NTflagsdb 0;1. Флаги в Windows NT. Бит 0 - флаг необxодимости проверки диска. Бит 1 - флаг необходимости диагностики             поверхности.
     EBPB_extsigndb 29h;2. Признак расшренного BPB по версии DOS 4.0.
     EBPB_volIDdd 0;3-6. "Серийный номер". Любое случайное число или ноль, без разницы.
     EBPB_vollabeldb 'BOOTLOADER ';7-17. Название диска. Устарело.
     EBPB_filesysdb 'FAT12   ';18-25. Имя файловой системы.



;ИСПОЛНЯЕМЫЙ БЛОК===============================================================;

;Шаг 1. Исправить значения сегментных регистров.
execute:
                    ;DS, ES, FS, GS.
                              mov ax,07C0h;Сегмент загрузчика.
                              mov ds,ax;Поместить это значение во все сегментные регистры.
                              mov es,ax
                              mov fs,ax
                              mov gs,ax

                    ;СЕГМЕНТ СТЕКА.
                              cli;Запретить прерывания перед переносом стека.
                              mov ss,ax;Поместить в SS адрес сегмента загрузчика.
                              mov sp,0FFFFh;Указатель стека - на конец сегмента.
                              sti;Разрешить прерывания.

                    ;СЕГМЕНТ КОДА.
                              push ax;Поместить в стек сегмент.
                              mov ax,offset jump;Указатель на инструкцию после retf.
                              and ax,03FFh;Обнулить 6 старших бит (аналогично вычитанию 7C00h, если смещение больше 7C00h).
                              push ax;Поместить в стек смещение.
                              retf;Дальний возврат для смены CS.

jump:                     mov byte ptr EBPB_drivenum,dl;BIOS должен вернуть номер загрузочного устройства в DL. Сохранить его в BPB.

                             mov ax,BPB_RDentries;Число записей КД
                             shl ax,5;*32 (размер записи в байтах) = размер КД в байтах.
                             div BPB_bytespersec;AX/размер сектора в байтах = размер КД в секторах.
                             mov cx,ax;Поместить его в CX (будет счетчиком для загрузки КД).
                             xor ax,ax;Обнулить AX.
                             mov al,byte ptr BPB_numFATs;Число FAT
                             mul BPB_FATsize;*размер FAT в секторах = общий размер всех FAT в секторах.
                             mov total_FATs_size,ax;Сохранить результат в переменной.
                             add ax,BPB_reserved;AX+число зарезервированных секторов = стартовый сектор КД.
                             mov datasector,ax;Стартовый сектор КД + размер КД в секторах =
                             add datasector,cx;= стартовый сектор области данных. Сохранить его в переменной.

                             cli
                             hlt

;ПЕРЕМЕННЫЕ==================================================================;
     total_FATs_size dw ?;Переменная для хранения общего размера FAT в секторах.
     datasector dw ?;Переменная для хранения номера стартового сектора области данных.

     org 1FEh;Заполняет память нулями до 511-го байта.
     dw 0AA55h;Байты 511 и 512. Признак загрузочного сектора.

CSEG ends
end begin

Добавим следующий код между add datasector,cx и cli:

                              mov bx,0200h
                              call read_sectors

Теперь загрузчик перед тем, как остановить процессор, вызывает процедуру read_sectors. Но передали ли
мы все нужные параметры? Напоминаю, в AX должен быть LBA первого загружаемого сектора. И в AX у нас
как раз номер первого сектора КД! CX должен содержать число загружаемых секторов. И, большая удача,
именно оно в CX и есть. Сегмент в ES у нас уже установлен, а смещение в BX мы явно задали перед
вызовом процедуры. Всё отлично! Осталась самая малость: написать саму процедуру.

Где-нибудь между hlt и переменными сделайте шаблон:

read_sectors proc
                              ;ПУСТО
read_sectors endp

Алгоритм работы в общих чертах представляется нам как-то так: перевести LBA в CHS, установить
значения регистров для int 13h, вызвать прерывание... Профит! Не будем медлить. Пишите:

read_sectors proc
                              div BPB_secpertrack;Разделить LBA в AX на число секторов в дорожке.
                              inc dl;Остаток + 1 = номер сектора, т.к. нумерация с 1.
                              mov cl,dl;Поместить номер сектора в CL для int 13h
                              xor dx,dx;Обнулить перед делением.
                              div BPB_numheads;Разделить результат на число головок.
                              shl dx,8;Остаток = номер головки, сдвинуть его в DH.
                              mov ch,al;Частное = номер дорожки, его поместить в CH для int 13h.
                              mov dl,0;DL = 0, флоппи-диск А.
                              mov ax,0201h;Функция 2 int 13h, загрузка секторов с диска. В AL - число секторов.
                              int 13h
                              ret
read_sectors endp

Поздравим себя, на сегодня дело сделано. Шутка. Включаем голову. Во-первых, носители - а особенно
флоппи-диски! - имеют свойство не читаться с первого раза. На этот случай int 13h возвращает
статус операции в CF: если флаг обнулён - всё хорошо, если установлен - была ошибка чтения.
Во-вторых, даже в случае успеха мы загрузили только один сектор: значение в CX до сих пор не
используется. Начнём со второй проблемы:

read_sectors proc
                              mov bp,BPB_bytespersec;Размер сектора, понадобится внутри цикла.

main:                      pusha;Сохранить регистры общего назначения.
                              div BPB_secpertrack;Разделить LBA в AX на число секторов в дорожке.
                              inc dl;Остаток + 1 = номер сектора, т.к. нумерация с 1.
                              mov cl,dl;Поместить номер сектора в CL для int 13h
                              xor dx,dx;Обнулить перед делением.
                              div BPB_numheads;Разделить результат на число головок.
                              shl dx,8;Остаток = номер головки, сдвинуть его в DH.
                              mov ch,al;Частное = номер дорожки, его поместить в CH для int 13h.
                              mov dl,0;DL = 0, флоппи-диск А.
                              mov ax,0201h;Функция 2 int 13h, загрузка секторов с диска. В AL - число секторов.
                              int 13h
                              popa;Восстановить сохраненные регистры.

                              inc ax;Увеличить LBA.
                              add bx,bp;Сместить указатель загрузки на длину сектора.
                              loop main;Продолжить цикл.
                              ret;Завершить процедуру.
read_sectors endp

Процедура теперь организована в виде цикла со счётчиком в CX. Команда loop возвращает
указатель инструкции к указанной метке при условии, что CX не равен 0. CX при этом
уменьшается на 1. Обратите внимание, что в начале процедуры мы помещаем в BP
размер сектора в байтах, а блок кода из прошлой версии теперь обрамляется инструкциями
pusha и popa. Последнее нужно для того, чтобы после выполнения шага цикла вернуть вводные
значения в соответствующие регистры. Перед началом следующего шага LBA в AX увеличивается
на 1, а смещение области загрузки увеличивается на размер сектора. Время разобраться
с возможными ошибками чтения.

read_sectors proc
                              mov bp,BPB_bytespersec;Размер сектора, понадобится внутри цикла.
main:                      mov di,5;Число попыток чтения в случае ошибки.

load_sector:            pusha;Сохранить регистры общего назначения.
                              div BPB_secpertrack;Разделить LBA в AX на число секторов в дорожке.
                             inc dl;Остаток + 1 = номер сектора, т.к. нумерация с 1.
                             mov cl,dl;Поместить номер сектора в CL для int 13h
                             xor dx,dx;Обнулить перед делением.
                             div BPB_numheads;Разделить результат на число головок.
                             shl dx,8;Остаток = номер головки, сдвинуть его в DH.
                             mov ch,al;Частное = номер дорожки, его поместить в CH для int 13h.
                             mov dl,0;DL = 0, флоппи-диск А.
                             mov ax,0201h;Функция 2 int 13h, загрузка секторов с диска. В AL - число секторов.
                             int 13h
                             jnc sector_loaded;Если CF не установлен, сектор загружен успешно.

                             xor ax,ax;Функция 0 int 13h, сброс головок.
                             xor dl,dl;DL = номер привода, флоппи-диск А.
                             int 13h
                             popa;Восстановить сохраненные регистры.
                             sub di,1;Уменьшить счетчик попыток.
                             jnz load_sector;Если счетчик не обнулился, перейти к загрузке сектора.
                             ret

sector_loaded:        popa;Восстановить сохраненные регистры.
                             inc ax;Увеличить LBA.
                             add bx,bp;Сместить указатель загрузки на длину сектора.
                             loop main;Продолжить цикл.
                             ret;Завершить процедуру.
read_sectors endp

После вызова прерывания у нас теперь стоит jnc sector_loaded. Эта инструкция делает переход к
указанной метке, но только если флаг CF не установлен. Таким образом, к инициализации переменных
для следующего шага цикла мы попадаем только если предыдущий завершился успешно. Если же CF
установлен, начинается обработка ошибки. Функция 0 int 13h возвращает читающие головки привода к
0 сектору 0 дорожки, это должно уменьшить вероятность ошибки при следующем чтении. После
этого мы уменьшаем счётчик попыток на 1 и, если он не обнулился (инструкция jnz), делаем повторную
попытку. Теперь процедура почти готова. Остались финальные штрихи. Во-первых, сброс головок
тоже может пойти с ошибкой, и для пущей уверенности операцию стоит повторить несколько раз.
Во-вторых, было бы неплохо, если бы процедура обрабатывала ситуацию, когда все попытки чтения
завершились неудачей. Сейчас она просто завершается, как и в случае успеха. Начнём опять со второй задачи.

read_sectors proc
                             mov bp,BPB_bytespersec;Размер сектора, понадобится внутри цикла.
main:                     mov di,5;Число попыток чтения в случае ошибки.

load_sector:            pusha;Сохранить регистры общего назначения.
                             div BPB_secpertrack;Разделить LBA в AX на число секторов в дорожке.
                             inc dl;Остаток + 1 = номер сектора, т.к. нумерация с 1.
                             mov cl,dl;Поместить номер сектора в CL для int 13h
                             xor dx,dx;Обнулить перед делением.
                             div BPB_numheads;Разделить результат на число головок.
                             shl dx,8;Остаток = номер головки, сдвинуть его в DH.
                             test ah,ah;Проверить AH. Если больше нуля, что-то пошло не так.
                             jnz error;Т.к. на диске не может быть больше 255 дорожек, завершить с ошибкой.
                             mov ch,al;Частное = номер дорожки, его поместить в CH для int 13h.
                             mov dl,0;DL = 0, флоппи-диск А.
                             mov ax,0201h;Функция 2 int 13h, загрузка секторов с диска. В AL - число секторов.
                             int 13h
                             jnc sector_loaded;Если CF не установлен, сектор загружен успешно.

                             xor ax,ax;Функция 0 int 13h, сброс головок.
                             xor dl,dl;DL = номер привода, флоппи-диск А.
                             int 13h
                             popa;Восстановить сохраненные регистры.
                             sub di,1;Уменьшить счетчик попыток.
                             jnz load_sector;Если счетчик не обнулился, перейти к загрузке сектора.
                             ret

sector_loaded:        popa;Восстановить сохраненные регистры.
                             inc ax;Увеличить LBA.
                             add bx,bp;Сместить указатель загрузки на длину сектора.
                             loop main;Продолжить цикл.
                             ret;Завершить процедуру.

error:                     popa;Попытки кончились. Восстановить сохраненные регистры.
                             mov ax,07c0h;Сегмент загрузчика
                             mov es,ax;поместить в ES для int 10h.
                             mov ah,03h;Функция 3 прерывания 10h, получить позицию курсора в DH, DL.
                             xor bh,bh;BH = номер видеостраницы.
                             int 10h;DH = строка, DL = столбец.

                             mov ax,1300h;Функция 19 прерывания 10h, вывод строки. AL = режим вывода.
                             mov bx,0007h;BH = страница, BL = атрибуты символа.
                             mov cx,0010h;CX = длина строки.
                             mov bp,offset msg_DRE;ES:BP = указатель на строку.
                             int 10h;Вывести строку в DH,DL без обновления курсора.
                             cli;Запретить прерывания
                             hlt;и остановить процессор.
read_sectors endp

В первом сегменте кода после shl dx,8 у нас появилась проверка на ошибочность результата. Она
явно избыточна, но пусть будет. Если в результате деления у нас получился номер дорожки больше
255, то что-то пошло не так. Программа переходит к метке error, после которой происходит
следующее: первый сегмент кода опустошает стек, а потом с помощью прерывания 10h
(прерывание для работы с дисплеем) считывает положение курсора на экране, а второй выводит сообщение
об ошибке и останавливает процессор. Строку с сообщением можно хранить рядом состальными переменными,
выглядит она так:

msg_DRE db 'Disk read error.' ;Сообщение об ошибке чтения с диска.

Осталась самая малость. Обработать повторные попытки сброса головок. Финальная версия прецедуры
будет выглядеть так:

read_sectors proc
                             mov bp,BPB_bytespersec;Размер сектора, понадобится внутри цикла.
main:                     mov di,5;Число попыток чтения в случае ошибки.

load_sector:            pusha;Сохранить регистры общего назначения.
                             div BPB_secpertrack;Разделить LBA в AX на число секторов в дорожке.
                             inc dl;Остаток + 1 = номер сектора, т.к. нумерация с 1.
                             mov cl,dl;Поместить номер сектора в CL для int 13h
                             xor dx,dx;Обнулить перед делением.
                             div BPB_numheads;Разделить результат на число головок.
                             shl dx,8;Остаток = номер головки, сдвинуть его в DH.
                             test ah,ah;Проверить AH. Если больше нуля, что-то пошло не так.
                             jnz error;Т.к. на диске не может быть больше 255 дорожек, завершить с ошибкой.
                             mov ch,al;Частное = номер дорожки, его поместить в CH для int 13h.
                             mov dl,0;DL = 0, флоппи-диск А.
                             mov ax,0201h;Функция 2 int 13h, загрузка секторов с диска. В AL - число секторов.
                             int 13h
                             jnc sector_loaded;Если CF не установлен, сектор загружен успешно.

                             mov cx,0003h;Счетчик попыток сброса головок.
reset:                     xor ax,ax;Функция 0 int 13h, сброс головок.
                             xor dl,dl;DL = номер привода, флоппи-диск А.
                             int 13h
                             jnc reload;Если не было ошибки - повторить попытку чтения сектора.
                             loop reset;Попробовать сбросить головки еще раз, если CX не обнулился.
error:                     popa;Попытки кончились. Восстановить сохраненные регистры.
                             jmp short disk_read_error;Сообщить об ошибке и завершить программу.

reload:                   popa;Восстановить сохраненные регистры.
                             sub di,1;Уменьшить счетчик попыток.
                             jnz load_sector;Если счетчик не обнулился, перейти к загрузке сектора.
                             jmp short disk_read_error;Сообщить об ошибке и завершить программу.

sector_loaded:        popa;Восстановить сохраненные регистры.
                             inc ax;Увеличить LBA.
                             add bx,bp;Сместить указатель загрузки на длину сектора.
                             loop main;Продолжить цикл.
                             ret;Завершить процедуру.

disk_read_error:      mov ax,07c0h;Сегмент загрузчика
                             mov es,ax;поместить в ES для int 10h.
                             mov ah,03h;Функция 3 прерывания 10h, получить позицию курсора в DH, DL.
                             xor bh,bh;BH = номер видеостраницы.
                             int 10h;DH = строка, DL = столбец.

                             mov ax,1300h;Функция 19 прерывания 10h, вывод строки. AL = режим вывода.
                             mov bx,0007h;BH = страница, BL = атрибуты символа.
                             mov cx,0010h;CX = длина строки.
                             mov bp,offset msg_DRE;ES:BP = указатель на строку.
                             int 10h;Вывести строку в DH,DL без обновления курсора.
                             cli;Запретить прерывания
                             hlt;и остановить процессор.
read_sectors endp

Поздравим себя! Теперь у нас есть процедура, считывающая данные с диска. Добавленный нами
вызов read_sectors в конце программы помещает КД диска в память сразу после самого
загрузчика. Следующий пост будет последним на тему первичного загрузчика. В нём мы научимся
пользоваться КД и FAT и загружать файлы.

Вопрос относительно Cheat Engine и возможности составить цепочку действий в таблице.


Как сделать цепочку последовательностей действий в Cheat Engine, которая может быть активирована одной кнопкой? Я в программировании ноль и в скриптах не шарю.

Современное программирование

,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,собака,собакен, песель, пес,песочница

Гайд на основные Функции DAIN-APP V0.36 от 11.03.2020


Само приложение: https://grisk.itch.io/dain-app

ГАЙД ОТ ЛАМЕРА-ДЛЯ ЛАМЕРОВ! ГЛУБОКОГО ВНИКАНИЯ И РОСПИСИ ЗАТРАТ ПАМЯТИ ТУТ НЕТ!
Программа использует память видеокарты. Нужна Куда(загугли).
ОКНО ДИАЛОГА
юзер-фнедли интерфейс для настройки

1) 
1.1)Input Video- Процессировать видео
1.2)Input PNG Sequense- Процессировать выделенную последовательность изображении.
1.3)Resume render- Продолжить прерванный ранее рендер.

2)
2.1)Inpute file(s)- Выбрать нужный фаил.
2.2)Export as...- Экспортировать как Mp4, GIF, WebM, APNG.
2.3)Output Folder- Указать место, в котором программа создаст 3 папки: оригинальные кадры, интерполированные кадры, результат.

3)Mode.
3.1)Mode 1: all( frames treated the same)- Все, новые и старые, кадры будут использованы в конечном результате. Дефолтная настройка. Средняя ресурсоёмкость. Не меняет скорость результата.
3.2)Mode 2: Remove duplicate frames( may alter animation speed)- Не будут сгенерированы одинаковые кадры. Скорость анимации может изменится. Самая маленькая ресурсоёмкость.
3.3)Mode 3: Adaptive record timestamps them remove duplicate frames.- Каждый кадр будет на своём месте во времени(timespamp), а потом программа попробует угадать сколько кадров между ними нужно создать. Наименее полезен и стабилен. Высокая ресурсоёмкость. Не смотря на описание, скорость результата часто меняется.
3.4)Mode 4: Static record timestamps them remove duplicate frames.- Мод 3, но программа создаст только указанное количество кадров. Не всегда полезен. Средняя ресурсоёмкость. Не меняет скорость результата.

4) Depth Awareness Mode.
4.1)Real life or 3D- Для видео с четкой глубиной.
Сartoon or Anime- Для анимации и аниме без глубины, или её практическим отсутствием.
4.2)Alpha transparency- Будут ли сгенерированые кадры иметь полупрозрачные переходные части.
No alpha- функция отключена
Fast alpha- Менее ресурсоёмкий вариант, результат будет немного хуже.
Fast alpha- Более ресурсоёмкий вариант, наиболее качественный результат.
4.3) Interpolation Algorithm. 
Default- Стандартные х2, х4 и х8 функции интерполяции. Меньшие затраты памяти, медленнее более чистые результаты.
Experimental- Эксперементальные функции интерполяции. Быстрее, больший расход памяти, генерирует больше артефактов. Не доступна (4.2).

5)
5.1) Input FPS- Количество кадров в секунду орицинального файла\фаилов.
5.2) Interpolate 2x/4x/8x- Увеличить изначальное кадры в такое количество раз. 
5.3) Output FPS- Расчетное количество кадров конечного результата, всегда округляется до целых после конца рендера.

6) Split frames into sections- Использовать, если не хватает памяти. При рендере программа будет разделять каждый кадр на части с указанными размерами(6.1) и (6.2). Снижает расход ресурсов, но сильно замедляет процесс.
6.1) Section size- Размер секции. Т.е. Если указать 500, то разделение будет идти на секции 500х500 пикселей, при этом создаст четыре версии в зависимости от (6.2).
6.2) Section Padding- Переменная, которая определяет четые вариации (6.1). Т.е, при указании (6.1)=500, и (6.2)=200, будут такие четыре варианта: 500х500, 200х500, 500х200, 200х200. Такими секциями программа будет обрабатывать кадры, начиная с максимального количества больших секции, и постепенно уменьшая их размер.

7) 
7.1) Downscale video- Уменьшает размер результата. Указывать в виде ХнаХ(500х500) пикселей.
7.2) Don't interpolate scene changes- При обнаружении резкой смены изображения(перехода сцены), программа не будет интерполировать переход между ними.

8)
8.1) Clean interpolated folder before starting-  Программа очистит папку с интерполированными кадрами при старте следующего рендера с теми же (2.3). Я постоянно использую при работе на трудной гифкой, которую нужно переделывать не один раз.
8.2) Limit color palette to use only original colors- При рендере программа будет использовать только оригинальную палитру цветов файла. Анимации могу использовать (4.2) только с этой функцией. Я включаю всегда. 
8.3) Create a output with audio- Результат сохранит изначальное аудио. Работает нормально только с (3.1) и (3.4). Не стабильная эксперементальная функция.
8.4) Perfect loop animation- Анимация будет идеально закольцована. Использовать, если оригинал это подразумевает.

9) If FPS exceed this value. Create another version with this FPS.- Если ФПС перейдет это значение(9.1), создать версию с этим [ФПС](9.1).
9.1) [FPS]= - переменная, определяющая предел ФПС.
9.2) (If FPS exceeds [FPS]) Create a [FPS] version of movie- Если был превышен лимит (9.1), то сгенерировать дополнительную версию с указанным ФПС(9.1) в виде видео.
9.2) (If FPS exceeds [FPS]) Interpolate down to [FPS] [Conf 1: Smooth]-  Если был превышен лимит (9.1), то сгенерировать версию с указанным ФПС(9.1). Будет задействована первая конфигурация. Результат будет более плавным.
9.3) (If FPS exceeds [FPS]) Interpolate down to [FPS] [Conf 2: Sharp]- Если был превышен лимит (9.1), то сгенерировать версию с указанным ФПС(9.1). Будет задействована Вторая конфигурация. Результат будет более резким.

10)
10.1)Preform all steps: Render- полностью выполнит процесс рендера.
10.2)Step 1: Split source video into frames- Только разделит фаил на кадры, создаст папку (2.3), и поместит их туда.
10.3)Step 2: Feed sorce frames to DAIN- Начинает процесс интерполяции оригинальных кадров и генерацию новых.
10.4)Step 3: Convert DAIN frames to video- Сшивание сгенерированных кадров в (2.2).

ОКНО ПРОЦЕССА
Говорить тут особо неочем: подробности процесса, количество готовых кадров.


Ну, вот вроде и все. Учтите, что универсальных настроек не существует, и почти всегда надо будет шаманить для лучшего результата.

Господа, у меня к вам еще один вопрос.

Я недавно спрашивал про английский. Теперь у меня новый вопрос и я хочу пояснить ситуацию. 

Так получилось что я несколько лет был в депрессии, перед новым годом совсем крыло, во многом спасался здесь бесконечно обновляя ленту в поисках нового. Благодаря друзьям я сначала принял что у меня действительно есть проблема и пришел к осознанию необходимости лечения. Но это уже дело прошлого, сейчас, находясь посреди курса лечения уже сняв острое состояние у меня в первые за долгое время появилась желания не сидеть дальше на жопе ровно на моей работе, а начинать развиваться в ту сторону, в которую я всегда хотел, но из-за сочетания моей врожденной прокрастинации и депрессии было лишь абстрактной мыслью. Я всегда хотел стать разработчиком, в своем время даже учился в колледже информационных технологий, но бросил потому что работать и зарабатывать деньги было проще, хоть и прикрывался всегда необходимостью. Теперь, у меня появились силы бороться со своей прокрастинацией и абстрактные планы начали преобразоваться в конкретные шаги.
Предыдущий вопрос про английский был один из шагов, за что хочу сказать спасибо, потому что некоторые советы пришлись к делу. Но пора перейти к сути. 
В рамках моего запланированного обучения я пришел к тому что мне нужно нормально знать как минимум школьную программу математике с дальнейшим углубление уже в профильные разделы. Вопрос заключается в поиске проверенных методических материалов для повторения и изучения школьного курса на нормальном уровне, по которому я смогу заниматься самостоятельно. Вид может любой, как хорошие уроки на ютубе, так и в текстовом виде, например в виде хорошего учебника или цикла статей на сайте.

И второй вопрос, моя текущая цель утроится через год джуинором чтобы начать получать рабочий опыт.
На данный момент мой крус запланирован из:
Язык программирования C# и платформы .NET Эндрю Троелсен, Джепикс Филипп
Изучаем SQL Линн Бейли
Алгоритмы на JAVA Роберт Сенджвик, Кевин Уэйн - для изучения алгоритмов
Clean Architeture Robert C. Martin
Язык программирования С Деннис Ритчи, Брайнан Кернинган
Идеальный программист Роберт мартин

Может посоветуете что-то добавить и в принципе ваши мысли достаточный ли это список литературы чтобы получить начальную профессию не имея при этом корочки.
Заранее спасибо.
З.Ы. Извиняюсь за стену текста.
,пидоры помогите,реактор помоги,депрессия,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,математика,наука,много текста

Ув.пидоры - есть ли тут люди соображающие в nodejs?
Суть в чем - телеговский бот не пашет, если в коде прописан прокси с логин\паролем. Если прописан халявный прокси - все ок. Код и иже с ним - могу показать в ЛС, без регистрации и смс
КУПОН
НА 1 помощь,пидоры помогите,реактор помоги,it,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор

Урок ОСдева №5: подготовка к работе с файловой системой FAT12.

В прошлый раз мы инициализировали сегментные регистры и обеспечили загрузчику безопасную среду
обитания. Сегодня будем готовить почву для работы с файловой системой FAT12. Для начала стоит
поподробнее ознакомиться с её структурой. В FAT12 пространство носителя можно разделить на
несколько областей. Они могут быть разного размера, но идут всегда в следующем порядке:

ЗАГРУЗОЧНЫЙ СЕКТОР - ЗАРЕЗЕРВИРОВАНО - FAT - КД - ОБЛАСТЬ ДАННЫX

Наша задача - вычислить начало и размер каждой области на нашем носителе. Эта информация понадобится
для загрузки файлов. Важный момент: при работе с контроллером флоппи-привода мы оперируем секторами,
а не байтами. То есть, когда я пишу "размер", я имею в виду количество секторов, занятыx
областью.

Загрузочный сектор - место, где обитает наша программа. Это всегда сектор
номер 1 на носителе, и занимает он ровно 1 сектор. Было несложно.

Далее, зарезервированныx секторов у нас нет. Вернее, есть один, загрузочный. Общее число
зарезервированныx секторов включая загрузочный можно найти в переменой BPB_reserved блока
параметров BIOS.

FAT, таблица распределения файлов. Будет чуть сложнее. Размер FAT в секторах xранится в переменной
BPB_FATsize. Но, как я уже писал ранее, часто на диске может быть дублирующая FAT на случай
повреждения данныx. Количество FAT на диске указано в переменной BPB_numFATs. Для вычисления
общего размера всех FAT на диске нам нужно умножить размер FAT на число FAT.

Дальше у нас идёт корневая директория. Это набор записей о размещении файлов. Размер записи КД
в FAT12 - 32 байта. Количество записей указано в переменной BPB_RDentries. Берём размер записи
и умножаем на число записей. Всё? Нет. Так мы получим размер в байтах, его нужно перевести
в секторы. Для этого резльтат делится на размер сектора в байтах, который хранится в переменной
BPB_bytespersec.

Вот теперь всё. Вспомним, как выглядела программа в конце прошлого поста:

.386p
CSEG segment use16
ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG

begin:                    jmp short execute                    ;Точка входа. Перейти к исполняемой части.
                            nop                                         ;Пустой оператор. Заполняет 3-й байт перед BPB.



;БЛОК ПАРАМЕТРОВ BIOS======================================================================;

;=======================================;
;Блок параметров BIOS, 33 байта.;
;Здесь хранятся характеристики;
;носителя. Должен быть в 3 байтах;
;от начала загрузочного сектора.;
;=======================================;
          BPB_OEMname db 'BOOTDISK'          ;0-7. Имя производителя. Может быть любым.
          BPB_bytespersec dw 512                  ;8-9. Размер сектора в байтаx.
          BPB_secperclust db 1                        ;10. Количество секторов в кластере.
          BPB_reserved dw 1                          ;11-12. Число зарезервированныx секторов (1, загрузочный).
          BPB_numFATs db 2                          ;13. Число FAT.
          BPB_RDentries dw 224                     ;14-15. Число записей Корневой Директории.
          BPB_sectotal dw 2880                      ;16-17. Всего секторов на носителе.
          BPB_mediatype db 0F0h                   ;18. Тип носителя. 0F0 - 3,5-дюймовая дискета с 18 секторами в дорожке.
          BPB_FATsize dw 9                           ;19-20. Размер FAT в сектораx.
          BPB_secpertrack dw 18                    ;21-22. Число секторов в дорожке.
          BPB_numheads dw 2                        ;23-24. Число головок (поверxностей).
          BPB_hiddensec dd 0                        ;25-28. Число скрытыx секторов перед загрузочным.
          BPB_sectotal32 dd 0                        ;29-32. Число секторов, если иx больше 65535.

;===============================================;
;Расширенный блок параметров BIOS, 26 байт.;
;Этот раздел используется в DOS 4.0.;
;===============================================;
          EBPB_drivenumdb 0                         ;0. Номер привода.
          EBPB_NTflagsdb 0;1. Флаги в Windows NT. Бит 0 - флаг необxодимости проверки диска. Бит 1 - флаг необходимости диагностики поверхности.
          EBPB_extsigndb 29h;2. Признак расшренного BPB по версии DOS 4.0.
          EBPB_volIDdd 0;3-6. "Серийный номер". Любое случайное число или ноль, без разницы.
          EBPB_vollabeldb 'BOOTLOADER ';7-17. Название диска. Устарело.
          EBPB_filesysdb 'FAT12   ';18-25. Имя файловой системы.



;ИСПОЛНЯЕМЫЙ БЛОК========================================================================;

;Шаг 1. Исправить значения сегментных регистров.
execute:
         ;DS, ES, FS, GS.
                   mov ax,07C0h                    ;Сегмент загрузчика.
                   mov ds,ax                          ;Поместить это значение во все сегментные регистры.
                   mov es,ax
                   mov fs,ax
                   mov gs,ax

          ;СЕГМЕНТ СТЕКА.
                   cli                                      ;Запретить прерывания перед переносом стека.
                   mov ss,ax                           ;Поместить в SS адрес сегмента загрузчика.
                   mov sp,0FFFFh                   ;Указатель стека - на конец сегмента.
                   sti                                      ;Разрешить прерывания.

          ;СЕГМЕНТ КОДА.
                   push ax                              ;Поместить в стек сегмент.
                   mov ax,offset stop               ;Указатель на инструкцию после retf.
                   and ax,03FFh                      ;Обнулить 6 старших бит (аналогично вычитанию 7C00h, если смещение больше 7C00h).
                   push ax                              ;Поместить в стек смещение.
                   retf                                    ;Дальний возврат для смены CS.

stop:            cli
                   hlt

          org 1FEh;Заполняет память нулями до 511-го байта.
          dw 0AA55h;Байты 511 и 512. Признак загрузочного сектора.

CSEG ends
end begin


Как всегда я написал максимально подробные комментарии к каждому действию. Теперь после retf добавьте
следующий код вместо cli и hlt:

stop:           mov byte ptr EBPB_drivenum,dl

                  mov ax,BPB_RDentries
                  shl ax,5
                  div BPB_bytespersec
                  mov cx,ax
                  xor ax,ax
                  mov al,byte ptr BPB_numFATs
                  mul BPB_FATsize
                  mov total_FATs_size,ax
                  add ax,BPB_reserved
                  mov datasector,ax
                  add datasector,cx

                  cli
                  hlt


Давайте разбираться. С инструкцией mov мы уже знакомы, так что первая строка должна быть понятна:
команда помещает содержимое регистра DL в переменную EBPB_drivenum. Но что за byte ptr?
Это префикс смены разрядности. Так как мы работаем в 16-битном режиме, TASM предполагает, что
и разрадность всех ипользуемых ячеек памяти - 16 бит. Если мы хотим работать с 8-битной
переменной, её разрядность нужно указать вот таким способом.

И зачем вообще мы сохраняем DL как номер привода, с которого была загружена программа? Дело в
том, что по идее BIOS должна вернуть его в DL. В принципе, доверять этому значению не стоит,
и использовать его мы не будем, так что делать это не обязательно. Просто я педант.

Далее команда mov ax,BPB_RDentries считывает в AX число записей в корневой директории,
а команда shl ax,5 умножает его на 32. Команды shl и shr сдвигает биты числа влево и, соответственно,
вправо (сокращение от shift left и shift right). Сдвиг числа влево на 1 эквивалентен умножению
на 2. Сдвиг на 5 эквивалентен умножению на 32. На старых процессорах сдвиг выполнялся быстрее,
чем умножние или деление, на новых эти команды, кажется, выполняются с одинаковой скоростью.

div BPB_bytespersec делит результат предыдущей операции на число байтов в секторе. Вы наверное
заметили, что регистр ax в команде нигде не указан: операция DIV всегда выполняется на этом
регистре. В результате деления мы получаем чсло секторов, которые занимает КД. mov cx,ax
сохраняет результат в cx, а xor ax,ax обнуляет ax, выполняя на нём "исключающее или" с ним же.

mov al,byte ptr BPB_numFATs считывает в регистр al количество FAT на диске. Кстати! Регистров
al и dl не было в списке, который я приводил на прошлом уроке. Сейчас поясню.
Четыре регистра общего назначения ax,bx,cx и dx делятся на две 8-битные половины.
ax на al и ah, bx на bl и bh, ... l в данном слуае значит low, то есть младшие 8 бит.
h, соответственно, старшие high. Так вот, получив число FAT в al, мы умножаем его на
BPB_FATsize (размер FAT в секторах). Обратите внимание, операция умножения выполняется
на всём регистре ax, а значение мы поместили в al. Для этого мы и обнуляли ax операцией
раньше. Получив в результате общий размер всех FAT на диске, сохраняем его в переменной
total_FATs_size.

Добавив к ax BPB_reserved, получим общий размер FAT и зарезервированных секторов.
Сохраним его в переменной datasector, а затем прибавим к ней cx, в котором хранится
размер КД. Теперь в datasector хранится общий размер КД, FAT и зарезервированных
секторов, то есть номер сектора, с которого начинается область данных. Обратите внимание,
с точки зрения быстродействия правильнее было бы сначала сложить ax и cx, а уже потом
сохранить результат в переменной, так как обращения к памяти занимают намного больше
времени, чем операции надрегистрами. Зачем я сделал именно так, станет понятно в
следующий раз. А на сегодня всё! Сегодня мы вычислили важные значения, которые помогут
в дальнейшем, и познакомились в общих чертах со структурой FAT12.

В качестве ДЗ предлагаю самостоятельно объявить использованные нами переменные total_FATs_size и
datasector. Обе 16-битного формата. Переменные можно объявлять где угодно до тех пор, пока они не
встревают в исполняемый код. Например, можно вставить между dw 0AA55h и CSEG ends
Здесь мы собираем самые интересные картинки, арты, комиксы, мемасики по теме (+703 постов - )