DE PL EN RU
← Назад

CYBER27 — собственная операционная система

Bare-metal система для Raspberry Pi 3 — без Linux, с собственным интерпретатором BASIC, графическим рабочим столом и 3D-движком.

Технические данные

ПроцессорARM Cortex-A53, 4× 1,2 ГГц (Raspberry Pi 3)
ОСнет — bare metal (Circle)
Экранбуфер 320×240, масштаб до 640×480 / 1920×1080
Цвета255 (палитра, как Amiga 1200)
Языксобственный интерпретатор BASIC (R0–R7, именованные, SUB/FUNCTION, TYPE)
Спрайты16 слотов × 32×32, 8 кадров анимации, масштаб ×1..×4
3D-движокraycasting (Wolf), туннель, изометрия (стиль Diablo)
Картыдо 320×320 тайлов, база слоёв (WARSTWY.TXT)
Аудио4 голоса ADSR + PCM-сэмплы (SLOAD/SPLAY)
Памятьядро 64 МБ, BSS ~3,6 МБ

Скриншоты

ZARZEW — Isometrie (Diablo-Stil) | Izometria | Isometric | Изометрия

CYBER-LAB 3D — Raycasting (Wolfenstein-Stil) | CYBER-LAB 3D — raycaster | CYBER-LAB 3D — raycaster | CYBER-LAB 3D — рейкастинг

Texturen 64×64 | Tekstury | Textures | Текстуры

Objekte 32×32 | Obiekty | Objects | Объекты

Sprite & Transparenz | Sprite | Sprite | Спрайт

Обучающие программы

Помимо игр в системе есть полный учебный пакет: математика, физика, химия, география, астрономия — от школьника до студента. Всё написано на BASIC.

APOLLO — Centrum Misji | Centrum Misji | Mission Centre | Центр миссии

Fizyka | Fizyka | Physics | Физика

Uczenie — wybór wieku | Uczenie | Learning | Обучение

Studia | Studia | Advanced | Углублённо

Syntezator — 4 głosy | Syntezator | Synthesizer | Синтезатор

Руководство BASIC (справка в системе)

Справка доступна прямо в системе — клавиша F1.
Основы: как работает программа
CYBER27 BASIC (27-БИТ)

ПРОГРАММА — это список строк.
В каждой строке есть НОМЕР и СОДЕРЖИМОЕ:

     10 PRINT "OK"
     ^^ ^^^^^^^^^^
     |  +-- содержимое (что делать)
     +----- номер (порядок)

НОМЕРА определяют ПОРЯДОК ВЫПОЛНЕНИЯ,
а не порядок ввода. Поэтому можно вставить
строку 15 между 10 и 20 — она выполнится
в нужном месте.

РЕГИСТРЫ: R0, R1 ... R7
  8 ячеек для чисел. Самые быстрые.

ПАМЯТЬ: 256 слов (адреса 0x00..0xFF)
  Больше регистров, но медленнее.
  Доступ через POKE и PEEK.

ЧИСЛА: с плавающей точкой (как в C64,
но точнее). Работают точка и минус:
  PRINT 1/2    ->  0.5
  PRINT 10/3   ->  3.33333333
  PRINT -5     ->  -5

ПАМЯТЬ (POKE/PEEK) и битовые операции
остаются 27-битными (0x07FFFFFF).

АВТОНУМЕРАЦИЯ: в редакторе новая строка
сама получает номер (10, 20, 30...).
Можно ввести номер и вручную.
Основные команды
PRINT "ТЕКСТ"   выводит текст
  Кавычки ОБЯЗАТЕЛЬНЫ для текста!
  PRINT "ПРИВЕТ"

PRINT R3        выводит СОДЕРЖИМОЕ
  регистра — БЕЗ кавычек

PRINT "A", R0   несколько элементов
  ',' = пробел, ';' = без пробела
  ';' в конце = без перевода строки

?               сокращение для PRINT

Один пробел (без запятой) разделяет
текст и число — как в C64.
Регистры и память
РЕГИСТРЫ R0..R7 — 8 ячеек для чисел.
Это САМЫЕ БЫСТРЫЕ переменные.

  R0 = 5            присвоить значение
  R1 = R0 * 2       вычислить
  PRINT R1          вывести (10)

Регистры там, где важна скорость.

ПАМЯТЬ (POKE/PEEK):
  POKE 0x10, R3     запись в память
    0x10 = адрес (слот 16)
    R3   = значение
    В памяти 256 слов (0x00..0xFF).

  PEEK 0x10         чтение из памяти
    Результат на ЭКРАНЕ. В программе
    используйте PEEK(x) как функцию.

DIM A(20)         МАССИВ A (индексы 0..20)
  A(i) = 7        записать элемент
  PRINT A(i)      прочитать элемент
  Буквы A..Z, индекс макс. 63.

INPUT R0          ввод числа от пользователя
  с клавиатуры.
