?login_element?

Subversion Repositories NedoOS

Rev

Rev 1297 | Rev 1410 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.         include "sysdefs.asm"
  2.        
  3. ;*********************** QUIT **********************
  4. ;Закрывает текущий процесс, освобождая все используемые им страницы ОЗУ,
  5. ;дескрипторы сокетов и файлов (кроме пайпов и TR-DOS'ных файлов), а также обработчик музыки.
  6. ;Переключает исполнение и фокус видеовывода на следующий активный процесс.
  7. ;    Аргумент: hl=результат программы (родитель его получает по WAITPID).
  8. ;    Возвращаемых значений нет.
  9. ;    
  10. ;Пример использования, а также минимальный исходный код программы:
  11. ;        DEVICE ZXSPECTRUM128
  12. ;        include "../_sdk/sys_h.asm"
  13. ;        ORG PROGSTART
  14. ;        ;исходный код программы
  15. ;        ld hl,0 ;result
  16. ;        QUIT
  17. ;        savebin "progname.com",PROGSTART,$-PROGSTART
  18.         macro QUIT
  19.         rst 0 ;close app
  20.         endm
  21.  
  22. ;*********************** CALLBDOS, CALLBDOS_NOPARAM_A **********************
  23. ;Внутренние макросы для вызова функций системы.
  24. ;(CALLBDOS - для функций системы, имеющих параметр в регистре A)
  25. ;(CALLBDOS_NOPARAM_A - для функций системы, не имеющих параметра в регистре A)
  26. ;Напрямую использовать не рекомендуется, см. макросы для каждой отдельной функции системы.
  27.         macro CALLBDOS ;don't use directly CALLBDOS or call BDOS!!!
  28.         ex af,af' ;'
  29.         call BDOS ;c=CMD
  30.         endm
  31.         macro CALLBDOS_NOPARAM_A ;don't use directly CALLBDOS or call BDOS!!!
  32.         call BDOS ;c=CMD
  33.         endm
  34.  
  35. ;*********************** OS_GETKEY **********************
  36. ;Возвращает нажатую кнопку клавиатуры, кнопки мыши и координаты мыши.
  37. ;Фактически чтение происходит только процессом с фокусом. При отсутствии фокуса возвращается
  38. ;код символа NOKEY и флаг Z установлен в 0 (т.е. верно условие NZ).
  39. ;    Аргументов нет.
  40. ;    Возвращаемые значения в регистрах:
  41. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  42. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется для обработки "горячих кнопок"
  43. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  44. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  45. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  46. ;        Флаг Z - если 0(NZ), то отсутствует фокус.
  47. ;
  48. ;Пример ожидания символа:
  49. ;        ORG PROGSTART
  50. ;        LD E,6
  51. ;        OS_SETGFX
  52. ;        ...
  53. ;WAIT_LOOP:
  54. ;        YIELD    ;отдадим квант времени системе
  55. ;        OS_GETKEY
  56. ;        OR A
  57. ;        JR Z,WAIT_LOOP
  58. ;        CP key_esc
  59. ;        JP Z,CLOSE_PROC
  60. ;        ;получили код символа в A
  61. ;        ...
  62. ;CLOSE_PROC:
  63. ;        QUIT
  64. ;        
  65. ;        Примечание: желательна обработка кода key_esc для завершения программы
  66. ;и кода key_redraw для перерисовки экрана при получении фокуса.
  67.         macro OS_GETKEY
  68.         rst 0x08 ;out: a=key (NOKEY=no key), de=mouse position (y,x), l=mouse buttons (bits 0,1,2: 0=pressed)+mouse wheel (bits 7..4), h=high bits of key|register, bc=keynolang, lx=kempston joystick, nz=no focus (mouse position=0, ignore it!)
  69.         endm
  70.         macro GET_KEY
  71.         OS_GETKEY
  72.         endm
  73.  
  74. ;*********************** OS_PRCHAR **********************
  75. ;Выводит символ на экран, используется только в текстовом видеорежиме.
  76. ;При отсутствии фокуса вывод игнорируется.
  77. ;    Все аргументы в регистрах:
  78. ;        A - символ (символ '\r'=0x0d = возврат каретки, символ '\n'=0x0a = перевод строки)
  79. ;    Возвращаемых значений нет.
  80. ;    
  81. ;Пример печати строки "Hello Work!":
  82. ;        DEVICE ZXSPECTRUM128
  83. ;        include "../_sdk/sys_h.asm"
  84. ;        ORG PROGSTART
  85. ;        LD E,6
  86. ;        OS_SETGFX
  87. ;        LD HL,STR_HELLO
  88. ;PRINT_LOOP:
  89. ;        LD A,(HL)
  90. ;        OR A
  91. ;        JR Z,PRINT_LOOP_END
  92. ;        PUSH HL
  93. ;        OS_PRCHAR
  94. ;        POP HL
  95. ;        INC HL
  96. ;        JR PRINT_LOOP
  97. ;PRINT_LOOP_END:
  98. ;<wait something to see the screen...>
  99. ;        QUIT
  100. ;STR_HELLO:
  101. ;        DEFB "Hello Work!",0
  102. ;        savebin "progname.com",PROGSTART,$-PROGSTART
  103.         macro OS_PRCHAR
  104.         rst 0x10 ;a=char ;spoils all registers!
  105.         endm
  106.         macro PRCHAR
  107.         OS_PRCHAR
  108.         endm
  109.  
  110. ;*********************** SETPG4000 **********************
  111. ;Устанавливает страницу номер A в области адресов 0x4000..0x7fff.
  112. ;Быстрая функция (не включает контекст ядра).
  113. ;    Все аргументы в регистрах:
  114. ;        A - номер страницы
  115. ;    Возвращаемых значений нет (портится BC, остальные регистры не портятся)
  116. ;
  117. ;Примечание: не используйте номера страниц, не полученные из системы тем или иным образом
  118. ;(вызовы OS_NEWPAGE, OS_GETMAINPAGE, OS_GETMAINPAGES, OS_GETAPPMAINPAGES
  119. ;или чтение номеров страниц экрана из user_scr0_low, user_scr0_high, user_scr1_low, user_scr1_high),
  120. ;потому что на моделях памяти ATM2 и ATM3 номера страниц различаются!
  121. ;
  122. ;Примечание 2: для смены страницы в области адресов 0x0000..0x3fff см. OS_SETMAINPAGE
  123.         macro SETPG4000
  124.         rst 0x18 ;set page "a" in 0x4000 ;spoils BC
  125.         endm
  126.         macro SETPG16K
  127.         SETPG4000
  128.         endm
  129.        
  130. ;*********************** SETPG8000 **********************
  131. ;Устанавливает страницу номер A в области адресов 0x8000..0xbfff.
  132. ;Быстрая функция (не включает контекст ядра).
  133. ;    Все аргументы в регистрах:
  134. ;        A - номер страницы
  135. ;    Возвращаемых значений нет (портится BC, остальные регистры не портятся)
  136. ;
  137. ;См. примечания к SETPG4000!
  138.         macro SETPG8000
  139.         rst 0x20 ;set page "a" in 0x8000 ;spoils BC
  140.         endm
  141.         macro SETPG32KLOW
  142.         SETPG8000
  143.         endm
  144.        
  145. ;*********************** SETPGC000 **********************
  146. ;Устанавливает страницу номер A в области адресов 0xc000..0xffff.
  147. ;Быстрая функция (не включает контекст ядра).
  148. ;    Все аргументы в регистрах:
  149. ;        A - номер страницы
  150. ;    Возвращаемых значений нет (портится BC, остальные регистры не портятся)
  151. ;
  152. ;См. примечания к SETPG4000!
  153.         macro SETPGC000
  154.         rst 0x28 ;set page "a" in 0xc000 ;spoils BC
  155.         endm
  156.         macro SETPG32KHIGH
  157.         SETPGC000
  158.         endm
  159.  
  160. ;*********************** YIELD **********************
  161. ;Отдаёт квант времени системе.
  162. ;В текущем кванте 50 Гц этой задаче не будет возвращено управление.
  163. ;    Аргументы не используются.
  164. ;    Возвращаемых значений нет.
  165. ;    
  166. ;Пример использования смотрите в описании OS_GETKEY    
  167. ;    
  168. ;Примечание: обычно используется при ожидании какого-либо события, не критичного по времени отклика.
  169. ;Использование этого вызова ускоряет общую работу системы.
  170.         macro YIELD ;use instead of HALT
  171.         OS_YIELD
  172.         endm
  173.        
  174. ;*********************** YIELDKEEP **********************
  175. ;Отдаёт квант времени системе.
  176. ;В текущем кванте 50 Гц этой задаче будет возвращено управление, если останется время.
  177. ;    Аргументы не используются.
  178. ;    Возвращаемых значений нет.
  179. ;    
  180. ;Примечание: используется при записи в очередь, когда очередь переполнена (stdio.asm и term).
  181. ;В остальных случаях замедляет общую работу системы.
  182.         macro YIELDKEEP ;if you want reentry in this frame
  183.         OS_YIELDKEEP
  184.         endm
  185.  
  186. ;*********************** YIELDGETKEY **********************
  187. ;Отдаёт квант времени системе и опрашивает клавиатуру (не рекомендуется использовать для опроса мыши).
  188. ;    Аргументы не используются.
  189. ;    Возвращаемые значения в регистрах:
  190. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  191. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется дляи обработки "горячих кнопок"
  192. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  193. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  194. ;        Флаг Z - если 1(Z), то клавиша не нажата
  195.         macro YIELDGETKEY ;out: nz=nokey, a=keylang, c=keynolang
  196.         YIELD ;halt ;если сделать просто di:rst 0x38, то 1.сдвинем таймер и 2.можем потерять кадровое прерывание, а если без ei, то будут глюки
  197.         OS_GETKEY
  198.         or a ;cp NOKEY ;keylang==0?
  199.         jr nz,$+3
  200.         cp c ;keynolang==0?
  201.         endm
  202.  
  203. ;*********************** YIELDGETKEYLOOP **********************
  204. ;Циклически опрашивает клавиатуру (не рекомендуется использовать для опроса мыши).
  205. ;    Аргументы не используются.
  206. ;    Возвращаемые значения в регистрах:
  207. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  208. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется дляи обработки "горячих кнопок"
  209. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  210. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  211.         macro YIELDGETKEYLOOP
  212. __1=$
  213.         YIELDGETKEY
  214.         jr z,__1
  215.         endm
  216.  
  217. ;*********************** WAITPID **********************
  218. ;Ожидание завершения дочернего процесса.
  219. ;    Аргументы не используются.
  220. ;    Возвращаемые значения в регистрах:
  221. ;        HL - результат, который вернула дочерняя задача
  222. ;Как это работает:
  223. ;OS_SETWAITING замораживает текущий процесс, а YIELD передаёт время системе.
  224. ;Текущий процесс получит управление только тогда, когда завершится дочерний процесс
  225. ;(он автоматически размораживает родителя и записывает childresult в структуру родителя).
  226.         macro WAITPID
  227.         OS_SETWAITING
  228.         YIELD
  229.         ld c,CMD_GETCHILDRESULT
  230.         CALLBDOS_NOPARAM_A ;hl=result
  231.         endm
  232.  
  233. ;======================= from CP/M: =============================
  234.  
  235. ;*********************** OS_SETDTA **********************
  236. ;Установить адрес передачи данных для следующей команды CP/M.
  237. ;    Все аргументы в регистрах:
  238. ;        DE - адрес передачи данных.
  239. ;    Возвращаемых значений нет.
  240.         macro OS_SETDTA ;DE = data transfer address (DTA)
  241.         ld c,CMD_SETDTA
  242.         CALLBDOS_NOPARAM_A
  243.         endm
  244. ;*********************** OS_FSEARCHFIRST **********************
  245. ;Прочитать первый элемент текущей директории (файл или каталог).
  246. ;Последующие элементы директории надо считывать командой OS_FSEARCHNEXT.
  247. ;Вся информация о файле или каталоге будет записана в FCB по адресу, установленному командой SET_DTA (этот адрес меняется после выполнения команды!).
  248. ;Полученную FCB можно будет открыть командой OS_FOPEN.
  249. ;Если возвращена ошибка, то ничего не записывается и адрес не сдвигается.
  250. ;    Все аргументы в регистрах:
  251. ;        DE - адрес FCB с маской имени файла или каталога (знак '?' в ней означает любой символ в имени).
  252. ;    Возвращаемые значения в регистрах:
  253. ;        A - код ошибки (если 0, то ошибки нет). Окончание директории - это ошибка.
  254. ;
  255. ;Примечания:
  256. ;NedoOS не проверяет номер экстента в FCB с маской.
  257. ;В NedoOS атрибуты файла возвращаются в обычном месте (не в поле S1).
  258. ;NedoOS не возвращает этой командой метку диска и date stamps.
  259. ;NedoOS не пропускает скрытые и системные файлы.
  260. ;NedoOS не возвращает коды ошибки в регистрах H,L,C.
  261. ;В NedoOS выходное значение A = 1..3 считается ошибкой.
  262.         macro OS_FSEARCHFIRST ;de = pointer to unopened FCB (filename with ????????), read matching FCB to DTA. DTA had to set every time
  263.         ld c,CMD_FSEARCHFIRST
  264.         CALLBDOS_NOPARAM_A
  265.         endm
  266.        
  267. ;*********************** OS_FSEARCHNEXT **********************
  268. ;Прочитать очередной (не первый) элемент текущей директории (файл или каталог).
  269. ;Вся информация о файле или каталоге будет записана в FCB по адресу, установленному командой SET_DTA (этот адрес меняется после выполнения команды!).
  270. ;Полученную FCB можно будет открыть командой OS_FOPEN.
  271. ;Если возвращена ошибка, то ничего не записывается и адрес не сдвигается.
  272. ;    Все аргументы в регистрах:
  273. ;        DE - адрес FCB с маской имени файла или каталога (знак '?' в ней означает любой символ в имени).
  274. ;    Возвращаемые значения в регистрах:
  275. ;        A - код ошибки (если 0, то ошибки нет). Окончание директории - это ошибка.
  276. ;
  277. ;Примечание: в отличие от CP/M, нужно обязательно передавать адрес маски!
  278. ;См. также примечания к OS_FSEARCHFIRST!
  279.         macro OS_FSEARCHNEXT ;(NOT CP/M compatible!!!)de = pointer to unopened FCB (filename with ????????), read matching FCB to DTA. DTA had to set every time
  280.         ld c,CMD_FSEARCHNEXT
  281.         CALLBDOS_NOPARAM_A
  282.         endm
  283.        
  284. ;Нижеследующие вызовы CP/M пользовать не рекомендуется!
  285. ;from CP/M (try to avoid use!)
  286.         ;macro OS_PRCHAR ;e=char
  287.         ;ld c,CMD_PRCHAR
  288.         ;CALLBDOS_NOPARAM_A
  289.         ;endm
  290.         macro OS_SETDRV ;e=drive ;out: a!=0 => not mounted, [l=number of drives]
  291.         ld c,CMD_SETDRV
  292.         CALLBDOS_NOPARAM_A
  293.         endm
  294.         macro OS_FOPEN ;de = pointer to unopened FCB
  295.         ld c,CMD_FOPEN
  296.         CALLBDOS_NOPARAM_A
  297.         endm
  298.         macro OS_FCLOSE ;de = pointer to opened FCB
  299.         ld c,CMD_FCLOSE
  300.         CALLBDOS_NOPARAM_A
  301.         endm
  302.         macro OS_FDEL ;DEPRECATED!!!!! ;DE = Pointer to unopened FCB
  303.         ld c,CMD_FDEL
  304.         CALLBDOS_NOPARAM_A
  305.         endm
  306.         macro OS_FREAD ;DE = Pointer to opened FCB, read 128 bytes in DTA, out: a=128^bytes actually read (not CP/M!)
  307.         ld c,CMD_FREAD
  308.         CALLBDOS_NOPARAM_A
  309.         endm
  310.         macro OS_FWRITE ;DE = Pointer to opened FCB, write 128 bytes from DTA
  311.         ld c,CMD_FWRITE
  312.         CALLBDOS_NOPARAM_A
  313.         endm
  314.         macro OS_FCREATE ;DE = Pointer to unopened FCB
  315.         ld c,CMD_FCREATE
  316.         CALLBDOS_NOPARAM_A
  317.         endm
  318.  
  319. ;======================= from MSX-DOS: =============================
  320.  
  321. ;*********************** OS_OPENHANDLE **********************
  322. ;Открывает существующий файл для чтения/записи.
  323. ;    Все аргументы в регистрах:
  324. ;        DE - строка с именем файла, может содержать относительный или абсолютный путь к файлу.
  325. ;            в текущей реализации поддержан формат имен 8.3
  326. ;    Возвращаемые значения в регистрах:
  327. ;        А - ошибка. Если 0x00, то ошибки нет.
  328. ;        B - хэндл файла, если нет ошибки.
  329. ;    
  330. ;Пример открытия файла "pyraster.txt", расположенного в директории "../fu/ckco":
  331. ;        ...
  332. ;        LD DE,FILE_NAME
  333. ;        OS_OPENHANDLE
  334. ;        OR A
  335. ;        JP NZ,ERR_EXIT    ;обработка ошибок
  336. ;        LD A,B
  337. ;        LD (FILE),A    ;сохраняем дескриптор
  338. ;        ...
  339. ;FILE_NAME:
  340. ;        DEFB "../fu/ckco/pyraster.txt",0
  341. ;        ...
  342. ;        
  343. ;Примечания:
  344. ;Необходимо закрывать все открытые файлы.
  345. ;Также желательно закрыть файл, как только он становится не нужен для чтения/записи.
  346. ;При открытии файла указатель чтения/записи этого файла устанавливается на первый байт в файле.
  347.         macro OS_OPENHANDLE ;DE = Drive/path/file ASCIIZ string ;out: B = new file handle, A=error
  348.         ld c,CMD_OPENHANDLE
  349.         CALLBDOS_NOPARAM_A
  350.         endm
  351.        
  352. ;*********************** OS_CREATEHANDLE **********************
  353. ;Создать и открыть файл для чтения/записи.
  354. ;    Все аргументы в регистрах:
  355. ;        DE - строка с именем файла, может содержать относительный или абсолютный путь к файлу.
  356. ;            в текущей реализации поддержан формат имен 8.3
  357. ;    Возвращаемые значения в регистрах:
  358. ;        А - ошибка. Если 0x00, то ошибки нет.
  359. ;        B - хэндл файла, если нет ошибки.
  360. ;    
  361. ;Пример создания файла "pyraster.txt", расположенного в директории "../fu/ckco":
  362. ;        ...
  363. ;        LD DE,FILE_NAME
  364. ;        OS_CREATEHANDLE
  365. ;        OR A
  366. ;        JP NZ,ERR_EXIT    ;обработка ошибок
  367. ;        LD A,B
  368. ;        LD (FILE),A    ;сохраняем дескриптор
  369. ;        ...
  370. ;FILE_NAME:
  371. ;        DEFB "../fu/ckco/pyraster.txt",0    
  372. ;        ...
  373. ;        
  374. ;Примечания:
  375. ;Необходимо закрывать все открытые файлы.
  376. ;Также желательно закрыть файл, как только он становится не нужен для чтения/записи.
  377. ;При создании файла указатель чтения/записи этого файла устанавливается на первый байт в файле.
  378. ;Не рекомендуется читать файл, открытый через OS_CREATEHANDLE! Лучше закройте его и откройте через OS_OPENHANDLE.
  379.         macro OS_CREATEHANDLE ;DE = Drive/path/file ASCIIZ string ;out: B = new file handle, A=error
  380.         ld c,CMD_CREATEHANDLE
  381.         CALLBDOS_NOPARAM_A
  382.         endm
  383.  
  384. ;*********************** OS_CLOSEHANDLE **********************
  385. ;Закрывает открытый файл.
  386. ;    Все аргументы в регистрах:
  387. ;        B - хэндл файла.
  388. ;    Возвращаемые значения в регистрах:
  389. ;        А - ошибка. Если 0x00, то ошибки нет.
  390. ;    
  391. ;Пример закрытия файла:
  392. ;        ...
  393. ;        LD A,(FILE)
  394. ;        LD B,A
  395. ;        OS_CLOSEHANDLE
  396. ;        OR A
  397. ;        JP NZ,ERR_EXIT    ;обработка ошибок
  398. ;        ...
  399. ;
  400. ;Примечания:
  401. ;Необходимо закрывать все открытые файлы.
  402. ;Также желательно закрыть файл, как только он становится не нужен для чтения/записи.
  403.         macro OS_CLOSEHANDLE ;B = file handle, out: A=error
  404.         ld c,CMD_CLOSEHANDLE
  405.         CALLBDOS_NOPARAM_A
  406.         endm
  407.  
  408. ;*********************** OS_READHANDLE **********************
  409. ;Читает массив байтов из открытого файла.
  410. ;    Все аргументы в регистрах:
  411. ;        B - хэндл файла.
  412. ;        DE - указатель на буфер, куда следует прочитать массив байтов.
  413. ;        HL - количество байтов, которые следует прочитать.
  414. ;    Возвращаемые значения в регистрах:
  415. ;        А - ошибка. Если 0x00, то ошибки нет.
  416. ;        HL - если ошибки нет, то содержит количество прочитанных байтов (если 0, то файл кончился).
  417. ;    
  418. ;Пример чтения из открытого файла:
  419. ;        ...
  420. ;        LD A,(FILE)
  421. ;        LD B,A
  422. ;        LD DE,READ_BUF
  423. ;        LD HL,150
  424. ;        OS_READHANDLE
  425. ;        OR A
  426. ;        JP NZ,ERR_EXIT    ;обработка ошибок
  427. ;        LD A,H
  428. ;        OR L
  429. ;        JP Z,END_READ    ;данных для чтения нет, либо указатель чтения\записи указывает на конец файла
  430. ;        ...
  431. ;READ_BUF
  432. ;        DEFS 1000
  433. ;Примечание: при чтении сдвигается (на количество прочитанных байт)
  434. ;указатель на данные в файле, следующее чтение начнётся с позиции этого указателя.
  435.         macro OS_READHANDLE ;B = file handle, DE = Buffer address, HL = Number of bytes to read, out: HL = Number of bytes actually read, A=error
  436.         ld c,CMD_READHANDLE
  437.         CALLBDOS_NOPARAM_A
  438.         endm
  439.  
  440. ;*********************** OS_WRITEHANDLE **********************
  441. ;Запись массива байтов в открытый файл.
  442. ;    Все аргументы в регистрах:
  443. ;        B - хэндл файла.
  444. ;        DE - указатель на буфер, содержащий массив байтов, которые следует записать в файл
  445. ;        HL - количество байтов, которые следует записать
  446. ;    Возвращаемые значения в регистрах:
  447. ;        А - ошибка. Если 0x00, то ошибки нет.
  448. ;        HL - если ошибки нет, то содержит количество записанных байтов.
  449. ;    
  450. ;Пример записи в открытый файл:
  451. ;        ...
  452. ;        LD A,(FILE)
  453. ;        LD B,A
  454. ;        LD DE,BUF
  455. ;        LD HL,BUF_SIZE
  456. ;        OS_WRITEHANDLE
  457. ;        OR A
  458. ;        JP NZ,ERR_EXIT    ;обработка ошибок
  459. ;        ...
  460. ;BUF        DEFB "Hello Work!"
  461. ;BUF_SIZE EQU $-BUF
  462. ;
  463. ;Примечание: при записи сдвигается (на количество записанных байтов)
  464. ;указатель на данные в файле, следующая запись начнётся с позиции этого указателя.
  465.         macro OS_WRITEHANDLE ;B = file handle, DE = Buffer address, HL = Number of bytes to write, out: HL = Number of bytes actually written, A=error
  466.         ld c,CMD_WRITEHANDLE
  467.         CALLBDOS_NOPARAM_A
  468.         endm
  469.  
  470. ;*********************** OS_SEEKHANDLE **********************
  471. ;Перемещение указателя чтения/записи в файле.
  472. ;    Все аргументы в регистрах:
  473. ;        B - хэндл файла.
  474. ;        DEHL - нужное смещение относительно начала файла.
  475. ;    Возвращаемых значений нет.
  476. ;
  477. ;Примечание: в отличие от MSX-DOS, смещение всегда относительно начала файла (регистр A не влияет).
  478. ;Для чтения положения указателя см. функцию OS_TELLHANDLE.
  479. ;Для чтения размера файла см. функцию OS_GETFILESIZE.
  480.         macro OS_SEEKHANDLE ;b=file handle, dehl=offset
  481.         ld c,CMD_SEEKHANDLE
  482.         CALLBDOS_NOPARAM_A
  483.         endm
  484.  
  485. ;*********************** OS_CHDIR **********************
  486. ;Сменить текущую директорию (в рамках текущего процесса).
  487. ;    Все аргументы в регистрах:
  488. ;        DE - указатель на строку с полным или относительным путём (можно без конечной косой черты).
  489. ;    Возвращаемые значения в регистрах:
  490. ;        А - ошибка. Если 0x00, то ошибки нет.
  491. ;
  492. ;Примечание: В отличие от MSX-DOS, в пути используются только прямые косые черты.
  493. ;Например: "e:/bin/".
  494.         macro OS_CHDIR ;DE = Pointer to ASCIIZ string. Out A=error
  495.         ld c,CMD_CHDIR
  496.         CALLBDOS_NOPARAM_A
  497.         endm
  498.  
  499. ;*********************** OS_GETPATH **********************
  500. ;Прочитать текущий путь (в рамках текущего процесса).
  501. ;    Все аргументы в регистрах:
  502. ;        DE - указатель на буфер размером MAXPATH_sz, куда будет помещён путь (ASCIIZ).
  503. ;    Возвращаемые значения в регистрах:
  504. ;        HL - указатель на последний элемент пути в этом буфере
  505. ;
  506. ;Примечания:
  507. ;В MSX-DOS был буфер размером 64 байта, а в текущей реализации NedoOS MAXPATH_sz = 256.
  508. ;Путь возвращается без конечной косой черты, кроме случая корня диска.
  509. ;В отличие от MSX-DOS, в пути используются только прямые косые черты.
  510.         macro OS_GETPATH ;DE = Pointer to MAXPATH_sz byte buffer ;out: DE = Filled in with whole path string (WITH DRIVE! Finished by slash only if root dir), HL = Pointer to start of last item
  511.         ld c,CMD_GETPATH
  512.         CALLBDOS_NOPARAM_A
  513.         endm
  514.  
  515. ;*********************** OS_RENAME **********************
  516. ;Переименовать файл или директорию.
  517. ;    Все аргументы в регистрах:
  518. ;        DE - старое имя, возможно с полным или относительным путём (ASCIIZ).
  519. ;        HL - новое имя, пока что требуется такой же путь, как в DE.
  520. ;    Возвращаемые значения в регистрах:
  521. ;        HL - указатель на последний элемент пути в этом буфере
  522. ;
  523. ;Примечания:
  524. ;В отличие от MSX-DOS, в новом имени пока что требуется такой же путь, как в DE (если там не было пути, то и в новом не надо).
  525.         macro OS_RENAME ;DE = Drive/path/file ASCIIZ string, HL = New filename ASCIIZ string (NOT MSXDOS compatible! with Drive/path!) ;RENAME OR MOVE FILE
  526.         ld c,CMD_RENAME
  527.         CALLBDOS_NOPARAM_A
  528.         endm
  529.  
  530. ;*********************** OS_DELETE **********************
  531. ;Удалить файл.
  532. ;    Все аргументы в регистрах:
  533. ;        DE - имя файла, возможно с полным или относительным путём (ASCIIZ).
  534. ;    Возвращаемые значения в регистрах:
  535. ;        А - ошибка. Если 0x00, то ошибки нет.
  536.         macro OS_DELETE ;DE = Drive/path/file ASCIIZ string, out: A = Error
  537.         ld c,CMD_DELETE
  538.         CALLBDOS_NOPARAM_A
  539.         endm
  540.  
  541. ;*********************** OS_PARSEFNAME **********************
  542. ;Перекодировать имя файла в формат CP/M (8 байт имени, 3 байта расширения).
  543. ;    Все аргументы в регистрах:
  544. ;        DE - имя файла в ASCIIZ.
  545. ;        HL - указатель на буфер под имя файла в формате CP/M.
  546. ;    Возвращаемые значения в регистрах:
  547. ;        DE - указатель на терминатор имени файла
  548. ;        HL - указатель на буфер под имя файла в формате CP/M.
  549. ;        A - всегда 0.
  550. ;
  551. ;Примечание: в отличие от MSX-DOS, не возвращаются флаги результата в регистре B.
  552.         macro OS_PARSEFNAME ;de(dotname) -> hl(cpmname) ;out: de=pointer to termination character, hl=buffer filled in
  553.         ld c,CMD_PARSEFNAME
  554.         CALLBDOS_NOPARAM_A
  555.         endm
  556.  
  557. ;invented  
  558.         macro OS_OPENDIR ;de=path (must be empty ASCIIZ for now)
  559.         ld c,CMD_OPENDIR
  560.         CALLBDOS_NOPARAM_A
  561.         endm
  562.         macro OS_READDIR        ;de=buf for FILINFO (if no LNAME, use FNAME), 0x00 in FILINFO_FNAME = end dir
  563.         ld c,CMD_READDIR
  564.         CALLBDOS_NOPARAM_A              ;out in A=error(0 - no error, 4 - no more files, other - critical error)
  565.         endm
  566.         macro OS_HIDEFROMPARENT ;for tasks with their own screen handling ;hl=результат программы (родитель его получает по WAITPID)
  567.         ld c,CMD_HIDEFROMPARENT
  568.         CALLBDOS_NOPARAM_A
  569.         endm
  570.         macro OS_SETSTDINOUT ;b=id, e=stdin, d=stdout, h=stderr
  571.         ld c,CMD_SETSTDINOUT
  572.         CALLBDOS_NOPARAM_A
  573.         endm
  574.         macro OS_GETSTDINOUT ;e=stdin, d=stdout, h=stderr
  575.         ld c,CMD_GETSTDINOUT
  576.         CALLBDOS_NOPARAM_A
  577.         endm
  578.         macro OS_PLAYCOVOX ;hl=data (0xc000+, 0x00=end), de=pagetable (0x0000+), hx=delay (18=11kHz, 7=22kHz, 1=44kHz)
  579.         ld c,CMD_PLAYCOVOX
  580.         CALLBDOS_NOPARAM_A
  581.         endm
  582.         macro OS_SETMUSIC ;hl=muzaddr (0x4000..0xffff), a=muzpg (pages in 0x8000, 0xc000 are taken from current user memory)
  583.         ld c,CMD_SETMUSIC
  584.         CALLBDOS
  585.         endm
  586.         macro OS_READSECTORS ;b=drive, de=buffer, ixhl=sector number, a=count
  587.         ld c,CMD_READSECTORS
  588.         CALLBDOS
  589.         endm
  590.         macro OS_WRITESECTORS ;b=drive, de=buffer, ixhl=sector number, a=count
  591.         ld c,CMD_WRITESECTORS
  592.         CALLBDOS
  593.         endm
  594.         macro OS_GETFILESIZE ;b=handle, out: dehl=file size
  595.         ld c,CMD_GETFILESIZE
  596.         CALLBDOS_NOPARAM_A
  597.         endm
  598.         macro OS_GETFILINFO ;de=filename, hl=buf[FILINFO_sz] to get FILINFO
  599.         ld c,CMD_GETFILINFO
  600.         CALLBDOS_NOPARAM_A
  601.         endm
  602.         macro OS_SETBORDER ;e=0..15
  603.         ld c,CMD_SETBORDER
  604.         CALLBDOS_NOPARAM_A
  605.         endm
  606.         macro OS_SETWAITING ;set WAITING state for current task
  607.         ld c,CMD_SETWAITING
  608.         CALLBDOS_NOPARAM_A
  609.         endm
  610.         macro OS_NETSOCKET ;D=address family (2=inet, 23=inet6), E=socket type (0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip) ;out: L=SOCKET (if L < 0 then A=error)
  611.         ld l,0x01
  612.         ld c,CMD_WIZNETOPEN
  613.         CALLBDOS_NOPARAM_A
  614.         endm
  615.         macro OS_NETSHUTDOWN;A=SOCKET ; out: if HL < 0 then A=error
  616.         ld l,0x02
  617.         ld c,CMD_WIZNETOPEN
  618.         CALLBDOS
  619.         endm
  620.         macro OS_NETCONNECT;A=SOCKET, DE=sockaddr ptr {unsigned char sin_family /*net type*/; unsigned short sin_port; struct in_addr sin_addr /*4 bytes IP*/; char sin_zero[8];}; out: if HL < 0 then A=error
  621.         ld l,0x03
  622.         ld c,CMD_WIZNETOPEN
  623.         CALLBDOS
  624.         endm
  625.         macro OS_ACCEPT;A=SOCKET; out: HL
  626.         ld l,0x04
  627.         ld c,CMD_WIZNETOPEN
  628.         CALLBDOS
  629.         endm
  630.         macro OS_BIND;A=SOCKET, DE=sockaddr ptr {unsigned char sin_family /*net type*/; unsigned short sin_port; struct in_addr sin_addr /*4 bytes IP*/; char sin_zero[8];}
  631.         ld l,0x05
  632.         ld c,CMD_WIZNETOPEN
  633.         CALLBDOS
  634.         endm
  635.         macro OS_LISTEN;A=SOCKET
  636.         ld l,0x06
  637.         ld c,CMD_WIZNETOPEN
  638.         CALLBDOS
  639.         endm
  640.         macro OS_GETDNS;DE= ptr to DNS buffer(4 bytes)
  641.         ld l,0x08
  642.         ld c,CMD_WIZNETOPEN
  643.         CALLBDOS
  644.         endm
  645.         macro OS_WIZNETCLOSE;A=SOCKET
  646.         ld c,CMD_WIZNETCLOSE
  647.         CALLBDOS
  648.         endm
  649.         macro OS_WIZNETREAD;A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) ; out: HL=count if HL < 0 then A=error
  650.         ld c,CMD_WIZNETREAD
  651.         CALLBDOS
  652.         endm
  653.         macro OS_WIZNETWRITE;A=SOCKET, de=buffer_ptr, HL=sizeof(buffer) ; out: HL=count if HL < 0 then A=error
  654.         ld c,CMD_WIZNETWRITE
  655.         CALLBDOS
  656.         endm
  657.         macro OS_DROPAPP ;e=id
  658.         ld c,CMD_DROPAPP
  659.         CALLBDOS_NOPARAM_A
  660.         endm
  661.         macro OS_GETAPPMAINPAGES ;e=id ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id, a=error
  662.         ld c,CMD_GETAPPMAINPAGES
  663.         CALLBDOS_NOPARAM_A
  664.         endm
  665.         macro OS_GETCONFIG  ;H=system drive, L= 1-Evo 2-ATM2 3-ATM3 6-p2.666
  666.                             ;E=pgsys(system page) D= TR-DOS page
  667.         ld c,CMD_GETCONFIG
  668.         CALLBDOS_NOPARAM_A
  669.         endm
  670.         macro OS_GETXY ;out: de=yx ;GET CURSOR POSITION
  671.         ld c,CMD_GETXY
  672.         CALLBDOS_NOPARAM_A
  673.         endm
  674.         macro OS_GETTIME ;out: ix=date, hl=time
  675.         ld c,CMD_GETTIME
  676.         CALLBDOS_NOPARAM_A
  677.         endm
  678.         macro OS_GETFILETIME ;de=Drive/path/file ASCIIZ string, out: ix=date, hl=time
  679.         ld c,CMD_GETFILETIME
  680.         CALLBDOS_NOPARAM_A
  681.         endm
  682.         macro OS_SETFILETIME ;de=Drive/path/file ASCIIZ string, ix=date, hl=time
  683.         ld c,CMD_SETFILETIME
  684.         CALLBDOS_NOPARAM_A
  685.         endm
  686.        
  687. ;*********************** OS_TELLHANDLE **********************
  688. ;Чтение указателя чтения/записи в файле.
  689. ;    Все аргументы в регистрах:
  690. ;        B - хэндл файла.
  691. ;    Возвращаемые значения в регистрах:
  692. ;        DEHL - смещение относительно начала файла.
  693. ;
  694. ;Примечание: для чтения размера файла см. функцию OS_GETFILESIZE.
  695.         macro OS_TELLHANDLE ;b=file handle, out: dehl=offset ;GET POSITION IN FILE
  696.         ld c,CMD_TELLHANDLE
  697.         CALLBDOS_NOPARAM_A
  698.         endm
  699.  
  700.         macro OS_SCROLLUP ;de=topyx, hl=hgt,wid ;x, wid even ;TEXTMODE ONLY
  701.         ld c,CMD_SCROLLUP
  702.         CALLBDOS_NOPARAM_A
  703.         endm
  704.         macro OS_SCROLLDOWN ;de=topyx, hl=hgt,wid ;x, wid even ;TEXTMODE ONLY
  705.         ld c,CMD_SCROLLDOWN
  706.         CALLBDOS_NOPARAM_A
  707.         endm
  708.         macro OS_SETMAINPAGE ;e=page for 0x0000
  709.         ld c,CMD_SETMAINPAGE
  710.         CALLBDOS_NOPARAM_A
  711.         endm
  712.         macro OS_SETSYSDRV ;out: a!=0 => not mounted, l=number of drives
  713.         ld c,CMD_SETSYSDRV
  714.         CALLBDOS_NOPARAM_A
  715.         endm
  716.         macro OS_MKDIR ;DE = Pointer to ASCIIZ string, out: a
  717.         ld c,CMD_MKDIR
  718.         CALLBDOS_NOPARAM_A
  719.         endm
  720.         macro OS_CHECKPID ;e=id ;check if this child(!) app exists, out: a!=0 => OK, or else a=0
  721.         ld c,CMD_CHECKPID
  722.         CALLBDOS_NOPARAM_A
  723.         endm
  724.         macro OS_FREEZEAPP ;e=id ;disable app and make non-graphic ;сейчас делает то же, что OS_SETWAITING делает себе
  725.         ld c,CMD_FREEZEAPP
  726.         CALLBDOS_NOPARAM_A
  727.         endm
  728.         macro OS_GETATTR ;DEPRECATED!!! ;out: a ;READ ATTR AT CURSOR POSITION
  729.         ld c,CMD_GETATTR
  730.         CALLBDOS_NOPARAM_A
  731.         endm
  732.         macro OS_MOUNT ;e=drive, out: a
  733.         ld c,CMD_MOUNT
  734.         CALLBDOS_NOPARAM_A
  735.         endm
  736.         macro OS_GETKEYMATRIX ;out: bcdehlix = halfrows cs...space
  737.         ld c,CMD_GETKEYMATRIX
  738.         CALLBDOS_NOPARAM_A
  739.         endm
  740.         macro OS_GETTIMER ;out: hlde=timer
  741.         ld c,CMD_GETTIMER
  742.         CALLBDOS_NOPARAM_A
  743.         endm
  744.         macro OS_YIELD ;schedule to another app (use YIELD macro instead of HALT!!!)
  745.         ld c,CMD_YIELD
  746.         CALLBDOS_NOPARAM_A
  747.         endm
  748.         macro OS_RUNAPP ;e=id ;ACTIVATE DISABLED APP
  749.         ld c,CMD_RUNAPP
  750.         CALLBDOS_NOPARAM_A
  751.         endm
  752.         macro OS_NEWAPP ;out: b=id, a=error, dehl=newapp pages in 0000,4000,8000,c000 ;MAKE NEW DISABLED APP
  753.         ld c,CMD_NEWAPP
  754.         CALLBDOS_NOPARAM_A
  755.         endm
  756.         macro OS_PRATTR ;e=color byte ;DRAW ATTR AT CURSOR POSITION
  757.         ld c,CMD_PRATTR
  758.         CALLBDOS_NOPARAM_A
  759.         endm
  760.         macro OS_CLS ;e=color byte
  761.         ld c,CMD_CLS
  762.         CALLBDOS_NOPARAM_A
  763.         endm
  764.         macro OS_SETCOLOR ;e=color byte
  765.         ld c,CMD_SETCOLOR
  766.         CALLBDOS_NOPARAM_A
  767.         endm
  768.         macro OS_SETXY ;de=yx ;SET CURSOR POSITION
  769.         ld c,CMD_SETXY
  770.         CALLBDOS_NOPARAM_A
  771.         endm
  772.  
  773. ;*********************** OS_SETGFX **********************
  774. ;Устанавливает видеорежим и переключает фокус на текущий процесс.
  775. ;При старте процесса вывод на экран, процессом, недоступен без установки видеорежима.
  776. ;    Все аргументы в регистрах:
  777. ;        E - видеорежим (+8, если нужно выключить турбо, +0x80, если нужно автоматически запоминать и восстанавливать экранные страницы), допустимы следующие значения:
  778. ;            0 - EGA
  779. ;            2 - Аппаратный мультиколор
  780. ;            3 - 6912
  781. ;            6 - текстовый видеорежим
  782. ;            -1 - отключает видеовывод и переключает фокус на следующий процесс
  783. ;    Возвращаемые значения в регистрах:
  784. ;        E - видеорежим до вызова OS_SETGFX
  785. ;    
  786. ;Пример установки текстового видеорежима:
  787. ;        LD E,6
  788. ;        OS_SETGFX
  789.         macro OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  790.         ld c,CMD_SETGFX
  791.         CALLBDOS_NOPARAM_A
  792.         endm
  793.        
  794.         macro OS_SETPAL ;de=palette (32 bytes)
  795.         ld c,CMD_SETPAL
  796.         CALLBDOS_NOPARAM_A
  797.         endm
  798.         macro OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  799.         ld c,CMD_GETMAINPAGES
  800.         CALLBDOS_NOPARAM_A
  801.         endm
  802.         macro OS_NEWPAGE ;out: a=0 (OK)/!=0 (fail), e=page
  803.         ld c,CMD_NEWPAGE
  804.         CALLBDOS_NOPARAM_A
  805.         endm
  806.         macro OS_DELPAGE ;e=page ;GIVE SOME PAGE BACK TO THE OS
  807.         ld c,CMD_DELPAGE
  808.         CALLBDOS_NOPARAM_A
  809.         endm
  810.         macro OS_GETPAGEOWNER ;e=page ;out: e=owner id (0=free, 0xff=system)
  811.         ld c,CMD_GETPAGEOWNER
  812.         CALLBDOS_NOPARAM_A
  813.         endm
  814.         macro OS_SETSCREEN ;e=screen=0..1
  815.         ld c,CMD_SETSCREEN
  816.         CALLBDOS_NOPARAM_A
  817.         endm
  818.         macro OS_YIELDKEEP ;schedule to another app, can return in this frame
  819.         ld c,CMD_YIELDKEEP
  820.         CALLBDOS_NOPARAM_A
  821.         endm
  822.  
  823. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  824.        
  825.         macro STANDARDPAL ;DDp palette: %grbG11RB(low),%grbG11RB(high), inverted
  826.         dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  827.         dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  828.         endm
  829.  
  830. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  831. ;последующие макросы будут убраны (они временно для переделки программ под term)
  832.         macro SETXY_ ;set cursor position (in: de=YX, top left is 0;0)
  833.         ;OS_SETXY
  834.         call setxy
  835.         endm
  836.  
  837.         macro SETX_ ;set cursor X position (in: e=X, left is 0)
  838.         call setx
  839.         endm
  840.  
  841.         macro CLS_ ;clear visible area of terminal
  842.         ;ld e,0
  843.         ;OS_CLS
  844.         call clearterm
  845.         endm
  846.  
  847.         macro PRCHAR_ ;send char to stdout (in: A=char)
  848.         ;OS_PRCHAR
  849.         call sendchar
  850.         endm
  851.  
  852.         macro GETCHAR_ ;read char from stdin (out: A=char, CY=error)
  853.         ;OS_GETKEY
  854.         call receivechar
  855.         endm
  856.  
  857.         macro GETKEY_ ;read key from stdin (out: A=keylang, C=keynolang(???TODO), CY=error)
  858.         ;OS_GETKEY
  859.         call getkey;receivekey
  860.         endm
  861.  
  862.         macro SETCOLOR_ ;setcolor (macro SETCOLOR_) - set color attribute (in: d=paper, e=ink)
  863.         ;ld a,d
  864.         ;add a,a
  865.         ;add a,a
  866.         ;add a,a
  867.         ;or e
  868.         ;ld e,a
  869.         ;OS_SETCOLOR
  870.         call setcolor
  871.         endm
  872.  
  873.