Буквально на прошлой неделе на Riverwash 2009 простой чешский парень Jan Kadlec (aka Řrřola) забомбил PC 256 byte intro которое установило новый мировой порядок. Имя ему — Puls.
Итак речь идет о куске машинного кода в 256 байт для Intel x86 совместимой машины. Работает он под DOS, совершенно равнодушен к 3D возможностям вашей видеокарты и объемам установленного ОЗУ, но не откажется от быстрого CPU. Код генерирует динамическую визуальную сцену используя базовые возможности Intel архитектуры и стандартного видеорежима.
Собственно, надеюсь, у всех есть понимание что такое 256 байт в масштабах хотя бы текста SMS сообщения, и как в таком объеме можно уместить этот движняк для многих остается непонятным. При этом рядом исходник на ассемблере который заставляет уверовать.
Обычно в этом месте обыватель задает вопрос: “Здорово! А как мы это можем использовать?”
Отвечаю примером для 9-го класса:
«Вояджер-1» — 722-килограммовый автоматический зонд, исследующий солнечную систему и её окрестности с сентября 1977 года. Осенью 2008 г. «Вояджер-1» был примерно в 107,58 а. е. (16,093 млрд км) от Солнца выйдя за пределы солнечной системы. На борту корабля три радиоизотопных термоэлектрических генератора которые обеспечивают зонду питание. Радиосвязь с ним есть и корабль может передавать и принимать данные телеметрии.
Одна проблема – сигнал идет до земли 14 часов. При этом интернеты не говорят нам с какой скоростью идет обмен, но можно предположить, что она не превышает 300 бод (индустриальный стандарт тех времен).
Короче очень и очень медленно. Теперь представьте, что надо этому зонду ВНЕЗАПНО, одним пакетом, передать инфу о смене траектории движения, включении дальнего света и противотуманок, а так же запуске программы визуального приветствия жителей других галактик. Причем видеоряд этого приветствия надо передать на зонд заново — старая запись 1977 года уже не актуальна в свете последних политических изменений.
Вот в такой ситуации без искусства программирования компактного, но функционального кода под процессор стоящий на Вояджере-1 не обойтись!
Такой вот пример
Если по прямым http линкам будут проблемы со скачиванием используйте зеркало на ftp.scene.org/incoming/parties/riverwash3009/in256
habr.com
Чем (среди прочего) мне нравится демосцена, так это тем что, приступая к работе, понятия не имеешь, что в итоге получишь. Среди нескольких идей, что именно написать, конкретно вот этой не было точно. Две были отброшены потому, что изображение на эмуляторе и реальном Vectrex’e слишком уж отличалось — после каждой сборки заливать всё это в эмулятор ПЗУ и перетыкать его в Vectrex чтобы посмотреть, что получилось — нереально.
Третью идею я было начал реализовывать, но уже в процессе увидел, что сделать такое красиво в 256 байт — слишком сложно. Но, в процессе что-то там переглючило и напомнило пружину. Вот эту идею я, в итоге, и развил:
Важным признаком хорошей демо является, на мой взгляд, использование преимуществ именно той платформы, под которую пишется работа. Сильные стороны есть почти у всех компьютеров — на одних это аппаратный скроллинг, на других поддержка большого количества спрайтов, на третьих — мощный процессор. В данном случае оказалось возможным нарисовать «витки» пружины не при помощи вычислений координат каждой точки кривой, как это пришлось бы делать на других компьютерах, а аппаратным способом: при нарастающем напряжении на ЦАП канала Y (вертикаль), через короткие равные промежутки времени менять напряжение на ЦАП канала X (горизонталь), в результате чего получалась кривая, похожая на синусоиду. Причём, для каждой последующей «пружины» амплитуда отличалась и, соответственно, они имеют разную ширину («диаметр»).
Очевидно, пружины должны сжиматься, иначе какие это пружины? «Сжатие» обеспечивается изменением напряжения по вертикали. Говоря точнее, изменением разницы между напряжением в точке, где луч начинает отрисовку пружины (внизу) и точкой, где пружина заканчивается (вверху).
Однако, простым увеличением и уменьшением этой разницы здесь не отделаешься — для пружин в такой ситуации естественна разная скорость сжатия взависимости от текущей растянутости. И вот тут уже без вычислений не обойтись… Понятно, что процессор 6809 команды для вычисления синусов не имеет, а табличка синусов для 256 байтной интро — слишком большая роскошь. К счастью, покопавшись в исходниках ПЗУ Vectrex, я обнаружил там по адресу $fc6d табличку, отлично подходящую для такого случая:
RTRIGS FCB 0,25,50,74 SINE TABLE- 16 ANGLES/QUADRANT
FCB 98,121,142,162 VALUES REPRESENT SINE*256
FCB 181,198,213,226
FCB 237,245,251,255
FCB 255,255,251,245
FCB 237,226,213,198
FCB 181,162,142,121
FCB 98,74,50,25
lsra
lsra
Теперь следующая проблема — кому интересна единственная пружина, прыгающая на одном месте? Так ни компо не выиграешь, ни лайков не наберёшь — пружины должны прыгать одна за другой.
Поскольку состояние пружины в любой момент времени полностью определяется выбранным из таблицы синусов значением, логично хранить это значение отдельно для каждой из пружин. Выбираем адрес в ОЗУ, где будем это дело хранить. Но, предварительно, нужно эту табличку проинициализировать начальными значениями. И не любыми, чтобы в шествии был некоторый порядок. Резервируем несколько байт в ПЗУ, а потом копируем в ОЗУ:
springs equ $C890 ; index in sine table for each spring ... ldu #springstmp ldx #springs lda #(3*3) jsr Move_Mem_a ; A - byte count, U - source, X - destination ... springstmp: db 15, 20, 25
Табличка синусов небольшая, поэтому если на каждую итерацию стандартного цикла Vectrex «по кадрам» брать следующее значение, пружины будут скакать очень быстро. Поэтому, берём из таблички следующее значение не каждую итерацию (но рисуем-то конечно в каждую, иначе будет мерцать):
ldb ,x ; загружаем в b индекс в таблице синусов для очередной кривой (по адресу, находящемуся в регистре x)
...
lda frames_c
bita #$03
bne skipinc ; пропуск
incb ; следующий индекс в таблице синусов
skipinc:
stb ,x+ ; сохраняем индекс из b обратно, откуда взяли. И заодно увеличиваем адрес в x на единицу
ldb #$40 ; end dot brightness (20-30 is ok for release)
repeat_dot:
decb
bne repeat_dot
clr <VIA_shift_reg ; Blank beam in VIA shift register
lda #$ff ; максимальный масштаб sta <VIA_t1_cnt_lo ldd #(-60*256+(-54)) ; Y,X. Перемещаем выключенный луч в начальную точку jsr Moveto_d ldd #(0*256+(127)) ; Y,X Перемещаем включенный луч до конечной jsr Draw_Line_d
1. При выводе строк процедурами BIOS (там с помощью пунктирных векторов имитируется растровые символы) при увеличении длины строки она начинает наклоняться, так что где-то после 10 символа уже трудно что-то разобрать.
2. С уменьшением высоты, пружины начинает перекашивать влево. Это не «так задумано» — это проблема конкретного экземпляра Vectrex’a. Я попросил владельца двух других машин заснять, как выглядит intro у него. Легко заметить, что разница существенная:
Хотя звук в 256 байтных intro встречается довольно редко, если такая возможность есть — грех ей не воспользоваться.
Чем хорош BIOS Vectrex — в нём припасена не только простая подпрограмма для проигрывания примитивных мелодий, но и несколько примеров самих мелодий (по десятку-другому байт на каждую). Для большой демо это конечно нельзя использовать, но для 256 байт intro — отличная «вишенка на торте»:
ldu #$fe38
jsr Init_Music_chk ; Initialize the music
...
; внутри цикла, регулярно:
jsr Do_Sound
habr.com
1 Байт = 9.31×10-10 Гигабайт | 10 Байт = 9.313×10-9 Гигабайт | 2500 Байт = 2.3283×10-6 Гигабайт |
2 Байт = 1.863×10-9 Гигабайт | 20 Байт = 1.8626×10-8 Гигабайт | 5000 Байт = 4.6566×10-6 Гигабайт |
3 Байт = 2.794×10-9 Гигабайт | 30 Байт = 2.794×10-8 Гигабайт | 10000 Байт = 9.3132×10-6 Гигабайт |
4 Байт = 3.725×10-9 Гигабайт | 40 Байт = 3.7253×10-8 Гигабайт | 25000 Байт = 2.3×10-5 Гигабайт |
5 Байт = 4.657×10 | 50 Байт = 4.6566×10-8 Гигабайт | 50000 Байт = 4.7×10-5 Гигабайт |
6 Байт = 5.588×10-9 Гигабайт | 100 Байт = 9.3132×10-8 Гигабайт | 100000 Байт = 9.3×10-5 Гигабайт |
7 Байт = 6.519×10-9 Гигабайт | 250 Байт = 2.328×10-7 Гигабайт | 250000 Байт = 0.000233 Гигабайт |
8 Байт = 7.451×10-9 Гигабайт | 500 Байт = 4.657×10-7 Гигабайт | 500000 Байт = 0.000466 Гигабайт |
9 Байт = 8.382×10-9 Гигабайт | 1000 Байт = 9.313×10-7 Гигабайт | 1000000 Байт = 0.000931 Гигабайт |
convertlive.com
1 Мегабайт = 1048576 Байт | 10 Мегабайт = 10485760 Байт | 2500 Мегабайт = 2621440000 Байт |
2 Мегабайт = 2097152 Байт | 20 Мегабайт = 20971520 Байт | 5000 Мегабайт = 5242880000 Байт |
3 Мегабайт = 3145728 Байт | 30 Мегабайт = 31457280 Байт | 10000 Мегабайт = 10485760000 Байт |
4 Мегабайт = 4194304 Байт | 40 Мегабайт = 41943040 Байт | 25000 Мегабайт = 26214400000 Байт |
5 Мегабайт = 5242880 Байт | 50 Мегабайт = 52428800 Байт | 50000 Мегабайт = 52428800000 Байт |
6 Мегабайт = 6291456 Байт | 100 Мегабайт = 104857600 Байт | 100000 Мегабайт = 104857600000 Байт |
7 Мегабайт = 7340032 Байт | 250 Мегабайт = 262144000 Байт | 250000 Мегабайт = 262144000000 Байт |
8 Мегабайт = 8388608 Байт | 500 Мегабайт = 524288000 Байт | 500000 Мегабайт = 524288000000 Байт |
9 Мегабайт = 9437184 Байт | 1000 Мегабайт = 1048576000 Байт | 1000000 Мегабайт = 1048576000000 Байт |
convertlive.com
128 байт
127 байт
255 байт
Какая модель памяти используется при создании .COM-программ?
Выберите один ответ:
.tchuge
small
.medium
.tiny
Резидентная программа:
Выберите один ответ:
— перехватывает резидентные вирусы
— постоянно находится на жестком диске
— постоянно находится в оперативной памяти
Перехватывает выполнения обработчика программы и вставляет вместо него вредоносный код.
— стартует сразу же при запуске компьютера;
Какой компонент современного процессора выполняет команды по выполнению оперций с плавающей точкой?
Выберите один ответ:
ALU
FPU
GPU
CPU
К микросхеме ПЛИС стенда SDK-1.1 подключены? (выбрать правильные ответы)
Выберите один или несколько ответов:
Матричная клавиатура
Аналоговые порты ввода
Термодатчик
Линейка светодиодов
Модуль ЖКИ
шина l2C
Дискретные порты ввода/вывода
Что находится в каждом элементе таблицы векторов прерываний ПК, работающего под управлением MS DOS ?
Выберите один ответ:
п/программа обработки прерывания
Номер прерывания, подлежащего обработке
размер п/программы обработки прерывания
Начальный адрес обработчика прерываний;
Назначение данного фрагмента программы?
mov AX,0B800h ; адрес видеобуфера в компьютере IBM PC.
mov ES,AX
MOV SI, 0
MOV Dl, 0
MOV AH, 3Fh
MOV CX, Len_str ; длина строки msg
M1:
MOVAL, msg[SI]
MOV ES:[DI], AX
INC SI
INC Dl
INC Dl
Loop M1
Выберите один ответ:
Вывод на экран строки длиной Len_str с использованием функции 3Fh.
Запись строки msg в файл с использованием функции 3Fh;
Вывод на экран строки msg с использованием текстового видеобуфера.
Вывод на экран строки msg с использованием функции 3Fh;
Если адресное пространство памяти размером 64 Кб поделено с помощью 5-ти старших разрядов ША, то размер одного поддиапазона адресов будет равен:
Выберите один ответ
5 Кб
2 Кб
8 Кб
4 Кб
Источники прерывания микроконтроллеров семейства МК-51 (в базовой версии)?
Выберите один ответ:
Два внешних, одно от последовательного порта, два от таймеров-счетчиков;
Два внешних, два от последовательного порта, два от таймеров-счетчиков;
одно от АЦП, два от последовательного порта, два от таймеров-счетчиков.
Три от таймеров-счетчиков, три внешних, два от последовательного порта;
Даны два числа 7 и 8: перевести эти числа в двоичный дополнительный код и сложить.
Выберите один ответ:
8Fh
F1h
F0h
F8h
Назначение «0» в ASCIIZ-строке?
Выберите один ответ:
с помощью «0» программа определяет, в каком сегменте (данных или кода) хранится ASCIIZ-строка.
с помощью «0» функции работы с файлами определяют конец строки;
с помощью «0» программист сообщает программе, что объявлена ASCIIZ-строка
с помощью «0» программа отличает имена строк от имён файлов
Назначение сигнала на входе Т шинного формирователя (ШФ)?
Выберите один ответ
При OЕ=0 сигнал на входе Т определяет направление передачи данных
При ОЕ=0 и Т=1 работа ШФ запрещена
При ОЕ=0 и Т=1 передача данных А>В
При OE=0 и T=0 входы и выходы ШФ переключаются в Z-состояние
Какой регистр в ADuC812 служит для задания режимов работы т/с0 и т/с1?
Выберите один ответ
— TCON
TMOD
SCON
IE
Двоично-десятичный (BCD) формат представления чисел; определите формат представления следующего числа и сколько байт памяти потребуется для его хранения? 09070305h
Выберите один ответ:
распакованный формат, 8 Байт.
распакованный формат, 4 Байт
упакованный формат, 4 Байт;
упакованный формат, 5 Байт
Определите семисегментный код цифры 9 для индикатора с общим катодом (см. рис).
Выберите один ответ:
5Fh
3Fh
6Fh
7Fh
Отличительная особенность микросхем динамических ОЗУ.
Выберите один ответ:
очень высокое быстродействие
энергонезависимость хранимой информации
очень низкое быстродействие
требуется периодическое восстановление хранимых в ОЗУ данных
Функциональные узлы базовой версии МК-51 и их назначение.
a)-генератор тактовых импульсов (ГТИ):
Выберите один ответ:
формирование временных интервалов, кратных одному МЦ
формирование прямоугольных импульсов с периодом, равным одному машинному такту
формирование временных интервалов, кратных одному командному циклу
формирование прямоугольных импульсов с периодом, равным 1 сек
Какой из циклов в общем случае включает в себя несколько составляющих (этапов):
-выборку команды;
-формирование адреса следующей команды;
-декодирование команды;
-вычисление адресов операндов;
-выборку операндов;
-исполнение операции;
-формирование признака результата; -запись результата.
Выберите один ответ:
цикл рекурсии
цикл команды
машинный цикл
Цикл шины
В основе этой архитектуры лежит принцип универсальности: структура команд упрощена, инструкции имеют фиксированную длину, регистры однородны по функциональному назначению. Для процессора это означает простоту реализации блока дешифраторов и соответственно более высокую скорость исполнения инструкций. Количество команд — около 50. каждая команда выполняется за один такт процессора. Определите данную архитектуру.
Выберите один ответ:
CISC
RISC
PISC
ARM
Функции сигнала «сброс» МП-pa? Выбрать правильные ответы.
Выберите один или несколько ответов
остановить работу ГТИ микропроцессора
установка внутренних регистров МП-pa в исходное состояние:
остановить работу МП-ра
микропроцессор начинает выполнять программу сначала.
Назначение счетчика команд микропроцессора.
Выберите один ответ:
Фиксация (хранение) адреса вершины стека.
Дешифрация КОП текущей команды исполняемой программы
Фиксация (хранение) адреса текущей команды исполняемой программы
Фиксация (хранение) адреса текущей команды исполняемой программы; фиксация (хранение) КОП текущей команды исполняемой программы;
Сколько типов (№) прерываний содержит таблица указателей векторов прерываний в IBM PC?
Выберите один ответ:
512
1024
255
256
Общее число регистров общего назначения в ADuC812 и на сколько частей (банков) они поделены?
Выберите один ответ
studfiles.net
1 Гигабайт = 1073741824 Байт | 10 Гигабайт = 10737418240 Байт | 2500 Гигабайт = 2684354560000 Байт |
2 Гигабайт = 2147483648 Байт | 20 Гигабайт = 21474836480 Байт | 5000 Гигабайт = 5368709120000 Байт |
3 Гигабайт = 3221225472 Байт | 30 Гигабайт = 32212254720 Байт | 10000 Гигабайт = 10737418240000 Байт |
4 Гигабайт = 4294967296 Байт | 40 Гигабайт = 42949672960 Байт | 25000 Гигабайт = 26843545600000 Байт |
5 Гигабайт = 5368709120 Байт | 50 Гигабайт = 53687091200 Байт | 50000 Гигабайт = 53687091200000 Байт |
6 Гигабайт = 6442450944 Байт | 100 Гигабайт = 107374182400 Байт | 100000 Гигабайт = 1.073741824×1014 Байт |
7 Гигабайт = 7516192768 Байт | 250 Гигабайт = 268435456000 Байт | 250000 Гигабайт = 2.68435456×1014 Байт |
8 Гигабайт = 8589934592 Байт | 500 Гигабайт = 536870912000 Байт | 500000 Гигабайт = 5.36870912×1014 Байт |
9 Гигабайт = 9663676416 Байт | 1000 Гигабайт = 1073741824000 Байт | 1000000 Гигабайт = 1.073741824×1015 Байт |
convertlive.com
Хранилище данных — компьютерная технология, которая не является количественной величиной СИ. Компьютерная информация представлена в числовых формах «1» и «0» в различных типах хранилищ. Главной единицей хранения цифровых данных является байт, а в байте 8 бит. Виртуальные данные измеряются в таких единицах, как бит, байт, килобайт (КБ), мегабайт (МБ), гигабайт (ГБ), терабайт (ТБ), петабайт или эксабайт.
Переводим из
Переводим в
Основные единицы данных | |
Бит | бит |
Байт | байт |
Эксабит | Эбит |
Эксабайт | ЭБ |
Гигабит | Гбит |
Гигабайт | ГБ |
Килобит | Кбит |
Килобайт | кБ |
Мегабит | Мбит |
Мегабайт | МБ |
Петабит | Пбит |
Петабайт | ПБ |
Терабит | Тбит |
Терабайт | ТБ |
Другие единицы | |
Блок | |
CD (74 Minute) | CD 74 min |
CD (80 Minute) | CD 80 min |
Двойное слово | DW |
DVD (1 слой, 1 сторона) | DVD 1l/1s |
DVD (1 слой, 2 стороны) | DVD 1l/2s |
DVD (2 слоя, 1 сторона) | DVD 2l/1s |
DVD (2 слоя, 2 стороны) | DVD 2l/2s |
Эксабайт (10^18 Байт) | ЭБ |
Дискета (3.5″, DD) | FDD 3.5″ |
Дискета (3.5″, HD) | FDD 3.5″ |
Дискета (3.5″, ED) | FDD 3.5″ |
Дискета (5.25″, DD) | FDD 5.25″ |
Дискета (5.25″, HD) | FDD 5.25″ |
Гигабайт (10^9 Байт) | GB |
Jaz 1GB | |
Jaz 2GB | |
Kilobyte (10^3 Bytes) | kB |
Megabyte (10^6 Bytes) | MB |
Ниббл | |
Petabyte (10^15 Bytes) | PB |
Quadruple-Word | QW |
Terabyte (10^12 Bytes) | TB |
Слово | W |
Zip 100 | |
Zip 250 |
Основные единицы данных | |
Бит | бит |
Байт | байт |
Эксабит | Эбит |
Эксабайт | ЭБ |
Гигабит | Гбит |
Гигабайт | ГБ |
Килобит | Кбит |
Килобайт | кБ |
Мегабит | Мбит |
Мегабайт | МБ |
Петабит | Пбит |
Петабайт | ПБ |
Терабит | Тбит |
Терабайт | ТБ |
Другие единицы | |
Блок | |
CD (74 Minute) | CD 74 min |
CD (80 Minute) | CD 80 min |
Двойное слово | DW |
DVD (1 слой, 1 сторона) | DVD 1l/1s |
DVD (1 слой, 2 стороны) | DVD 1l/2s |
DVD (2 слоя, 1 сторона) | DVD 2l/1s |
DVD (2 слоя, 2 стороны) | DVD 2l/2s |
Эксабайт (10^18 Байт) | ЭБ |
Дискета (3.5″, DD) | FDD 3.5″ |
Дискета (3.5″, HD) | FDD 3.5″ |
Дискета (3.5″, ED) | FDD 3.5″ |
Дискета (5.25″, DD) | FDD 5.25″ |
Дискета (5.25″, HD) | FDD 5.25″ |
Гигабайт (10^9 Байт) | GB |
Jaz 1GB | |
Jaz 2GB | |
Kilobyte (10^3 Bytes) | kB |
Megabyte (10^6 Bytes) | MB |
Ниббл | |
Petabyte (10^15 Bytes) | PB |
Quadruple-Word | QW |
Terabyte (10^12 Bytes) | TB |
Слово | W |
Zip 100 | |
Zip 250 |
Результат конвертации:
kalkulator.pro