Subversion Repositories NedoOS

Rev

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