NedoOS
Многозадачная операционная система для ZX Spectrum
Multitasking operating system for ZX Spectrum

Возможности
Capabilities
~~~~~~~~~~~

* работа с дискетами TR-DOS, SD-картой, IDE HDD (FAT12/16/32). Номера устройств: "E".."H" - IDE HDD (Master), "I".."L" - IDE HDD (Slave), "M" - SD-карта (Z-controller), "N" - SD-карта (NeoGS), "O" - USB flash, "A".."D" - дискета TR-DOS. IDE-контроллер (ATM или Nemo) зависит от того, каким батником собрать. Поддержаны сегментированные файлы в TR-DOS произвольного размера (по стандарту файлов последовательного доступа TR-DOS). Длинные имена в FAT.
  Works with TR-DOS floppies, SD card, IDE HDD (FAT12/16/32). Device letters: "E".."H" - IDE HDD (Master), "I".."L" - IDE HDD (Slave), "M" - SD-карта (Z-controller), "N" - SD-карта (NeoGS), "O" - USB flash, "A".."D" - TR-DOS floppies. IDE controller (ATM or Nemo IDE) depends on the batch file you run. Includes support for segmented TR-DOS files of any size (according to TR-DOS sequential access files standard).
* до 16 задач одновременно. Задачи могут быть активными (одна из них имеет фокус, то есть может читать устройства ввода и печатать на видимый экран терминала) и замороженными. Задачи могут отдавать свой квант времени системе с помощью YIELD, но не обязаны это делать.
  Up to 16 tasks at the same time. Tasks may be active (one of them has the focus, so it can read input devices and print on visible terminal screen) or frozen. Tasks may give away their times slot to system with using YIELD, but don't have to.
* одновременно можно открыть до 8 файлов на FAT, до 8 файлов на TR-DOS и до 8 пайпов между задачами.
  May open up to 8 files on FAT, up to 8 files on TR-DOS, and up to 8 pipes between tasks at the same time.
* программе пользователя доступна вся память 0x0100..0xffff, причём все 16K окна можно щёлкать через вызовы ОС (см. ниже). Файловые операции и передача данных в BDOS могут вестись по любому адресу в userspace.
  User program can access the whole memory 0x0100..0xffff, any 16K window can be switched via OS calls (see below). File operations and BDOS data transfer can be done at any address in userspace.
* программа пользователя может заменить обработчик прерываний (например, для восстановления содержимого стека) и переставлять стек.
  User programs can change interrupt handler (for example, to restore stack data) and move stack pointer.
* графический редактор Scratch, плейеры NedoPlayer и modplay, текстовый редактор texted, монтировщик образов дисков dmm, запускатель/переключатель снапшотов nmisvc, компилятор NedoLang, ассемблер NedoAsm, бейсик NedoBasic, просмотрщик картинок NedoView, разархиваторы *.zip, *gz, *.rar, *.tar, архиваторы *.rar и *.tar, сетевые утилиты (NedoBrowser, dmirc, dmftp, netterm и др.), игры...
  Gfx editor Scratch, music players NedoPlayer and modplay, text editor texted, disk image mounter dmm, snapshot runner/switcher nmisvc, compiler NedoLang, assembler NedoAsm, basic interpreter NedoBasic, picture viewer NedoView, decompressors for *.zip, *gz, *.rar, *.tar, archivers for *.rar and *.tar, network utilities (NedoBrowser, dmirc, dmftp, netterm etc.), games...

Системные требования
System requirements
~~~~~~~~~~~~~~~~~~~~

* компьютер, совместимый с ATM Turbo 2 или с ATM3 (в зависимости от того, каким батником собрать)
  ATM Turbo 2 or ATM3 compatible computer (depends on the batch file)
* рекомендуется Kempston mouse
  Kempston mouse recommended
* рекомендуется SD-карта (Z-Controller с теневыми портами или NeoGS) или HDD (NemoIDE или ATM IDE)
  SD card recommended (Z-Controller with shadow ports or NeoGS) or HDD (NemoIDE or ATM IDE)
* рекомендуется палитра от DDp (4+4+4)
  DDp's palette (4+4+4) recommended