Арифметика: ADD SUB MUL
ADD R0, R1, R2    R0 = R1 + R2
SUB R0, R1, R2    R0 = R1 - R2
MUL R0, R1, R2    R0 = R1 * R2
DIV R0, R1, R2    R0 = R1 / R2

ВАЖНО: РЕЗУЛЬТАТ должен попасть в
РЕГИСТР (не в массив)!

В выражениях работают и обычные операторы:

  R0 = 3 * 4 + 1       -> 13
  R1 = (2 + 3) * 4     -> 20
  R2 = 10 / 4          -> 2.5

Приоритет: ( ) затем * / затем + -

Отбрасывание дробной части: нет
TRUNC/INT — используйте & (битовая маска).
Корни, степени, волны (SIN/COS)
SIN(x)   синус (x в радианах)
COS(x)   косинус
TAN(x)   тангенс
ATN(x)   арктангенс
SQR(x)   квадратный корень
ABS(x)   модуль
SGN(x)   знак (-1, 0, 1)

ГРАДУСЫ -> РАДИАНЫ:
  rad = deg * PI / 180

ОКРУЖНОСТЬ по углам:
  x = cx + r * COS(a)
  y = cy + r * SIN(a)

PI — встроенная константа:
  PRINT PI     -> 3.14159265...

СТЕПЕНИ:
  SQR(x) — это корень. Для степеней
  умножайте: x*x*x вместо x^3.
Битовая арифметика
БИТОВЫЕ ОПЕРАЦИИ — по каждому биту отдельно.
Это НЕ обычная математика.

AND R2,R0,R1   побитовое И
  Результат 1 только когда ОБА бита = 1.
    1100 AND 1010 = 1000

OR  R2,R0,R1   побитовое ИЛИ
  Результат 1 когда ЛЮБОЙ бит = 1.
    1100 OR  1010 = 1110

XOR R2,R0,R1   побитовое исключающее ИЛИ
  Результат 1 когда биты РАЗЛИЧАЮТСЯ.
    1100 XOR 1010 = 0110

NOT R2,R0      отрицание
  Меняет каждый 0 на 1 и наоборот.

SHL R2,R0,3    сдвиг ВЛЕВО
  Это умножение на 2^3 = 8.
    0001 SHL 1 = 0010

SHR R2,R0,2    сдвиг ВПРАВО
  Это деление на 4 (по битам).

ЗАЧЕМ: проверить пин — это
AND с маской — без умножения,
очень быстро. Так работает железо.

ОТЛИЧИЕ от ADD/MUL:
  SHL — это сдвиг, а не арифметика.
Графика: рисование (CO, TP, LINE...)
CO n              установить ЦВЕТ
  n = 0..255 (палитра, C64 + 191 новый):
     0 чёрный      1 белый
     2 красный     3 циан
     4 фиолетовый  5 зелёный
     6 синий       7 жёлтый
     8-15 яркие варианты
  CO 1     или   COLOR 12

TD x,y,"ТЕКСТ"    нарисовать ТЕКСТ
  x = столбец, y = строка
  TD 2,2,"CYBER27"

TP x,y,color      поставить ПИКСЕЛЬ
  x,y   = позиция (пиксели)
  TP 0,0,15   TP 20,10,12

ЛИНИИ И ФИГУРЫ (координаты в пикселях):
  LINE x1,y1,x2,y2    линия
  BOX x1,y1,x2,y2     прямоугольник (рамка)
  FILLRECT x1,y1,x2,y2 залитый прямоугольник
  CIRCLE x,y,r        круг
  FILLCIRCLE x,y,r    залитый круг
  пример:
    BOX 10,10,80,60

BLIT sx,sy,w,h,dx,dy   копировать прямоугольник
BLITT sx,sy,w,h,dx,dy  как BLIT, но 0 = прозрачный

БУФЕР ГРАФИКИ: 320 x 240 пикселей.
На экране увеличен 2x.
Монитор и спрайт
MON              показывает карту 32x16
  Это ВСПОМОГАТЕЛЬНАЯ область памяти
  (m_MonitorMap), не экран.
  Для тестирования графики.
  Символы в выводе:
     '.' = пустой пиксель
     '#' = установленный пиксель

SP slot,x,y,color   СПРАЙТ (объект)
  slot  = 0..7 — какой из 8 спрайтов
  x,y   = позиция в карте
  color = цвет 0..255

  ПРИМЕР:
     SP 0,5,6,15   спрайт 0 в (5,6)
     SP 1,10,8,7   спрайт 1 в (10,8)

  Хранится в m_SpriteMap[].
  Простой прототип — готов к
  движению и коллизиям.
  НЕ рисуется на экране.
