Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13

Тема: Christmas Tree Event - рисуем елочку =)

  1. #1
    Master
    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    905
    Спасибо Благодарностей отдано 
    76
    Спасибо Благодарностей получено 
    205
    Поблагодарили
    153 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Christmas Tree Event - рисуем елочку =)

    К сожалению, узнал об этом конкурсе только вчера от Manwe в этой темке https://zx-pk.ru/threads/34009-bk-by...=1#post1140654
    В посте Manwe ссылка на результаты (последняя колонка - размер в байтах), ссылка на сам эвент (описание): http://logiker.com/Vintage-Computing...Challenge-2021
    Спектрум, как ни странно, глубоко в эээ середине, непорядок. Решил помучать свои мозги, заранее условившись не смотреть готовые решения вообще, для любой платформы.
    В правилах ничего не сказано про запреты на использование особенностей компа, поэтому код использует процедуру печати ПЗУ, а также некоторые трюки для сокращения объема:

    - при запуске кода из Бейсика регистровая пара BC равняется адресу запуска. Используем, ибо нефиг
    - сам адрес запуска, т.е. пара BC, указывает на массив данных для вывода строк
    - в то же время, адрес кода (данных) рассчитан так, чтобы регистр C пригодился как счетчик строк, а регистр B экономит один байт при подсчете координат вывода
    - вывод идет в служебный экран, это фича Спектрум-Бейсика при запуске кодов. Экономим память, убирая инициализацию основного потока (экрана)
    - в условиях не сказано, что код обязан возвращать управление, поэтому для предотвращения очистки служебного экрана прога "вешается", дабы не выходить в Бейсик
    - адрес запуска не совпадает с адресом загрузки блока, что тоже не является обязательным
    - исходя из пункта один, корректный запуск возможен только из Бейсика. Можно просто запустить файл TRD в эмуляторе, на диске уже записан "boot" для загрузки и запуска кода

    Размер моей версии - 35 байт. 14 байт данных строк "елочки" плюс 21 байт программы, это 15 команд Z80.
    Однако ниже по топику char указал, как сократить программу еще на три байта, за что заслуживает почетной медали
    Итоговый размер (пока?) - 32 байта. Код сократился до 13 команд и занимает 18 байт, плюс те же 14 байт данных. Улучшенная версия приложена.
    Конечно, конкурс довольно специфический, и является неким писькомерством, но потренировать мозги было интересно.
    Версия для ПК8000 от Ivagor, 42 байта: https://zx-pk.ru/threads/8378-pk8000...=1#post1140692 но и там есть подвижки в сторону уменьшения.

    Christmas_Tree_by_reddie.zip

    Christmas_Tree_by_char_and_reddie_for_ZX_Spectrum.zip

    Последний раз редактировалось reddie; 27.12.2021 в 07:09.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Veteran Аватар для Manwe
    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,722
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    403
    Поблагодарили
    256 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Отличный результат!
    А о конкурсе мы сами узнали в последний день – каждый из трёх участников на БК 0010 писал свою программу за один вечер.
    Так-то понятно, что у 8-битного компьютера больше шансов выйти вперёд, чем у 16-битного. Поэтому меня и удивило, что БК 0010 смог обойти только C64 в этом конкурсе.
    manwe.pdp-11.ru

  4. #3
    Master
    Регистрация
    16.12.2014
    Адрес
    г. Ожерелье
    Сообщений
    743
    Спасибо Благодарностей отдано 
    223
    Спасибо Благодарностей получено 
    40
    Поблагодарили
    39 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Manwe Посмотреть сообщение
    Отличный результат!
    А о конкурсе мы сами узнали в последний день – каждый из трёх участников на БК 0010 писал свою программу за один вечер.
    Так-то понятно, что у 8-битного компьютера больше шансов выйти вперёд, чем у 16-битного. Поэтому меня и удивило, что БК 0010 смог обойти только C64 в этом конкурсе.
    Там ещё Коммодор+4 впереди, а это не 64; На самом деле, думаю там практически любая машина с 6502 могла запустить примерно тот же код, что и Коммодор 64 или +4.

    - - - Добавлено - - -

    Цитата Сообщение от reddie Посмотреть сообщение
    К сожалению, узнал об этом конкурсе только вчера от Manwe в этой темке https://zx-pk.ru/threads/34009-bk-by...=1#post1140654
    В посте Manwe ссылка на результаты (последняя колонка - размер в байтах), ссылка на сам эвент (описание): http://logiker.com/Vintage-Computing...Challenge-2021
    Спектрум, как ни странно, глубоко в эээ середине, непорядок. Решил помучать свои мозги, заранее условившись не смотреть готовые решения вообще, для любой платформы.
    В правилах ничего не сказано про запреты на использование особенностей компа, поэтому код использует процедуру печати ПЗУ, а также некоторые трюки для сокращения объема:

    - при запуске кода из Бейсика регистровая пара BC равняется адресу запуска. Используем, ибо нефиг
    - сам адрес запуска, т.е. пара BC, указывает на массив данных для вывода строк
    - в то же время, адрес кода (данных) рассчитан так, чтобы регистр C пригодился как счетчик строк, а регистр B экономит один байт при подсчете координат вывода
    - вывод идет в служебный экран, это фича Спектрум-Бейсика при запуске кодов. Экономим память, убирая инициализацию основного потока (экрана)
    - в условиях не сказано, что код обязан возвращать управление, поэтому для предотвращения очистки служебного экрана прога "вешается", дабы не выходить в Бейсик
    - адрес запуска не совпадает с адресом загрузки блока, что тоже не является обязательным
    - исходя из пункта один, корректный запуск возможен только из Бейсика. Можно просто запустить файл TRD в эмуляторе, на диске уже записан "boot" для загрузки и запуска кода

    Итоговый размер кода - 35 байт. 14 байт данных строк "елочки" плюс 21 байт программы, это 15 команд Z80. Спектрум рулит, просто нужно творчески подходить к делу.
    Конечно, конкурс довольно специфический, и является неким писькомерством, но потренировать мозги было интересно.
    Версия для ПК8000 от Ivagor, 42 байта: https://zx-pk.ru/threads/8378-pk8000...=1#post1140692

    Christmas_Tree_by_reddie.zip

    Ну и ну! Надо было спектрумистов тоже приглашать... Но это уже было бы какое-то вторжение.

  5. #4
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    достаточно RRA вместо SRA A

  6. #5
    Master
    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    905
    Спасибо Благодарностей отдано 
    76
    Спасибо Благодарностей получено 
    205
    Поблагодарили
    153 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от char Посмотреть сообщение
    достаточно RRA вместо SRA A
    Если после RST 16 флаг переноса всегда устанавливается - то да. Настолько глубоко в дебри ПЗУ не залазил
    Думал еще поиграться с вариантов с циклами, но вряд ли он окажется короче. Потом как-нибудь попробую.
    Кстати, организатор конкурса ответил мне на почту, обещал выложить и мой вариант. Пока 35 байт это рекорд, но...
    Цитируя его: программа под ДОС (MS-DOS, видимо) на данный момент весит 36 байт, но ребята работают над этим =)

  7. #6
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    еще можно перед print убрать одну RST 16 и в таблице все значения уменьшить на 1

    - - - Добавлено - - -

    а можно и два rst 16 убрать, 32 байта

    Код:
    	defb	-3-2,-3-2,-23-2,-17-2,-11-2,-5-2,-15-2,-11-2,-7-2,-3-2,-7-2,-5-2,-3-2,-1-2
    
    start
    	dec	c
    	jr	z,$	;stop when finished
    
    	ld	a,23	;set coords via ROM procedure
    	rst	16
    	ld	a,(bc)	;line len in negative format
    	ld	e,a
     rra
    	sub	b	;centering
    print
    	rst	16
    	ld	a,"*"
    	inc	e
    	jr	nz,print
    	jr	start
    end

  8. Этот пользователь поблагодарил char за это полезное сообщение:

    reddie (26.12.2021)

  9. #7
    Master
    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    905
    Спасибо Благодарностей отдано 
    76
    Спасибо Благодарностей получено 
    205
    Поблагодарили
    153 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от char Посмотреть сообщение
    еще можно перед print убрать одну RST 16
    Да, команде TAB второй байт, в общем-то, пофиг, можно и звездочку вместо него скормить. И после RST 16 действительно флаг выставляется как надо.
    Итого ужали еще на три байта. Что лишний раз подтверждает истинность фразы "любую программу можно сократить минимум еще на байт" =))
    Но для этого нужно время и желание, а эти ресурсы не бесконечны. Хотя теперь код близок к идеалу. по-моему.

  10. #8
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,042
    Спасибо Благодарностей отдано 
    934
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    122 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    Cool

    На спектруме, вообще не нужна программа, чтобы рисовать такую ёлку. Просто надо написать одну строчку.
    Вложения Вложения

  11. #9
    Master
    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    905
    Спасибо Благодарностей отдано 
    76
    Спасибо Благодарностей получено 
    205
    Поблагодарили
    153 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот только длина этой бейсик-программы в разы больше ассемблерной, а суть конкурса была именно в минимизации.

  12. #10
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,042
    Спасибо Благодарностей отдано 
    934
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    122 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Программы? Ноль байтов.
    Это не программа, это команда. Составная.

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Russian Demoscene Winter Event 2016
    от TmK в разделе События
    Ответов: 36
    Последнее: 04.12.2015, 16:50
  2. 30th Anniversary Event
    от SaintTurnip в разделе Amiga
    Ответов: 0
    Последнее: 13.08.2015, 17:58
  3. Ответов: 3
    Последнее: 10.05.2012, 09:06
  4. Рисуем на BORDER
    от breeze в разделе Программирование
    Ответов: 42
    Последнее: 19.03.2009, 09:56
  5. рисуем круги
    от jim в разделе Программирование
    Ответов: 1
    Последнее: 07.10.2006, 10:09

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •