Subversion Repositories NedoOS

Rev

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