GPIO: GPO и GPI (реальные пины)
GPO pin,value   ВЫХОД (записать состояние)

  'pin' — номер GPIO ИЛИ ИМЯ:
     17, 22, 4...     номер пина
     LED, ACT         активный светодиод
     TX, RX, UART     последовательные линии
     USB, SD, RTC     управление железом
     CPU, FAN, MON    состояние системы

  'value' — 0 (выкл) или 1 (вкл).

  ПРИМЕР:
     GPO 17,1     установить пин 17 в 1
     GPO LED,0    погасить диод

  ДОЗВОЛЕННЫЕ пины (безопасные):
     17 18 22 23 24 25 27 4
  (не конфликтуют с UART/I2C/SPI)

GPI pin         ВХОД (прочитать)
  Читает РЕАЛЬНОЕ состояние в R0:
     GPI 17
     PRINT "PIN 17 = ", R0

GPMODE pin,in|out   направление
Циклы, условия, переходы
FOR R0 = 1 TO 5    ЦИКЛ — начало
  R0 = счётчик (регистр R0..R7 ИЛИ имя)
  1  = начальное значение
  5  = конечное значение (включительно)
  С шагом:
     FOR R0 = 0 TO 10 STEP 2
  Также по имени:  FOR I = 1 TO 10

NEXT R0            ЦИКЛ — конец
  Прибавляет шаг к R0 и возвращается
  к FOR, пока R0 <= конечного значения.
  Без R0 — используется последний FOR.

IF условие THEN команда
  операторы: >  <  =  >=  <=
  IF R0 > 0 THEN PRINT "OK"
  IF R0 = 5 THEN GOTO 100

GOTO номер         переход к строке
GOSUB номер        подпрограмма (RETURN)

ПОЛНЫЙ ПРИМЕР — счёт до 5:
  10 FOR R0 = 1 TO 5
  20 PRINT R0
  30 NEXT R0
  40 PRINT "КОНЕЦ"
Сохранение и загрузка (SD-карта)
SAVE "имя.bas"     сохранить на SD-карту
LOAD "имя.bas"     загрузить с карты

  Имя ОБЯЗАТЕЛЬНО в кавычках.
  Файл попадает в корневой каталог
  карты (монтируется как SD:).

  ВНИМАНИЕ: старая команда SAVE работает
  с таблицей интерпретатора, а НЕ с
  буфером редактора!

  В РЕДАКТОРЕ используйте сочетания:
     Ctrl+S   сохранить весь буфер
     Ctrl+L   загрузить в буфер
  Файл: SD:/BASIC.BAS или EDITOR.BAS

DEL номер          удалить строку программы
  DEL 10 — удаляет строку 10

RS232 (последовательный порт):
  XSEND "файл"  отправить (XMODEM)
  XRECV "файл"  принять (XMODEM)
  На ПК: sx файл / rx файл (lrzsz)
Примеры готовых программ
ПРИМЕР 1 — вывод текста:
  10 CO 12
  20 TD 2,2,"CYBER27"
  30 TP 10,10,15
  40 PRINT "ГОТОВО"

ПРИМЕР 2 — GPIO:
  10 GPO 17,1
  20 GPI 17
  30 PRINT "GPIO 17"

ПРИМЕР 3 — цикл:
  10 FOR R0 = 1 TO 5
  20 PRINT R0
  30 NEXT R0
  40 PRINT "DONE"

ПРИМЕР 4 — битовая арифметика:
  10 LET R0 = 0xFF
  20 SET R1, 0x0F
  30 AND R2, R0, R1
  40 PRINT R2
Советы и частые ошибки
СОКРАЩЕНИЯ КОМАНД:
  TD  = Text Draw   (текст)
  TP  = Plot Pixel  (пиксель)
  CO  = Color       (цвет)
  MON = Monitor map (просмотр)
  SP  = Sprite      (объект)
  GPO = GPIO Out    (выход)
  GPI = GPIO In     (вход)

КАК ПИСАТЬ:
  Буквы выводятся ЗАГЛАВНЫМИ — клавиатура
  даёт заглавные, строчных нет.

  Текст ВСЕГДА в кавычках:
     PRINT "OK"      правильно
     PRINT OK        ошибка!

  Числа: 123 или 0x7B (шестнадцатерично)

ЧАСТЫЕ ОШИБКИ:
  — нет кавычек вокруг текста
  — запятая вместо пробела
  — опечатка в имени команды
  — FOR с переменной вместо регистра
    (теперь можно: FOR I = ... и FOR R0 = ...)
Статус, отладка и сочетания клавиш
STATUS   состояние регистров и окон
LIST     вывести программу с номерами
SAVE     сохранить программу
LOAD     загрузить программу

── СТРЕЛКИ В СПРАВКЕ ──
UP/DOWN    по оглавлению
ENTER      открыть тему
PgUp/PgDn  переход на 8 позиций
ESC        на уровень выше
F1         закрыть справку

── СОЧЕТАНИЯ В РЕДАКТОРЕ ──
Ctrl+S     сохранить буфер на SD
Ctrl+L     загрузить буфер с SD
BACKSPACE  удалить символ перед курсором
ENTER      следующая строка
ALT+1-9    переход в комнату
ALT+СТРЕЛКА выбор комнаты в матрице

