?login_element?

Subversion Repositories NedoOS

Rev

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
    Примечание: при чтении либо записи, сдвигается(на количество прочитанных\записанных байтов) 
        указатель на данные в файле, следующее чтение\запись начнется с позиции этого указателя.