|
Комментарии | #1 Автор: SokilOff (2022.05.08 20:16, изменений: 1, 2022.05.10 16:44) | Помню, мы когда-то конкурс проводили на самую маленькую резидентную прогу, которая на текстовом экране "находила" все символы '/', '-', '\', '|' и начинала их "вращать". Победил вариант размером 44 байта |
#2 Автор: Eugene_80286 (2022.05.09 07:39) | SokilOff, Давно еще читал какую то книгу про Turbo Pascal и там была задача сделать псевдоанимацию из этих символов) |
#3 Автор: SokilOff (2022.05.10 16:53, изменений: 3, 2022.05.10 20:06) | Собственно, вот (увы, нормальное форматирование кода в комментариях не сохраняется):
.model tiny .code .586 org 100h
run:
mov dx,offset resid mov ax,251Ch int 21h mov dl,32h int 27h
resid:
push ds pusha mov di,0B800h mov ds,di
@2: mov si,offset symbs mov cl,04
@1: lods cs:[si] dec si cmpxchg byte ptr [di],ah loopne @1
dec di dec di jnz @2
popa pop ds iret
symbs db '-','\','|','/','-'
end run |
#5 Автор: uav (2022.05.12 00:04) | Интересная программа, очень проработанная в плане ужатия размера. Я практически ничего не придумал в плане уменьшения. Можно убрать один dec di, программа при этом как бы работает, хоть алгоритм получается неправильный. Позволяет сэкономить 1 байт. :-) После ещё можно di не инициализировать (ещё минус 1 байт), заменив блок
mov di,0B800h mov ds,di
на
push 0B800h pop ds
При этом программа тоже работает (как бы), но стабильность существенно падает (чёрточки-то вращаются, но клавиатура перестаёт нормально реагировать и т.п.). В общем, без потерь качества ничего не получилось уменьшить. |
#6 Автор: SokilOff (2022.05.12 01:33) | uav,
>Можно убрать один dec di, программа при этом как бы работает, хоть алгоритм получается неправильный.
Значит убрать нельзя ;)
>чёрточки-то вращаются, но клавиатура перестаёт нормально реагировать и т.п.
Инициализация через регистр, а не через стэк, сделана не просто так. |
#7 Автор: uav (2022.05.12 02:39) | Ну так понятно, что попутно в DI заносится нужное значение.
> Значит убрать нельзя ;)
На практике программа при этом работает, т.к. в большинстве программ не происходит совпадений атрибутов с символами "чёрточек". Но где-то такие совпадения могу быть - при этом некоторые символы изменят цвет. Ну и второе следствие - более медленная работа, т.к. при одном dec di проверяется вдвое больший объём данных Вообще, если всё делать чисто, то в исходной программе надо делать не mov cl,4, а mov cx,4 (плюс один байт), т.к. состояние cx при вызове прерывания 1c неизвестно, соответственно, цикл может получится не из 4-х шагов, а любой, скажем, если изначально в cx было 01FFh, то после mov cl,4 там будет 0104h, ну и шагов при проверке будет сделано столько же. Ну и в чистом варианте (если не гнаться за размером) надо в конце передать управление прошлому обработчику int 1Ch, иначе клавиатура не совсем корректно работает (я про исходный вариант, а не про свои модификации), ну и другие глюки могут быть - если были другие перехватчики этого прерывания. |
#8 Автор: SokilOff (2022.05.12 14:32, изменений: 2, 2022.05.12 14:33) | >Но где-то такие совпадения могу быть - при этом некоторые символы изменят цвет.
Вместо символа будет изменён его цветовой атрибут.
Про CX вместо CL - да, но с CL хотя бы визуально работает корректно. Про сохранение оригинального адреса обработчика int 0x1C и передачу управления на него - тоже да, но это выходит за рамки задачи. |
#9 Автор: uav (2022.05.12 15:55, изменений: 1, 2022.05.12 15:56) | Возвращаясь к исходной программе The Animated O - в описании сказано, что "в DOSBoxе на нажатие шифтов программа не реагирует", но у меня всё нормально - нужно только оба шифта секунду подержать. Экран очищается и программа отключается. Добавил скрин, кстати, в виде GIF-анимации. В DOSBox, помнится, иногда некоторые программы не реагируют на клавиши, если запущен Keyrus. Может, и тут было из-за этого? |
#10 Автор: Eugene_80286 (2022.05.13 07:24) | uav, Смотрел я в DOSBox SVN-Daum, там почему не сработало. Бывает. |
| |
|