── ЖУРНАЛ UART ──
Сообщения об ошибках BASIC идут на
последовательный порт 115200.
Просмотр: screen /dev/ttyUSB0 115200
КАРТА ПАМЯТИ: что где лежит
КАРТА ПАМЯТИ (27-бит):
  Регистры R0..R7 — числа float
  Память: 256 слов (POKE/PEEK)
  Буфер графики 320x240 (TP/LINE...)
  Спрайты: 16 слотов (WSDEF)
  Строки A$..Z$; текстовый экран
  Всё доступно из BASIC
Звук: SID и секвенсор
ЗВУК — 4 ГОЛОСА (0..3)

ФОРМА ВОЛНЫ: WAVE голос,w
  0 PULSE  1 SAW  2 TRIANGLE
  3 SINE   4 NOISE (барабан)

ИГРАТЬ: PLAY голос,freq,w
  напр. PLAY 0,440,0
НОТА: NOTE freq,длит(ms)
  напр. NOTE 880,120

ТЕМБР:
  PULSE голос,w  0..4095 (2048=50%)
  ENV голос,a,d,s,r  огибающая ms
  PAN голос,p    0=влево .. 15=вправо
  ARP голос,n1,n2  аккорд на 1 голосе

СЕКВЕНСОР:
  TRACK n1,n2,n3,n4[,dur]
  SONG (цикл)   SONGCLR
STOP — остановить звук

ПРИМЕР (бас+лид+барабан):
  SONGCLR
  WAVE 0,0
  PULSE 0,3000
  ENV 0,0,150,10,80
  PAN 0,7
  WAVE 1,0
  ENV 1,5,120,12,60
  WAVE 2,4
  ENV 2,0,0,15,15
  TRACK 110,220,0,200
  TRACK 110,277,0,200
  TRACK 110,330,0,200
  TRACK 110,220,0,200
  SONG
ИГРА — план и этапы
КАК НАПИСАТЬ ИГРУ — ПО ЭТАПАМ

Не пишите всю программу сразу!
Делаем МАЛЕНЬКИЙ шаг и проверяем.
Каждый этап — готовая программа.

ЗАПУСК:
   LOAD "GRA1"
   RUN
Или: нажмите здесь F5 (справка
сама загрузит и запустит GRA1).

ЭТАП 1 — ПОЛЕ (GRA1)
  Рисуем только площадку:
   - верхний и нижний борт (FILLRECT)
   - пунктирная средняя линия
  Пока ничего не двигается.

ЭТАП 2 — МЯЧ (GRA2)
  Мяч отскакивает по вертикали.
  Секрет анимации, повторяйте:
    1. CLS            очистить
    2. вычислить новую позицию
    3. нарисовать мяч
    4. FLIP + WAIT    показать и ждать
    5. GOTO 1

ЭТАП 3 — ОТСКОКИ (GRA3)
  Мяч летает по всему экрану.
  Добавляем движение по X (влево-вправо).
  Направление X в R2, направление Y в R3.

ЭТАП 4 — РАКЕТКА (GRA4)
  Ваша планка внизу экрана.
  UP/DOWN двигают её.
  Мяч отскакивает от ракетки.

ЭТАП 5 — ПОЛНАЯ ИГРА (GRA5)
  Две ракетки: ВЫ и CPU.
  Очко, когда мяч пролетает мимо.
  Это соединение этапов 1-4!

СОВЕТ: если что-то не работает —
вернитесь на этап назад и сравните.
Каждый этап РАБОТАЕТ сам по себе.

F5 = запуск GRA1
ИГРА этап 1: поле
ЭТАП 1 — ПОЛЕ  (GRA1)

Цель: только игровая площадка.
Пока ничего не двигается.

Что рисуем:
  - верхний борт (FILLRECT)
  - нижний борт (FILLRECT)
  - пунктирная средняя линия
    (цикл FOR + STEP 8)

Код (кратко):
  150 CLS
  170 CO 6
  180 FILLRECT 0,0,163,6
  200 FILLRECT 0,121,163,127
  230 FOR R0 = 0 TO 120 STEP 8
  240 FILLRECT 81,R0,82,R0+4
  250 NEXT R0

F5 = запуск GRA1
Потом вернитесь сюда и переходите
к теме 19 (этап 2).
ИГРА этап 2: мяч
ЭТАП 2 — МЯЧ В ДВИЖЕНИИ  (GRA2)

Цель: мяч отскакивает по вертикали.

СЕКРЕТ АНИМАЦИИ (повторяйте):
  1. CLS              очистить экран
  2. вычислить позицию R1 = R1 + R2
  3. нарисовать мяч   FILLRECT
  4. FLIP             показать на экране
  5. WAIT 20          подождать 20 мс
  6. GOTO 1           повторить

