Rev 569 | Blame | Compare with Previous | Last modification | View Log | Download
Определения, описанные в этом документе, объявлены в файле 'sys_h.asm',который в свою очередь линкует файл 'sysdefs.asm'.Данный документ подразумевает использование асм-компилятора sjasmplus из репозитория NedoOS.sjasmplus поставляется в виде исполнияемого файла sjasmplus.exe для OS Windows.А также в виде исходного кода для самостоятельной сбоки под вами используюмую OS.************************* Используемые выражения *************************байт - минимальня единица хранения данных в ОЗУ ZX-Spectrum, равная 8 битам.0x - приставка к константе, обозначающая число представленном в шестнадцатиричной систаме измерения.хост(host) - точка подключенияerrno - номер ошибкиbig-endian - представление числа в ОЗУ. Сначала старший байт, затем младший.К примеру 16 битное число 0x1234 располагается в памяти как DEFB 0x12,0x34little-endian - представление числа в ОЗУ. Это представление использует процессор z80.Сначала младший байт, затем старший. В этом документе, по умолчанию, все числа little-endian.К примеру 16 битное число 0x1234 располагается в памяти как DEFB 0x34,0x12SOCKET - дескриптор сокета. Знаковое 8-битное число.sockaddr_in - структура, размером 15 байт, со следующими полями:sin_family - семейство адресов, беззнаковое 8-битное число.в текущей реализации допускается только значение 2 (AF_INET).sin_port - номер порта, 16-битное беззнаковое big-endian число.sin_addr - IP-адрес. Массив из четырёх 8-битных беззнаковых чисел.к примеру IP-адрес 1.2.3.4 располагается в памяти как defb 1,2,3,4sin_zero - зарезервировано. массив из 8 байт.************************* Возможные номера ошибок (errno)*************************SHUT_RDWR EQU 2ERR_EAGAIN EQU 35 ;/* Try again */ERR_EWOULDBLOCK EQU ERR_EAGAIN ;/* Operation would block */ERR_INTR EQU 4ERR_NFILE EQU 23ERR_ALREADY EQU 37ERR_NOTSOCK EQU 38ERR_EMSGSIZE EQU 40 ;/* Message too long */ERR_PROTOTYPE EQU 41ERR_AFNOSUPPORT EQU 47ERR_HOSTUNREACH EQU 65ERR_ECONNABORTED EQU 53 /* Software caused connection abort */ERR_CONNRESET EQU 54ERR_NOTCONN EQU 57************************* Протоколы соединений *************************SOCK_STREAM EQU 0x01 ;tcp/ipSOCK_ICMP EQU 0x02 ;icmpSOCK_DGRAM EQU 0x03 ;udp/ipAF_INET EQU 2********************************************************************************** Определения **********************************************************************************При вызове функций ядра считается, что возможна порча всехрегистров(за исключением SP).Все вызовы не блокирующие(за исключением OS_NETCONNECT), т.е.не ожидадают отправку\прием данных, либо подключения.При необходимости использования блокирующих функций - реализовывать самостоятельно внутри процесса.*********************** OS_NETSOCKET **********************Создаёт сокет.Макрос вызова функции ядра.Все аргументы в регистрах:D - семейство адресов, беззнаковое 8-битное число, допускается только значение 2 (AF_INET).E - протокол соединения(0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip)Возвращаемые значения в регистрах:L - SOCKET при положительном значении, при отрицательном значении - функция завершилась с ошибкой.А - errno при ошибке.Возможные ошибки:ERR_AFNOSUPPORT - семейство адресов не поддерживаетсяERR_NFILE - нет свободных сокетовERR_PROTOTYPE - протокол не поддерживаетсяПример создания TCP/IP сокета:LD D,AF_INET;2LD E,SOCK_STREAMOS_NETSOCKETBIT 7,LJP NZ,ERR_EXIT ;обработка ошибкиLD A,LLD (SOC),A ;сохраняем дескриптор сокета.Примечания:При закрытии процесса, закрываются все сокеты созданные этим процессом.Сокеты защищены от использования другим процессом.Номер исходящего порта присваивается автоматически из диапазона 49152...65535*********************** OS_NETSHUTDOWN **********************Закрытие сокета.Макрос вызова функции ядра.Все аргументы в регистрах:A - SOCKETE - Варианты закрытия, 0 - закрыть немедленно, 1 - закрыть только если буфер отправки пуст.Возвращаемые значения в регистрах:L - При отрицательном значении - функция завершилась с ошибкой.А - errno при ошибке.Пример закрытия сокета с ожиданием опустошения буфера отправки:close_wait:LD A,(SOC)LD E,1OS_NETSHUTDOWNBIT 7,LRET Z ;сокет закрылсяCP ERR_EAGAINJP NZ,ERR_EXIT ;обработка ошибки не связанной с ожиданием отправки.OS_YIELD ;не обязательно. Если время не критично,;то отдадим квант времени системе.JR close_wait ;ожидаем отправки данныхВозможные ошибки:ERR_NOTSOCK - не действительный дескриптор сокетаERR_EAGAIN - буфер отправки не пустПримечание: Керналь закрывает сокеты процесса при закрытии процесса.Но, ввиду ограниченного количества сокетов, рекомендуется закрывать сокеткак только он становится не нужен.*********************** OS_NETCONNECT **********************Подключить TCP/IP сокет к хосту.Макрос вызова функции ядра.Все аргументы в регистрах:A - SOCKETDE - указатель на структуру sockaddr_in содержащую IP адрес и порт хоста.Возвращаемые значения в регистрах:L - При отрицательном значении - функция завершилась с ошибкой.А - errno при ошибке.Возможные ошибки:ERR_NOTSOCK - не действительный дескриптор сокетаERR_ALREADY - сокет уже подключенERR_HOSTUNREACH - хост не доступн, либо отверг подключение.Пример подключения к хосту с IP адресом 1.2.3.4 на порт 80:LD A,(SOC)LD DE,destination_hostOS_NETCONNECTBIT 7,LJP NZ,ERR_EXIT ;обработка ошибки... ;подключилисьdestination_hostDEFB AF_INETDEFB 0,80 ;порт назначенияDEFB 1,2,3,4 ;IP адрес назначенияDEFB 0,0,0,0,0,0,0,0 ;резервПримечание: Данная функция применима только к TCP/IP сокетам.*********************** OS_BIND **********************Присвоение сокету конкретного номера исходящего порта.Макрос вызова функции ядра.Все аргументы в регистрах:A - SOCKETDE - указатель на структуру sockaddr_in содержащую номер исходящего порта.(остальные поля структуры не используются, но обязаны присутствовать)Возвращаемые значения в регистрах:L - При отрицательном значении - функция завершилась с ошибкой.А - errno при ошибке.Возможные ошибки:ERR_NOTSOCK - не действительный дескриптор сокетаПример присвоения сокету исходяего порта 433:LD A,(SOC)LD DE,source_hostOS_BINDBIT 7,LJP NZ,ERR_EXIT ;обработка ошибки... ;удачно, продолжаем работуsource_hostDEFB AF_INETDEFB high(433),low(433) ;исходящий портDEFB 0,0,0,0 ;исходящий IP адрес (не используется в текущей реализации)DEFB 0,0,0,0,0,0,0,0 ;резервПримечание: В режиме TCP/IP функция вызывается(если нужна) до вызовов OS_NETCONNECT или OS_LISTEN.*********************** OS_LISTEN **********************Включить режим прослушивания исходящего порта(режим сервера) TCP/IP сокета.Макрос вызова функции ядра.Все аргументы в регистрах:A - SOCKETВозвращаемые значения в регистрах:L - При отрицательном значении - функция завершилась с ошибкой.А - errno при ошибке.Возможные ошибки:ERR_NOTSOCK - не действительный дескриптор сокетаERR_ALREADY - сокет уже подключенПример включения режима прослушивания:LD A,(SOC)OS_LISTENBIT 7,LJP NZ,ERR_EXIT ;обработка ошибки... ;удачно, продолжаем работуПримечание: Данная функция применима только к TCP/IP сокетам.Как правило функция вызывается(если нужна) после вызова OS_BIND.*********************** OS_ACCEPT **********************Принять входящее TCP/IP подключение.Макрос вызова функции ядра.Все аргументы в регистрах:A - SOCKETВозвращаемые значения в регистрах:L - SOCKET при положительном значении, при отрицательном значении - функция завершилась с ошибкой.А - errno при ошибке.Возможные ошибки:ERR_NOTSOCK - не действительный дескриптор сокетаERR_ECONNABORTED - общая ошибка сокетаERR_EAGAIN - входящих подключений пока нетПример принятия соединения с ожиданием подключения:WAIT_CLIENTSLD A,(SOC)OS_ACCEPTBIT 7,LJR Z,ESTABLISHEDCP ERR_EAGAINJP NZ,ERR_EXIT ;обработка ошибкиOS_YIELD ;не обязательно. Если время реагирования на подключение не критично,;то отдадим квант времени системе.JR WAIT_CLIENTS ;никто не подключился, ждёмESTABLISHEDLD A,L ;㤠筮LD (SOC_CLIENT),A ;сохраняем дескриптор сокета.... ;продолжаем работуПримечания: Данная функция применима только к TCP/IP сокетам.Функция вызывается после вызова OS_LISTEN.Возвращает новый дескриптор сокета с принятым соединением. Сокет прослушки продолжает слушать.Если дальнейшая прослушка не требуется, то рекомендуется сразу закрывать слушающий сокет.При недостатке сокетов, возвращается дескриптор подключенного сокета прослушки,в этом случае нет дальнейшего прослушивания.Т.е. при закрытии слушающего сокета, необходимо проверить(путем сравнения дескрипторов)не является ли он сокетом с принятым соединением.*********************** OS_WIZNETREAD **********************Прочитать входящие данные.Макрос вызова функции ядра.При протоколе TCP/IP все аргументы в регистрах:A - SOCKETDE - указатель на буфер для принятия данныхHL - размер буфера(в байтах)При протоколе отличном от TCP/IP все аргументы в регистрах:A - SOCKETDE - указатель на структуру sockaddr_in, в неё помещается(ядром) IP-адрес и порт хоста отправившего данные.IX - указатель на буфер для принятия данныхHL - размер буфера(в байтах)Возвращаемые значения в регистрах:HL - при отрицательном значении функция завершилась с ошибкой,про значении больше нуля возвращается действительный размер(в байтах) принятых данных,нулевого значения вызов не возвращает.А - errno при ошибке.Возможные ошибки:ERR_NOTSOCK - не действительный дескриптор сокетаERR_EAGAIN - входящих данных пока нетERR_NOTCONN - сокет с неустановленным\пропавшем соединением(при протоколе TCP/IP)Пример принятия данных по протоколу TCP/IP с ожиданием данных:WAIT_DATALD A,(SOC)LD DE,BUFLD HL,BUF_SIZEOS_WIZNETREADBIT 7,HJR Z,RECEIVED ;ошибок нетCP ERR_EAGAINJP NZ,ERR_EXIT ;обработка ошибкиOS_YIELD ;не обязательно. Если время реагирования на пришедшие данные не критично,;то отдадим квант времени системе.JR WAIT_DATA ;данных нет, ждёмRECEIVEDLD (DATA_SIZE),HL ;удачно. если требуется, то сохраняем количество принятых данных.... ;продолжаем работуBUF DEFS 1000BUF_SIZE EQU $-BUFПримечания: При протоколе отличном от TCP/IP, необходимо единовременно прочитать весь пакет,иначе недовычитанные данные пакета игнорируются.*********************** OS_WIZNETWRITE **********************Отправить пакет данных.Макрос вызова функции ядра.При протоколе TCP/IP все аргументы в регистрах:A - SOCKETDE - указатель на буфер с даннымиHL - размер данных(в байтах), в текущей реализации максимум 8192 байтаПри протоколе отличном от TCP/IP все аргументы в регистрах:A - SOCKETDE - указатель на структуру sockaddr_in, в неё необходимо поместить IP-адрес и порт хоста получателяIX - указатель на буфер с даннымиHL - размер данных(в байтах), в текущей реализации максимум 8192 байтаВозвращаемые значения в регистрах:HL - при отрицательном значении функция завершилась с ошибкой,иначе возвращается действительный размер(в байтах) отправленных данных,А - errno при ошибке.Возможные ошибки:ERR_NOTSOCK - не действительный дескриптор сокетаERR_NOTCONN - сокет с неустановленным\пропавшем соединением(при протоколе TCP/IP)ERR_EMSGSIZE - в буфере отправки нет места, либо пакет слишком большойПример отправки данных по протоколу TCP/IP с ожиданием данных:WAIT_SENDLD A,(SOC)LD DE,BUFLD HL,BUF_SIZEOS_WIZNETWRITEBIT 7,HJR Z,SEND_OK ;ошибок нетCP ERR_EMSGSIZEJP NZ,ERR_EXIT ;обработка ошибкиOS_YIELD ;не обязательно. Если время не критично,;то отдадим квант времени системе.JR WAIT_SEND ;буфер отправки переполнен, ждём освобожденияSEND_OKLD (DATA_SIZE),HL ;удачно. если требуется, то сохраняем количество отправленных данных.... ;продолжаем работуBUF DEFB "Hello World!"BUF_SIZE EQU $-BUF