* рекомендуются энергонезависимые часы по схеме Mr.Gluk'а
  Real-time clock (Mr.Gluk's schematics) recommended
* рекомендуется сетевая плата ZXNETUSB
  ZXNETUSB card recommended
* рекомендуется General Sound или NeoGS
  General Sound or NeoGS recommended
* рекомендуется TurboSound FM
  TurboSound FM recommended

Горячие клавиши
~~~~~~~~~~~~~~~

NedoOS опрашивает клавиши и мышь и передаёт их задаче, которая в фокусе.
Комбинации клавиш Ext+буква (Tab+буква) соответствуют управляющим кодам ASCII 1..26.
Комбинации клавиш Ext+цифра (Tab+цифра, Caps Shift+Symbol Shift+цифра) эквивалентны F1..F10 на PS/2 клавиатуре.

Параллельно проверяются горячие клавиши:

Caps Shift - задерживает скролл на экране
Symbol Shift+Enter - переключение визуальных задач (то есть тех, которые вызывали CMD_SETGFX), при этом задача, на которую переключились, получает код клавиши key_redraw (узнав это, она может перерисовать экран)
C+M+D (одновременно) - запустить cmd.com (опрашивается в задаче idle, поэтому работает только при отсутствии активных задач)
Caps Shift+2 (Caps Lock) - переключение регистра
Caps Shift+1 (`) (Alt+Shift) - переключение языка (рус/lat). В русском режиме (он также поддерживает украинский язык) действует раскладка ШВЕРТЫ. При этом часть букв вводится двумя нажатиями (ja=я, jo=ё, ju=ю, je=є, ji=ї, jy=i, cg=?, cc=ц, hh=э, jj=ъ). Из-за того, что "й", "ц", "ш", "э" работают в начале комбинаций, отдельно их ввести можно, нажав после них какую-либо клавишу, не входящую в их комбинации. Эта клавиша, нажатая после, не игнорируется, а тоже обрабатывается. В литературном тексте комбинации "йа", "йо", "йу", "йе", "чч", "хх", "йи", "йы", "йй", "цг" практически исключены (бывают в иностранных словах). Чтобы вводить такие комбинации, можно пользоваться движением курсора. Все знаки препинания, доступные в латинском режиме, доступны и в русском. Кодировка русских букв - CP866, украинских букв - CP1125 (см. setfont на ZX Evo)
Ext+Enter (Tab+Enter, Caps Shift+Symbol Shift+Enter, use Tab+Right Shift+Enter on incompatible keyboards) - вкл/выкл режим ввода псевдографики

При ошибках TR-DOS (красный бордер) работают кнопки R (Retry), I (Ignore sector), A (Abort).

cmd
~~~

Командный интерпретатор.
Имеется интерактивный режим ввода команд (командная строка) с прокруткой влево и вправо.
Кнопка вверх - вспомнить предыдущую команду.

Запускаются файлы следующих типов (проверяется первый символ расширения):
.com (расширение можно не писать) - исполняемая программа, под неё создаётся новый параллельный процесс, ей передаётся командная строка по адресу COMMANDLINE (см. раздел "Программирование").
.bat - последовательность команд, которые понимает cmd, в том числе запуск программ .com (в этом случае последовательный, а не параллельный - кроме команды start). Каждая команда показывается на экране до её исполнения.

Программы, установленные в bin/ системного диска, можно запускать в командной строке из любой директории любого диска (сначала программа ищется в текущей директории, потом в системном bin/). При запуске программ текущая директория не меняется.

Поддерживаются следующие команды:
uname - вывод ревизии ядра
exit - выход из cmd
a: ... o: - смена текущего диска
dir (ls) - каталог текущего диска (директории). Можно выводить в файл: dir >filename
cd <path> - переход на другую директорию. <path> может содержать имя диска. Путь ".." означает переход на уровень выше
md (mkdir) <path/dirname> - создать директорию с заданным именем в текущей или в заданной директории
del (rm) <path/filename> - удалить файл или пустую директорию в текущей директории
copy (cp) <path/filename> <newpath/newfilename> - копировать файл
ren <path/filename> <newpath/newfilename> - переименовать или переместить файл
mem (free) - показать число свободных страниц памяти
proc (ps) - показать текущие процессы и их состояние ("+" или "-" - активность, "g" для графических задач) 
drop (kill) <ID> - удалить процесс с заданным ID
date - показать текущую дату и время
rem - ничего не делает (нужно для .bat-файлов)
start <path/filename> - запустить программу в фоновом режиме (по умолчанию запускаемая программа блокирует cmd)
copydir <dir1> <dir2> - скопировать директорию dir1 вместе с файлами в директорию dir2 (рекурсивно). Должны быть указаны полные пути, а не относительные!
pause [sec] - ожидание нажатия клавиши sec секунд(по умолчанию - бесконечность)
echo <сообщение> - вывести сообщение (нужно для .bat-файлов)
type (cat) <path/filename> - вывести файл

Допустимы команды типа:
dir > filename.txt
dir | more.com
more < filename.txt

Параметры .bat-файла доступны через макросы %0..%9 (%0 - имя самого файла)

Системная задача idle запускает терминал term.com, который создаёт пайпы stdin и stdout и запускает командный интерпретатор для исполнения autoexec.bat. Потом idle входит в бесконечный цикл с опросом C+M+D (см. выше).
При запуске командный интерпретатор смотрит свою командную строку и исполняет её. Если командная строка имеет вид "cmd.com autoexec.bat", то после выполнения autoexec.bat командный интерпретатор входит в интерактивный режим, иначе выход.
Можно запустить ещё один независимый терминал командой term, или сетевой терминал (netterm), доступный по Telnet (TCP/IP port 2323).

nv
~~

Nedovigator - двухпанельный файловый менеджер.

Горячие клавиши:
стрелки (вверх, вниз) - переход по файлам
Home (Symbol Shift+Q) - переход к первому файлу
End (Symbol Shift+E) - переход к последнему файлу
Tab (Caps Shift+Symbol Shift) - переход между панелями
Space - пометка
Ext+A (Alt+A) - инверсия пометки
BackSpace (Caps Shift+0) - переход на директорию уровнем выше
Enter - запуск файла в блокирующем режиме (файлы .com и .$c запускаются непосредственно, остальные типы - с помощью внешних запускальщиков, см. ниже)
Enter - исполнение командной строки в блокирующем режиме, когда nv освобождает фокус и ожидает окончания вызыванной программы (потом кнопкой 9 можно посмотреть текстовый экран, который был на момент завершения команды)
Caps Shift+Enter или F9 - вставка имени файла в командную строку
3 - просмотр текстовых файлов (стрелки, PageUp (Caps Shift+3), PageDown (Caps Shift+4), F1 - переключение кодировки, Ins - переключение переноса строк, Break (Esc, Caps Shift+Space) - выход, Tab (Caps Shift + Symbol Shift) - hex viewer (управление стрелками, PgUp, PgDn, ввод цифрами и a-f, Caps Shift+Enter или F2 (сохранение), Break (Esc, Caps Shift+Space) - выход), Tab (Caps Shift+Symbol Shift) - переход в просмотрщик)
4 - вызов редактора texted для редактирования файла под курсором
5 - копирование помеченных файлов или текущего файла на противоположную панель
6 - переименование файла/директории (запрещены символы :,/,\)
7 - создание директории с заданным именем в текущей панели (Esc (CS+Space) - отмена)
8 - удаление помеченных файлов (или директорий, если они пустые - непустая не удалится)
1 - выбор дисковода в текущей панели (стрелками, Esc (CS+Space) - отмена, Enter - подтверждение)
2 - поиск файла (Tab - переключение между именем файла и подстрокой)
(вместо цифр можно нажимать F1..F10 на клавиатуре PS/2)
Symbol Shift+1..5 - выбор режима сортировки (по имени, расширению, размеру, дате, без сортировки). Повторное нажатие меняет порядок сортировки на противоположный, смена режима устанавливает порядок по возрастанию
Break (Esc, Caps Shift+Space) - выход (Esc - отмена, Enter - подтверждение)

Остальные клавиши используются для редактирования командной строки (цифры не вводятся при пустой командной строке).

Сохраняется текстовый экран программы, запущенной из командной строки (но не программы, запущенной в другом терминале). Терминал можно прокрутить колесом мыши.
В случае nvfast, который работает не через терминал, переключение между экраном программы и nv - кнопка Esc.

В файле nv.ext описана ассоциация запускальщиков файлов по расширению, например:
bmp,scr:scratch.com
bat:cmd.com

texted
~~~~~~

Текстовый редактор. Вызывается с параметром - именем редактируемого файла.
Может редактировать файл любого размера, сколько хватит памяти.

Горячие клавиши:
стрелки, PageUp (Caps Shift+3), PageDown (Caps Shift+4) - движение курсора
Home (Symbol Shift+Q) - переход к началу строки
End (Symbol Shift+E) - переход к концу строки
Symbol Shift+PageUp - переход к началу текста
Symbol Shift+PageDown - переход к концу текста
BackSpace (Caps Shift+0) - удаление символа слева от курсора
Del (Caps Shift+9) - удаление символа справа от курсора
Break (Esc, Caps Shift+Space) - выход
Ins (Symbol Shift+W) - wrap on/off
F1 - help
F2 или Caps Shift+Enter - сохранение
F9 - запустить build.bat из директории с текстом
F10 - сменить кодировку (866/1251)

Остальные клавиши используются для ввода символов.

basic
~~~~~

NedoBasic - интерпретатор языка Бейсик. Можно вызвать с параметром - именем запускаемого файла *.bas.

Типы данных:
* целые числа (32 бита со знаком), также используются как логические значения (0=false, -1=true), также используются как индекс цикла, но для этого им выделяется больше памяти
* строки (до 255 байт+нулевой терминатор), также используются как массив беззнаковых байтов
* одномерные массивы целых чисел (32 бита со знаком)

Имена переменных однобуквенные: i (число), a$ (строка), a(10) (10-й элемент массива, считая с 0), a$(10) (10-й символ строки, считая с нуля).

В выражениях используются операции:
* самый низкий приоритет: =, <, >, <=, >=, <>
* средний приоритет: +, -
* высокий приоритет: *, /
* самый высокий приоритет: унарный -, скобки выражений ()
Также имеется функция $rnd (выдаёт числа 0..65535, после названия функции надо писать пробел!)

Команды (можно писать несколько в одной строке через двоеточие):
run - запуск программы
list - просмотр листинга программы
quit - выход из NedoBasic
edit <выражение> - вызов на редактирование строки с заданным номером
clear - очистка переменных
new - удаление программы
let <переменная>=<выражение>
print <выражение>;<выражение>... (если последний символ - точка с запятой, то в конце не делается перевод строки)
cls - очистка экрана чёрным цветом
goto <выражение> - переход на заданный номер строки или (если такой строки нет) на первый номер после указанного
if <выражение> then <команды> - если выражение не равно false, выполнить команды до конца строки
dim <переменная>(<выражение>) - создать массив заданного размера
for <переменная>=<выражение_начальное значение> to <выражение_конечное значение> step <выражение_шаг> - начало цикла. Шаг может быть положительным или отрицательным, но не 0
next <переменная> - конец цикла
rem <текст> - комментарий до конца строки
gfx 0 - включение графического режима 320x200x16 цветов
gfx 6 - включение текстового режима (после выхода из программы включается автоматически)
pause - ожидание нажатия клавиши
plot <выражение_x>,<выражение_y>,<выражение_color> - рисование точки в графическом режиме
line <выражение_x2>,<выражение_y2>,<выражение_color> - рисование линии в графическом режиме (от предыдущей точки или конца предыдущей линии)
save <строка_имя файла> - сохранение программы. Имя файла может быть с путём, например, "m:/path/file.bas". Строка может быть строковой переменной
load <строка_имя файла> - загрузка программы. Имя файла может быть с путём, например, "m:/path/file.bas". Строка может быть строковой переменной
system <строка_команда> - запуск команды через cmd с ожиданием завершения. Строка может быть строковой переменной

Прерывание выполнения программы или просмотра листинга - по кнопке Esc (Break, CS+Space)

tp
~~

Turbo Pascal 3.0 by Borland. Горячие клавиши написаны на экране.
Может редактировать, компилировать в память и на диск. Описание есть на английском: http://www.retroarchive.org/docs/software/turbodoc.html
Примеры - t.pas ("Hello" в цикле), mc.pas (электронная таблица)

cc, cc2, clink, c.ccc, deff.crl, deff2.crl
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

BDS C compiler by Brain Damage Software. Пример: cc.bat ex (скомпилирует ex.c, слинкует и запустит)

#include <stdio.h>
main(argc,argv)
char **argv;
{
int i;
printf("Hello world!\n");

for (i = 1; i < argc; i++) printf("Arg #%d = %s\n",i,argv[i]);

getchar();
}

Работать так:
cc filename.c
(cc2 - второй проход компилятора, запускается автоматически)
Объектные файлы и библиотеки имеют расширение .crl (deff2.crl линкер подключает автоматически). Примеры библиотек - deff2a.csm, deffgfx.csm.
Слинковать исполняемый файл:
clink filename
clink filename deffgfx (см. cc.bat и пример ex.c)

Как собрать утилиту склейки файлов (concat outfile infile1 infile2):
cc concat.c
clink concat

modplay
~~~~~~

Простейший плейер музыки в формате MOD (на General Sound).
Имя файла для проигрывания передаётся параметром в командной строке.
Запуск без параметров останавливает проигрывание.

pkunzip
~~~~~~~

Распаковщик архивов в форматах *.zip и *.gz.
Распаковывает весь архив, заданный в качестве параметра, в текущую директорию.

tar
~~~

Распаковщик архивов в формате *.tar.
Распаковывает весь архив, заданный в качестве параметра, в текущую директорию.
Если параметр - не архив .tar, то это имя файла, из которого создастся архив (если указана директория, то она вся упакуется в архив со входящими файлами и директориями). Имя архива соответствует имени файла, с заменой расширения на .tar

unrar
~~~~~

Распаковщик архивов в формате *.rar (2.x).
Принимает имя архива в командной строке, дальше работает в интерактивном режиме.
v - просмотр содержимого архива
e - распаковка нужных файлов из архива
m - ввод маски для файлов (первые символы имени файла в архиве, включая внутренний путь)

zxrar
~~~~~

Упаковщик архивов в формате *.rar (2.x).
Принимает имя файла в командной строке, создаёт и пополняет архив mynewrar.rar.

browser
~~~~~~~

NedoBrowser - веб-браузер.
Вызывается командной строкой типа:
browser file://m:/girl.jpg (можно не писать file://)
browser http://alonecoder.nedopc.com/ (можно не писать http:// и конечный слеш)
https:// поддерживается через прокси.

Внизу экрана расположена строка статуса, где отображается:
- полный путь к текущему файлу
- число занятых страниц
- время рендера
- ошибки (conn.err - ошибка соединения, load err - ошибка загрузки)

Поддержаны форматы:
html (пока не все тэги и только кодировки windows-1251 и UTF-8 (по умолчанию))
jpeg (пока только обычная развёртка)
gif (пока только обычная развёртка, поддержана анимация)
png (пока только обычная развёртка)
bmp (пока только обычный порядок строк, 24bit)
svg (без заливки, координаты в ограниченном диапазоне)
При просмотре крупных картинок действуют стрелки, Z - смена масштаба.

Горячие клавиши:
стрелки, PageUp (Caps Shift+3), PageDown (Caps Shift+4) - движение курсора
Enter - переход по ссылке
S - сохранить текущий файл (в текущей версии имя файла download.fil, первая буква увеличивается с каждым файлом)
L - скачать файл по ссылке (вызывает программу wget)
5 - перезагрузить файл
E - отредактировать url (действуют стрелки влево, вправо, Enter, BackSpace (Caps Shift+0))
U - сменить кодировку UTF-8/windows-1251
BackSpace (Caps Shift+0) - возврат по истории
Break (Esc, Caps Shift+Space) - выход

wget
~~~~

Утилита скачки файла по HTTPS.
Автоматически запускает музыку и картинки scr.

dmm
~~~

Утилита монтирования образов TRD, SCL, FDI, TAP через Evo Service.
Также может монтировать TRD образы с помошью ПЗУ xBIOS на ATM2.

time
~~~~

Утилита обновления времени с импользованием интернета. Ключи:
-H help
-T set time(-T17:59:38)
-D set date(-D21-06-2019)
-N ntp-server default: -N2.ru.pool.ntp.org
-Z time-zone default: -Z3
-i get datetime from internet

dmirc
~~~~~

IRC-клиент.

dmftp
~~~~~

FTP-клиент.

ping
~~~~

ping 1.2.3.4

telnet
~~~~~~

Telnet-клиент.
Можно писать порт: telnet url:1234, по умолчанию 23.

3ws
~~~

Web-сервер для расшаривания системного диска.
Описание см. 3ws.txt
Можно использовать своё оформление (файлы в одноимённом подкаталоге)

wizcfg
~~~~~~

Настройка сети для ZXNETUSB по файлу net.ini.

nmisvc
~~~~~~

Запускатель и переключатель снапшотов (на ATM3).
Запускает снапшот .SNA (48K или 128K), переданный в командной строке.

Выход из снапшота в OS по кнопке NMI. Можно сохранить состояние в новый снапшот или продолжить выполнение.
В это же время можно вручную переключиться на другую задачу в OS. Таким образом можно переключаться между снапшотами и системой.

Также умеет запускать бейсики с TR-DOS диска.

view
~~~~

NedoView - просмотрщик картинок.

Поддерживает следующие форматы:
scr (6144 и 6912)
fnt (в линейном и экранном формате, 768 и 2048)
img (два экрана с мерцанием)
3 (редакторы AGA, 8col)
888 (редактор 8col)
+ или - (редактор MultiStudio)
Y (упакованная 8-цветная картинка для просмотрщика ManyColor+/XColor+)
plc (Laser Compact 5, BGE)
mc (мультиколор)
mlt (мультиколор из редактора ZX Paintbrush)
mcx (мультиколор с мерцанием)
grf (аппаратный мультиколор ATM/Profi)
ch$ (большие картинки с атрибутами, с мерцанием и без)
mg1, mg2, mg4, mg8 (редактор MultiArtist)
rm (R-Mode)
16c (образ памяти 32K + 32 байта палитра)

hddfdisk
~~~~~~~~

Утилита для разметки и форматирования разделов на IDE.

term
~~~~

Терминал для программ, использующих stdio.asm.
Передаёт ANSI-коды (VT-100+) с событиями мыши.
Прокрутка колёсиком мыши.
Клик мышкой в левом верхнем углу - сохранение текст терминала файл в pasta.txt.
Клик мышкой в левом нижнем углу - вставка 80 символов из файла pasta.txt.

netterm
~~~~~~~

Сетевой терминал (Telnet-сервер по порту 2323) для программ, использующих stdio.asm
Telnet-клиент (на примере Putty) должен быть настроен так:
- VT-100
- Local echo off
- Local line editing off
- Backspace = Control H

pt
~~

Pro Tracker 3.x с увеличенным окном и с поддержкой жёсткого диска и General Sound (см. описание в отдельном файле)

playtap
~~~~~~~
Плейер файлов .tap. Играемый файл должен называться tilt.tap.

Программирование (подробнее см. api_base.txt)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Программы пользователя компилируются с заголовочным файлом ../_sdk/sys_h.asm, который включает файл sysdefs.asm с константами.

Программы грузятся и запускаются с PROGSTART (0x0100), с командной строкой в COMMANDLINE (0x0080) длиной COMMANDLINE_sz (0x0080). Крайне рекомендуется использовать эти константы, а не числа (то же касается кодов клавиш, номеров вызовов и т.п.).
Стек изначально растёт сверху из 0x0000, его можно переставлять вручную в любое место выше 0x3b00.
Файловые операции и передача данных в BDOS могут вестись по любому адресу в userspace.
 
Не рекомендуется читать порты клавиатуры вручную, используйте OS_GETKEYMATRIX - она возвращает нажатые клавиши только той задаче, которая сейчас в фокусе.

Не рекомендуется в программах пользователя использовать зависимость от syssets.asm.

Разработчики приложений используют символьные имена клавиш, определённые в sysdefs.asm в разделе "Usable key codes".

В настоящий момент система не может собрать сама себя. Чтобы приблизиться к этому, будем соблюдать ряд рекомендаций при программировании на ассемблере:
- не рекомендуется использовать для сборки программ внешние утилиты (*.exe), кроме ассемблера и пакета NedoLang.
- рекомендуется оформлять шестнадцатеричные числа в формате 0xffff, не рекомендуется использовать двоичные числа (в крайнем случае писать в формате 0b0101).
- рекомендуется арифметические выражения писать так, чтобы они выполнялись правильно даже при отсутствии приоритета операций. Если для этого требуется начать выражение со скобки, пишите перед скобкой знак +.
- рекомендуется арифметические выражения писать так, чтобы они выполнялись правильно при беззнаковом умножении и делении.
- не рекомендуется использовать ifn a == b, пользуйтесь if a != b.
- не рекомендуется использовать ORG, кроме начального. Пользуйтесь ds addr-$.
- не рекомендуется использовать DUP..EDUP, для больших блоков можно пользоваться include, а маленькие разворачивать.
- не рекомендуется использовать EQU и STRUCT, пользуйтесь знаком =.
- не рекомендуется использовать цифровые метки и переходы вида 1b (особенно переходы вида 1f!).
- не рекомендуется писать несколько команд в строке и несколько наборов параметров у одной команды.
- не рекомендуется использовать кодировку UTF8, пользуйтесь кодировкой Windows-1251 или CP866.
По мере развития нативной системы сборки эти ограничения будут смягчаться.

Рестарты в кернале (крайне рекомендуется использовать их через макросы, т.к. планируется освободить 0x0000 для пользователя, сделать CALLBDOS рестартом, а SETPG... вызовами для скорости):
QUIT (0x0000) - закрытие текущей задачи и освобождение её памяти (предполагается также как точка останова в отладчике), hl=result
CALLBDOS (0x0005) - вызов BDOS (функции см. в см. sys_h.asm, номер функции в C). Не следует вызывать этот макрос напрямую, для каждой команды есть отдельный макрос OS_... Регистры не сохраняются!
OS_GETKEY (0x0008) - читать клавишу (HA=код с языком, BC=код без языка, коды клавиш указаны в sysdefs.asm) и одновременно читать мышь (de=mouse position (y,x), l=mouse buttons (bits 0,1,2: 0=pressed)) и кемпстон-джойстик (LX), nz=программа не в фокусе, кнопки не выдаются, позицию мыши надо игнорировать (=0)
OS_PRCHAR (0x0010) - печать символа A (регистры не сохраняются!)
SETPG4000 (0x0018) - включить страницу A в 0x4000 (портит регистр BC). Номер страницы сохраняется в (CURPG16K)
SETPG8000 (0x0020) - включить страницу A в 0x8000 (портит регистр BC). Номер страницы сохраняется в (CURPG32KLOW)
SETPGC000 (0x0028) - включить страницу A в 0xc000 (портит регистр BC). Номер страницы сохраняется в (CURPG32KHIGH)
(страницу в 0x0000 переключать через OS_SETMAINPAGE, при этом в странице должен быть керналь!)
0x0030 - планируется far call
0x0038 - обработчик прерываний

Функции BDOS:
см. sys_h.asm

Вход в стандартный обработчик прерываний выглядит так:
        push af
        push bc
        push de

Как перехватывать обработчик прерываний в вашей программе:
- замените 3 байта по адресу 0x0038 на jp <адрес вашего обработчика>, а адрес intjp возьмите из 0x0038+3 и скопируйте к себе.
Например:
swapimer ;первый вызов включит ваш обработчик, второй вызов вернёт обратно стандартный обработчик
	di
         ld hl,(0x0038+3) ;адрес intjp
         ld (intjpaddr),hl        
        ld de,0x0038
        ld hl,oldimer
        ld bc,3
swapimer0
        ld a,(de)
        ldi ;[oldimer] -> [0x0038]
        dec hl
        ld (hl),a ;[0x0038] -> [oldimer]
        inc hl
        jp pe,swapimer0
	ei
        ret
oldimer
        jp on_int ;заменится на код из 0x0038
        jp 0x0038+3
- ваш обработчик прерываний должен вызывать oldimer.
Например:
on_int
        ex de,hl ;de="hl", hl="de"
        ex (sp),hl ;hl=адрес выхода, de="hl", в стеке "de"
	ld (on_int_jp),hl
        ld (on_int_sp),SP
	ld sp,INTSTACK ;чтобы не запортить стек
        push af
        push bc
        push de ;"hl"
	...
        call oldimer ;ei
        ...
        pop de ;"hl"
        pop bc
        pop af
on_int_sp=$+1
	ld sp,0
;de="hl", в стеке "de"
        pop de
        ;ei
on_int_jp=$+1
        jp 0
- не пользуйтесь YIELD, пользуйтесь вместо него HALT. Иначе прерывание уйдёт в другую задачу, а там другой обработчик прерываний.
- функции NedoOS (кроме переключения страниц) вызывайте либо в обработчике прерываний, либо непосредственно после HALT.
- если вы просто устанавливаете свой проигрыватель музыки, используйте OS_SETMUSIC, при этом можно игнорировать предыдущие два пункта (музыка будет работать всё равно).

Разработчики
~~~~~~~~~~~~

Руководитель проекта, код, документирование - Быстров Дмитрий Михайлович (Alone Coder/Conscience).
Работа с сетью, патчи в дисковую подсистему, утилиты, тестирование - DimkaM.
Немного кода и документирования - Гривин Николай Александрович.
NedoBasic написан с участием Кирилла Ловягина в рамках обучения ассемблеру.
Дальнейшее развитие NedoBasic и Nedovigator, скрипты сборки под Linux, утилиты - demige.
Сортировка файлов, фиксы скриптов сборки под Linux, утилита aynet_psg, фикс sjasm и UnrealSpeccy - Lord Vader.
Утилиты rdtrd, wrtrd - Konstantin Kosarev.
Игра ZX Battle City - Slip, музыка - nq, тестирование - Videogames Sematary, портирование - Alone Coder.
Портирование игры Eric and the Floaters - Rasmer, раскраска - Alone Coder, Sashapont.
Портирование игры Black Raven - Alone Coder, раскраска - Alone Coder, Sashapont, Котик, Louisa.
Логотипы - Louisa, Sashapont, Wizard.

Дисковая подсистема основана на библиотеке FatFS с драйверами от Savelij13 и DimkaM и на библиотеке iofast из комплекта NedoLang.

Операционная система была задумана в 2007 году, тогда же была написана (но не проверена) первая версия ядра. Основная часть кода ядра, cmd и nv написана в 2018 году в рамках проекта графического редактора Scratch.

Лицензия
~~~~~~~~

Разрешается свободное распространение программы и её исходного кода. Нельзя портировать на другие платформы (полностью или частично) без согласования с руководителем проекта.

Настройка системы
~~~~~~~~~~~~~~~~~

Использование часов по схеме Mr.Gluk'а на АТМ2 проверено в UnrealSpeccy 0.37.1.

Образы дисков (чисто для примера, там нужны только bmp'шки, образ HDD можно расковырять через WinImage, а образ SD-карты замаунтить в новых виндовсах, главное не забыть потом размаунтить):
http://alonecoder.nedopc.com/sd.zip
http://alonecoder.nedopc.com/hdd.zip

Установка системы на реальный HDD:
1. Запустить mkatm2.bat (или mkatm3.bat для ATM3).
2. С помощью nv скопировать все файлы с полученного *.trd в e:/bin/.
3. Запустить mkatm2hd.bat (или mkatm3hd.bat для ATM3), скопировать полученный *.$c на драйв 1.
После этого можно запускать систему (*.$c) с HDD.

Установка системы на реальную SD-карту: пцшным копировщиком скопировать каталог bin/ и нужный $c на SD-карту.

Настройки для эмулятора UnrealSpeccy:

[ZC]            ; Z-Controller settings
; sdcard image
SDCARD="sd.vhd"

[HDD]
Scheme=NEMO-DIVIDE (для АТМ3 версии) или ATM (для ATM2 версии)

Image0=hdd.ima
CHS0=609/16/63  ; max size, accessible through CHS. not used for real drive
LBA0=614400    ; max size, accessible through LBA. not used for real drive
HD0RO=0         ; read only flag
CD0=0           ; 1 if image is cdrom

eVHDattach.bat (можно примонтировать и по клику на *.vhd):
d:
cd zx\us035\
@echo off
if exist VHDattach.txt (
	@echo on
	echo VHDattach.txt exist
	@echo off
) else (
	@echo on
	echo create VHDattach.txt
	@echo off
	echo select vdisk file="%cd%\sd.vhd" > VHDattach.txt
	echo attach vdisk >> VHDattach.txt
	rem echo select vdisk file="%cd%\sd.vhd" >> VHDattach.txt
	rem echo select part 1 >> VHDattach.txt
	rem echo assign letter=K >> VHDattach.txt
)
if exist sd.vhd (
	@echo on
	echo sd.vhd attach
	diskpart /s VHDattach.txt
	@echo off
) else (
	@echo on
	echo create VHDcreate.txt
	@echo off
	echo create vdisk file="%cd%\sd.vhd" MAXIMUM=300 TYPE=FIXED > VHDcreate.txt
	echo select vdisk file="%cd%\sd.vhd" >> VHDcreate.txt
	echo attach vdisk >> VHDcreate.txt
	echo create part primary  >> VHDcreate.txt
	echo select part 1 >> VHDcreate.txt
	echo format label="ZX" quick fs=FAT32 >> VHDcreate.txt
	echo assign >> VHDcreate.txt
	@echo on
	diskpart /s VHDcreate.txt
	del VHDcreate.txt
	@echo off
)
@echo on
pause

eVHDdetach.bat:
d:
cd zx\us035\
@echo off
if exist VHDdetach.txt (
	@echo on
	echo VHDdetach.txt exist
	@echo off
) else (
	@echo on
	echo create VHDdetach.txt
	@echo off
	echo select vdisk file="%cd%\sd.vhd" > VHDdetach.txt
	echo detach vdisk >> VHDdetach.txt
)
@echo on
diskpart /s VHDdetach.txt
pause

В Windows 10 можно использовать монтирование и размонтирование по правой кнопке.