R1 = позиция Y мяча
R2 = направление (+1 вниз, -1 вверх)

ОТСКОК (очень важно):
  340 IF R1 <= 8   THEN SET R2, 1
  360 IF R1 >= 119 THEN SET R2, -1
Когда мяч касается борта,
меняем направление.

FLIP нужен, иначе изображение скачет.

F5 = запуск GRA2
ИГРА этап 3: отскоки
ЭТАП 3 — ОТСКОКИ ОТ 4 СТЕН  (GRA3)

Цель: мяч летает по ВСЕМУ экрану.
Добавляем движение по X (влево-вправо).

Теперь у нас ДВА направления:
  R2 = направление X (1=вправо, -1=влево)
  R3 = направление Y (1=вниз,   -1=вверх)

Движение:
  270 ADD R0, R0, R2     X
  280 ADD R1, R1, R3     Y

Отскоки (4 стены):
  340 IF R0 <= 4   THEN SET R2, 1
  350 IF R0 >= 159 THEN SET R2, -1
  370 IF R1 <= 4   THEN SET R3, 1
  380 IF R1 >= 123 THEN SET R3, -1

F5 = запуск GRA3
ИГРА этап 4-5: ракетка и полная игра
ЭТАП 4-5 — РАКЕТКА И ПОЛНАЯ ИГРА

ЭТАП 4 (GRA4): ваша ракетка.
  R4 = позиция ракетки (слева)
  ВВЕРХ/ВНИЗ двигают её (GET R6).
  Отскок от ракетки:
    когда мяч касается планки ->
    изменить направление X
  F5 = запуск GRA4

ЭТАП 5 (GRA5): ПОЛНАЯ ИГРА.
  Две ракетки: ВЫ и CPU.
  R4 = ракетка игрока (слева)
  R5 = ракетка CPU (справа)
  R6,R7 = счёт ВЫ, CPU
  CPU сам гонится за мячом:
    IF R5 < R1 THEN ADD R5,R5,3
    IF R5 > R1 THEN SUB R5,R5,3
  Очко, когда мяч пролетает мимо.
  Это соединение этапов 1-4!

Чтобы запустить GRA5 (F5 запускает GRA4):
  LOAD "GRA5"
  RUN
ИГРА: ЗМЕЙКА (готова!)
ИГРА: ЗМЕЙКА  (WAZ1 = голова, WAZ2 = целая)

Классика: змейка ест и растёт.
  ВВЕРХ/ВНИЗ/ВЛЕВО/ВПРАВО = движение
  ESC = конец

WAZ1 — только ГОЛОВА (один квадрат).
  Учит плавной анимации в одном
  направлении. Стены заворачивают:
   IF R0 < 0 THEN SET R0, 160

WAZ2 — целая змейка:
  * ТЕЛО из многих сегментов
    (массивы SX(), SY())
  * ЕДА (красный квадрат)
  * съела -> змейка растёт
  * врезалась в себя -> конец

Секрет движения тела: сдвигаем
сегменты от хвоста к голове
(труба):
  640 FOR R7 = D(0)-1 TO 1 STEP -1
  650 SX(R7) = SX(R7-1)
  660 SY(R7) = SY(R7-1)
  670 NEXT R7

F5 = запуск WAZ1
ИГРА: ARKANOID (кирпичи)
ИГРА: ARKANOID  (ARKANOID)

Разбейте все КИРПИЧИ сверху!
  ВЛЕВО/ВПРАВО = платформа
  ESC = конец

Элементы игры:
  R0,R1 = мяч (X,Y)
  R2,R3 = направление мяча
  R4    = платформа (игрок, внизу)
  KX(),KY(),KH() = кирпичи

Кирпичи — это МАССИВЫ, у каждого:
  позиция X, Y и состояние (есть/разбит)
  Если мяч попал -> KH(R7) = 0
  и мяч отскакивает вниз.

Отскок от платформы — классика:
  IF мяч на высоте платформы
  AND мяч над платформой
  THEN SET R3, -2

F5 = запуск ARKANOID
ИГРА: 2 ПУШКИ (2 игрока)
ИГРА: 2 ПУШКИ  (ARMATA)

ДВА игрока по очереди!
  Цель: попасть в пушку противника.

Управление:
  G / D = УГОЛ пушки (вверх/вниз)
  H / J = СИЛА выстрела
  ENTER = ОГОНЬ!   ESC = конец

Физика (учит углам и векторам!):
  угол в градусах -> радианы:
    R8 = угол * PI / 180
  горизонтальная скорость: vx = сила*COS(a)
  вертикальная скорость:   vy = сила*SIN(a)
  гравитация: каждый кадр
    vy = vy + 1  (снаряд падает)

Снаряд летит по ДУГЕ — чем больше
сила, тем дальше.
Попадание = очко. Потом стреляет
другой. Счёт внизу.

