Печать с наложением
Apr. 6th, 2023 11:32 amВ форматной печати языка Фортран есть интересная особенность: если первый символ строки это '+', то строка печатается поверх предыдущей. Переход на новую строку не происходит. Эта штука работала и на БЭСМ-6.
К примеру, программа на Фортране:
Выдача dispak --native:
Посмотрим, как выглядит поток байтов на уровне экстракода Э64. Интересно, что есть разница между ОС Диспак и ОС Дубна.
Трассировка dispak:
Читаем диспаковское описание Э64:
Похоже на багу в диспаковской реализации Э64. Причём в Дубне этой баги нету, поэтому там символ наложения прекрасно отрабатывает с первой позиции. А в Диспаке решили багу не править, вместо этого документировать и превратить в фичу. 😀
К примеру, программа на Фортране:
print 1000
1000 format(' --' / '+foobar')
напечатает одну строку с минусами поверх букв OO:FO̵O̵BARСимулятор dispak с флагом --native, то есть с реализацией экстракода Э64, взятой в бинарниках из кода Диспак, выдаст максимально возможное подобие: две строки, где первая заканчивается символом '\', означающим наложение.
Выдача dispak --native:
Заметьте, что буква F "проваливается" в первую строку. То есть для символов из строки наложения сначала делается попытка поместить их в первую строку, если там пробелы. Если же там занято, то первая строка выводится целиком, и формируется новая строка из оставшихся символов.F--\
OOBAR
Посмотрим, как выглядит поток байтов на уровне экстракода Э64. Интересно, что есть разница между ОС Диспак и ОС Дубна.
Трассировка dispak:
Трассировка dubna:017 017 017 013 013 172
--
017 212 100 056 056 042 040 107 172
FOOBAR
Видим, что режим наложения задаётся символом '212'. В Дубне он стоит в первой позиции, за ним пробел '017'. В Диспаке символ '212' стоит на второй позиции, и пробел перед ним. Странно.017 017 017 013 013 231
--
212 017 100 056 056 042 040 107 231
FOOBAR
Читаем диспаковское описание Э64:
Наложение (212b) - обеспечивает наложение той строки, в которой данный код использован, на предыдущую строку; для этого код 212b должен содержаться во второй (при нумерации с единицы) позиции; при печати он будет заменен пробелом.Должен содержаться во второй позиции! Я пробовал ставить '212' в первой или третьей позициях - действительно, наложения не происходит. Вместо этого делается "прыжок" на 12-ю позицию текущей строки.
Похоже на багу в диспаковской реализации Э64. Причём в Дубне этой баги нету, поэтому там символ наложения прекрасно отрабатывает с первой позиции. А в Диспаке решили багу не править, вместо этого документировать и превратить в фичу. 😀
no subject
Date: 2023-04-07 08:19 pm (UTC)no subject
Date: 2023-04-07 08:49 pm (UTC)