?login_element?

Subversion Repositories NedoOS

Rev

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

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