Rev 519 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
Определения, описанные в этом документе, объявлены в файле 'sys_h.asm',
который в свою очередь линкует файл 'sysdefs.asm'.
Данный документ подразумевает использование асм-компилятора sjasmplus из репозитория NedoOS.
sjasmplus поставляется в виде исполняемого файла sjasmplus.exe для OS Windows.
А также в виде исходного кода для самостоятельной сборки под вами используемую OS.
************************* Используемые выражения *************************
байт - минимальная единица хранения данных в ОЗУ ZX-Spectrum, равная 8 битам.
0x - приставка к константе, обозначающая число представленное в шестнадцатеричной системе измерения.
little-endian - представление числа в ОЗУ. Это представление использует процессор z80.
Сначала младший байт, затем старший. В этом документе, по умолчанию, все числа little-endian.
К примеру 16 битное число 0x1234 располагается в памяти как DEFB 0x34,0x12
string(строка) - нуль-терминированный массив байтов, обычно содержащий строку символов.
Пример: DEFB "Hello Work!",0
буфер - массив байтов, как правило располагается в ОЗУ.
страница ОЗУ(page) - 16 килобайт физического ОЗУ.
окно(окно памяти) - диапазон адресного пространства процессора z80.
В NedoOS используется четыре окна располагаемых в адресах
0x0000...0x3fff, 0x4000...0x7fff, 0x8000...0xbfff, 0xc000...0xffff
указатель - адрес, в адресном пространстве z80 либо файле, указывающий на ячейку памяти или на начало массива ячеек памяти
Палитра - палитра цветов видеовывода
фокус - доступность, процессу, вывода на экран и чтения клавиатуры.
В момент времени фокус может принадлежать только одному процессу, остальным процессам в этот момент фокус недоступен.
Фокус переключается при вызове OS_SETGFX, при закрытии процесса, а также хоткеем.
квант времени - время выделяемое процессу. Как правило процессорное время распределяется
в равных долях между всеми активными процессами. Переключение процессов происходит
по сигналу n_int процессора, либо если процесс отдал свой квант времени.
процесс - задача.
Процессу доступно адресное пространство 0x0080...0xffff.
Не допускается модифицирование данных, процессом, в адресном пространстве 0x0000...0x007f
Стек процесса может располагаться в диапазоне адресов 0x3b00...0xffff.
У каждого процесса свой квант времени и своя палитра.
При создании процесса ему выделяется четыре страницы ОЗУ, которые подключаются
в 4 окна адресного пространства. Адреса 0x0000...0x00ff заполняются служебной информацией.
Также устанавливается системная цветовая палитра.
При старте процесса управление передается на адрес PROGSTART,
в регистр SP помещается адрес 0x0000.
программа - типичная программа это исполняемый файл с расширением '.com', максимальный размер программы 0x10000-PROGSTART
При запуске программы она помещается в отдельный процесс начиная с адреса PROGSTART
командная строка вызова программы помещается(вызываемым процессом) начиная с адреса 0x0080, максимум PROGSTART-0x0080 символов.
Программы запускаются процессами следующим образом:
создаётся процесс, загружается тело программы в его страницы, запускается процесс.
Исходный код программы, как правило, начинается строками:
DEVICE ZXSPECTRUM128
include "../_sdk/sys_h.asm"
ORG PROGSTART
И заканчивается строкой
savebin "progname.com",PROGSTART,$-PROGSTART
Данный тип программ поддерживается, для запуска, программами 'cmd.com' и 'nv.com'
8.3 - формат имени файла либо директории, до 8 символов имя и до 3 символов расширение.
В случае присутствия расширения, используется символ '.' в качестве разделителя имени и расширения
***********************************************************
*********************** Определения ***********************
***********************************************************
При вызове функций ядра возможна порча всех регистров(за исключением SP).
*********************** PROGSTART **********************
Идентификатор, определяющий начало компиляции и стартовый адрес программы.
В текущей реализации равен 0x0100
Пример использования, а также минимальный исходный код программы:
DEVICE ZXSPECTRUM128
include "../_sdk/sys_h.asm"
ORG PROGSTART
;исходный код программы
QUIT
savebin "progname.com",PROGSTART,$-PROGSTART
*********************** QUIT **********************
Макрос, вызова функции ядра.
Закрывает текущий процесс, освобождая все используемые им страницы ОЗУ,
дескрипторы сокетов.
Переключает исполнение и фокус видеовывода на следующий активный процесс.
Аргументы не используются.
Возвращаемых значений нет.
Пример использования смотрите в описании PROGSTART
*********************** OS_YIELD **********************
Макрос, вызова функции ядра.
Отдаёт квант времени системе.
Аргументы не используются.
Возвращаемых значений нет.
Пример использования смотрите в описании GET_KEY
Примечание: обычно используется при ожидании какого либо события не критичного по времени отклика.
Использование этого вызова ускоряет общую работу системы.
*********************** OS_SETGFX **********************
Макрос вызова функции ядра.
Устанавливает видеорежим и переключает фокус на текущий процесс.
При старте процесса вывод на экран, процессом, недоступен без установки видеорежима.
Все аргументы в регистрах:
E - видеорежим, допустимы следующие значения:
0 - EGA
2 - Аппаратный мультиколор
3 - 6912
6 - текстовый видеорежим
-1 - отключает видеовывод и переключает фокус на следующий процесс
Возвращаемые значения в регистрах:
E - видеорежим до вызова OS_SETGFX
Пример установки текстового видеорежима:
LD E,6
OS_SETGFX
*********************** PRCHAR **********************
Макрос вызова функции ядра.
Выводит символ на экран, используется только в текстовом видеорежиме.
При отсутствии фокуса вывод игнорируется.
Все аргументы в регистрах:
A - символ. символы '\r' и '\n' являются управляющими.
Возвращаемых значений нет.
Пример печати строки "Hello Work!":
DEVICE ZXSPECTRUM128
include "../_sdk/sys_h.asm"
ORG PROGSTART
LD E,6
OS_SETGFX
LD HL,STR_HELLO
PRINT_LOOP:
LD A,(HL)
OR A
JR Z,PRINT_LOOP_END
PUSH HL
PRCHAR
POP HL
INC HL
JR PRINT_LOOP
PRINT_LOOP_END:
QUIT
STR_HELLO:
DEFB "Hello Work!",0
savebin "progname.com",PROGSTART,$-PROGSTART
*********************** GET_KEY **********************
Макрос вызова функции ядра.
Возвращает нажатую кнопку клавиатуры, кнопки мыши и координаты мыши.
Фактически чтение происходит только процессом с фокусом. При отсутствии фокуса возвращается
код символа NOKEY и флаг Z установлен в 0.
Аргументов нет.
Возвращаемые значения в регистрах:
A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Internal keyboard values'
C - код символа(кнопки) без учета текущего языкового модификатора. Как правило используется при обработки "горячих кнопок"
DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
L - кнопки мыши (bits 0,1,2: 0=pressed)
Флаг Z - если 0(NZ), то отсутствует фокус.
Пример ожидания символа:
ORG PROGSTART
LD E,6
OS_SETGFX
...
WAIT_LOOP:
OS_YIELD ;не обязательно. Если время не критично,
;то отдадим квант времени системе.
GET_KEY
OR A
JR Z,WAIT_LOOP
CP key_esc
JP Z,CLOSE_PROC
;получили код символа в A
...
CLOSE_PROC:
QUIT
Примечание: желательна обработка кода key_esc для завершения программы.
*********************** OS_OPENHANDLE **********************
Макрос вызова функции ядра.
Открывает существующий файл для чтения/записи.
Все аргументы в регистрах:
DE - строка с именем файла, может содержать относительный или абсолютный путь к файлу.
в текущей реализации поддержан формат имен 8.3
Возвращаемые значения в регистрах:
А - ошибка. Если 0x00 то ошибки нет.
B - дескриптор файла если нет ошибки.
Пример открытия файла 'pyraster.txt' расположенного в директории '../fu/ckco':
...
LD DE,FILE_NAME
OS_OPENHANDLE
OR A
JP NZ,ERR_EXIT ;обработка ошибок
LD A,B
LD (FILE),A ;сохраняем дескриптор
...
FILE_NAME:
DEFB "../fu/ckco/pyraster.txt",0
...
Примечание: Необходимо закрывать все открытые файлы.
Так же желательно закрыть файл как только он становится не нужен для чтения\записи.
При открытии файла указатель чтения\записи устанавливается на первый байт в файле.
*********************** OS_CLOSEHANDLE **********************
Макрос вызова функции ядра.
Закрывает открытый файл.
Все аргументы в регистрах:
B - дескриптор файла.
Возвращаемые значения в регистрах:
А - ошибка. Если 0x00 то ошибки нет.
Пример закрытия файла:
...
LD B,(FILE)
OS_OPENHANDLE
OR A
JP NZ,ERR_EXIT ;обработка ошибок
...
Примечание: Необходимо закрывать все открытые файлы.
Так же желательно закрыть файл как только он становится не нужен для чтения\записи.
*********************** OS_CREATEHANDLE **********************
Макрос вызова функции ядра.
Создать и открыть файл для чтения/записи.
Все аргументы в регистрах:
DE - строка с именем файла, может содержать относительный или абсолютный путь к файлу.
в текущей реализации поддержан формат имен 8.3
Возвращаемые значения в регистрах:
А - ошибка. Если 0x00 то ошибки нет.
B - дескриптор файла если нет ошибки.
Пример создания файла 'pyraster.txt' расположенного в директории '../fu/ckco':
...
LD DE,FILE_NAME
OS_CREATEHANDLE
OR A
JP NZ,ERR_EXIT ;обработка ошибок
LD A,B
LD (FILE),A ;сохраняем дескриптор
...
FILE_NAME:
DEFB "../fu/ckco/pyraster.txt",0
...
Примечание: Необходимо закрывать все открытые файлы.
Так же желательно закрыть файл как только он становится не нужен для чтения\записи.
При открытии файла указатель чтения\записи устанавливается на первый байт в файле.
*********************** OS_READHANDLE **********************
Макрос вызова функции ядра.
Читает массив байтов из открытого файла.
Все аргументы в регистрах:
B - дескриптор файла.
DE - указатель на буфер, куда следует прочитать массив байтов
HL - количество байтов которые следует прочитать
Возвращаемые значения в регистрах:
А - ошибка. Если 0x00 то ошибки нет.
HL - если ошибки нет, то содержит количество прочитанных байтов.
Пример чтения из открытого файла:
...
LD B,(FILE)
LD DE,READ_BUF
LD HL,150
OS_READHANDLE
OR A
JP NZ,ERR_EXIT ;обработка ошибок
LD A,H
OR L
JP Z,END_READ ;данных для чтения нет, либо указатель чтения\записи указывает на конец файла
...
READ_BUF
DEFS 1000
Примечание: при чтении либо записи, сдвигается(на количество прочитанных\записанных байт)
указатель на данные в файле, следующее чтение\запись начнется с позиции этого указателя.
*********************** OS_WRITEHANDLE **********************
Макрос вызова функции ядра.
Запись массива байтов в открытый файл.
Все аргументы в регистрах:
B - дескриптор файла.
DE - указатель на буфер содержащий массив байтов которые следует записать в файл
HL - количество байтов которые следует записать
Возвращаемые значения в регистрах:
А - ошибка. Если 0x00 то ошибки нет.
HL - если ошибки нет, то содержит количество записанных байтов.
Пример записи в открытый файла:
...
LD B,(FILE)
LD DE,BUF
LD HL,BUF_SIZE
OS_WRITEHANDLE
OR A
JP NZ,ERR_EXIT ;обработка ошибок
...
BUF DEFB "Hello Work!"
BUF_SIZE EQU $-BUF
Примечание: при чтении либо записи, сдвигается(на количество прочитанных\записанных байтов)
указатель на данные в файле, следующее чтение\запись начнется с позиции этого указателя.