F5 = запуск ARMATA
SYNTH: игра на синтезаторе
SYNTH — КАК ИГРАТЬ

ВАЖНО: звук включается только после
первой команды NOTE или PLAY.
Без этого — ТИШИНА!

ШАГ 1: включить звук в BASIC:
   NOTE 440,300
   (440 Hz = нота A, 300 мс)
Теперь наверху комнаты SYNTH видно:
DZWIEK: ON

ШАГ 2: открыть комнату SYNTH
(меню комнат -> SYNTH -> ENTER)

КЛАВИШИ В КОМНАТЕ SYNTH:
  1 2 3 4        выбор ГОЛОСА
  W              следующая ФОРМА ВОЛНЫ
  Z X C V B N M  ноты C D E F G A B
  ESC            выход в меню комнат

4 ГОЛОСА — каждый играет свой звук
одновременно (как 4 музыки).
Голос выбирается цифрой, форма волны
меняется клавишей W.
MUSIC: формы волны
MUSIC — ФОРМА ВОЛНЫ

ФОРМА ВОЛНЫ определяет ФОРМУ звуковой
волны. Другая форма = другой тембр
(другое звучание).

5 форм волны в CYBER27:
  0 PULSE     прямоугольная (как SID)
  1 SAW       пила (резкая, жужжит)
  2 TRIANGLE  треугольная (мягкая)
  3 SINE      синус (чистая)
  4 NOISE     шум (барабан, гром)

Как изменить: клавиша W в комнате SYNTH
или в BASIC:
  WAVE 0,3      голос 0 -> синус

PULSE (прямоугольная) имеет ещё
PULSE WIDTH — ширину импульса:
  PULSE 0,2048  (2048 = ровно 50%)

ЗАЧЕМ: у каждого инструмента своя форма
волны — флейта это синус, труба это
пила, ударные это шум.
Курс программирования от А до Я
КУРС ПРОГРАММИРОВАНИЯ — ПЛАН

Цель: целая школа программирования,
а не только азбука — 100 упражнений,
чтобы после курса свободно владеть
BASIC.

KURS1 (старт) — введение:
  1 Как думает компьютер (0/1)
  2 Первый PRINT
  3 Числа и регистры
  4 Сложение в BASIC

ВСЕ МОДУЛИ КУРСА:
  A Основы (PRINT, переменные)
  B Арифметика и выражения
  C Условия IF...THEN
  D Циклы FOR...NEXT
  E Массивы (DIM)
  F Строки A$
  G Подпрограммы GOSUB/RETURN
  H Графика (TP, LINE, ...)
  I Звук (NOTE, WAVE, ...)
  J Игры (анимация, коллизии)

F5 = запуск KURS1
Маргарет Хэмилтон и Apollo
МАРГАРЕТ ХЭМИЛТОН (1936-)

Она НАПИСАЛА программное обеспечение
для Apollo 11! Руководила командами
в MIT (Instrumentation Laboratory).
Она ввела термин "software engineering".

ЗНАМЕНИТОЕ ФОТО 1969:
  Она стоит рядом со СТОПКОЙ
  распечаток кода AGC — выше
  её роста!

ЕЁ КОД СПАС МИССИЮ:
  Во время полёта радар вызвал
  тревогу (1201, 1202).
  Её код расставил приоритеты
  и проигнорировал лишнее.
  Посадка удалась.

УРОК ДЛЯ НАС:
  — программное обеспечение — инженерия
  — ошибки стоят жизней (или миссий)
  — хорошие приоритеты спасают всё
Азбука Морзе
АЗБУКА МОРЗЕ

MORSE = точка (.) и тире (-).
У каждой буквы своя последовательность.

Точка = КОРОТКИЙ сигнал
Тире = ДЛИННЫЙ (3× точка)
Пауза между буквами = 3 точки
Пауза между словами = 7 точек

A  .-      N  -.
B  -...    O  ---
C  -.-.    P  .--.
D  -..     Q  --.-
E  .       R  .-.
F  ..-.    S  ...
G  --.     T  -
H  ....    U  ..-
I  ..      V  ...-
J  .---    W  .--
K  -.-     X  -..-
L  .-..    Y  -.--
M  --      Z  --..
Солнечная система: планеты
СОЛНЕЧНАЯ СИСТЕМА: ПЛАНЕТЫ

8 планет, у каждой своя карточка:
  расстояние от Солнца, сутки (вращение),
  год (обращение), условия на поверхности
  и число спутников.

ПОРЯДОК от Солнца:
  1 МЕРКУРИЙ   57,9 млн км, год 88 дней
  2 ВЕНЕРА    108,2 млн км, +465 °C
  3 ЗЕМЛЯ     149,6 млн км (наш дом!)
  4 МАРС      227,9 млн км, 2 луны
  5 ЮПИТЕР    778,5 млн км, ГАЗ, 95 лун
  6 САТУРН    1434 млн км, кольца
  7 УРАН      2871 млн км, лежит на боку
  8 НЕПТУН    4495 млн км, самый дальний

