Subversion Repositories NedoOS

Rev

Rev 646 | Rev 707 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

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