Эта история напоминает классическую из ZX-Ревью на тему процедуры гашения экрана аттрибутами. Там тоже была гонка байтов, потеря качества работы, дикий угар. Очень одобряю! То, что меняется при этом визуальная составляющая это совершенно нормально, так как она в начале пути не была четко определена (лабиринт, например).
Прикольно, все старательно не замечают 0-байтовый (на самом деле 1-байтовый) лабиринт: www.pouet.net/prod.php?which=65319
Да, сразу скажу, что меряют длину кодового блока, не учитывают длину бейсика, длины заголовков и т.д. Так что 1-байтовый лабиринт, да. Не больший читинг, чем устанавливать все регистры и генерить половину кода в памяти бейсиком.
его и не надо замечать, это фэйк из всех фэйков. почему? потому что во всех других вариантах есть настоящий код, который печатает (рст 10 + манипуляции с регами для вывода слешей). и именно этот код измеряется, этот код встраивается в некое более-менее стандартное окружение. и это интересно — найти минимум байт, при загрузке которых оно начнет делать то, что хочется.
0б — это фикция. там кода много байт, просто он загружается косвенно, но загружается, но нам рассказывают, что байт нет или он один.
Не больший читинг, чем устанавливать все регистры и генерить половину кода в памяти бейсиком.
да не генерится никакая половина кода бейсиком, там просто честный лоад и уср. это просто реюзание памяти. а то можно ведь сделать бейсик в который незаметно вшить код и назвать это true-0b. там будет rand usr 0 и всё.
не надо превращать соревнование по сокращению кода в соревнования по прятанию кода.
Сравнения имели бы смысл, если бы это было какое-то компо с зафксированными правилами. А так у alone прикольный хак и у psb прикольный хак, но совершенно другого плана.
На комоде, например, печатать весь лабиринт заставляют ПЗУ, хитро запатчив ему область память с переменными и небольшими кусочками кодов.
Каждая из 7b, 6b и 5b требует определённых манимуляций с бейсиком, после чего в области памяти #FFxx (где стек) появляются некоторые байтики, которые, будучи исполненными, оказываются подходящими, чтобы закрутить процедуркам цикл и как-то модифицировать регистры. Вопрос — включать ли это в длину кода, или нет, и почему? Если включаем, то тогда далеко не 7 байт будет, если нет и меряемся только длиной части с данными кодового блока, то 0б (1б) — победитель, ведь трюки-то любые никто не запрещал.
Длинами кодовых блоков логично меряться, когда в них весь исполняемый код. Иначе получается мерялка — кто круче извратится, либо надо меряться длиной TAP-файла.
1. Из длины комодоровских процедур надо вычитать 2. Т.е. настоящая длина 11 и 9 байт соответственно. И ещё, эти блоки грузятся в 0ую страницу по адресу $7С. Там, в основном, лежат системные переменные биоса и бейсика, но и кусочки кода тоже. Судя по всему, они хитро патчат эти кусочки. Основной цикл, кстати, крутится в ПЗУ! Глубже не копал.
2. Оказывается, чуть раньше Gasman'овского threadzx на пц появился Maze 8b. Правда, лабиринт там неклассический, если судить по скриншоту.
если исключать читерство, то… а что такое читерство?:) имхо, самый чит в этих 7 6 5 байтах — команда зацикливания — она создается на стеке, когда пользователь вводит RUN . именно поэтому там нет автозапуска. ок, предположим, мы не можем юзать такой «сложный и неустойчивый» подход. но регистры-то реюзать можем? если да, то вот вариант 8 байт (работает даже на каком-то SE Basic ROM):
loop:
org 0xd1xx
cp (hl) ; random byte (random CY)
dec l ; . . .
sbc a,a ; -> a=FF or 00
and h ; h=2d -> a=2d or 00
sub b ; b=d1 -> a+=2f
rst 0x10 ; a=2f or 5c
jr loop
Я просто напомню, что тег z80 делает страничку веселее:
loop:
org 0xd1xx
cp (hl) ; random byte (random CY)
dec l ; . . .
sbc a,a ; -> a=FF or 00
and h ; h=2d -> a=2d or 00
sub b ; b=d1 -> a+=2f
rst 0x10 ; a=2f or 5c
jr loop
19 комментариев
сдается мне, что и это не предел, особенно если пожертвовать красотой лабиринта.
Придется апдейтить заголовок?
лабиринт не совсем рандомный, но норм! 5 байт.
Да, сразу скажу, что меряют длину кодового блока, не учитывают длину бейсика, длины заголовков и т.д. Так что 1-байтовый лабиринт, да. Не больший читинг, чем устанавливать все регистры и генерить половину кода в памяти бейсиком.
0б — это фикция. там кода много байт, просто он загружается косвенно, но загружается, но нам рассказывают, что байт нет или он один.
да не генерится никакая половина кода бейсиком, там просто честный лоад и уср. это просто реюзание памяти. а то можно ведь сделать бейсик в который незаметно вшить код и назвать это true-0b. там будет rand usr 0 и всё.
не надо превращать соревнование по сокращению кода в соревнования по прятанию кода.
А сравнивать их, это как теплое и мягкое.
1) на других платформах так же были хаки?
2) если не было, то какие все таки честные объемы рабочих процедур на ZX?
Каждая из 7b, 6b и 5b требует определённых манимуляций с бейсиком, после чего в области памяти #FFxx (где стек) появляются некоторые байтики, которые, будучи исполненными, оказываются подходящими, чтобы закрутить процедуркам цикл и как-то модифицировать регистры. Вопрос — включать ли это в длину кода, или нет, и почему? Если включаем, то тогда далеко не 7 байт будет, если нет и меряемся только длиной части с данными кодового блока, то 0б (1б) — победитель, ведь трюки-то любые никто не запрещал.
чур я не писец:) уломайте алона написать, заодно и повод зарегаться:)
2. Оказывается, чуть раньше Gasman'овского threadzx на пц появился Maze 8b. Правда, лабиринт там неклассический, если судить по скриншоту.