ЕДИНИЦЫ: 1 а.е. = 149,6 млн км
  (а.е. = астрономическая единица)
APOLLO 11: симулятор миссии
APOLLO 11: СИМУЛЯТОР МИССИИ

Это НЕ викторина — это ИГРА.
Вы пилот. Цель: долететь до Луны
(384 000 км) и вернуться живым.

УПРАВЛЕНИЕ:
  L / P  = смена ОКНА (вид)
  G / D  = выбор ДЕЙСТВИЯ
  ENTER  = выполнить действие
  S      = сохранить миссию
  L      = загрузить миссию
  ESC    = назад в меню

ПОКАЗАНИЯ НА ПУЛЬТЕ:
  ВЫСОТА, СКОРОСТЬ, расстояние
  до цели, ТОПЛИВО, КИСЛОРОД, ПИТАНИЕ.

СЛУЧАЙНЫЕ СОБЫТИЯ (АВАРИИ!):
  - утечка топлива
  - отказ электроники
  - потеря кислорода
APOLLO: физика полёта
APOLLO: ФИЗИКА ПОЛЁТА

Физические законы, управляющие полётом
к Луне.

1) СКОРОСТЬ: v = s / t
   скорость = путь / время
   напр. 300 км за 2 ч -> 150 км/ч

2) ТОПЛИВО: топливо = расход * время
   Двигатель тратит X в час, полёт
   длится Y часов -> X * Y.

3) УСКОРЕНИЕ: a = dv / t
   как быстро растёт скорость.

4) ВЕС: гравитация разных тел
   (Земля = 1, Луна = 1/6 -> в 6 раз легче).

5) ВТОРАЯ КОСМИЧЕСКАЯ:
   минимальная скорость, чтобы покинуть
   тело (Земля: 11,2 км/с).
Свои комнаты: POKOJ
СВОИ КОМНАТЫ (команды)

Вы можете добавить СВОЮ комнату и решить,
какая программа в ней запускается.

КАК СДЕЛАТЬ:
  1. Напишите программу (в комнате BASIC)
     и сохраните её:
       SAVE "MYPROG"
     (создаст MYPROG.BAS)
  2. Добавьте комнату с этой программой:
       POKOJ "MY GAME","MYPROG"
  3. Сохраните список комнат на карту:
       ZAPISZPOKOJE

Новая комната появится в МЕНЮ КОМНАТ и
запустит вашу программу. Она переживёт
ПЕРЕЗАГРУЗКУ (файл POKOJE.TXT на карте).
Именованные переменные (POINTS = 10)
ИМЕНОВАННЫЕ ПЕРЕМЕННЫЕ

Представьте КОРОБКИ с надписью.
В каждую кладёте число. Имя говорит,
ЧТО внутри.

Вместо того чтобы помнить "R3 это очки",
вы просто пишете: POINTS.

КАК ИСПОЛЬЗОВАТЬ:
  POINTS = 10      положить 10 в POINTS
  PRINT POINTS     показать (10)
  POINTS = POINTS + 5   увеличить (15)

ВЫЧИСЛЕНИЯ:
  LIFE = 3
  LIFE = LIFE - 1       (2)
  RESULT = LIFE * 10    (20)

ИМЯ может содержать буквы, цифры и '_'.
До 15 символов. Регистр не важен.
Типы и записи (TYPE)
ТИПЫ И ЗАПИСИ (TYPE)

Вместо 5 отдельных переменных для ОДНОЙ
вещи — сделайте ОДНУ коробку с ячейками.

Это ЗАПИСЬ. Имена ячеек — ПОЛЯ.

ШАГ 1 — описать, что есть у снаряда:
  TYPE Bullet
  X
  Y
  VX
  END TYPE

ШАГ 2 — массив снарядов:
  DIM p(4) AS Bullet
  (5 снарядов: p(0)..p(4))

ШАГ 3 — использовать (точка '.'):
  p(0).X = 100
  p(0).VX = -3
  p(0).X = p(0).X + p(0).VX

ПРЕИМУЩЕСТВО: все данные объекта вместе —
как объявление класса.
Процедуры: SUB и FUNCTION
ПРОЦЕДУРЫ: SUB и FUNCTION

Что если вы повторяете один и тот же код
много раз? Вместо копирования — сделайте
ПРОЦЕДУРУ.

SUB — это группа команд с именем.
Вы вызываете её через CALL.

КАК СОЗДАТЬ SUB:
  SUB Draw(x, y)
  PRINT "Рисую в ", x, y
  END SUB

ВЫЗОВ:
  CALL Draw(10, 20)
  CALL Draw(30, 40)

x и y — ПАРАМЕТРЫ. Внутри SUB они
локальные (значения существуют только там).

FUNCTION — как SUB, но ВОЗВРАЩАЕТ
значение (в WYNIK):
  FUNCTION Square(a)
  WYNIK = a * a
  END FUNCTION
  R0 = Square(5)     -> 25
Метки: GOTO Start
МЕТКИ (GOTO Start)

До сих пор переход был к НОМЕРУ СТРОКИ:
  GOTO 500
Это неудобно — нужно помнить номера.

Теперь можно дать месту ИМЯ.
Пишете имя и двоеточие:

  LOOP:
  PRINT "раз"
  GOTO LOOP

Метка — как закладка в книге —
GOTO возвращается к ней.

КАК ЭТО РАБОТАЕТ:
  Start:      <- метка (с ':')
  ... код ...
  GOTO Start  <- переход к метке

МОЖНО GOSUB (с возвратом):
  GOSUB Greet
  ...
  Greet:
  PRINT "Привет"
  RETURN
PCM-сэмплы (звук как Amiga)
PCM-СЭМПЛЫ (звук как Amiga)

Синтезатор делает звуки из нот.
СЭМПЛ — это ЗАПИСЬ: настоящий звук —
барабаны, гитара, голос, выстрел.
Как на Amiga!

Файл сэмпла — это сырые данные
.RAW (8-бит, как Amiga).

ШАГ 1 — загрузить (SLOAD):
  SLOAD 0, "TEST.RAW"
  (слот 0..3, файл с SD-карты)

ШАГ 2 — проиграть (SPLAY):
  SPLAY 0, 0, 1.0
  канал(0..3), слот, pitch

PITCH = высота тона (как Paula):
  1.0 = нормально
  2.0 = на октаву ВЫШЕ
  0.5 = на октаву НИЖЕ
PAINT 3D: редактор текстур
PAINT 3D — РЕДАКТОР ГРАФИКИ

Вы рисуете картинки, которые потом
загружает 3D-движок и игры.

TAB = следующий режим:
  0 текстура 64x64 (стены)
  1 персонаж 32x32 x 8 кадров
  2 оружие   64x32 x 2 кадра
  3 BIB      32x32 (библиотека)

N = следующий кадр
G = сетка 8x8 (помощь)

КЛАВИШИ (только клавиатура!):
  СТРЕЛКИ    = движение курсора
  ПРОБЕЛ     = поставить / завершить
  A / D      = цвет - / +
  1..5       = инструмент

ИНСТРУМЕНТЫ (1..5):
  1 пиксель   2 линия   3 прямоугольник
  4 круг      5 заливка

S = сохранить (PAINT.RAW)
L = загрузить

ИСПОЛЬЗОВАНИЕ В ИГРЕ:
  текстура: WTLD 1,"PAINT.RAW"
  персонаж: WSDEF 1,"PAINT.RAW"
  оружие:   WGUN "PAINT.RAW"

F5 = запуск PAINT3D
НОВОЕ 2026: 255 цветов, большой буфер
НОВОЕ В CYBER27 (2026)

255 ЦВЕТОВ (было 32)
  CO 0..254   напр. CO 32 = чистый чёрный

  Новые группы:
   64-79  градации серого (16)
   80-95  красные (16)
   96-111 зелёные (16)
   112-127 синие (16)
   128-143 золото/коричневый (16)
   144-159 фиолетовые (16)
   160-175 бирюзовые (16)
   176-191 кожа (16)
   192-207 камень (16)
   208-223 лес (16)
   224-239 небо (16)
   240-254 огонь (15)

БУФЕР 320x240 (было 164x128)
  - в 4 раза больше пикселей
  - на 640x480 масштаб x2 = ПОЛНЫЙ экран
  - на 1920x1080 масштаб x4

WCOMPAT 2   старые игры (0..163)
WCOMPAT 1   новые игры (0..319)
  По умолчанию 2 — старые игры работают.
  В новой игре: WCOMPAT 1.

SCRINFO  информация об экране:
  R0,R1 = ширина,высота
  R2    = масштаб буфера
  R3,R4 = смещение X,Y
  R5,R6 = размер буфера

FOR с ИМЕНЕМ (раньше только R0..R7)
  FOR I = 1 TO 10   работает!
  NEXT I

BLIT sx,sy,w,h,dx,dy
  Копировать прямоугольник в буфере.
  Скроллинг: BLIT 2,0,318,239,0,0

BLITT sx,sy,w,h,dx,dy
  Как BLIT, но пиксели 0 —
  ПРОЗРАЧНЫЕ (фон остаётся).

WSETDIR "каталог"
  Каталог ресурсов для WTLD/WSDEF
  WSETDIR "" = корневой каталог

WARSTWY.TXT — база слоёв
  NAZWA RENDER WYSOKOSC KOLIZJA TEKSTURA [SPRITE=n]
  render: podloga/bryla/prog/drzewo/sprite/brak

Статус проекта

CYBER27 · Raspberry Pi 3 · Circle · 2026