From 70e1e6bb0478d0fd31330bf0de302da5b80ac3f3 Mon Sep 17 00:00:00 2001 From: savelij13 Date: Fri, 30 May 2025 08:35:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.bat | 39 + build_pause.bat | 6 + docs/HELP.ENG | 25 + docs/HELP.RUS | 29 + docs/fn_api_0.2.txt | 572 ++++++++ docs/fn_api_0.3.txt | 596 ++++++++ docs/fn_api_0.4.txt | 611 +++++++++ docs/fn_api_0.5.txt | 671 +++++++++ docs/history.txt | 145 ++ docs/todo.txt | 19 + fn_const.a80 | 386 ++++++ fn_exe_boot.a80 | 191 +++ fn_macros.a80 | 101 ++ fn_version.a80 | 7 + fnbar.a80 | 596 ++++++++ fndos.a80 | 313 +++++ fndosline.a80 | 710 ++++++++++ fninit.a80 | 602 ++++++++ fninput.a80 | 801 +++++++++++ fnmain.a80 | 570 ++++++++ fnmenu.a80 | 1232 +++++++++++++++++ fnmouse.a80 | 498 +++++++ fnpanel.a80 | 1239 +++++++++++++++++ fnprint.a80 | 620 +++++++++ fnsort.a80 | 690 ++++++++++ fnsys.a80 | 948 +++++++++++++ fntab.a80 | 369 +++++ fntree.a80 | 734 ++++++++++ fnwin.a80 | 1124 +++++++++++++++ fnwork.a80 | 2077 ++++++++++++++++++++++++++++ font.raw | Bin 0 -> 6888 bytes iff_font.raw | Bin 0 -> 8704 bytes plugins/build_all.bat | 20 + plugins/calc/build.bat | 21 + plugins/calc/calc.a80 | 348 +++++ plugins/cdplayer/INFO | 21 + plugins/cdplayer/build.bat | 21 + plugins/cdplayer/cd.a80 | 138 ++ plugins/cdplayer/cdplayer.a80 | 253 ++++ plugins/cdplayer/cdrom.a80 | 253 ++++ plugins/cdplayer/digits.a80 | 384 ++++++ plugins/cdplayer/shaos.a80 | 81 ++ plugins/date/build.bat | 21 + plugins/date/date.a80 | 426 ++++++ plugins/fneditor/build.bat | 21 + plugins/fneditor/feditor.a80 | 849 ++++++++++++ plugins/fneditor/fedos.a80 | 494 +++++++ plugins/fneditor/fehex.a80 | 1228 +++++++++++++++++ plugins/fneditor/femain.a80 | 24 + plugins/fneditor/feprn.a80 | 340 +++++ plugins/fneditor/fesetup.a80 | 314 +++++ plugins/fneditor/fetext.a80 | 1946 ++++++++++++++++++++++++++ plugins/fnviewer/build.bat | 21 + plugins/fnviewer/fvhex.a80 | 724 ++++++++++ plugins/fnviewer/fviewer.a80 | 1081 +++++++++++++++ plugins/fnviewer/fvmain.a80 | 24 + plugins/fnviewer/fvprn.a80 | 334 +++++ plugins/fnviewer/fvtext.a80 | 780 +++++++++++ plugins/help/build.bat | 21 + plugins/help/header.a80 | 30 + plugins/help/help.a80 | 401 ++++++ plugins/help/help_t.a80 | 137 ++ plugins/test/Q_START.ENG | 2 + plugins/test/build.bat | 21 + plugins/test/test.a80 | 75 + rez2_fnconfig.a80 | 712 ++++++++++ rez2_fnerror.a80 | 346 +++++ rez2_fnfunct.a80 | 2418 +++++++++++++++++++++++++++++++++ rez2_fnmisc.a80 | 965 +++++++++++++ rez2_fnsearch.a80 | 368 +++++ rez2_fntab1.a80 | 151 ++ rez3_fnmark.a80 | 870 ++++++++++++ rez3_fnnext.a80 | 219 +++ 73 files changed, 33424 insertions(+) create mode 100644 build.bat create mode 100644 build_pause.bat create mode 100644 docs/HELP.ENG create mode 100644 docs/HELP.RUS create mode 100644 docs/fn_api_0.2.txt create mode 100644 docs/fn_api_0.3.txt create mode 100644 docs/fn_api_0.4.txt create mode 100644 docs/fn_api_0.5.txt create mode 100644 docs/history.txt create mode 100644 docs/todo.txt create mode 100644 fn_const.a80 create mode 100644 fn_exe_boot.a80 create mode 100644 fn_macros.a80 create mode 100644 fn_version.a80 create mode 100644 fnbar.a80 create mode 100644 fndos.a80 create mode 100644 fndosline.a80 create mode 100644 fninit.a80 create mode 100644 fninput.a80 create mode 100644 fnmain.a80 create mode 100644 fnmenu.a80 create mode 100644 fnmouse.a80 create mode 100644 fnpanel.a80 create mode 100644 fnprint.a80 create mode 100644 fnsort.a80 create mode 100644 fnsys.a80 create mode 100644 fntab.a80 create mode 100644 fntree.a80 create mode 100644 fnwin.a80 create mode 100644 fnwork.a80 create mode 100644 font.raw create mode 100644 iff_font.raw create mode 100644 plugins/build_all.bat create mode 100644 plugins/calc/build.bat create mode 100644 plugins/calc/calc.a80 create mode 100644 plugins/cdplayer/INFO create mode 100644 plugins/cdplayer/build.bat create mode 100644 plugins/cdplayer/cd.a80 create mode 100644 plugins/cdplayer/cdplayer.a80 create mode 100644 plugins/cdplayer/cdrom.a80 create mode 100644 plugins/cdplayer/digits.a80 create mode 100644 plugins/cdplayer/shaos.a80 create mode 100644 plugins/date/build.bat create mode 100644 plugins/date/date.a80 create mode 100644 plugins/fneditor/build.bat create mode 100644 plugins/fneditor/feditor.a80 create mode 100644 plugins/fneditor/fedos.a80 create mode 100644 plugins/fneditor/fehex.a80 create mode 100644 plugins/fneditor/femain.a80 create mode 100644 plugins/fneditor/feprn.a80 create mode 100644 plugins/fneditor/fesetup.a80 create mode 100644 plugins/fneditor/fetext.a80 create mode 100644 plugins/fnviewer/build.bat create mode 100644 plugins/fnviewer/fvhex.a80 create mode 100644 plugins/fnviewer/fviewer.a80 create mode 100644 plugins/fnviewer/fvmain.a80 create mode 100644 plugins/fnviewer/fvprn.a80 create mode 100644 plugins/fnviewer/fvtext.a80 create mode 100644 plugins/help/build.bat create mode 100644 plugins/help/header.a80 create mode 100644 plugins/help/help.a80 create mode 100644 plugins/help/help_t.a80 create mode 100644 plugins/test/Q_START.ENG create mode 100644 plugins/test/build.bat create mode 100644 plugins/test/test.a80 create mode 100644 rez2_fnconfig.a80 create mode 100644 rez2_fnerror.a80 create mode 100644 rez2_fnfunct.a80 create mode 100644 rez2_fnmisc.a80 create mode 100644 rez2_fnsearch.a80 create mode 100644 rez2_fntab1.a80 create mode 100644 rez3_fnmark.a80 create mode 100644 rez3_fnnext.a80 diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..d5314db --- /dev/null +++ b/build.bat @@ -0,0 +1,39 @@ + +@echo off + +if not exist tmp md tmp +if not exist fn md fn +if not exist fn\flx md fn\flx +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\svn\pentevo\tools\noice2equ\;d:\yad\sprinter_src\tools\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\sprinter_src\ + +cls + +rem Flex Navigator + +mhmt font.raw tmp\font_raw.pack +mhmt iff_font.raw tmp\iff_font_raw.pack + +rem asl -U -L -C -x -olist tmp\fnexeboot.lst -i %includes% fn_exe_boot.a80 || goto error +asl -U -L -C -x -olist tmp\fnexeboot.lst -i %includes% -D NO_EDIT,NO_VIEW,NO_HELP fn_exe_boot.a80 || goto error +p2bin fn_exe_boot.p tmp\fn.exe -r $-$ -k + +rem Flex Navigator Plugins +rem cd plugins +rem call build_all +rem cd .. + +copy /Y /B tmp\fn.exe fn\fn.exe +copy /Y /B plugins\*.flx fn\flx + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit \ No newline at end of file diff --git a/build_pause.bat b/build_pause.bat new file mode 100644 index 0000000..84aefe7 --- /dev/null +++ b/build_pause.bat @@ -0,0 +1,6 @@ + +@ECHO OFF + +call build.bat + +pause diff --git a/docs/HELP.ENG b/docs/HELP.ENG new file mode 100644 index 0000000..ea8d9f1 --- /dev/null +++ b/docs/HELP.ENG @@ -0,0 +1,25 @@ + +struct FlxPluginHeader { + char Id[8]; + unsigned short LoadOffset; + unsigned short EntryOffset; + unsigned char PluginMode; + unsigned char Reserved[3]; +}; + + Header of Plugin for Flex Navigator v1.xx: + 8 bytes Id - identifier of plugin, you should begin from three symbols - FLX + 2 bytes LoadOffset - displacement in page of memory for load (0 - 0x3FFF) + 2 bytes EntryOffset - displacement in page of memory for executing (0 - 0x3FFF) + 1 byte PluginMode - modes of work: + 0 - repairing Flex Navigator screen after finish + 1 - without repairing Flex Navigator screen after finish + 3 bytes Reserved + length = 16 bytes + + ATTANTION!!! + 1. Size of plugin code (without header) must be less 4000 bytes. + 2. ORG = 0xC000 + 3. When control will return to Flex Navigator, Carry Flag are specify error status: + CF = 1 error during initialization + CF = 0 no error diff --git a/docs/HELP.RUS b/docs/HELP.RUS new file mode 100644 index 0000000..6a22292 --- /dev/null +++ b/docs/HELP.RUS @@ -0,0 +1,29 @@ + +struct FlxPluginHeader { + char Id[8]; + unsigned short LoadOffset; + unsigned short EntryOffset; + unsigned char PluginMode; + unsigned char Reserved[3]; +}; + + Заголовок плагина для Flex Navigator v1.xx: + 8 байт Id - индентификатор плагина, первые 3 символа всегда должны быть FLX + 2 байта LoadOffset - смещение в странице памяти для загрузки (0 - 0x3FFF) + 2 байта EntryOffset - смещение в странице памяти для запуска (0 - 0x3FFF) + 1 байт PluginMode - режим работы: + 0 - работает с восстановлением рабочей области Flex Navigator + (т.е. после работы плагина не нужно восстанавливать экран) + 1 - работает без восстановления рабочей области Flex Navigator + (т.е. после работы плагина нужно восстанавливать экран) + 3 байта Reserved - зарезервировано + длина = 16 байт + + !!! ВНИМАНИЕ + 1. все плагины для Flex Navigator v1.xx не должны превышать в размере основного кода +(т.е. без заголовка) 0x4000 байта. + 2. все плагины для Flex Navigator v1.xx должны быть откомпилированы с адреса 0xC000 +(т.е. org = 0xC000). + 3. возвращаемое значение: + CF = 1 ошибка на стадии инитиализации (после неё ничего не восстанавливается) + CF = 0 нет ошибки diff --git a/docs/fn_api_0.2.txt b/docs/fn_api_0.2.txt new file mode 100644 index 0000000..9e47e18 --- /dev/null +++ b/docs/fn_api_0.2.txt @@ -0,0 +1,572 @@ +[]========================================================================[] +* * +* Описание Flex Navigator API v1.xx для разработчиков Flx-Plugins * +* doc v0.2 от 07.07.2002 * +* * +[]========================================================================[] + + + + + +[]------------------------------------------------------------------------[] + + ClearScreen - процедура отчистки 0-го экана нужным цветом. + + на вход: + A - цвет отчистки (00-0Fh) + на выход: + - + +[]------------------------------------------------------------------------[] + + MakeWindow - процедура создания графического окна + + на вход: + (SP) - описатель окна + на выход: + - + + сразу за вызовом этой процедуры в программе следует описатель окна. + возврат из процедуры происходит по адресу, следующему за описателем. + + например: + call MakeWindow + ... ; описатель окна + + + описатель окна: + +00 (1) флаг вывода окна: 0 - без сохранения данных под окном + (используется для полноэкранных окон) + 1 - с сохранением данных под окном + (используется для небольших окон) + 0x7F - восстановить данные под окном + (флаг служит для закрытия + текущего окна) + +01 (2) координата x для вывода (0 - 639) + +03 (2) координата y для вывода (0 - 255) + +05 (2) длина окна по x (0 - 639) + +07 (2) длина окна по y (0 - 255) + + далее идут об'екты окна в формате: + +00 (1) тип обекта + +01 ... описатели обекта + + об'екты окна: + 0. +00 (1) == 0 - конец списка об'ектов. после этого оконная + функция возвращает управление. + + 1. +00 (1) == 1 - текстовая строка + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +06 ... текстовая строка (конец строки - 0) + + 2. +00 (1) == 2 - заполнение прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + +09 (1) цвет заполнения + (d7-d4 цвет background, d3-d0 цвет foreground) + + 3. +00 (1) == 3 - отрисовка углублённой прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + + 4. +00 (1) == 4 - отрисовка выпуклой прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + + 5. +00 (1) == 5 - отрисовка кнопки с текстом + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + +09 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +10 ... текстовая строка (конец строки - 0) + + Внимание! печать текста осуществляется с позиций + x + 4, y + 1 + + 6. +00 (1) == 6 - отрисовка горизонтального разделителя + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + + 7. +00 (1) == 7 - отрисовка вертикального разделителя + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по y (0 - 255) + + 8. +00 (1) == 8 - отрисовка левой кнопки скролбара <- + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 9. +00 (1) == 9 - отрисовка правой кнопки скролбара -> + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 10. +00 (1) == 10 - отрисовка верхней кнопки скролбара ^ + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 11. +00 (1) == 11 - отрисовка нижней кнопки скролбара + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + +[]------------------------------------------------------------------------[] + + InvertRectan - процедура замены цвета прямоугольной плоскости + + на вход: + HL - x координата + BC - y координата + HX - длина y + LX - длина x + D - текущий цвет + (d7-d4 цвет background, d3-d0 цвет foreground) + E - нужный цвет + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + к сожалению процедура не очень быстрая, поэтому большие + прямоугольники советую особо не инвертировать... ;) + +[]------------------------------------------------------------------------[] + + PrnTxtLnIFF - процедура вывода текстовых строк на графический экран + 640x256 в режиме размерного по X шрифта + на вход: + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за строкой + +[]------------------------------------------------------------------------[] + + PrnTxtLnNorm - процедура вывода текстовых строк на графический экран + 640x256 + на вход: + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за строкой + +[]------------------------------------------------------------------------[] + + PrnTxtLnNormC - процедура вывода текстовых строк на графический экран + 640x256 с известным числом символов + на вход: + HL - адрес текстовой строки + DE - позиция вывода по X + C - позиция вывода по Y + B - кол-во печатаемых символов + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за последним символом + +[]------------------------------------------------------------------------[] + + PrnRangPathL - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, прижатых к + левому краю ( |-> ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + PrnRangPathR - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, прижатых к + правому краю ( <-| ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + PrnRangPathC - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, отцентрированных + относительно краёв ( <-|-> ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + InputLine - процедура редактирования строки на графическом экране + 640x256 в режиме размерного по X шрифта + + на вход: + IX - адрес описателя строки + HL - адрес описателя элементов экрана (для мышки) + на выход: + - + + описатель строки: + +00 (1) максимальная длина строки + +01 (1) флаг готовности + +02 (1) текущая X позиция курсора (инициализируется в InputLine) + +03 (1) текущая add_x (инициализируется в InputLine) + +04 (1) количество введенных символов / длина строки + +05 (2) X позиция строки на экране + +07 (2) Y позиция строки на экране + +09 (2) X длина строки на экране + +0B (1) цвет строки (d7-d4 цвет background, d3-d0 цвет foreground) + +0C ... сама строка + + процедуры для таблицы элементов экрана: + InpLnExtN - процедура нормального выхода из редакции + InpLnExtC - процедура выхода из редакции по cancel + (восстанавливает изначальную строку) + +[]------------------------------------------------------------------------[] + + InitScrBar - процедура инициализации описателя скроллбара + + на вход: + IX - адрес описателя скроллбара + на выход: + - + +[]------------------------------------------------------------------------[] + + PrnHScrBar - процедура печати горизонтального скроллбара + + на вход: + IX - адрес описателя скроллбара + на выход: + - + +[]------------------------------------------------------------------------[] + + PrnVScrBar - процедура печати вертикального скроллбара + + на вход: + IX - адрес описателя скроллбара + на выход: + - + +[]------------------------------------------------------------------------[] + + InitProcess - процедура инициализации описателя процессбара + + на вход: + IX - адрес описателя процессбара + на выход: + - + +[]------------------------------------------------------------------------[] + + PrnProcess - процедура печати процессбара + + на вход: + IX - адрес описателя процессбара + на выход: + - + +[]------------------------------------------------------------------------[] + + ResFire - процедура ожидания, пока все кнопки мыши не будут отпущены + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + TestCoords - процедура проверки координат мыши по таблице элементов + зкрана + + на вход: + IX - адрес таблицы элементов зкрана + на выход: + - + + таблица элементов зкрана: + +00 (2) левая x координата элемента + +02 (2) правая x координата элемента + +04 (2) верхняя y координата элемента + +06 (2) нижняя y координата элемента + +08 (2) флаги элемента + +10 (2) адрес обработчика при не нажатом огне + +12 (2) адрес обработчика при нажатом огне (левая кнопка) + +14 (2) адрес обработчика при нажатом огне (правая кнопка) + + флаги элемента: + d00 - элемент кнопка + d01 - рабочая кнопка + d02 - инверт + d03 - статичный инверт + d04 - программа запускается без адреса возврата без огня + d05 - программа запускается без адреса возврата по левой кнопке + огня + d06 - программа запускается без адреса возврата по правой кнопке + огня + d07 - вызвать функцию закрытия окна перед запуском программы без + огня + d08 - вызвать функцию закрытия окна перед запуском программы по + левой кнопке + d09 - вызвать функцию закрытия окна перед запуском программы по + правой кнопке + d15 - это флаг: 1 - инверт при огне не убирать + + + если +00 == 0x8000 это считается концом таблицы элементов зкрана + +[]------------------------------------------------------------------------[] + + SetCMOSPrint - процедура включения печати даты/время из CMOS + + на вход: + - будет описано позднее + на выход: + - +[]------------------------------------------------------------------------[] + + ResCMOSPrint - процедура выключения печати даты/время из CMOS + + на вход: + - будет описано позднее + на выход: + - + +[]------------------------------------------------------------------------[] + + SetClock - процедура установки курсора мыши в часы + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + SetMouse - процедура установки курсора мыши в нормальный курсор + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + MoveBytes - процедура быстрого копирования памяти с помощью + акселлератора с увеличением адресов + на вход: + HL - откуда + DE - куда + BC - сколько + на выход: + HL - (откуда + сколько) + DE - (куда + сколько) + +[]------------------------------------------------------------------------[] + + MoveBytesUp - процедура быстрого копирования памяти с помощью + акселлератора с уменьшением адресов + на вход: + HL - откуда + DE - куда + BC - сколько + на выход: + HL - (откуда - сколько) + DE - (куда - сколько) + +[]------------------------------------------------------------------------[] + + Mult8 - процедура умножения 8 * 8 bit = 16 bit + + на вход: + E * C + на выход: + HL - результат + +[]------------------------------------------------------------------------[] + + Mult16X8 - процедура умножения 16 * 8 bit = 24 bit + + на вход: + DE * C + на выход: + A, HL - результат + +[]------------------------------------------------------------------------[] + + Mult16 - процедура умножения 16 * 16 bit = 16 bit + + на вход: + DE * BC + на выход: + HL - результат + +[]------------------------------------------------------------------------[] + + Mult16X16 - процедура умножения 16 * 16 bit = 32 bit + + на вход: + DE * BC + на выход: + HL, DE - результат + +[]------------------------------------------------------------------------[] + + Mult32 - процедура умножения 32 * 16 bit = 32 bit + + на вход: + HL, DE * BC + на выход: + HL, DE - результат + +[]------------------------------------------------------------------------[] + + Divis16X16 - процедура деления 16 / 16 bit = 16.16 bit + + на вход: + BC / DE + на выход: + BC - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis24X16 - процедура деления 24 / 16 bit = 8.16 bit + + на вход: + HL, C / DE + на выход: + A - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis32X16 - процедура деления 32 / 16 bit = 16.16 bit + + на вход: + HL, DE / BC + на выход: + DE - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis32 - процедура деления 32 / 16 bit = 32.16 bit + + на вход: + HL, DE / BC + на выход: + HL, DE - результат + BC - остаток + +[]------------------------------------------------------------------------[] + + ConvNumTxt32 - процедура конвертации числа 32 bit в текст + + на вход: + BC, HL - число 32 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvNumTxt16 - процедура конвертации числа 16 bit в текст + + на вход: + HL - число 16 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvNumTxt8 - процедура конвертации числа 8 bit в текст + + на вход: + A - число 8 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvTxtNum32 - процедура конвертации текста в число 32 bit + + на вход: + DE - адрес текста (конец строки - 0) + на выход: + HL, IX - число + C flag - ошибка + +[]------------------------------------------------------------------------[] + + ConvTxtNum16 - процедура конвертации текста в число 16 bit + + на вход: + DE - адрес текста (конец строки - 0) + на выход: + HL - число + C flag - ошибка + +[]------------------------------------------------------------------------[] + + DOSError - процедура вывода окна ошибки (для дос ошибок) + + на вход: + A - номер ошибки + на выход: + - + +[]------------------------------------------------------------------------[] + + + + + +07 july 2002 +Anton Enin (C) Copyright 2002 R-lab +если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме. \ No newline at end of file diff --git a/docs/fn_api_0.3.txt b/docs/fn_api_0.3.txt new file mode 100644 index 0000000..a688359 --- /dev/null +++ b/docs/fn_api_0.3.txt @@ -0,0 +1,596 @@ +[]========================================================================[] +* * +* Описание Flex Navigator API v1.xx для разработчиков Flx-Plugins * +* doc v0.3 от 10.07.2002 * +* * +[]========================================================================[] + + + + +[]------------------------------------------------------------------------[] + + ClearScreen - процедура отчистки 0-го экана нужным цветом. + + на вход: + A - цвет отчистки (00-0Fh) + на выход: + - + +[]------------------------------------------------------------------------[] + + MakeWindow - процедура создания графического окна + + на вход: + (SP) - описатель окна + на выход: + - + + сразу за вызовом этой процедуры в программе следует описатель окна. + возврат из процедуры происходит по адресу, следующему за описателем. + + например: + call MakeWindow + ... ; описатель окна + + + описатель окна: + +00 (1) флаг вывода окна: 0 - без сохранения данных под окном + (используется для полноэкранных окон) + 1 - с сохранением данных под окном + (используется для небольших окон) + 0x7F - восстановить данные под окном + (флаг служит для закрытия + текущего окна) + +01 (2) координата x для вывода (0 - 639) + +03 (2) координата y для вывода (0 - 255) + +05 (2) длина окна по x (0 - 639) + +07 (2) длина окна по y (0 - 255) + + далее идут об'екты окна в формате: + +00 (1) тип обекта + +01 ... описатели обекта + + об'екты окна: + 0. +00 (1) == 0 - конец списка об'ектов. после этого оконная + функция возвращает управление. + + 1. +00 (1) == 1 - текстовая строка + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +06 ... текстовая строка (конец строки - 0) + + 2. +00 (1) == 2 - заполнение прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + +09 (1) цвет заполнения + (d7-d4 цвет background, d3-d0 цвет foreground) + + 3. +00 (1) == 3 - отрисовка углублённой прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + + 4. +00 (1) == 4 - отрисовка выпуклой прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + + 5. +00 (1) == 5 - отрисовка кнопки с текстом + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + +09 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +10 ... текстовая строка (конец строки - 0) + + Внимание! печать текста осуществляется с позиций + x + 4, y + 1 + + 6. +00 (1) == 6 - отрисовка горизонтального разделителя + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + + 7. +00 (1) == 7 - отрисовка вертикального разделителя + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по y (0 - 255) + + 8. +00 (1) == 8 - отрисовка левой кнопки скролбара <- + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 9. +00 (1) == 9 - отрисовка правой кнопки скролбара -> + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 10. +00 (1) == 10 - отрисовка верхней кнопки скролбара ^ + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 11. +00 (1) == 11 - отрисовка нижней кнопки скролбара + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + +[]------------------------------------------------------------------------[] + + InvertRectan - процедура замены цвета прямоугольной плоскости + + на вход: + HL - x координата + BC - y координата + HX - длина y + LX - длина x + D - текущий цвет + (d7-d4 цвет background, d3-d0 цвет foreground) + E - нужный цвет + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + к сожалению процедура не очень быстрая, поэтому большие + прямоугольники советую особо не инвертировать... ;) + +[]------------------------------------------------------------------------[] + + PrnTxtLnIFF - процедура вывода текстовых строк на графический экран + 640x256 в режиме размерного по X шрифта + на вход: + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за строкой + +[]------------------------------------------------------------------------[] + + PrnTxtLnNorm - процедура вывода текстовых строк на графический экран + 640x256 + на вход: + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за строкой + +[]------------------------------------------------------------------------[] + + PrnTxtLnNormC - процедура вывода текстовых строк на графический экран + 640x256 с известным числом символов + на вход: + HL - адрес текстовой строки + DE - позиция вывода по X + C - позиция вывода по Y + B - кол-во печатаемых символов + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за последним символом + +[]------------------------------------------------------------------------[] + + PrnRangPathL - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, прижатых к + левому краю ( |-> ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + PrnRangPathR - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, прижатых к + правому краю ( <-| ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + PrnRangPathC - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, отцентрированных + относительно краёв ( <-|-> ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + InputLine - процедура редактирования строки на графическом экране + 640x256 в режиме размерного по X шрифта + + на вход: + IX - адрес описателя строки + HL - адрес описателя элементов экрана (для мышки) + на выход: + - + + описатель строки: + +00 (1) максимальная длина строки + +01 (1) флаг готовности + +02 (1) текущая X позиция курсора (инициализируется в InputLine) + +03 (1) текущая add_x (инициализируется в InputLine) + +04 (1) количество введенных символов / длина строки + +05 (2) X позиция строки на экране + +07 (2) Y позиция строки на экране + +09 (2) X длина строки на экране + +0B (1) цвет строки (d7-d4 цвет background, d3-d0 цвет foreground) + +0C ... сама строка + + процедуры для таблицы элементов экрана: + InpLnExtN - процедура нормального выхода из редакции + InpLnExtC - процедура выхода из редакции по cancel + (восстанавливает изначальную строку) + +[]------------------------------------------------------------------------[] + + InitScrBar - процедура инициализации описателя скроллбара + + на вход: + IX - адрес описателя скроллбара + на выход: + - + + описатель скроллбара: + +00 (2) X позиция скролбара (0-639) + +02 (2) Y позиция скролбара (0-255) + +04 (2) длина скролбара + +06 (2) текущая длина скролбара (инициализируется в InitScrBar) + +08 (2) адрес ячейки, куда запишется начальная координата бара + если 0, то не используется + (используется для таблицы элементов экрана) + +10 (2) адрес ячейки, куда запишется конечная координата бара + если 0, то не используется + (используется для таблицы элементов экрана) + +12 (2) кол-во видимых элементов + +14 (2) общее кол-во элементов + +16 (2) первая видимый элемент + +[]------------------------------------------------------------------------[] + + PrnHScrBar - процедура печати горизонтального скроллбара + + на вход: + IX - адрес описателя скроллбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + PrnVScrBar - процедура печати вертикального скроллбара + + на вход: + IX - адрес описателя скроллбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + InitProcess - процедура инициализации описателя процессбара + + на вход: + IX - адрес описателя процессбара + на выход: + - + + описателя процессбара: + +00 (2) X позиция процессбара (0-639) + +02 (2) Y позиция процессбара (0-255) + +04 (2) длина процессбара + +06 (2) коэффициент для процесса (инициализируется в InitProcess) + +08 (2) коррекция коэфициента (инициализируется в InitProcess) + +10 (4) максимум (инициализируется в InitProcess) + +14 (4) текущее (инициализируется в InitProcess) + +18 (1) цвет процессбара + (d7-d4 цвет background, d3-d0 цвет foreground) + +[]------------------------------------------------------------------------[] + + PrnProcess - процедура печати процессбара + + на вход: + IX - адрес описателя процессбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + ResFire - процедура ожидания, пока все кнопки мыши не будут отпущены + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + TestCoords - процедура проверки координат мыши по таблице элементов + зкрана + + на вход: + IX - адрес таблицы элементов зкрана + на выход: + - + + таблица элементов зкрана: + +00 (2) левая x координата элемента + +02 (2) правая x координата элемента + +04 (2) верхняя y координата элемента + +06 (2) нижняя y координата элемента + +08 (2) флаги элемента + +10 (2) адрес обработчика при не нажатом огне + +12 (2) адрес обработчика при нажатом огне (левая кнопка) + +14 (2) адрес обработчика при нажатом огне (правая кнопка) + + если +00 == 0x8000 это считается концом таблицы элементов зкрана + + флаги элемента: + d00 - элемент кнопка + d01 - рабочая кнопка + d02 - инверт + d03 - статичный инверт + d04 - программа запускается без адреса возврата без огня + d05 - программа запускается без адреса возврата по левой кнопке + огня + d06 - программа запускается без адреса возврата по правой кнопке + огня + d07 - вызвать функцию закрытия окна перед запуском программы без + огня + d08 - вызвать функцию закрытия окна перед запуском программы по + левой кнопке + d09 - вызвать функцию закрытия окна перед запуском программы по + правой кнопке + d15 - это флаг: 1 - инверт при огне не убирать + +[]------------------------------------------------------------------------[] + + SetCMOSPrint - процедура включения печати даты/время из CMOS + + на вход: + - будет описано позднее + на выход: + - +[]------------------------------------------------------------------------[] + + ResCMOSPrint - процедура выключения печати даты/время из CMOS + + на вход: + - будет описано позднее + на выход: + - + +[]------------------------------------------------------------------------[] + + SetClock - процедура установки курсора мыши в часы + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + SetMouse - процедура установки курсора мыши в нормальный курсор + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + MoveBytes - процедура быстрого копирования памяти с помощью + акселлератора с увеличением адресов + на вход: + HL - откуда + DE - куда + BC - сколько + на выход: + HL - (откуда + сколько) + DE - (куда + сколько) + +[]------------------------------------------------------------------------[] + + MoveBytesUp - процедура быстрого копирования памяти с помощью + акселлератора с уменьшением адресов + на вход: + HL - откуда + DE - куда + BC - сколько + на выход: + HL - (откуда - сколько) + DE - (куда - сколько) + +[]------------------------------------------------------------------------[] + + Mult8 - процедура умножения 8 * 8 bit = 16 bit + + на вход: + E * C + на выход: + HL - результат + +[]------------------------------------------------------------------------[] + + Mult16X8 - процедура умножения 16 * 8 bit = 24 bit + + на вход: + DE * C + на выход: + A, HL - результат + +[]------------------------------------------------------------------------[] + + Mult16 - процедура умножения 16 * 16 bit = 16 bit + + на вход: + DE * BC + на выход: + HL - результат + +[]------------------------------------------------------------------------[] + + Mult16X16 - процедура умножения 16 * 16 bit = 32 bit + + на вход: + DE * BC + на выход: + HL, DE - результат + +[]------------------------------------------------------------------------[] + + Mult32 - процедура умножения 32 * 16 bit = 32 bit + + на вход: + HL, DE * BC + на выход: + HL, DE - результат + +[]------------------------------------------------------------------------[] + + Divis16X16 - процедура деления 16 / 16 bit = 16.16 bit + + на вход: + BC / DE + на выход: + BC - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis24X16 - процедура деления 24 / 16 bit = 8.16 bit + + на вход: + HL, C / DE + на выход: + A - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis32X16 - процедура деления 32 / 16 bit = 16.16 bit + + на вход: + HL, DE / BC + на выход: + DE - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis32 - процедура деления 32 / 16 bit = 32.16 bit + + на вход: + HL, DE / BC + на выход: + HL, DE - результат + BC - остаток + +[]------------------------------------------------------------------------[] + + ConvNumTxt32 - процедура конвертации числа 32 bit в текст + + на вход: + BC, HL - число 32 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvNumTxt16 - процедура конвертации числа 16 bit в текст + + на вход: + HL - число 16 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvNumTxt8 - процедура конвертации числа 8 bit в текст + + на вход: + A - число 8 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvTxtNum32 - процедура конвертации текста в число 32 bit + + на вход: + DE - адрес текста (конец строки - 0) + на выход: + HL, IX - число + C flag - ошибка + +[]------------------------------------------------------------------------[] + + ConvTxtNum16 - процедура конвертации текста в число 16 bit + + на вход: + DE - адрес текста (конец строки - 0) + на выход: + HL - число + C flag - ошибка + +[]------------------------------------------------------------------------[] + + DOSError - процедура вывода окна ошибки (для дос ошибок) + + на вход: + A - номер ошибки + на выход: + - + +[]------------------------------------------------------------------------[] + + + + + +10 july 2002 +Anton Enin (C) Copyright 2002 R-lab +если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме. \ No newline at end of file diff --git a/docs/fn_api_0.4.txt b/docs/fn_api_0.4.txt new file mode 100644 index 0000000..8047424 --- /dev/null +++ b/docs/fn_api_0.4.txt @@ -0,0 +1,611 @@ +[]========================================================================[] +* * +* Описание Flex Navigator API v1.xx для разработчиков Flx-Plugins * +* doc v0.4 от 13.07.2002 * +* * +[]========================================================================[] + + + + +[]------------------------------------------------------------------------[] + + ClearScreen - процедура отчистки 0-го экана нужным цветом. + + на вход: + A - цвет отчистки (00-0Fh) + на выход: + - + +[]------------------------------------------------------------------------[] + + MakeWindow - процедура создания графического окна + + на вход: + (SP) - описатель окна + на выход: + - + + сразу за вызовом этой процедуры в программе следует описатель окна. + возврат из процедуры происходит по адресу, следующему за описателем. + + например: + call MakeWindow + ... ; описатель окна + + + описатель окна: + +00 (1) флаг вывода окна: 0 - без сохранения данных под окном + (используется для полноэкранных окон) + 1 - с сохранением данных под окном + (используется для небольших окон) + 0x7F - восстановить данные под окном + (флаг служит для закрытия + текущего окна) + +01 (2) координата x для вывода (0 - 639) + +03 (2) координата y для вывода (0 - 255) + +05 (2) длина окна по x (0 - 639) + +07 (2) длина окна по y (0 - 255) + + далее идут об'екты окна в формате: + +00 (1) тип обекта + +01 ... описатели обекта + + об'екты окна: + 0. +00 (1) == 0 - конец списка об'ектов. после этого оконная + функция возвращает управление. + + 1. +00 (1) == 1 - текстовая строка + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +06 ... текстовая строка (конец строки - 0) + + 2. +00 (1) == 2 - заполнение прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + +09 (1) цвет заполнения + (d7-d4 цвет background, d3-d0 цвет foreground) + + 3. +00 (1) == 3 - отрисовка углублённой прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + + 4. +00 (1) == 4 - отрисовка выпуклой прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + + 5. +00 (1) == 5 - отрисовка кнопки с текстом + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + +09 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +10 ... текстовая строка (конец строки - 0) + + Внимание! печать текста осуществляется с позиций + x + 4, y + 1 + + 6. +00 (1) == 6 - отрисовка горизонтального разделителя + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + + 7. +00 (1) == 7 - отрисовка вертикального разделителя + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по y (0 - 255) + + 8. +00 (1) == 8 - отрисовка левой кнопки скролбара <- + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 9. +00 (1) == 9 - отрисовка правой кнопки скролбара -> + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 10. +00 (1) == 10 - отрисовка верхней кнопки скролбара ^ + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 11. +00 (1) == 11 - отрисовка нижней кнопки скролбара + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + +[]------------------------------------------------------------------------[] + + InvertRectan - процедура замены цвета прямоугольной плоскости + + на вход: + HL - x координата + BC - y координата + HX - длина y + LX - длина x + D - текущий цвет + (d7-d4 цвет background, d3-d0 цвет foreground) + E - нужный цвет + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + к сожалению процедура не очень быстрая, поэтому большие + прямоугольники советую особо не инвертировать... ;) + +[]------------------------------------------------------------------------[] + + PrnTxtLnIFF - процедура вывода текстовых строк на графический экран + 640x256 в режиме размерного по X шрифта + на вход: + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за строкой + +[]------------------------------------------------------------------------[] + + PrnTxtLnNorm - процедура вывода текстовых строк на графический экран + 640x256 + на вход: + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за строкой + +[]------------------------------------------------------------------------[] + + PrnTxtLnNormC - процедура вывода текстовых строк на графический экран + 640x256 с известным числом символов + на вход: + HL - адрес текстовой строки + DE - позиция вывода по X + C - позиция вывода по Y + B - кол-во печатаемых символов + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за последним символом + +[]------------------------------------------------------------------------[] + + PrnRangPathL - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, прижатых к + левому краю ( |-> ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + PrnRangPathR - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, прижатых к + правому краю ( <-| ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + PrnRangPathC - процедура вывода досовских путей на графический экран + 640x256 в режиме размерного по X шрифта, отцентрированных + относительно краёв ( <-|-> ) + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + InputLine - процедура редактирования строки на графическом экране + 640x256 в режиме размерного по X шрифта + + на вход: + IX - адрес описателя строки + HL - адрес описателя элементов экрана (для мышки) + на выход: + - + + описатель строки: + +00 (1) максимальная длина строки + +01 (1) флаг готовности + +02 (1) текущая X позиция курсора (инициализируется в InputLine) + +03 (1) текущая add_x (инициализируется в InputLine) + +04 (1) количество введенных символов / длина строки + +05 (2) X позиция строки на экране + +07 (2) Y позиция строки на экране + +09 (2) X длина строки на экране + +0B (1) цвет строки (d7-d4 цвет background, d3-d0 цвет foreground) + +0C ... сама строка + + процедуры для таблицы элементов экрана: + InpLnExtN - процедура нормального выхода из редакции + InpLnExtC - процедура выхода из редакции по cancel + (восстанавливает изначальную строку) + +[]------------------------------------------------------------------------[] + + InitScrBar - процедура инициализации описателя скроллбара + + на вход: + IX - адрес описателя скроллбара + на выход: + - + + описатель скроллбара: + +00 (2) X позиция скролбара (0-639) + +02 (2) Y позиция скролбара (0-255) + +04 (2) длина скролбара + +06 (2) текущая длина скролбара (инициализируется в InitScrBar) + +08 (2) адрес ячейки, куда запишется начальная координата бара + если 0, то не используется + (используется для таблицы элементов экрана) + +10 (2) адрес ячейки, куда запишется конечная координата бара + если 0, то не используется + (используется для таблицы элементов экрана) + +12 (2) кол-во видимых элементов + +14 (2) общее кол-во элементов + +16 (2) первая видимый элемент + +[]------------------------------------------------------------------------[] + + PrnHScrBar - процедура печати горизонтального скроллбара + + на вход: + IX - адрес описателя скроллбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + PrnVScrBar - процедура печати вертикального скроллбара + + на вход: + IX - адрес описателя скроллбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + InitProcess - процедура инициализации описателя процессбара + + на вход: + IX - адрес описателя процессбара + на выход: + - + + описателя процессбара: + +00 (2) X позиция процессбара (0-639) + +02 (2) Y позиция процессбара (0-255) + +04 (2) длина процессбара + +06 (2) коэффициент для процесса (инициализируется в InitProcess) + +08 (2) коррекция коэфициента (инициализируется в InitProcess) + +10 (4) максимум (инициализируется в InitProcess) + +14 (4) текущее (инициализируется в InitProcess) + +18 (1) цвет процессбара + (d7-d4 цвет background, d3-d0 цвет foreground) + +[]------------------------------------------------------------------------[] + + PrnProcess - процедура печати процессбара + + на вход: + IX - адрес описателя процессбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + ResFire - процедура ожидания, пока все кнопки мыши не будут отпущены + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + TestCoords - процедура проверки координат мыши по таблице элементов + зкрана + + на вход: + IX - адрес таблицы элементов зкрана + на выход: + - + + таблица элементов зкрана: + +00 (2) левая x координата элемента + +02 (2) правая x координата элемента + +04 (2) верхняя y координата элемента + +06 (2) нижняя y координата элемента + +08 (2) флаги элемента + +10 (2) адрес обработчика при не нажатом огне + +12 (2) адрес обработчика при нажатом огне (левая кнопка) + +14 (2) адрес обработчика при нажатом огне (правая кнопка) + + если +00 == 0x8000 это считается концом таблицы элементов зкрана + + флаги элемента: + d00 - элемент кнопка + d01 - рабочая кнопка + d02 - инверт + d03 - статичный инверт + d04 - программа запускается без адреса возврата без огня + (т.е. при попадании курсора мыши в эту прямоугольную + область удаляется адрес возрата со стека и осуществляется + переход на адрес, который находиться в +10) + d05 - программа запускается без адреса возврата по левой кнопке + огня + (т.е. при нажатии левой кнопки мыши над прямоугольной + областью удаляется адрес возрата со стека и осуществляется + переход на адрес, который находиться в +12) + d06 - программа запускается без адреса возврата по правой кнопке + огня + (т.е. при нажатии правой кнопки мыши над прямоугольной + областью удаляется адрес возрата со стека и осуществляется + переход на адрес, который находиться в +14) + d07 - вызвать функцию закрытия окна перед запуском программы без + огня + (т.е. при попадании курсора мыши в эту прямоугольную + область удаляется последнее окно с экрана) + d08 - вызвать функцию закрытия окна перед запуском программы по + левой кнопке + (т.е. при нажатии левой кнопки мыши над прямоугольной + областью удаляется последнее окно с экрана) + d09 - вызвать функцию закрытия окна перед запуском программы по + правой кнопке + (т.е. при нажатии правой кнопки мыши над прямоугольной + областью удаляется последнее окно с экрана) + d15 - это флаг: 1 - инверт при огне не убирать + +[]------------------------------------------------------------------------[] + + SetCMOSPrint - процедура включения печати даты/время из CMOS + + на вход: + - будет описано позднее + на выход: + - +[]------------------------------------------------------------------------[] + + ResCMOSPrint - процедура выключения печати даты/время из CMOS + + на вход: + - будет описано позднее + на выход: + - + +[]------------------------------------------------------------------------[] + + SetClock - процедура установки курсора мыши в часы + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + SetMouse - процедура установки курсора мыши в нормальный курсор + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + MoveBytes - процедура быстрого копирования памяти с помощью + акселлератора с увеличением адресов + на вход: + HL - откуда + DE - куда + BC - сколько + на выход: + HL - (откуда + сколько) + DE - (куда + сколько) + +[]------------------------------------------------------------------------[] + + MoveBytesUp - процедура быстрого копирования памяти с помощью + акселлератора с уменьшением адресов + на вход: + HL - откуда + DE - куда + BC - сколько + на выход: + HL - (откуда - сколько) + DE - (куда - сколько) + +[]------------------------------------------------------------------------[] + + Mult8 - процедура беззнакового умножения 8 * 8 bit = 16 bit + + на вход: + E * C + на выход: + HL - результат + +[]------------------------------------------------------------------------[] + + Mult16X8 - процедура беззнакового умножения 16 * 8 bit = 24 bit + + на вход: + DE * C + на выход: + A, HL - результат + +[]------------------------------------------------------------------------[] + + Mult16 - процедура беззнакового умножения 16 * 16 bit = 16 bit + + на вход: + DE * BC + на выход: + HL - результат + +[]------------------------------------------------------------------------[] + + Mult16X16 - процедура беззнакового умножения 16 * 16 bit = 32 bit + + на вход: + DE * BC + на выход: + HL, DE - результат + +[]------------------------------------------------------------------------[] + + Mult32 - процедура беззнакового умножения 32 * 16 bit = 32 bit + + на вход: + HL, DE * BC + на выход: + HL, DE - результат + +[]------------------------------------------------------------------------[] + + Divis16X16 - процедура беззнакового деления 16 / 16 bit = 16.16 bit + + на вход: + BC / DE + на выход: + BC - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis24X16 - процедура беззнакового деления 24 / 16 bit = 8.16 bit + + на вход: + HL, C / DE + на выход: + A - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis32X16 - процедура беззнакового деления 32 / 16 bit = 16.16 bit + + на вход: + HL, DE / BC + на выход: + DE - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + Divis32 - процедура беззнакового деления 32 / 16 bit = 32.16 bit + + на вход: + HL, DE / BC + на выход: + HL, DE - результат + BC - остаток + +[]------------------------------------------------------------------------[] + + ConvNumTxt32 - процедура конвертации беззнакового числа 32 bit в текст + + на вход: + BC, HL - число 32 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvNumTxt16 - процедура конвертации беззнакового числа 16 bit в текст + + на вход: + HL - число 16 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvNumTxt8 - процедура конвертации беззнакового числа 8 bit в текст + + на вход: + A - число 8 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + ConvTxtNum32 - процедура конвертации текста в беззнаковое число 32 bit + + на вход: + DE - адрес текста (конец строки - 0) + на выход: + HL, IX - число + C flag - ошибка + +[]------------------------------------------------------------------------[] + + ConvTxtNum16 - процедура конвертации текста в беззнаковое число 16 bit + + на вход: + DE - адрес текста (конец строки - 0) + на выход: + HL - число + C flag - ошибка + +[]------------------------------------------------------------------------[] + + DOSError - процедура вывода окна ошибки (для дос ошибок) + + на вход: + A - номер ошибки + на выход: + - + +[]------------------------------------------------------------------------[] + + + + + +13 july 2002 +Anton Enin (C) Copyright 2002 R-lab +если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме. \ No newline at end of file diff --git a/docs/fn_api_0.5.txt b/docs/fn_api_0.5.txt new file mode 100644 index 0000000..db053bf --- /dev/null +++ b/docs/fn_api_0.5.txt @@ -0,0 +1,671 @@ +[]========================================================================[] +* * +* Описание Flex Navigator API v1.xx для разработчиков Flx-Plugins * +* doc v0.5 от 31.03.2025 (в процессе) * +* * +[]========================================================================[] + + Доступ к функциям осуществляется через набор переходов в начале ядра + Flex Navigator для сборки плагинов независимо от ядра. + Таблица переходов начинается с адреса JUMPS + 3 или она же с + BASE_ADDR + 3. Адрес начала таблицы выровнен по границе 256 байт. Первый + адрес переход занят для запуска самого навигатора. + Размер таблицы переходов 192 байта, после таблицы расположены некоторые + переменные Flex Navigator для доступа к ним из плагинов. + Для правильной работы при сборке плагина предлагается инклудить + файл fn_const.a80 + +[]------------------------------------------------------------------------[] + + JUMPS.ClearScreen - процедура отчистки 0-го экрана нужным цветом. + + на вход: + A - цвет отчистки (00-0Fh) + на выход: + - + +[]------------------------------------------------------------------------[] + + JUMPS.MakeWindow - процедура создания графического окна + + на вход: + (SP) - описатель окна + на выход: + - + + сразу за вызовом этой процедуры в программе следует описатель окна. + возврат из процедуры происходит по адресу, следующему за описателем. + + например: + call MakeWindow + ... ; описатель окна + + + описатель окна: + +00 (1) флаг вывода окна: 0 - без сохранения данных под окном + (используется для полноэкранных окон) + 1 - с сохранением данных под окном + (используется для небольших окон) + 0x7F - восстановить данные под окном + (флаг служит для закрытия + текущего окна) + 0x8x - без привязки к описателю окна + +01 (2) координата x для вывода (0 - 639) + +03 (2) координата y для вывода (0 - 255) + +05 (2) ширина (0 - 639) + +07 (2) высота (0 - 255) + + далее идут об'екты окна в формате: + +00 (1) тип объекта + +01 ... описатели обекта + + об'екты окна: + 0. +00 (1) == 0 - конец списка об'ектов. после этого оконная + функция возвращает управление. + + 1. +00 (1) == 1 - текстовая строка + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +06 ... текстовая строка (конец строки - 0) + + 2. +00 (1) == 2 - заполнение прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + +09 (1) цвет заполнения + (d7-d4 цвет background, d3-d0 цвет foreground) + + 3. +00 (1) == 3 - отрисовка углублённой прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + + 4. +00 (1) == 4 - отрисовка выпуклой прямоугольной плоскости + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + + 5. +00 (1) == 5 - отрисовка кнопки с текстом + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + +07 (2) длина по y (0 - 255) + +09 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +10 ... текстовая строка (конец строки - 0) + + Внимание! печать текста осуществляется с позиций + x + 4, y + 1 + + 6. +00 (1) == 6 - отрисовка горизонтального разделителя + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по x (0 - 639) + + 7. +00 (1) == 7 - отрисовка вертикального разделителя + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (2) длина по y (0 - 255) + + 8. +00 (1) == 8 - отрисовка левой кнопки скролбара <- + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 9. +00 (1) == 9 - отрисовка правой кнопки скролбара -> + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 10. +00 (1) == 10 - отрисовка верхней кнопки скролбара ^ + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + + 11. +00 (1) == 11 - отрисовка нижней кнопки скролбара + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +[]------------------------------------------------------------------------[] + + JUMPS.InvertRectan - процедура замены цвета прямоугольной плоскости + + на вход: + HL - x координата + BC - y координата + HX - длина y + LX - длина x + D - текущий цвет + (d7-d4 цвет background, d3-d0 цвет foreground) + E - нужный цвет + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + к сожалению процедура не очень быстрая, поэтому большие + прямоугольники советую особо не инвертировать... ;) + +[]------------------------------------------------------------------------[] + + JUMPS.PrnTxtLnIFF - процедура вывода текстовых строк на графический + экран 640x256 в режиме размерного по X шрифта + + на вход: + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за строкой + +[]------------------------------------------------------------------------[] + + JUMPS.PrnTxtLnNorm - процедура вывода текстовых строк на графический + экран 640x256 + + на вход: + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за строкой + +[]------------------------------------------------------------------------[] + + JUMPS.PrnTxtLnNormC - процедура вывода текстовых строк на графический + экран 640x256 с известным числом символов + + на вход: + HL - адрес текстовой строки + DE - позиция вывода по X + C - позиция вывода по Y + B - кол-во печатаемых символов + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + HL - адрес байта, следующего за последним символом + +[]------------------------------------------------------------------------[] + + JUMPS.PrnRangPathL - процедура вывода досовских путей на графический + экран 640x256 в режиме размерного по X шрифта, прижатых к + левому краю ( |-> ) + + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + JUMPS.PrnRangPathR - процедура вывода досовских путей на графический + экран 640x256 в режиме размерного по X шрифта, прижатых к + правому краю ( <-| ) + + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + JUMPS.PrnRangPathC - процедура вывода досовских путей на графический + экран 640x256 в режиме размерного по X шрифта, отцентрированных + относительно краёв ( <-|-> ) + + на вход: + IX - кол-во пикселей под вывод строки + HL - адрес текстовой строки (конец строки - 0) + DE - позиция вывода по X + BC - позиция вывода по Y + A - цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + на выход: + - + + процедура грамотно укорачивает досовский путь до нужного + размера путём замещения невлезающих директорий на ..\ + +[]------------------------------------------------------------------------[] + + JUMPS.InputLine - процедура редактирования строки на графическом + экране 640x256 в режиме размерного по X шрифта + + на вход: + IX - адрес описателя строки + HL - адрес описателя элементов экрана (для мышки) + на выход: + - + + описатель строки: + +00 (1) максимальная длина строки + +01 (1) флаг готовности + +02 (1) текущая X позиция курсора (инициализируется в InputLine) + +03 (1) текущая add_x (инициализируется в InputLine) + +04 (1) количество введенных символов / длина строки + +05 (2) X позиция строки на экране + +07 (2) Y позиция строки на экране + +09 (2) X длина строки на экране + +0B (1) цвет строки (d7-d4 цвет background, d3-d0 цвет foreground) + +0C ... сама строка + + процедуры для таблицы элементов экрана: + InpLnExtN - процедура нормального выхода из редакции + InpLnExtC - процедура выхода из редакции по cancel + (восстанавливает изначальную строку) + +[]------------------------------------------------------------------------[] + + JUMPS.InpLnExtN + +[]------------------------------------------------------------------------[] + + JUMPS.InpLnExtC + +[]------------------------------------------------------------------------[] + + JUMPS.DOSError - процедура вывода окна ошибки (для DOS ошибок) + + на вход: + A - номер ошибки + на выход: + - + +[]------------------------------------------------------------------------[] + + JUMPS.InitScrBar - процедура инициализации описателя скроллбара + + на вход: + IX - адрес описателя скроллбара + на выход: + - + + описатель скроллбара: + +00 (2) X позиция скролбара (0-639) + +02 (2) Y позиция скролбара (0-255) + +04 (2) длина скролбара + +06 (2) текущая длина скролбара (инициализируется в InitScrBar) + +08 (2) адрес ячейки, куда запишется начальная координата бара + если 0, то не используется + (используется для таблицы элементов экрана) + +10 (2) адрес ячейки, куда запишется конечная координата бара + если 0, то не используется + (используется для таблицы элементов экрана) + +12 (2) кол-во видимых элементов + +14 (2) общее кол-во элементов + +16 (2) первая видимый элемент + +[]------------------------------------------------------------------------[] + + JUMPS.PrnHScrBar - процедура печати горизонтального скроллбара + + на вход: + IX - адрес описателя скроллбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + JUMPS.PrnVScrBar - процедура печати вертикального скроллбара + + на вход: + IX - адрес описателя скроллбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + JUMPS.InitProcess - процедура инициализации описателя процессбара + + на вход: + IX - адрес описателя процессбара + на выход: + - + + описателя процессбара: + +00 (2) X позиция процессбара (0-639) + +02 (2) Y позиция процессбара (0-255) + +04 (2) длина процессбара + +06 (2) коэффициент для процесса (инициализируется в InitProcess) + +08 (2) коррекция коэфициента (инициализируется в InitProcess) + +10 (4) максимум (инициализируется в InitProcess) + +14 (4) текущее (инициализируется в InitProcess) + +18 (1) цвет процессбара + (d7-d4 цвет background, d3-d0 цвет foreground) + +[]------------------------------------------------------------------------[] + + JUMPS.PrnProcess - процедура печати процессбара + + на вход: + IX - адрес описателя процессбара (см. выше) + на выход: + - + +[]------------------------------------------------------------------------[] + + JUMPS.InitScrollBar + +[]------------------------------------------------------------------------[] + + JUMPS.MenuWork + +[]------------------------------------------------------------------------[] + + 3 команд перехода (12 байт) зарезервированы и заполнены + командой RET (12 байт 0xC9) + +[]------------------------------------------------------------------------[] + + JUMPS.ResFire - процедура ожидания, пока все кнопки мыши не будут + отпущены + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + JUMPS.TestCoords - процедура проверки координат мыши по таблице + элементов экрана + + на вход: + IX - адрес таблицы элементов зкрана + на выход: + - + + таблица элементов зкрана: + +00 (2) левая x координата элемента + +02 (2) правая x координата элемента + +04 (2) верхняя y координата элемента + +06 (2) нижняя y координата элемента + +08 (2) флаги элемента + +10 (2) адрес обработчика при не нажатом огне + +12 (2) адрес обработчика при нажатом огне (левая кнопка) + +14 (2) адрес обработчика при нажатом огне (правая кнопка) + + если +00 == 0x8000 это считается концом таблицы элементов зкрана + + флаги элемента: + d00 - элемент кнопка + d01 - рабочая кнопка + d02 - инверт + d03 - статичный инверт + d04 - программа запускается без адреса возврата без огня + (т.е. при попадании курсора мыши в эту прямоугольную + область удаляется адрес возрата со стека и осуществляется + переход на адрес, который находиться в +10) + d05 - программа запускается без адреса возврата по левой кнопке + огня + (т.е. при нажатии левой кнопки мыши над прямоугольной + областью удаляется адрес возрата со стека и осуществляется + переход на адрес, который находиться в +12) + d06 - программа запускается без адреса возврата по правой кнопке + огня + (т.е. при нажатии правой кнопки мыши над прямоугольной + областью удаляется адрес возрата со стека и осуществляется + переход на адрес, который находиться в +14) + d07 - вызвать функцию закрытия окна перед запуском программы без + огня + (т.е. при попадании курсора мыши в эту прямоугольную + область удаляется последнее окно с экрана) + d08 - вызвать функцию закрытия окна перед запуском программы по + левой кнопке + (т.е. при нажатии левой кнопки мыши над прямоугольной + областью удаляется последнее окно с экрана) + d09 - вызвать функцию закрытия окна перед запуском программы по + правой кнопке + (т.е. при нажатии правой кнопки мыши над прямоугольной + областью удаляется последнее окно с экрана) + d15 - это флаг: 1 - инверт при огне не убирать + +[]------------------------------------------------------------------------[] + + JUMPS.SetCMOSPrint - процедура включения печати даты/время из CMOS + + на вход: + - будет описано позднее + на выход: + - +[]------------------------------------------------------------------------[] + + JUMPS.ResCMOSPrint - процедура выключения печати даты/время из CMOS + + на вход: + - будет описано позднее + на выход: + - + +[]------------------------------------------------------------------------[] + + JUMPS.SetClock - процедура установки курсора мыши в часы + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + JUMPS.SetMouse - процедура установки курсора мыши в нормальный курсор + + на вход: + - + на выход: + - + +[]------------------------------------------------------------------------[] + + 4 команды перехода (12 байт) зарезервированы и заполнены + командой RET (12 байт 0xC9) + +[]------------------------------------------------------------------------[] + + JUMPS.ConvNumTxt40 + +[]------------------------------------------------------------------------[] + + JUMPS.MoveBytes - процедура быстрого копирования памяти с помощью + акселлератора с увеличением адресов + + на вход: + HL - откуда + DE - куда + BC - сколько + на выход: + HL - (откуда + сколько) + DE - (куда + сколько) + +[]------------------------------------------------------------------------[] + + JUMPS.MoveBytesUp - процедура быстрого копирования памяти с помощью + акселлератора с уменьшением адресов + + на вход: + HL - откуда + DE - куда + BC - сколько + на выход: + HL - (откуда - сколько) + DE - (куда - сколько) + +[]------------------------------------------------------------------------[] + + JUMPS.Mult8 - процедура беззнакового умножения + 8 * 8 bit = 16 bit + + на вход: + E * C + на выход: + HL - результат + +[]------------------------------------------------------------------------[] + + JUMPS.Mult16X8 - процедура беззнакового умножения + 16 * 8 bit = 24 bit + + на вход: + DE * C + на выход: + A, HL - результат + +[]------------------------------------------------------------------------[] + + JUMPS.Mult16 - процедура беззнакового умножения + 16 * 16 bit = 16 bit + + на вход: + DE * BC + на выход: + HL - результат + +[]------------------------------------------------------------------------[] + + JUMPS.Mult16X16 - процедура беззнакового умножения + 16 * 16 bit = 32 bit + + на вход: + DE * BC + на выход: + HL, DE - результат + +[]------------------------------------------------------------------------[] + + JUMPS.Mult32 - процедура беззнакового умножения + 32 * 16 bit = 32 bit + + на вход: + HL, DE * BC + на выход: + HL, DE - результат + +[]------------------------------------------------------------------------[] + + JUMPS.Divis16X16 - процедура беззнакового деления + 16 / 16 bit = 16.16 bit + + на вход: + BC / DE + на выход: + BC - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + JUMPS.Divis24X16 - процедура беззнакового деления + 24 / 16 bit = 8.16 bit + + на вход: + HL, C / DE + на выход: + A - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + JUMPS.Divis32X16 - процедура беззнакового деления + 32 / 16 bit = 16.16 bit + + на вход: + HL, DE / BC + на выход: + DE - результат + HL - остаток + +[]------------------------------------------------------------------------[] + + JUMPS.Divis32 - процедура беззнакового деления + 32 / 16 bit = 32.16 bit + + на вход: + HL, DE / BC + на выход: + HL, DE - результат + BC - остаток + +[]------------------------------------------------------------------------[] + + JUMPS.ConvNumTxt32 - процедура конвертации беззнакового числа + 32 bit в текст + + на вход: + BC, HL - число 32 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + JUMPS.ConvNumTxt16 - процедура конвертации беззнакового числа + 16 bit в текст + + на вход: + HL - число 16 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + JUMPS.ConvNumTxt8 - процедура конвертации беззнакового числа + 8 bit в текст + + на вход: + A - число 8 bit + DE - адрес буфера + на выход: + DE - адрес следующего байта за числом + +[]------------------------------------------------------------------------[] + + JUMPS.ConvTxtNum32 - процедура конвертации текста в беззнаковое + число 32 bit + + на вход: + DE - адрес текста (конец строки - 0) + на выход: + HL, IX - число + C flag - ошибка + +[]------------------------------------------------------------------------[] + + JUMPS.ConvTxtNum16 - процедура конвертации текста в беззнаковое + число 16 bit + + на вход: + DE - адрес текста (конец строки - 0) + на выход: + HL - число + C flag - ошибка + +[]------------------------------------------------------------------------[] + + JUMPS.Resident + +[]------------------------------------------------------------------------[] + +13 july 2002 +Anton Enin (C) Copyright 2002 R-lab +если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме. diff --git a/docs/history.txt b/docs/history.txt new file mode 100644 index 0000000..a3e7acf --- /dev/null +++ b/docs/history.txt @@ -0,0 +1,145 @@ + +FN - FlexNavigator +FV - FileViewer +FE - FileEditor + +28.05.25 +FE v1.08 +- убрано "искажение" имени файла при запуске. +FV v1.05 +- убрано "искажение" имени файла при запуске. +FN v1.14 +- исправлено зависание в командной строке при нажатии ALT+F1/F2. +- сделан пропуск для имени директории ".." для сортировщика для правильной сортировки. +- поправлены названия типов сортировки. +- сделан измеритель размера директории в байтах для копирования директориями (пока спрятан). +- показ содержимого директории из дерева сделан по ENTER вместо автопоказа (пока спрятана). +- поправлена генерация дерева файлов. + +------------------------------------------------------------------------------- + +25/06/24 +Добавлено отображение сообщения о защите от записи. + +13/05/24 +Исправлена ошибка инициализации страницы help. +Добавлена поддержка больших файлов для FAT32 + + +11/05/24 +Теперь выводится сообщение о том, что слишком много файлов в директории. Те файлы, которые "не влезли" - не отображаются. + + +12/12/23 +Поддержка Current Dir, при старте отображается текущая директория диска. + + +07/09/23 +Множественные мелкие правки. + + +01/08/23 +Повисает FN после перезагрузки большой альтеры (titd, ldconf). +Убрана проверка на Sp97. +Версия нормально прописана, лишние копирайты при запуске убраны. + + +29/07/23 +Таблица ошибок от завершившегося приложения - 32 записи. +DSS раньше не возвращал флаг CF при выходе с ошибкой, но FN всегда проверял после возврата из приложения флаг CF. +DSS теперь вернул, FN полез ошибку проверять, а там FF, а таблица на 32... +Найдено на disttest.exe, он выходит зачем-то установив код ошибки #FF, а такого кода нет. +Нужно с нулем выходить без ошибок. + + +17/07/23 +В биосе 2.55 появилась функция - передавать управление из ПЗУ обработчику прерывания в нулевой банке ОЗУ. +Cделана проверка на версию биоса. + + +10/05/22 +Viewer: +* Поправлен косметический баг в нижней строке при смене функциональных клавиш. +* Исправлено зависание принтера до таймаута при печати. +* Героически сэкономлено немного тактов там, где никто не заметит))). ++ Печать перенесена на клавишу F7, чтоб выгнать вас из зоны комфорта))). ++ Добавлено сочетание CTRL+P для печати. +? Почти исправлен Wrap, остался баг с верхней строкой. Лучше, чем ничего. + +Editor: ++ Добавлена кнопка "F7 Print" ++ Добавлено сочетание CTRL+P для печати в режиме HEX +* Поправлен косметический баг в нижней строке при смене функциональных клавиш +* Исправлено зависание принтера до таймаута при печати + +------------------------------------------------------------------------------- + +FE v.1.06 05.08.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ По кнопке F9 вызываются настройки редактора с возможностью сохранить настройки + в файл + +FN v.1.13.1 02.08.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) +* версия без сжатия кодовых блоков + +FE v.1.05.1 02.08.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ Добавлен параметр в конфиг-файле fnedit.ini, который включает/отключает диалог + подтверждения закрытия редактора + +FE v.1.05 07.06.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) +* исправлен глюк, который приводил к зависанию или сбросу после 7-го открытия + редактора ++ Добавлено автозакрытие символов скобок и кавычек ++ У редактора появился конфиг-файл fnedit.ini, через который можно отключить + некоторые фичи + +FE v.1.04 18.04.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ Добавлена кнопка Ctrl+P для печати (затем F9 будет переназначена на другой + функционал) ++ Добавлен функционал отмены по Ctrl+Z (это не пошаговый Undo, не полноценный, + просто сбрасывает буфер текущей редактируемой строки, на момент перехода + на эту строку) + +FE v.1.03 17.04.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ Добавлены кнопки управления Alt+CursorLeft(Home) и Alt+CursorRight(End) +* Исправлен баг в подпрограмме THomeString - на пустой строке могла зациклиться +* Исправлен баг в TEndString, аналогично - на пустой строке могла зациклиться +* Исправлена подпрограмма заполнения буфера текущей строки (при нулевой длине + строки он не очищался) + +FN v.1.12.1 13.04.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) +* Исправлен баг при автоматической смене панели ++ Добавлена настройка в SetUp для отключения автоматической активации панели при + смене диска + +FE v.1.02 10.04.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ Добавлена горячая кнопка Ctrl+D для дублирования строки (работает + только для строк до 127 символов) ++ При переносе строки в начале строки делается такой же отступ от начала, как и + на предыдущей строке +* Переработаны процедуры позиционирования курсора + +FN v.1.12+ 07.04.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ Панель, в которой меняется диск по Alt+F1/F2 становится активной + +FE v.1.01 07.04.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ Добавлен диалог с запросом подтверждения выхода из редактора ++ При извлечении строки буфер строки очищается - ранее можно было наблюдать + некоторый мусор в конце строки при навигации между строками +* Доработана процедура позиционирования курсора при навигации на строку + (страницу) выше/ниже - в зависимости от наличия табуляторов в строке, курсор + мог отскакивать на несколько позиций в сторону ++ Добавлена возможность удаления целой строки по Ctrl+Y ++ Добавлена горячая кнопка для сохранения Ctrl+S ++ Реализация нового режима работы Home - если есть табуляторы в начале строки, + то при первом нажатии курсор перемещается в позицию с первым не-пробельным + символом, при повторном нажатии - перемещается в первую позицию + +FN v.1.12 02.04.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ Реализован запуск BAT-файлов, как из панели, так и из командной строки с + передачей параметров. + +FN v.1.11 27.03.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) +* Исправлено определение каталога в котором располагаются файлы FlexNavigator-а. + +FV v.1.03 10.02.2021 (Mikhaltchenkov Dmitry aka Hard/WCG) ++ Добавлено переключение кодировки текста WIN/DOS/KOI diff --git a/docs/todo.txt b/docs/todo.txt new file mode 100644 index 0000000..a821898 --- /dev/null +++ b/docs/todo.txt @@ -0,0 +1,19 @@ + +Flex navigator TODO: + +[] добавить в настройки автопоказ или по ENTER при перемещении по дереву каталогов +[] добавить в настройки выбор менять ли активную панель при смене диска на не активной панели +[] при выводе дерева каталогов сделать скролл влево/вправо если дерево не влезает по горизонтали +[] по кнопке F6 только переименование, а должно быть переименование/перемещение файла если на панелях разные пути +[] переделать захордкоженные координаты, переделать на привязку к координатам окна +[] разобраться как работает строка ввода при поиске файла по имени +[] плагин редактирования шрифта +[] плагин для создания форм окон +[] загрузка FLX плагина по имени без запуска +[?] вызов и взаимодействие плагина с плагином + +[x] ввод в командную строку и нажатие ALT+F1/F2 (выбор драйва) подвисает +[x] сортировщик сортирует "..", а не должен +[x] вьювер при получении имени файла делает его конверсию и при наличии русских символов портит имя и "File not found" +[x] в Disk Info окне показывает имя диска имя файла (npl.exe) +[x] построитель дерева каталогов не работает diff --git a/fn_const.a80 b/fn_const.a80 new file mode 100644 index 0000000..efa2d67 --- /dev/null +++ b/fn_const.a80 @@ -0,0 +1,386 @@ + +; LAST UPDATE: 28.05.2025 savelij + +DOShistory_Size EQU 0x200 ; размер буфера DOS истории + + INIT_VAR 0x8000 + SETVAR WorkBuffer, 0x400 ; рабочий буфер + SETVAR StackTree, 0x100 ; начало буфера стека для работы с деревом директорий + SETVAR STACKTREE, 0 ; указатель на конец буфера (стек растет вниз) + SETVAR PagesList, 0x100 ; список страниц памяти + SETVAR Stack, 0x100 ; начало рабочего стека + SETVAR STACK, 0 ; указатель на конец буфера (стек растет вниз) + SETVAR BASE_ADDR, 0x100 ; начало кода (блок переходов и общих переменных для доступа из плагинов) + SETVAR PALETTE, 0 ; палитра сразу за таблицей переходов и глобальных переменных + +ADDR + _INIT_VAR 0x4000 + _SETVAR .FlexDIRECTORY + +PluginOrg EQU 0xC000 - 0x10 ; адрес плагина с учетом размера заголовка + +LenInpData EQU 12 ; какое-то смещение для метки SearchStr +CursTimer EQU 6 ; "частота" моргания текстового курсора +Step EQU 8 ; ширина символа для перемещения курсора при вводе текста +MainPullMenu EQU 6 ; количество пунктов в главном меню +MASK_SIZE EQU 13 +PANFILES ; количество файлов/директорий в панели в высоту +.BRIEF EQU 17 ; для Brief режима +.FULL EQU 18 ; для Full режима +.TREE EQU 18 ; для Tree режима + +SUPPFILES + _INIT_VAR 1 + _SETVAR .EXE + _SETVAR .BAT + _SETVAR .FLX + +; цвета INK +COLORI + _INIT_VAR + _SETVAR .BLACK ; 0 + _SETVAR .RED ; 1 + _SETVAR .GREEN ; 2 + _SETVAR .YELLOW ; 3 + _SETVAR .BLUE ; 4 + _SETVAR .INVERTPAPER ; 5 + _SETVAR .INVERTINK ; 6 + _SETVAR .BLACKGRAY ; 7 + _SETVAR .HIGHGRAY ; 8 + _SETVAR .PANEL ; 9 + _SETVAR .FILES ; A + _SETVAR .SELECTFILES ; B + _SETVAR .INVSELFILES ; C + _SETVAR .RESERVED ; D + _SETVAR .WHITE0E ; E + _SETVAR .WHITE ; F + +; цвета PAPER +COLORP + _INIT_VAR + _SETVAR .BLACK, 0x10 + _SETVAR .RED, 0x10 + _SETVAR .GREEN, 0x10 + _SETVAR .YELLOW, 0x10 + _SETVAR .BLUE, 0x10 + _SETVAR .INVERTPAPER, 0x10 + _SETVAR .INVERTINK, 0x10 + _SETVAR .BLACKGRAY, 0x10 + _SETVAR .HIGHGRAY, 0x10 + _SETVAR .PANEL, 0x10 + _SETVAR .FILES, 0x10 + _SETVAR .SELECTFILES, 0x10 + _SETVAR .INVSELFILES, 0x10 + _SETVAR .RESERVED, 0x10 + _SETVAR .WHITE0E, 0x10 + _SETVAR .WHITE, 0x10 + +WINOBJECT + _INIT_VAR + _SETVAR .TYPE, BYTE + +; нумерация подобъектов окна +WINSUBOBJ + _INIT_VAR + _SETVAR .END ; конец описателя окна + _SETVAR .TEXT ; печать текстовой строки + _SETVAR .FILL ; заливка цветом указанной области + _SETVAR .BORDER ; углубление + _SETVAR .BUTTON ; кнопка + _SETVAR .BUTTONTEXT ; кнопка с текстом + _SETVAR .HORIZLINE ; горизонтальная линия + _SETVAR .VERTICLINE ; вертикальная линия + _SETVAR .ICONLEFTARROW ; спрайтик для скроллбара "стрелка влево" + _SETVAR .ICONRIGHTARROW ; спрайтик для скроллбара "стрелка вправо" + _SETVAR .ICONUPARROW ; спрайтик для скроллбара "стрелка вверх" + _SETVAR .ICONDOWNARROW ; спрайтик для скроллбара "стрелка вниз" + _SETVAR .ADRTEXT ; печать текстовой строки по адресу + _INIT_VAR 0x7F + _SETVAR .RESTOREWIN ; восстановление экрана под окном + _SETVAR .WOBIND ; все выше перечисленное без привязки к описателю + _INIT_VAR + _SETVAR .NOSTORE ; без сохранения данных под окном + _SETVAR .STORE ; с сохранением данных под окном + +;[]----------------------------------------------------------[] +PANEL + _INIT_VAR + _SETVAR .PANELFLAG ; Флаг панели бит 7 - бит выделенности + ; бит 0 - номер панели + _SETVAR .VIEWFLAG ; Флаг вида панели 0 - краткая панель + ; бит 0 - подробная панель + ; бит 1 - дерево + ; бит 2 - ужатое дерево + _SETVAR .SORTFLAG ; Вид сортировки + ; бит 0 - по имени + ; бит 1 - по расширению + ; бит 2 - по размеру + ; бит 3 - по дате + ; бит 4 - execute file + ; бит 5 - file mask + _SETVAR .XL ; X позиция панели LOW + _SETVAR .XH ; X позиция панели HIGH + _SETVAR .BARXL ; X позиция скролбара LOW + _SETVAR .BARXH ; X позиция скролбара HIGH + _SETVAR .BARYL ; Y позиция скролбара LOW + _SETVAR .BARYH ; Y позиция скролбара HIGH + _SETVAR .BARMLL ; Max длина скролбара LOW + _SETVAR .BARMLH ; Max длина скролбара HIGH + _SETVAR .BARCLL ; тек.длина скролбара LOW + _SETVAR .BARCLH ; тек.длина скролбара HIGH + _SETVAR .BARLFL ; Адрес ячейки BarLeft LOW + _SETVAR .BARLFH ; Адрес ячейки BarLeft HIGH + _SETVAR .BARRTL ; Адрес ячейки BarRight LOW + _SETVAR .BARRTH ; Адрес ячейки BarRight HIGH + _SETVAR .FPL ; Кол-во файлов на странице LOW + _SETVAR .FPH ; Кол-во файлов на странице HIGH + _SETVAR .EFL ; Общее кол-во файлов LOW + _SETVAR .EFH ; Общее кол-во файлов HIGH + _SETVAR .FFL ; Первый файл на странице LOW + _SETVAR .FFH ; Первый файл на странице HIGH + _SETVAR .CFL ; Tекущий файл на странице LOW + _SETVAR .CFH ; Tекущий файл на странице HIGH + _SETVAR .MFL ; Кол-во маркированных файлов LOW + _SETVAR .MFH ; Кол-во маркированных файлов HIGH + _SETVAR .MBL1 ; Кол-во маркированных байтов [ + _SETVAR .MBH1 ; Кол-во маркированных байтов + _SETVAR .MBL2 ; Кол-во маркированных байтов + _SETVAR .MBH2 ; Кол-во маркированных байтов ] + _SETVAR .MBL3 ; Кол-во маркированных байтов FAT32 + _SETVAR .FILEMASK, MASK_SIZE ; Маска показа файлов + _SETVAR .CURRPATH, 0x100 ; Текущий путь панели + +PANELFLAG + _BITMASK PRNDOSPATH, 7 ; =1-печатать путь DOS + _BITMASK SIDE, 0 ; =1-правая панель, =0-левая панель + +VIEWFLAG + _BITMASK SHORTTREE, 2 ; =1-ужатое дерево + _BITMASK TREE, 1 ; =1-показ дерева каталогов + _BITMASK FULL, 0 ; =1-подробный показ каталогов, 0-краткий +.MASK EQU .M_TREE | .M_FULL + +SORTFLAG + _BITMASK BIT7, 7 ; not used + _BITMASK BIT6, 6 ; not used + _BITMASK FILTER, 5 ; =1-показ файлов по фильтру + _BITMASK EXEC, 4 ; =1-показывать только исполняемые файлы + _BITMASK SIZE, 3 ; =1-сортировка по размеру + _BITMASK DATE, 2 ; =1-сортировка по дате + _BITMASK EXT, 1 ; =1-сортировка по расширению + _BITMASK NAME, 0 ; =1-сортировка по имени +.MASK EQU .M_SIZE | .M_DATE | .M_EXT | .M_NAME +.MASKH EQU .M_BIT7 | .M_BIT6 | .M_FILTER | .M_EXEC +.MASKEXECFILTER EQU .M_FILTER | .M_EXEC + +;[]----------------------------------------------------------[] +BAR + _INIT_VAR + _SETVAR .XL + _SETVAR .XH + _SETVAR .YL + _SETVAR .YH + _SETVAR .MAXLL + _SETVAR .MAXLH + _SETVAR .LENL + _SETVAR .LENH + _SETVAR .LEFTL + _SETVAR .LEFTH + _SETVAR .RIGHTL + _SETVAR .RIGHTH + _SETVAR .PAGEL + _SETVAR .PAGEH + _SETVAR .MAXL + _SETVAR .MAXH + _SETVAR .FIRSTL + _SETVAR .FIRSTH + +;[]----------------------------------------------------------[] +PROC + _INIT_VAR + _SETVAR .XL + _SETVAR .XH + _SETVAR .YL + _SETVAR .YH + _SETVAR .MAXLL + _SETVAR .MAXLH + _SETVAR .COEFL + _SETVAR .COEFH + _SETVAR .CORRL + _SETVAR .CORRH + _SETVAR .MAXL1 + _SETVAR .MAXH1 + _SETVAR .MAXL2 + _SETVAR .MAXH2 + _SETVAR .CURL1 + _SETVAR .CURH1 + _SETVAR .CURL2 + _SETVAR .CURH2 + _SETVAR .COLOR + +; Формат таблицы +; +00 2 Xmin +; +02 2 Xmax +; +04 2 Ymin +; +06 2 Ymax +; +08 2 0 - простой об'ект +; бит 0 - кнопка +; бит 1 - рабочая кнопка +; бит 2 - инверт 1 +; бит 3 - статичный инверт +; бит 4 - программа запускается без адреса возвр. +; и без огня +; бит 5 - программа запускается без адреса возвр. +; по левой кнопке огня +; бит 6 - программа запускается без адреса возвр. +; по правой кнопке огня +; бит 7 - вызвать функцию закрытия окна перед +; запуском программы без огня +; бит 8 - вызвать функцию закрытия окна перед +; запуском программы по левой кнопке +; бит 9 - вызвать функцию закрытия окна перед +; запуском программы по правой кнопке +; бит15 - это переключатель (инверт при огне не +; убирать) +; +0A 2 Адрес обработчика при не нажатом огне +; +0C 2 Адрес обработчика при нажатом огне (лев) +; +0E 2 Адрес обработчика при нажатом огне (прав) +FORMTABL + _INIT_VAR + _SETVAR .XMINL + _SETVAR .XMINH + _SETVAR .XMAXL + _SETVAR .XMAXH + _SETVAR .YMINL + _SETVAR .YMINH + _SETVAR .YMAXL + _SETVAR .YMAXH + _SETVAR .FLAGL + _SETVAR .FLAGH + _SETVAR .FIRENOL + _SETVAR .FIRENOH + _SETVAR .FIRELEFTL + _SETVAR .FIRELEFTH + _SETVAR .FIRERIGHTL + _SETVAR .FIRERIGHTH + _SETVAR .SIZE, 0 + +;FLAGS ; биты 7-0 + _BITMASK EXECNOPRESS, 7 ; вызвать функцию закрытия окна перед запуском программы без огня + _BITMASK EXECNORETRMB, 6 ; программа запускается без адреса возвр. по правой кнопке огня + _BITMASK EXECNORETLMB, 5 ; программа запускается без адреса возвр. по левой кнопке огня + _BITMASK EXECONLY, 4 ; программа запускается без адреса возвр. и без огня + _BITMASK STATICINV, 3 ; статичный инверт + _BITMASK INV1, 2 ; инверт 1 + _BITMASK WORKBUTTON, 1 ; рабочая кнопка + _BITMASK BUTTON, 0 ; кнопка +; ; биты 15-8 + _BITMASK FIRENOINV, 7 ; это переключатель (инверт при огне не убирать) + _BITMASK CLOSEANDRUN, 1 ; вызвать функцию закрытия окна перед запуском программы по левой кнопке + _BITMASK CLOSEWIN, 0 ; вызвать функцию закрытия окна перед запуском программы по левой кнопке + _BITMASK ENDTABL, 7 ; бит в .XMINH указатель на конец списка + +; база таблицы переходов для вызова из плагинов +JUMPS +.JUMPSIZE EQU 3 +; таблица переходов на функции для плагинов + _INIT_VAR BASE_ADDR + .JUMPSIZE ; пропуск перехода на основной вход + _SETVAR .ClearScreen, .JUMPSIZE + _SETVAR .MakeWindow, .JUMPSIZE + _SETVAR .InvertRectan, .JUMPSIZE + _SETVAR .PrnTxtLnIFF, .JUMPSIZE + _SETVAR .PrnTxtLnNorm, .JUMPSIZE + _SETVAR .PrnTxtLnNormC, .JUMPSIZE + _SETVAR .PrnRangPathL, .JUMPSIZE + _SETVAR .PrnRangPathR, .JUMPSIZE + _SETVAR .PrnRangPathC, .JUMPSIZE + _SETVAR .InputLine, .JUMPSIZE + _SETVAR .InpLnExtN, .JUMPSIZE + _SETVAR .InpLnExtC, .JUMPSIZE + _SETVAR .DOSError, .JUMPSIZE + _SETVAR .InitScrBar, .JUMPSIZE + _SETVAR .PrnHScrBar, .JUMPSIZE + _SETVAR .PrnVScrBar, .JUMPSIZE + _SETVAR .InitProcess, .JUMPSIZE + _SETVAR .PrnProcess, .JUMPSIZE + _SETVAR .InitScrollBar, .JUMPSIZE + _ADDVAR .JUMPSIZE * 4 ; DUPL 15,0xC9 + _SETVAR .ResFire, .JUMPSIZE + _SETVAR .TestCoords, .JUMPSIZE + _SETVAR .SetCMOSPrint, .JUMPSIZE + _SETVAR .ResCMOSPrint, .JUMPSIZE + _SETVAR .SetClock, .JUMPSIZE + _SETVAR .SetMouse, .JUMPSIZE + _ADDVAR .JUMPSIZE * 4 ; DUPL 12,0xC9 + _SETVAR .ConvNumTxt40, .JUMPSIZE + _SETVAR .MoveBytes, .JUMPSIZE + _SETVAR .MoveBytesUp, .JUMPSIZE + _SETVAR .Mult8, .JUMPSIZE + _SETVAR .Mult16X8, .JUMPSIZE + _SETVAR .Mult16, .JUMPSIZE + _SETVAR .Mult16X16, .JUMPSIZE + _SETVAR .Mult32, .JUMPSIZE + _SETVAR .Divis16X16, .JUMPSIZE + _SETVAR .Divis24X16, .JUMPSIZE + _SETVAR .Divis32X16, .JUMPSIZE + _SETVAR .Divis32, .JUMPSIZE + _SETVAR .ConvNumTxt32, .JUMPSIZE + _SETVAR .ConvNumTxt16, .JUMPSIZE + _SETVAR .ConvNumTxt8, .JUMPSIZE + _SETVAR .ConvTxtNum32, .JUMPSIZE + _SETVAR .ConvTxtNum16, .JUMPSIZE + _SETVAR .Resident, .JUMPSIZE + _ADDVAR (BASE_ADDR + 0xC0) - .CURRVAR; - .JUMPSIZE; * 4 ; DUPL 12,0xC9 +; переменные для доступа из плагинов + _SETVAR .NUM_DEVICES, BYTE ; Кол-во устройств + _SETVAR .TreeFlag, BYTE ; Флаг дерева + _SETVAR .CMOSFlag, BYTE ; Флаг CMOS 0 - нет + ; 1 - есть + _SETVAR .MouseFlag, BYTE ; Флаг мыши 0 - нет + ; 1 - есть + _SETVAR .CMOSPrint, BYTE + _SETVAR .FNPAGESID, BYTE ; Индеф.памяти где FN + _SETVAR .FNFUNCT, BYTE ; Страница с функциями FN + _SETVAR .FNVIEW, BYTE ; Страница с FileViewer + _SETVAR .FNEDIT, BYTE ; Страница с FileEditor + _SETVAR .FNHELP, BYTE ; Страница FN HELP + _SETVAR .FNFONT, BYTE ; Страница шрифтов + _SETVAR .BufferID, BYTE ; Индентификатор памяти под буфера + _SETVAR .FLX, BYTE ; Страница для подгрузки FLX просмотр. FLX утилит + _SETVAR .LEFTPANEL, BYTE ; Страница каталога Левой панели + _SETVAR .RIGHTPANEL, BYTE ; Страница каталога Правой панели +; Буферные страницы под интерфейс + _SETVAR .BuffPg1, WORD + _SETVAR .BuffPg3, 3 + +FileHDR + _INIT_VAR + _SETVAR .Flag, BYTE ; +#00 + _SETVAR .Name, 8 ; +#01 + _SETVAR .Dot, BYTE ; +#09 ??? + _SETVAR .Ext, 3 ; +#0A + _SETVAR .Zero, BYTE ; +#0D ??? + _SETVAR .Attr, BYTE ; +#0E используется бит7 для чего-то + _SETVAR .SizeBytes, DWORD ; +#0F + _SETVAR .Date, BYTE ; +#13 + _SETVAR .Month, BYTE ; +#14 + _SETVAR .Year, BYTE ; +#15 + _SETVAR .Hours, BYTE ; +#16 + _SETVAR .Minutes, BYTE ; +#17 + _SETVAR .SIZE, 0 + _BITMASK MARK, 0 ; 1-файл помечен + +; имена файлов +FILENAME +.FN_INI EQU "fn.ini" +.FN_EXT EQU "fn.ext" +.FNVIEW_EXT EQU "fnview.ext" +.FNEDIT_EXT EQU "fnedit.ext" +.FNTREE_FLN EQU "treeinfo.fln" +.FNEDIT_INI EQU "FNEDIT.INI" + +; отладочное, не менять по избежание глюков +PLUGS_ENABLE EQU 0 +TREE_REZID EQU 0 +MARK_DIR EQU 0 ; выбор директории с подсчетом размера всех файлов +TREE_DIR_ENTER EQU 0 ; показ содержимого директории в дереве по ENTER diff --git a/fn_exe_boot.a80 b/fn_exe_boot.a80 new file mode 100644 index 0000000..c3724cc --- /dev/null +++ b/fn_exe_boot.a80 @@ -0,0 +1,191 @@ + +; LAST UPDATE: 29.05.2025 savelij + + include macros.a80 + + include macros_sp.a80 + include define_sp.a80 + include bios_sp.a80 + include dss_sp.a80 + include errors_sp.a80 + include ports_sp.a80 + include mouse_sp.a80 + include accel_sp.a80 + include fatdir.a80 + include fn_version.a80 + + INIT_VAR 0xC000 + SETVAR FONT_RAW, 6888;IFFFONT_RAW_PACK - FONT_RAW_PACK + SETVAR_ALIGN + SETVAR IFFFONT_RAW, 8704;IFFFONT_RAW_END - IFFFONT_RAW_PACK + SETVAR CLOCK_BMP, CLOCK_BMP_END - Clock_BMP + SETVAR MOUSE_BMP, MOUSE_BMP_END - Mouse_BMP + + org 0x80EA + +EXEhead: db "EXE" + db 1 ; +3 + dw EntryExec-EXEhead + dw 0x0000 ; +4 + dw EXEend-EntryExec ; +8 + dw 0,0 ; +10 + dw 0 ; +14 + dw EntryExec ; +16 + dw EntryExec + dw 0x80FF + +EntryExec: DI + LD A,(IX-0x03) ; file handle + LD (MAIN.hFile),A ; save + LD HL,MAIN.copyright_str + SPDSS DSSF.PCHARS ; print text + SPDSS DSSF.VERSION + LD A,D + OR A + JR NZ,.next1 + LD HL,MAIN.incor_dos_str + SPDSS DSSF.PCHARS ; print text + SPDSS DSSF.EXIT,0x26 ; exit + +.next1 + SPDSS DSSF.GETMEM,6 ; запрос 6 страниц памяти + JR NC,.next2 ; CY - not enough memory + LD HL,MAIN.no_memory_str + SPDSS DSSF.PCHARS ; print text + SPDSS DSSF.EXIT,0x1E ; exit + +.next2 LD (MAIN.hMem),A ; memory handle + LD HL,MAIN.FNMAIN + SPBIOS BIOSF.GETMEMBLKPAGES ; get memory pages list + LD A,(MAIN.FNMAIN) ; set pages from 0xC000 + SETPORT WINSP.CPU3,,0 + LD HL,BASE_ADDR ; FNMAIN + LD DE,END_BLOCK_1 - START_BLOCK_1 + LD A,(MAIN.hFile) + SPDSS DSSF.READ + JP C,disk_error + LD A,(MAIN.FNFUNCT) + SETPORT WINSP.CPU3,,0 + LD HL,0xC000 ; FNFUNCT + LD DE,END_BLOCK_2 - START_BLOCK_2 + LD A,(MAIN.hFile) + SPDSS DSSF.READ + JP C,disk_error + LD A,(MAIN.FNVIEW) ; FNVIEW + SETPORT WINSP.CPU3,,0 + LD HL,0xC000 + LD DE,END_BLOCK_EDITOR - START_BLOCK_EDITOR + LD A,(MAIN.hFile) + SPDSS DSSF.READ + JP C,disk_error + LD A,(MAIN.FNEDIT) ; FNEDIT + SETPORT WINSP.CPU3,,0 + LD HL,0xC000 + LD DE,END_BLOCK_VIEWER - START_BLOCK_VIEWER + LD A,(MAIN.hFile) + SPDSS DSSF.READ + JP C,disk_error + LD A,(MAIN.FNHELP) ; FNHELP + SETPORT WINSP.CPU3,,0 + SETPORT WINSP.CPU1,,0 + LD HL,0xC000 + LD DE,END_BLOCK_3 - START_BLOCK_3 + LD A,(MAIN.hFile) + SPDSS DSSF.READ + JP C,disk_error + LD A,(MAIN.FNFONT) ; FNFONT + SETPORT WINSP.CPU3,,0 + LD HL,0xFFFF - (IFFFONT_RAW_END - FONT_RAW_PACK) + LD DE,END_BLOCK_4 - START_BLOCK_4 + LD A,(MAIN.hFile) + SPDSS DSSF.READ + JP C,disk_error + LD A,(MAIN.hFile) + SPDSS DSSF.CLOSE ; close file +; распаковка шрифтов + LD HL,0xFFFF - (IFFFONT_RAW_END - FONT_RAW_PACK) + LD DE,0xC000 + CALL UNPACK + LD HL,0xFFFF - (IFFFONT_RAW_END - IFFFONT_RAW_PACK) + LD DE,0xDB00 + CALL UNPACK +; перенос иконок мыши на рабочее место + LD HL,Clock_BMP + LD DE,CLOCK_BMP + LD BC,CLOCK_BMP_Size + MOUSE_BMP_Size + LDIR + ;!TEST ; !HARDCODE SYS_PAGE + SETPORT WINSP.CPU3,PAGE.SYSTEM;0xFE + LD HL,0x0124 + CPU3 ; !HARDCODE + LD (HL),0x38 ; interrupt routine address Low byte + INC HL + XOR A + LD (HL),A ; interrupt routine address High byte + INC HL + GETPORT WINSP.CPU0 + LD (HL),A ; interrupt routine page + LD A,(MAIN.FNMAIN) + SETPORT WINSP.CPU3,,0 + LD A,(MAIN.hMem) + LD (RAMPAGES.FNPAGESID),A + LD HL,MAIN.FNFUNCT + LD DE,RAMPAGES.FNFUNCT + LD BC,0x0005 + LDIR + JP BASE_ADDR + +disk_error: PUSH AF + LD A,(MAIN.hMem) ; free memory + SPDSS DSSF.FREEMEM + LD A,(MAIN.hFile) + SPDSS DSSF.CLOSE ; close file + LD HL,MAIN.load_err_str + SPDSS DSSF.PCHARS ; print text + POP BC + SPDSS DSSF.EXIT ; exit + +UNPACK include dec40.a80 + +; 14 x 9 = 126 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D +Clock_BMP: DB 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE ; 00 + DB 0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF ; 01 + DB 0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0x00 ; 02 + DB 0xFE,0x00,0xFF,0xFF,0xFF,0x00,0xFE,0xF0,0xFE,0x00,0xFF,0xFF,0xFF,0xFF ; 03 + DB 0xFF,0x00,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0x00,0xFF ; 04 + DB 0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0xF0,0xFE,0x00,0xFF,0xFF,0xFF,0x00,0xFE ; 05 + DB 0xFE,0xFE,0x00,0xFE,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0x00 ; 06 + DB 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE ; 07 + DB 0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 08 +CLOCK_BMP_END + +; 13 x 9 = 117 00 01 02 03 04 05 06 07 08 09 0A 0B 0C +Mouse_BMP: DB 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0x00,0xFF ; 00 + DB 0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0xFF ; 01 + DB 0xFF,0x00,0xFE,0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0xFE ; 02 + DB 0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0x00 ; 03 + DB 0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x00,0xFF,0x00,0xFE ; 04 + DB 0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0xFE,0x00 ; 05 + DB 0xFF,0xFF,0xFF,0x00,0xFE,0x00,0x00,0xFE,0xFE,0x00,0xFF,0xFF,0x00 ; 06 + DB 0x00,0xFF,0xFF,0x00,0xFE,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00 ; 07 + DB 0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF ; 08 +MOUSE_BMP_END + +MAIN +.hFile db 0x00 +.hMem db 0x00 +.FNMAIN db 0x00 +.FNFUNCT db 0x00 ; 00 +.FNVIEW db 0x00 ; 01 +.FNEDIT db 0x00 ; 02 +.FNHELP db 0x00 ; 03 +.FNFONT db 0x00 ; 04 + DB 0xFF + +.copyright_str: DB "\r\nThe Flex Navigator, ver.\{FLEX_VERS.NAVIGATOR}\r\n",0 +.incor_dos_str: DZ "Incorrect DOS version, need DOS 1.00 or high.\r\n" +.no_memory_str: DZ "Not enough memory to load program.\r\n" +.load_err_str: DZ "Disk loading error.\r\n" + +EXEend: + + include fnmain.a80 diff --git a/fn_macros.a80 b/fn_macros.a80 new file mode 100644 index 0000000..de61368 --- /dev/null +++ b/fn_macros.a80 @@ -0,0 +1,101 @@ + +; LAST UPDATE: 28.05.2025 savelij + +MAKEWINDOW MACRO TYPE + CALL JUMPS.MakeWindow + DB TYPE + ENDM + +; описатель окна +W_MAIN MACRO X,Y,H,V + DW X,Y,H,V + ENDM + +; текстовая строка +W_TEXT MACRO OFFSETX,OFFSETY,COLOR,TXT + DB WINSUBOBJ.TEXT + DW OFFSETX,OFFSETY + DB COLOR,TXT,0 + ENDM + +W_ADRTEXT MACRO OFFSETX,OFFSETY,COLOR,ADRTXT + DB WINSUBOBJ.ADRTEXT + DW OFFSETX,OFFSETY + DB COLOR + DW ADRTXT + ENDM + +; заполнение прямоугольной плоскости +W_FILL MACRO OFFSETX,OFFSETY,H,V,COLOR + DB WINSUBOBJ.FILL + DW OFFSETX,OFFSETY,H,V + DB COLOR + ENDM + +; отрисовка углублённой прямоугольной плоскости +W_BORDER MACRO OFFSETX,OFFSETY,H,V + DB WINSUBOBJ.BORDER + DW OFFSETX,OFFSETY,H,V + ENDM + +; отрисовка выпуклой прямоугольной плоскости +W_BUTTON MACRO OFFSETX,OFFSETY,H,V + DB WINSUBOBJ.BUTTON + DW OFFSETX,OFFSETY,H,V + ENDM + +; отрисовка кнопки с текстом (печать текста осуществляется с позиций x + 4, y + 1) +W_BUTTONTEXT MACRO OFFSETX,OFFSETY,H,V,COLOR,TXT + DB WINSUBOBJ.BUTTONTEXT + DW OFFSETX,OFFSETY,H,V + DB COLOR,TXT,0 + ENDM + +; отрисовка горизонтального разделителя +W_HORIZLINE MACRO OFFSETX,OFFSETY,SIZE + DB WINSUBOBJ.HORIZLINE + DW OFFSETX,OFFSETY,SIZE + ENDM + +; отрисовка вертикального разделителя +W_VERTICLINE MACRO OFFSETX,OFFSETY,SIZE + DB WINSUBOBJ.VERTICLINE + DW OFFSETX,OFFSETY,SIZE + ENDM + +; отрисовка левой кнопки скролбара +W_ICONLEFTARROW MACRO OFFSETX,OFFSETY + DB WINSUBOBJ.ICONLEFTARROW + DW OFFSETX,OFFSETY + ENDM + +; отрисовка правой кнопки скролбара +W_ICONRIGHTARROW MACRO OFFSETX,OFFSETY + DB WINSUBOBJ.ICONRIGHTARROW + DW OFFSETX,OFFSETY + ENDM + +; отрисовка верхней кнопки скролбара +W_ICONUPARROW MACRO OFFSETX,OFFSETY + DB WINSUBOBJ.ICONUPARROW + DW OFFSETX,OFFSETY + ENDM + +; отрисовка нижней кнопки скролбара +W_ICONDOWNARROW MACRO OFFSETX,OFFSETY + DB WINSUBOBJ.ICONDOWNARROW + DW OFFSETX,OFFSETY + ENDM + +; конец описателя окна +W_END MACRO + DB WINSUBOBJ.END + ENDM + +; восстановить данные под окном +WINDOWCLOSE MACRO + MAKEWINDOW WINSUBOBJ.RESTOREWIN + W_END + ENDM + +BUILDDATE EQU "\{(DDATE / 10) + '0'}\{(DDATE # 10) + '0'}.\{MMOUNTH / 10 + '0'}\{MMOUNTH # 10 + '0'}.20\{(YYEAR / 10) + '0'}\{(YYEAR # 10) + '0'}" diff --git a/fn_version.a80 b/fn_version.a80 new file mode 100644 index 0000000..320fe9b --- /dev/null +++ b/fn_version.a80 @@ -0,0 +1,7 @@ + +; LAST UPDATE: 28.05.2025 savelij + +FLEX_VERS +.NAVIGATOR EQU "1.14" +.EDITOR EQU "1.08" +.VIEWER EQU "1.05" diff --git a/fnbar.a80 b/fnbar.a80 new file mode 100644 index 0000000..a146343 --- /dev/null +++ b/fnbar.a80 @@ -0,0 +1,596 @@ + +; LAST UPDATE: 07.03.2025 savelij + +;[]-----------------------------------------------------------[] +InitScrollBar LD C,(IX + BAR.PAGEL) + LD B,(IX + BAR.PAGEH) ; Кол-во элем. на стр. + LD L,C + LD H,B + LD E,(IX + BAR.MAXL) + LD D,(IX + BAR.MAXH) ; макс.элементов + LD A,D + OR E + JR NZ,.L1 + INC DE +.L1 OR A + SBC HL,DE + JR C,.L2 + ADD HL,DE + EX DE,HL +.L2 PUSH DE + LD E,(IX + BAR.MAXLL) + LD D,(IX + BAR.MAXLH) ; Кол-во вид. элем. * размер бара + CALL Mult16X16 ; DE * BC = HL + DE + POP BC ; /макс.элементов + CALL Divis32X16 ; HL + DE / BC = DE (HL-ост) + LD A,H + OR L + JR Z,.L3 + INC DE +.L3 LD HL,0x0003 + SBC HL,DE + JR C,.L4 + LD DE,0x0003 +.L4 LD (IX + BAR.LENL),E ; = длина бара + LD (IX + BAR.LENH),D ; = длина бара + RET + +PrnHScrBar PUSH IY + GETPORT WINSP.Y_PORT + PUSH AF + GETPORT WINSP.CPU1 + LD IYL,A + LD L,(IX + BAR.FIRSTL) ; FirstFile + LD H,(IX + BAR.FIRSTH) + LD E,(IX + BAR.PAGEL) + LD D,(IX + BAR.PAGEH) + LD C,(IX + BAR.MAXL) ; EquipFiles + LD B,(IX + BAR.MAXH) + LD A,B + OR C + JR NZ,.L1 + INC BC +.L1 PUSH BC + PUSH HL + ADD HL,DE + SBC HL,BC + POP HL + JR C,.L2 + JR Z,.L2 + LD L,C + LD H,B + SBC HL,DE + JR NC,.L2 + LD HL,0x0000 +.L2 EX DE,HL + LD C,(IX + BAR.MAXLL) + LD B,(IX + BAR.MAXLH) + CALL Mult16X16 + POP BC + CALL Divis32X16 + LD A,D + OR E + JR Z,.L3 + PUSH DE + SRL D + RR E + JR NC,.L4 + INC DE +.L4 LD L,(IX + BAR.XL) + LD H,(IX + BAR.XH) + SRL H + RR L + SET 6,H + LD A,(IX + BAR.YL) + LD C,A + LD B,COLORP.HIGHGRAY + COLORI.HIGHGRAY;0x88 + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x08 + ACCEL ACCELCMD.OFF +.L5 LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),B + ACCEL ACCELCMD.OFF + INC HL + DEC DE + LD A,D + OR E + JR NZ,.L5 + LD A,IYL + SETPORT WINSP.CPU1,,0 + EI + POP DE +.L3 PUSH DE + LD L,(IX + BAR.XL) + LD H,(IX + BAR.XH) + ADD HL,DE + LD E,(IX + BAR.LEFTL) + LD D,(IX + BAR.LEFTH) + LD A,D + OR E + JR Z,.L6 + EX DE,HL + SETPORT WINSP.Y_PORT,0xC0 + LD (HL),E + INC HL + LD (HL),D + EX DE,HL +.L6 PUSH HL + SRL H + RR L + SET 6,H + LD A,(IX + BAR.YL) + LD C,A + LD E,(IX + BAR.LENL) + LD D,(IX + BAR.LENH) + LD A,D + OR A + JR NZ,.L7 + LD A,E + CP 0x06 + JR NC,.L7 + LD E,0x06 +.L7 SRL D + RR E + JR C,.L8 + DEC DE +.L8 DEC DE + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x06 + ACCEL ACCELCMD.OFF + LD B,COLORP.WHITE + COLORI.WHITE;0xFF + LD A,C + SETPORT WINSP.Y_PORT,,0 + LD (HL),B + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),B + ACCEL ACCELCMD.OFF + LD (HL),0xF7 + INC HL +.L9 LD A,C + SETPORT WINSP.Y_PORT,,0 + LD (HL),B + INC A + SETPORT WINSP.Y_PORT,,0 + LD A,COLORP.HIGHGRAY + COLORI.HIGHGRAY;0x88 + ACCEL ACCELCMD.FILL_VERT + LD (HL),A + ACCEL ACCELCMD.OFF + LD (HL),COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + INC HL + DEC DE + LD A,D + OR E + JR NZ,.L9 + LD A,C + SETPORT WINSP.Y_PORT,,0 + LD (HL),0xF7 + INC A + SETPORT WINSP.Y_PORT,,0 + LD A,COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + ACCEL ACCELCMD.FILL_VERT + LD (HL),A + ACCEL ACCELCMD.OFF + LD (HL),A + INC HL + EX DE,HL + LD A,IYL + SETPORT WINSP.CPU1,,0 + EI + POP HL + LD C,(IX + BAR.LENL) + LD B,(IX + BAR.LENH) + PUSH BC + ADD HL,BC + LD C,(IX+BAR.RIGHTL) + LD B,(IX+BAR.RIGHTH) + LD A,B + OR C + JR Z,.L10 + SETPORT WINSP.Y_PORT,0xC0 + LD A,L + LD (BC),A + INC BC + LD A,H + LD (BC),A +.L10 POP BC + LD L,(IX + BAR.MAXLL) + LD H,(IX + BAR.MAXLH) + OR A + SBC HL,BC + POP BC + JR Z,.L11 + JR C,.L11 + OR A + SBC HL,BC + JR Z,.L11 + JR C,.L11 + EX DE,HL + SRL D + RR E + JR Z,.L11 + LD A,(IX + BAR.YL) + LD C,A + LD B,COLORP.HIGHGRAY + COLORI.HIGHGRAY;0x88 + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x08 + ACCEL ACCELCMD.OFF +.L12 LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),B + ACCEL ACCELCMD.OFF + INC HL + DEC DE + LD A,D + OR E + JR NZ,.L12 + LD A,IYL + SETPORT WINSP.CPU1,,0 + EI +.L11 POP AF + SETPORT WINSP.Y_PORT,,0 + POP IY + RET + +PrnVScrBar PUSH IY + GETPORT WINSP.Y_PORT + PUSH AF + GETPORT WINSP.CPU1 + LD IYH,A + LD L,(IX + BAR.FIRSTL) ; FirstFile + LD H,(IX + BAR.FIRSTH) + LD E,(IX + BAR.PAGEL) + LD D,(IX + BAR.PAGEH) + LD C,(IX + BAR.MAXL) ; EquipFiles + LD B,(IX + BAR.MAXH) + LD A,B + OR C + JR NZ,.L1 + INC BC +.L1 PUSH BC + PUSH HL + ADD HL,DE + SBC HL,BC + POP HL + JR C,.L2 + JR Z,.L2 + LD L,C + LD H,B + SBC HL,DE + JR NC,.L2 + LD HL,0x0000 +.L2 EX DE,HL + LD C,(IX + BAR.MAXLL) + LD B,(IX + BAR.MAXLH) + CALL Mult16X16 + POP BC + CALL Divis32X16 + LD A,(IX + BAR.YL) + LD IYL,A + LD A,D + OR E + JR Z,.L3 + PUSH DE + LD A,E + LD (.L4),A + LD L,(IX + BAR.XL) + LD H,(IX + BAR.XH) + SRL H + RR L + SET 6,H + LD D,COLORP.HIGHGRAY + COLORI.HIGHGRAY;0x88 + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.L4 EQU $-1 + ACCEL ACCELCMD.OFF + LD B,0x08 +.L5 LD A,IYL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),D + ACCEL ACCELCMD.OFF + INC HL + DJNZ .L5 + LD A,IYL + ADD A,E + LD IYL,A + LD A,IYH + SETPORT WINSP.CPU1,,0 + EI + POP DE +.L3 PUSH DE + LD L,(IX + BAR.YL) + LD H,(IX + BAR.YH) + ADD HL,DE + LD E,(IX + BAR.LEFTL) + LD D,(IX + BAR.LEFTH) + LD A,D + OR E + JR Z,.L6 + EX DE,HL + SETPORT WINSP.Y_PORT,0xC0 + LD (HL),E + INC HL + LD (HL),D + EX DE,HL +.L6 PUSH HL + LD L,(IX + BAR.XL) + LD H,(IX + BAR.XH) + SRL H + RR L + SET 6,H + LD A,(IX + BAR.LENL) + LD C,A + SUB 0x02 + LD (.L7),A + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.L7 EQU $-1 + ACCEL ACCELCMD.OFF + LD DE,(COLORP.WHITE + COLORI.WHITE) << 8 + COLORP.HIGHGRAY + COLORI.HIGHGRAY;0xFF88 + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + LD (HL),D + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),D + ACCEL ACCELCMD.OFF + LD (HL),COLORP.WHITE + COLORI.BLACKGRAY;0xF7 + INC HL + LD B,0x06 +.L8 LD A,IYL + SETPORT WINSP.Y_PORT,,0 + LD (HL),D + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + INC HL + DJNZ .L8 + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + LD (HL),COLORP.WHITE + COLORI.BLACKGRAY;0xF7 + INC A + SETPORT WINSP.Y_PORT,,0 + LD A,COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + ACCEL ACCELCMD.FILL_VERT + LD (HL),A + ACCEL ACCELCMD.OFF + LD (HL),A + INC HL + LD A,IYL + ADD A,C + LD IYL,A + LD A,IYH + SETPORT WINSP.CPU1,,0 + EI + POP HL + LD C,(IX + BAR.LENL) + LD B,(IX + BAR.LENH) + PUSH BC + ADD HL,BC + LD C,(IX + BAR.RIGHTL) + LD B,(IX + BAR.RIGHTH) + LD A,B + OR C + JR Z,.L9 + SETPORT WINSP.Y_PORT,0xC0 + LD A,L + LD (BC),A + INC BC + LD A,H + LD (BC),A +.L9 POP BC + LD L,(IX + BAR.MAXLL) + LD H,(IX + BAR.MAXLH) + OR A + SBC HL,BC + POP BC + JR Z,.L10 + JR C,.L10 + OR A + SBC HL,BC + JR Z,.L10 + JR C,.L10 + LD A,L + LD (.L11),A + LD L,(IX+BAR.XL) + LD H,(IX+BAR.XH) + SRL H + RR L + SET 6,H + LD D,COLORP.HIGHGRAY + COLORI.HIGHGRAY;0x88 + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.L11 EQU $-1 + ACCEL ACCELCMD.OFF + LD B,0x08 +.L12 LD A,IYL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),D + ACCEL ACCELCMD.OFF + INC HL + DJNZ .L12 + LD A,IYH + SETPORT WINSP.CPU1,,0 + EI +.L10 POP AF + SETPORT WINSP.Y_PORT,,0 + POP IY + RET + +;[]-----------------------------------------------------------[] +InitProcess SUB A + LD (IX + PROC.CURL1),A + LD (IX + PROC.CURH1),A + LD (IX + PROC.CURL2),A + LD (IX + PROC.CURH2),A + LD (IX + PROC.CORRL),A + LD (IX + PROC.CORRH),A + LD C,(IX + PROC.MAXLL) ; Макс/макс.длину процеса + LD B,(IX + PROC.MAXLH) + LD E,(IX + PROC.MAXL1) + LD D,(IX + PROC.MAXH1) + LD L,(IX + PROC.MAXL2) + LD H,(IX + PROC.MAXH2) + CALL Divis32X16 ; HL + DE / BC = DE (HL-ост) + LD A,H + OR L + JR Z,.L2 + INC DE ; = коэффициент +.L2 LD HL,9 + OR A + SBC HL,DE + JR C,.L1 + LD A,(IX + PROC.MAXL2) + OR (IX + PROC.MAXH2) + JR NZ,.L1 + LD E,(IX + PROC.MAXL1) + LD D,(IX + PROC.MAXH1) + LD BC,1000 + LD (IX + PROC.CORRL),C + LD (IX + PROC.CORRH),B + CALL Mult16X16 + LD C,(IX + PROC.MAXLL) ; Макс/макс.длину процеса + LD B,(IX + PROC.MAXLH) + CALL Divis32X16 ; HL + DE / BC = DE (HL-ост) +.L1 LD (IX + PROC.COEFL),E + LD (IX + PROC.COEFH),D + RET + +PrnProcess PUSH IY + GETPORT WINSP.Y_PORT + PUSH AF + GETPORT WINSP.CPU1 + LD IYL,A + LD E,(IX + PROC.CURL1) + LD D,(IX + PROC.CURH1) + LD L,(IX + PROC.CURL2) + LD H,(IX + PROC.CURH2) + LD A,(IX + PROC.CORRL) + OR (IX + PROC.CORRH) + JR Z,.L1 + LD C,(IX + PROC.CORRL) + LD B,(IX + PROC.CORRH) + CALL Mult16X16 +.L1 LD C,(IX + PROC.COEFL) + LD B,(IX + PROC.COEFH) + CALL Divis32X16 + LD L,(IX + PROC.XL) + LD H,(IX + PROC.XH) + SRL H + RR L + SET 6,H + LD A,D + OR E + JR Z,.L2 + PUSH DE + PUSH HL + LD L,(IX + PROC.MAXLL) + LD H,(IX + PROC.MAXLH) + OR A + SBC HL,DE + JR NC,.L3 + ADD HL,DE + EX DE,HL +.L3 POP HL + SRL D + RR E + JR NC,.L4 + INC DE +.L4 LD A,(IX + PROC.YL) + LD C,A + LD A,(IX + PROC.COLOR) + AND 0xF0 + LD B,A + RRCA + RRCA + RRCA + RRCA + OR B + LD B,A + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x0A + ACCEL ACCELCMD.OFF +.L5 LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),B + ACCEL ACCELCMD.OFF + INC HL + DEC DE + LD A,D + OR E + JR NZ,.L5 + LD A,IYL + SETPORT WINSP.CPU1,,0 + EI + POP DE +.L2 PUSH HL + LD L,(IX + PROC.MAXLL) + LD H,(IX + PROC.MAXLH) + OR A + SBC HL,DE + EX DE,HL + POP HL + JR Z,.L6 + JR C,.L6 + SRL D + RR E + JR NC,.L7 + INC DE +.L7 LD A,(IX + PROC.YL) + LD C,A + LD A,(IX + PROC.COLOR) + AND 0x0F + LD B,A + RLCA + RLCA + RLCA + RLCA + OR B + LD B,A + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x0A + ACCEL ACCELCMD.OFF +.L8 LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),B + ACCEL ACCELCMD.OFF + INC HL + DEC DE + LD A,D + OR E + JR NZ,.L8 + LD A,IYL + SETPORT WINSP.CPU1,,0 + EI +.L6 POP AF + SETPORT WINSP.Y_PORT,,0 + POP IY + RET diff --git a/fndos.a80 b/fndos.a80 new file mode 100644 index 0000000..e9617b0 --- /dev/null +++ b/fndos.a80 @@ -0,0 +1,313 @@ + +; LAST UPDATE: 27.04.2025 savelij + +;[]----------------------------------------------------------[] +BegDIRECTORY LD HL,BegDIR +NewDIRECTORY PUSH HL + CALL ResInvert + POP HL + CALL SetClock + PUSH IY + SPDSS DSSF.CHDIR + POP IY + CALL C,DOSError + PUSH IY + SPDSS DSSF.CURDISK + POP IY + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + ADD A,'A' + CP (HL) + PUSH AF + LD (HL),A + INC HL + LD (HL),':' + INC HL + PUSH IY + SPDSS DSSF.CURDIR + POP IY + POP AF + JR Z,NewDIRECT1 + LD A,(TreeFlag) + OR A + JP Z,InitPanel + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JP NZ,InitPanel + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,LeftPanel + PANEL.CURRPATH + LD DE,RightPanel + PANEL.CURRPATH + JR Z,NewDIR0 + LD HL,RightPanel + PANEL.CURRPATH + LD DE,LeftPanel + PANEL.CURRPATH +NewDIR0 SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + JP InitPanels + +NewDIRECT1 BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + PUSH AF + CALL NZ,NewDIRTree + POP AF + CALL Z,ReadDIR + CALL PrintPath + BIT PANELFLAG.B_PRNDOSPATH,(IY + PANEL.PANELFLAG) + CALL NZ,PrintDOSPath + CALL PrintDIR + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar + JP SetMouse + +NewDIRTree PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + INC HL + INC HL + IF TREE_REZID + CALL RESIDENT.FindTreeDIR + CALL RESIDENT.MakeTreePath + ELSE + CALL FindTreeDIRR + CALL MakeTreePathR + ENDIF + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 CALL NewDIRECTORY + POP IY + RET + +;[]----------------------------------------------------------[] +RefreshDIR BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,RfDIRn1 + CALL ReadDIR + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar +RfDIRn1 LD HL,LeftPanel + PANEL.CURRPATH + LD DE,RightPanel + PANEL.CURRPATH +RefrDIR LD A,(DE) + CP (HL) + RET NZ + INC HL + INC DE + LD A,(HL) + OR A + JR NZ,RefrDIR + LD A,(DE) + OR A + RET NZ + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,RefrDex + CALL ReadDIR + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar +RefrDex POP IY + RET + +;[]----------------------------------------------------------[] +FindPrevFile LD A,(IY + PANEL.EFL) + OR (IY + PANEL.EFH) + RET Z + BIT PANELFLAG.B_PRNDOSPATH,(IY + PANEL.PANELFLAG) + RET Z + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD IX,0x4000 + LD HL,0x4001 + LD BC,0x0000 +FndPrFile0 PUSH HL + BIT DIR.B_Dir,(IX + FileHDR.Attr) + JR NZ,FndPrFileNxt + LD DE,WorkBuffer + PUSH DE + PUSH BC + CALL MakeDOSname + POP BC + POP HL + LD DE,PrevFile +FndPrFile1 LD A,(DE) + OR A + JR Z,FndPrFileE + CP (HL) + JR NZ,FndPrFileNxt + INC HL + INC DE + JR FndPrFile1 + +FndPrFileNxt POP HL + LD DE,FileHDR.SIZE + ADD HL,DE + ADD IX,DE + INC BC + LD A,(HL) + OR A + JR NZ,FndPrFile0 + JP FndTreeExt + +FndPrFileE LD A,(HL) + OR A + JR NZ,FndPrFileNxt + JR FndTree + +PrevFile DB 13 DUP 0 + +;[]----------------------------------------------------------[] +FindPrevDIR LD A,(IY + PANEL.EFL) + OR (IY + PANEL.EFH) + RET Z + BIT PANELFLAG.B_PRNDOSPATH,(IY + PANEL.PANELFLAG) + RET Z + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD IX,0x4000 + LD HL,0x4001 + LD BC,0x0000 +FndPrDIR0 PUSH HL + BIT DIR.B_Dir,(IX + FileHDR.Attr) + JR Z,FndPrDIRnxt + LD DE,WorkBuffer + PUSH DE + PUSH BC + CALL MakeDOSname + POP BC + POP HL + LD DE,PrevDIR +FndPrDIR1 LD A,(DE) + OR A + JR Z,FndPrDIRe + CP (HL) + JR NZ,FndPrDIRnxt + INC HL + INC DE + JR FndPrDIR1 + +FndPrDIRnxt POP HL + LD DE,FileHDR.SIZE + ADD HL,DE + ADD IX,DE + INC BC + LD A,(HL) + OR A + JR NZ,FndPrDIR0 + JR FndTreeExt + +FndPrDIRe LD A,(HL) + OR A + JR NZ,FndPrDIRnxt +FndTree INC SP + INC SP + LD L,C + LD H,B + LD C,(IY + PANEL.FPL) + LD B,(IY + PANEL.FPH) + LD DE,0x0000 + EX DE,HL + OR A + SBC HL,BC + EX DE,HL +.L1 EX DE,HL + ADD HL,BC + EX DE,HL + OR A + SBC HL,BC + JR NC,.L1 + ADD HL,BC + LD (IY + PANEL.CFL),L + LD (IY + PANEL.CFH),H + LD (IY + PANEL.FFL),E + LD (IY + PANEL.FFH),D +FndTreeExt POP AF + SETPORT WINSP.CPU1,,0 + RET + +PrevDIR DB 13 DUP 0 + +;[]----------------------------------------------------------[] +MakeDOSname LD BC,0x0820 +.L1 LD A,(HL) + CP C + JR Z,.L2 + INC HL + LD (DE),A + INC DE + DJNZ .L1 + JR .L5 + +.L2 +; LD A,B +; OR A +; JR Z,.L5 + INC HL + DJNZ .L2 +.L5 LD B,0x03 + INC HL + LD A,(HL) + CP C + JR Z,.L4 + LD A,'.' + LD (DE),A + INC DE +.L3 LD A,(HL) + INC HL + LD (DE),A + INC DE + DJNZ .L3 +.L4 SUB A + LD (DE),A + RET diff --git a/fndosline.a80 b/fndosline.a80 new file mode 100644 index 0000000..e35ada5 --- /dev/null +++ b/fndosline.a80 @@ -0,0 +1,710 @@ + +; LAST UPDATE: 28.05.2025 savelij + +;[]==========================================================[] +DOSline SUB A + LD (HistCurrent),A + SPDSS DSSF.TESTKEY + BIT KEYBSTAT.B_ALT,B + JR Z,DOSln0 + LD A,D + AND 0x7F + CP SC.1 ; 0x02 + JR C,DOSlnEx + CP SC.BKSP ; 0x0E + JP C,RESIDENT.QSearch + CP SC.Q ; 0x10 + JR C,DOSlnEx + CP SC.QSKOBKAL ; 0x1A + JP C,RESIDENT.QSearch + CP SC.A ; 0x1D + JR C,DOSlnEx + CP SC.DOTZAP ; 0x26 + JP C,RESIDENT.QSearch + CP SC.Z ; 0x2A + JR C,DOSlnEx + CP SC.ZAP ; 0x31 + JP C,RESIDENT.QSearch + JR DOSlnEx + +DOSln0 LD A,E + CP 0x0D + JP Z,RunDOSline + CP 0x1B + JP Z,ClrDOSln1 + CP '!' ; 0x21 + JR NC,DOSloop + CP ' ' ; 0x20 + JR NZ,DOSln1 + LD A,(DOSstr.slen) + OR A + JR NZ,DOSloop +; пометка файла по SPACE + SPDSS DSSF.SCANKEY + JP RESIDENT.MarkFile + +DOSln1 LD A,D + CP SC.ENTER | SC.RUS ; 0xA8 + JR Z,DOSloop + CP SC.QSKOBKAL | SC.RUS ; 0x9A + JR Z,DOSloop + CP SC.QSKOBKAR | SC.RUS ; 0x9B + JR Z,DOSloop + CP SC.E | SC.RUS ; 0x92 + JR Z,DOSloop +DOSlnEx + SPDSS DSSF.SCANKEY + RET + +DOSloop SUB A + LD (HistCurrent),A + LD IX,DOSstr + LD HL,DOSTab + CALL DOSInputLine + RET C + JR Z,RunDOSline + SPDSS DSSF.TESTKEY + LD A,E + CP 0x1B + RET NZ + LD A,(DOSstr.slen) + OR A + RET Z + CALL ClearDOSline + SPDSS DSSF.SCANKEY + JR DOSloop + +;[]----------------------------------------------------------[] +ClrDOSln1 + SPDSS DSSF.SCANKEY + LD A,(DOSstr.slen) + OR A + JP Z,ShowDOSscreen +ClearDOSline SUB A + LD (HistCurrent),A + LD A,(DOSstr.slen) + OR A + RET Z + LD HL,DOSinp + SUB A + LD B,0x80 +.L1 LD (HL),A + INC HL + DJNZ .L1 + LD (DOSstr.slen),A + LD (DOSstr.posX),A + LD (DOSstr.addX),A + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 254,229,380,10,COLORI.PANEL + W_END + RET + +;[]----------------------------------------------------------[] +RunDOSline + SPDSS DSSF.SCANKEY + LD A,(DOSstr.slen) + OR A + JP Z,OpenFile + CALL SaveDOSline + LD HL,DOSinp + LD A,(HL) + CP 0x20 + JP Z,ClearDOSline + LD A,(DOSstr.slen) + LD B,A + LD C,0x00 + LD A,0x20 +RunDLn0 CP (HL) + JR Z,RunDLine + INC HL + INC C + DJNZ RunDLn0 +RunDLine DEC HL + LD A,'\\' + CP (HL) + JP NZ,RunDOSexe + LD HL,DOSinp + LD DE,WorkBuffer + PUSH DE + LD B,0x00 + LDIR + SUB A + LD (DE),A + CALL ClearDOSline + POP HL + LD A,(DOSinp + 1) + CP ':' + JR NZ,.L1 + LD (IY + PANEL.CURRPATH),0x00 +.L1 CALL NewDIRECTORY + LD A,(TreeFlag) + OR A + RET Z + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + RET NZ + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,LeftPanel + LD HL,RightPanel + JR NZ,.L2 + LD IY,RightPanel + LD HL,LeftPanel +.L2 LD DE,PANEL.CURRPATH + ADD HL,DE + INC HL + INC HL + IF TREE_REZID + CALL RESIDENT.FindTreeDIR + ELSE + CALL FindTreeDIRR + ENDIF + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL PrnVScrBar + POP IY + RET + +RunDOSexe LD HL,DOSinp - 1 +RunDE1 INC HL + LD A,(HL) + CP '!' + JR C,RunDOSexe1 + CP '.' + JR NZ,RunDE1 + INC HL + LD A,(HL) + RES 5,A + CP 'F' + JR NZ,RunDOSexe1 + INC HL + LD A,(HL) + RES 5,A + CP 'L' + JR NZ,RunDOSexe1 + INC HL + LD A,(HL) + RES 5,A + CP 'X' + JR NZ,RunDOSexe1 + LD HL,DOSinp + LD DE,WorkBuffer + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + CALL ClearDOSline + CALL RunFLX + JP C,DOSError + RET + +RunDOSexe1 ld hl,WorkBuffer + ld de,WorkBuffer + 1 + ld bc,0x0100 + ld (hl),0 + ldir + LD DE,WorkBuffer + call GetFileName + jp c,.error + ld hl,DOSinp + call SkipWord + ld a,(hl) + and a + jr z,.endOfLine + dec hl + ld de,WorkBuffer + call ConcatString +.endOfLine: ld hl,WorkBuffer + ld de,WorkBuffer + 0x0100 + SPDSS DSSF.EX_PATH,4 + jr c,.error + and 2 + jr z,.unknown + ld hl,(WorkBuffer + 0x0100) + ld de,'XE' ;0x5845 - 'EX' + sbc hl,de + jr nz,.noExe + ld a,(WorkBuffer + 0x0102) + cp 'E' + jr nz,.noExe + ;!TODO место для специфичного запуска exe? + ; ... ... ... + ; +.unknown: ld hl,WorkBuffer + ld de,WorkBuffer + 0x0100 + ld bc,0x0100 + ldir + jr .noBatch + +.noExe: ld hl,ShellFile ;копируем путь к шеллу + ld de,WorkBuffer + 0x0100 + call CopyString + ld hl,WorkBuffer + call ConcatString +.noBatch: CALL ResDrivers + SUB A + CALL ClearScreen + CALL ResVideoMode + LD HL,ReStartPoint + EX (SP),HL + LD HL,WorkBuffer + 0x0100 + SPDSS DSSF.EXEC,0 + RET NC + PUSH AF + SETPORT BORDER,0 + CALL InitVideoMode + CALL InitDrivers + CALL InitScreen + CALL ClearDOSline + SUB A + CALL InitPanels + POP AF +.error: CALL DOSError + LD HL,MainLoop + EX (SP),HL + RET + +; вставка из буфера ввода ком.строки имени исполняемого файла +; если указан абсолютный путь к файлу с именем диска, то он копируется целиком +; если просто имя файла, то производится попытка поиска файла в +; каталоге текущей панели и подставляется его абсолютный путь, если нет, то просто имя файла +; DE - буфер для имени файла +GetFileName: LD A,(DOSinp + 1) ; в ком.строке указан абсолютный путь к файлу (с диском) + CP ':' + JR nz,.panelSearch +.notFound: ld hl,DOSinp ;копируем буфер ком.строки в буфер + jp CopyWord + +.panelSearch: ex hl,de + ld (.str),hl + bit PANELFLAG.B_SIDE,(iy + PANEL.PANELFLAG) + ld hl,RightPanel + PANEL.CURRPATH + jr nz,.next + ld hl,LeftPanel + PANEL.CURRPATH +.next: ld de,WorkBuffer + 0x0100 + call CopyString + ld a,'\\' + ld (de),a + inc de +; Выделить имя файла из строки + ld hl,DOSinp ; откуда + SPDSS DSSF.EX_PATH,3 + ret c ; имя файла не найдено + bit 1,a + jr z,.noExt ; имя исполняемого файла указано с расширением, искать не нужно + ld hl,EndOfString + jr .found1 + +.noExt: ld hl,BATExtension + call PrepareFilename + call SearchFilename + jr nc,.found + ld hl,EXEExtension +.found1: call PrepareFilename + call SearchFilename +.found: ld de,0 +.str EQU $-2 + jr c,.notFound + ld hl,WorkBuffer + 0200h + jp CopyString + +;Подготовка имени файла для поиска +PrepareFilename: + ld de,WorkBuffer + 0200h + push hl + ld hl,WorkBuffer + 0x0100 + call CopyString + pop hl + jp ConcatString + +;поиск файла +SearchFilename: ld hl,WorkBuffer + 0200h ;поиск файла в каталоге текущей панели + ld de,WorkBuffer + 0300h + SPDSS DSSF.F_FIRST,1,DIR.M_Archive + DIR.M_ReadOnly + ret + +;[]----------------------------------------------------------[] +SaveDOSline + GETPORT WINSP.CPU1 + PUSH AF + LD A,(RAMPAGES.FNHELP) + SETPORT WINSP.CPU1,,0 + SETPORT WINSP.Y_PORT,0xC0 + LD IX,DOSstr + LD HL,(HistSpace) + LD C,(IX + DOSstr.slen - DOSstr) + LD B,0x00 +.L4 OR A + SBC HL,BC + JR C,.L1 + JR NZ,.L3 +.L1 LD A,(HistCount) + DEC A + LD (HistCount),A + PUSH BC + CALL FindHistory + POP BC + LD DE,DOShistory + DOShistory_Size + OR A + EX DE,HL + SBC HL,DE + JR .L4 + +.L3 DEC HL + LD (HistSpace),HL + PUSH BC + LD A,(HistCount) + CALL FindHistory + LD E,L + LD D,H + ADD HL,BC + INC HL + EX DE,HL + PUSH HL + LD BC,DOShistory + OR A + SBC HL,BC + LD C,L + LD B,H + POP HL + LD A,B + OR C + JR Z,.L2 + DEC HL + DEC DE + LDDR +.L2 POP BC + LD HL,DOSinp + LD DE,DOShistory + LD A,C + INC A + LD (DE),A + INC DE + LDIR + SUB A + LD (HistCurrent),A + POP AF + SETPORT WINSP.CPU1,,0 + LD HL,HistCount + INC (HL) + RET + +GetDOShistory LD IX,DOSstr + LD HL,HistCount + LD A,(HistCurrent) + INC (HL) + DEC (HL) + JP Z,ClearDOSline + CP (HL) + RET Z + EX AF,AF' + GETPORT WINSP.CPU1 + PUSH AF + LD A,(RAMPAGES.FNHELP) + SETPORT WINSP.CPU1,,0 + EX AF,AF' + PUSH AF + CALL FindHistory + LD DE,DOSinp + LD A,(HL) + INC HL + DEC A + LD (IX + DOSstr.slen - DOSstr),A + LD (IX + DOSstr.posX - DOSstr),A + LD C,A + LD B,0x00 + LDIR + SUB A + LD (IX + DOSstr.addX - DOSstr),A + POP AF + INC A + LD (HistCurrent),A + POP AF + SETPORT WINSP.CPU1,,0 + RET + +FindHistory LD HL,DOShistory + OR A + RET Z + LD B,A + LD D,0x00 +.L1 LD E,(HL) + ADD HL,DE + DJNZ .L1 + RET + +;[]----------------------------------------------------------[] +DOSInputLine LD (InpLnData),IX + LD (InputLine.InpMous),HL + RES 7,(IX + 0x01) + SET 6,(IX + 0x01) + SPDSS DSSF.TESTKEY + JR NZ,.L1 + RES 6,(IX + 0x01) +.L1 CALL InsInpLnCol + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX + 0x04) + ADD HL,DE + LD (HL),D + CALL PrintInpLn + 3 +DOSLineLp HALT + CALL ChCursor + LD IX,(InputLine.InpMous) + CALL TestCoords + SPDSS DSSF.TESTKEY + JR Z,DOSLineLp + RES 7,D + BIT KEYBSTAT.B_ALT,B + JR NZ,DOSLineLp1;DOSLineLp ; выход, здесь нет комбинаций с ALT + LD IX,DOSTable2 ; комбинация с CTRL + BIT KEYBSTAT.B_CTRL,B + JR NZ,DOSKeys + LD IX,DOSTable1 ; ввод без модификаторов +DOSKeys LD L,(IX + 0x00) ; ASCII code + INC IX + INC L + JR Z,DOSLineLp1 + DEC L + LD H,(IX + 0x00) ; position code + INC IX + LD C,(IX + 0x00) ; adr LOW + INC IX + LD B,(IX + 0x00) ; adr HIGH + INC IX + OR A + SBC HL,DE + JR NZ,DOSKeys + LD IX,(InpLnData) + RES 6,(IX + 0x01) + LD A,E + CP 0x1B + JR NZ,DOSLnNx + CALL ResCursor + LD A,0x01 + OR A + RET + +DOSLnNx LD HL,DOSLineLp + PUSH HL + PUSH BC + PUSH IX + SPDSS DSSF.SCANKEY + POP IX + RET + +DOSLineLp1 LD IX,(InpLnData) + LD A,E + CP 0x20 + JR NC,DOSLineLp2 + BIT 6,(IX + 0x01) + JR Z,DOSLnE0 + PUSH IX + SPDSS DSSF.SCANKEY + POP IX +DOSLnE0 CALL ResCursor + LD A,0x01 + OR A + RET + +DOSLineLp2 RES 6,(IX + 0x01) + LD HL,DOSLineLp + PUSH HL + PUSH IX + SPDSS DSSF.SCANKEY + POP IX + LD A,E + JP InsertSymbol + +DOSLnExtN POP HL + LD IX,(InpLnData) + CALL ResCursor + XOR A + RET + +DOSLnExtC POP HL + LD IX,(InpLnData) + CALL ResCursor + SCF + RET + +DOSTable1 DW SC.ESC << 8 | 0x1B, InputLine.InpLnExtC ; 0x011B,InpLnExtC + DW SC.ENTER << 8 | 0x0D,InputLine.InpLnExtN ; 0x280D,InpLnExtN + DW SC.X4 << 8, ILleft ; 0x5400,ILleft + DW SC.X6 << 8, ILright ; 0x5600,ILright + DW SC.BKSP << 8 | 8, ILdelet ; 0x0E08,ILdelet + DW SC.XDEL << 8, IL_del_ ; 0x4F00,IL_del_ + DW SC.X7 << 8, ILhome ; 0x5700,ILhome + DW SC.X1 << 8, ILend ; 0x5100,ILend + DB 0xFF + +DOSTable2 DW SC.X4 << 8, ILwordL ; 0x5400,ILwordL + DW SC.X6 << 8, ILwordR ; 0x5600,ILwordR + DW SC.BKSP << 8, ILdelWR ; 0x0E00,ILdelWR + DW SC.ENTER << 8, InsFileName ; 0x2800,InsFileName + DW SC.QSKOBKAL << 8, InsLeftPath ; 0x1A00,InsLeftPath + DW SC.QSKOBKAR << 8, InsRightPath ; 0x1B00,InsRightPath + DW SC.E << 8, InsHistory ; 0x1200,InsHistory + DB 0xFF + +InsFileName + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR Z,InsFN1 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + SET 6,H + INC HL + INC HL + LD DE,TempName + LD BC,0x000D + LDIR + JR InsFN2 + +InsFN1 ADD HL,HL + ADD HL,HL + ADD HL,HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + SET 6,H + INC HL + LD DE,TempName + CALL MakeDOSname +InsFN2 POP AF + SETPORT WINSP.CPU1,,0 + LD HL,TempName + LD A,(HL) + CP '.' + RET Z + CP '\\' + RET Z + PUSH HL + SUB A + LD C,A +.L1 INC C + INC HL + CP (HL) + JR NZ,.L1 + LD (HL),0x20 + INC HL + LD (HL),A + INC C + POP HL + JP InsertWord + +TempName DB 14 DUP 0 + +InsLeftPath LD HL,LeftPanel + PANEL.CURRPATH + JR InsPath + +InsRightPath LD HL,RightPanel + PANEL.CURRPATH +InsPath LD DE,WorkBuffer + 0x100 + PUSH DE + SUB A + LD C,A +.L1 LDI + CP (HL) + JR NZ,.L1 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L2 + LD (DE),A + INC DE + DEC C +.L2 SUB A + SUB C + LD C,A + POP HL + JP InsertWord + +InsertWord LD A,(IX + 0x04) ;InpytSymb + ADD A,C + RET C + SUB (IX + 0x00) ;Max len + RET NC + PUSH HL + LD A,(IX + 0x04) + SUB (IX + 0x02) + JR Z,NotInsWord +; Ввод в середину текста + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX + 0x04) + ADD HL,DE + LD E,L + LD D,H + LD B,0x00 + ADD HL,BC + EX DE,HL + DEC HL + DEC DE + PUSH BC + LD C,A + LDDR + POP BC +NotInsWord PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX + 0x02) + ADD HL,DE + EX DE,HL + POP HL + PUSH BC + LD B,0x00 + LDIR + POP BC + LD A,(IX + 0x04) + ADD A,C + LD (IX + 0x04),A + LD A,(IX + 0x02) + ADD A,C + LD (IX + 0x02),A + JP PrintInpLn + +InsHistory CALL GetDOShistory + JP PrintInpLn + +;[]----------------------------------------------------------[] +ShellFile: db "X:\\SYSTEM.EXE /C ",0 ; шелл +BATExtension: db ".BAT",0 +EXEExtension: db ".EXE" +EndOfString: db 0 +DOSstr DB 0x80,0x00 +.posX DB 0x00 +.addX DB 0x00 +.slen DB 0x00 + DW 256,231,376 + DB COLORP.PANEL + COLORI.FILES + +DOSinp DB 0x81 DUP 0 + +HistSpace DEFW 0x200 +HistCount DEFB 0x00 +HistCurrent DEFB 0x00 +;[]----------------------------------------------------------[] diff --git a/fninit.a80 b/fninit.a80 new file mode 100644 index 0000000..7e25c25 --- /dev/null +++ b/fninit.a80 @@ -0,0 +1,602 @@ + +; LAST UPDATE: 27.04.2025 savelij + +;[]==========================================================[] +InitVideoMode + SPDSS DSSF.GETVMOD + LD C,A ; текущий режим экрана + LD A,(InitFlg) + OR A + JR NZ,.L1 + LD A,C + LD (VMode),A + LD A,B ; страница экрана + LD (VScrn),A +.L1 LD HL,WorkBuffer + SPBIOS BIOSF.FN_VERSION + ;!TODO проверять на последний биос + AND A + LD HL,-0x101;ACEX.Config_ID.Sp2000 + SBC HL,BC + JR Z,.L2 + SPBIOS BIOSF.RST_CONF_CUSTOM,,-3 +.L2: + ;????? тут старый вариант выдачи FN_VERSION проверяется. Подумать. + ; LD A,%0000'1101 ; нужные биты для порта All_Mode + ; AND L + ; SUB %0000'1101 + ; JR Z,InitVM1 + ; IN A,(SCREEN_SWITCH) + ; PUSH AF + ; LD C,BIOS.RST_CONF.SP97_2 + ; RST ToBIOS + ; SUB A + ; OUT (BorderColor),A + ; POP AF + ; OUT (SCREEN_SWITCH),A +InitVM1 + SPDSS DSSF.SETVMOD,0,SETVMOD.GRF640X256 + SUB A + CALL ClearScreen +InitPAL LD HL,PALETTE + LD DE,0x1000 + SPBIOS BIOSF.PIC_SET_PAL,0xFF,0 + RET + +;[]----------------------------------------------------------[] +ResVideoMode LD B,0x00 +VScrn EQU $-1 + LD A,0x00 +VMode EQU $-1 + PUSH IY + SPDSS DSSF.SETVMOD + POP IY + RET + +;[]==========================================================[] +InitDrivers SUB A + LD (CMOSFlag),A + LD L,A + LD H,A + LD (TestCoords.PrvTabl),HL + LD (TestCoords.PrMousX),HL + LD (TestCoords.PrMousY),HL + SPDSS DSSF.GETMEM,7 + JR NC,InitDrv + CALL ResVideoMode + LD HL,NoEnMemory + SPDSS DSSF.PCHARS + LD A,(RAMPAGES.FNPAGESID) + SPDSS DSSF.FREEMEM + SPDSS DSSF.EXIT,0x1E + +NoEnMemory DZ "Not enough memory to run program.\r\n" + +InitDrv LD (RAMPAGES.BufferID),A + LD HL,RAMPAGES.FLX + SPBIOS BIOSF.GETMEMBLKPAGES +.skip: + SPDSS DSSF.CURDISK + JR C,.skip + LD A,C + CP 12 + JR C,.L1 + LD A,11 +.L1 LD (NUM_DEVICES),A + SPDSS DSSF.GETTIME + JR C,.L3 + LD A,D + CP 32 + CCF + JR C,.L3 + LD A,E + CP 13 + CCF + JR C,.L3 + LD A,H + CP 24 + CCF + JR C,.L3 + LD A,L + CP 60 + CCF +.L3 LD A,0x00 + JR C,.L2 + INC A +.L2 LD (CMOSFlag),A + LD A,0x00 +InitFlg EQU $-1 + OR A + CALL Z,FirstInit + CALL SETUP_DISKS + SPMOUSE MOUSEF.INIT + LD A,(MouseFlag) + OR A + LD C,MOUSEF.SHOW + JR NZ,.L1 + LD C,MOUSEF.HIDE +.L1 + SPMOUSE + ;!TEST enable shared interrupts + ;Check BIOS version + SPBIOS BIOSF.DRV_VERSION + AND A + LD HL,2 << 8 + 54 ;!HARDCODE (минимальная версия)-1 для активации прерываний + SBC HL,DE + RET NC ; выход, если версия ниже 2.55 + LD BC,WINSP.CPU2 + IN B,(C) + SETPORT WINSP.CPU2,0xFE + LD A,0xAA + LD (0x0127 + CPU2),A;(SYS_PAGE.INT_ID - #4000),A ;!HARDCODE SYS_PAGE.INT_ID - #4000 + OUT (C),B + RET + +FirstInit + SPDSS DSSF.BOOTDSK,0 + ADD A,'A' + LD (ShellFile),a ; fndosln.z80 + SPDSS DSSF.CURDISK + LD HL,LeftPanel + PANEL.CURRPATH + PUSH HL + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + SPDSS DSSF.CURDIR + POP HL + LD DE,RightPanel + PANEL.CURRPATH + LD BC,0x0100 + LDIR + GETPORT WINSP.CPU1 + PUSH AF + LD A,(RAMPAGES.FNFUNCT) + SETPORT WINSP.CPU1,,0 + LD HL,FlexDIRECTORY + SPDSS DSSF.APPINFO,1 + JP C,.L5 + LD HL,FlexDIRECTORY + SPDSS DSSF.CHDIR + JP C,.L5 + LD HL,SetupName + SPDSS DSSF.OPEN,,1 + JR C,.L5 + PUSH AF + LD HL,WorkBuffer + push hl + push hl + ld (hl),0 + pop de + ld bc,0x00ff + inc de + ldir + pop hl + LD DE,0x0100 + SPDSS DSSF.READ + POP AF + SPDSS DSSF.CLOSE + LD HL,WorkBuffer + LD DE,SetupHead + LD B,11 +.L3 LD A,(DE) + CP (HL) + JR NZ,.L5 + INC HL + INC DE + DJNZ .L3 + LD DE,PALETTE + LD BC,0x0040 + LDIR + LD A,(HL) + INC HL + OR A + JR Z,.L4 + LD A,(HL) + INC HL + AND 0x01 + LD (MouseFlag),A + LD DE,LeftPanel + PUSH DE + LDI + LDI + LDI + POP DE + EX DE,HL + LD BC,PANEL.FILEMASK + ADD HL,BC + EX DE,HL + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + INC HL + LD DE,RightPanel + PUSH DE + LDI + LDI + LDI + POP DE + EX DE,HL + LD BC,PANEL.FILEMASK + ADD HL,BC + EX DE,HL + SUB A +.L2 LDI + CP (HL) + JR NZ,.L2 + LD (DE),A +.L4 inc hl + ld a,(hl) ;параметр - авто смена панели при смене диска на ней + ld (AutoActivatePanel),a + inc hl + CALL InitPAL +.L5 POP AF + SETPORT WINSP.CPU1,,0 + LD DE,InitExtention + LD A,(RAMPAGES.FNHELP) + LD C,WINSP.CPU1 + CALL Resident + LD HL,LeftPanel + PANEL.CURRPATH + SPDSS DSSF.CHDIR + LD A,0x01 + LD (InitFlg),A + RET + +; обновление в таблице выбора дисков на панели +SETUP_DISKS LD HL,BgDISKl ; диски левой панели + LD DE,BgDISKr ; диски правой панели + LD BC,FORMTABL.SIZE * 2 + LD A,(NUM_DEVICES) +.L1 ADD HL,BC + INC HL + RES FORMTABL.B_ENDTABL,(HL) + DEC HL + EX DE,HL + ADD HL,BC + INC HL + RES FORMTABL.B_ENDTABL,(HL) + DEC HL + EX DE,HL + DEC A + JR NZ,.L1 + INC HL + SET FORMTABL.B_ENDTABL,(HL) + EX DE,HL + INC HL + SET FORMTABL.B_ENDTABL,(HL) + RET + +;[]----------------------------------------------------------[] +ResDrivers + SPMOUSE MOUSEF.HIDE + LD A,(RAMPAGES.BufferID) + SPDSS DSSF.FREEMEM + ;!TEST disable shared interrupts + LD BC,WINSP.CPU2 + IN B,(C) + SETPORT WINSP.CPU2,PAGE.SYSTEM;0xFE + XOR A + LD (0x0127 + CPU2),A ;!HARDCODE SYS_PAGE.INT_ID + OUT (C),B + RET + +;[]==========================================================[] +InitScreen + MAKEWINDOW WINSUBOBJ.NOSTORE + W_MAIN 0,0,640,256 + W_FILL 4,2,632,10,COLORI.BLACK + W_TEXT 16,3,COLORI.WHITE,"Flex Navigator v\{FLEX_VERS.NAVIGATOR}" + W_HORIZLINE 0,13,640 + W_TEXT 16,17,COLORP.HIGHGRAY,"File Select Options View Config About" + W_HORIZLINE 0,27,640 + W_VERTICLINE 318,30,12 + W_HORIZLINE 0,43,640 + W_HORIZLINE 0,211,640 + W_VERTICLINE 318,214,10 + W_HORIZLINE 0,225,640 + W_BORDER 252,228,384,12 + W_FILL 254,229,380,10,COLORI.PANEL + W_HORIZLINE 0,241,640 + W_BUTTON 0,242,80,14 + W_TEXT 22,245,COLORP.HIGHGRAY,"F1 Help" + W_BUTTON 80,242,80,14 + W_TEXT 100,245,COLORP.HIGHGRAY,"F3 View" + W_BUTTON 160,242,80,14 + W_TEXT 182,245,COLORP.HIGHGRAY,"F4 Edit" + W_BUTTON 240,242,80,14 + W_TEXT 260,245,COLORP.HIGHGRAY,"F5 Copy" + W_BUTTON 320,242,80,14 + W_TEXT 334,245,COLORP.HIGHGRAY,"F6 Rename" + W_BUTTON 400,242,80,14 + W_TEXT 414,245,COLORP.HIGHGRAY,"F7 MakeDir" + W_BUTTON 480,242,80,14 + W_TEXT 496,245,COLORP.HIGHGRAY,"F8 Delete" + W_BUTTON 560,242,80,14 + W_TEXT 580,245,COLORP.HIGHGRAY,"F10 Quit" + W_END + LD A,(CMOSFlag) + OR A + RET Z + MAKEWINDOW WINSUBOBJ.WOBIND + W_BORDER 500,15,136,12 + W_END + LD HL,0x01FC + LD DE,0x0012 + LD B,0x80 + EXX + LD HL,0x022E + LD DE,0x0012 + LD B,0x80 + EXX + LD A,0x02 + JP SetCMOSPrint + +;[]==========================================================[] +InitPanels LD (InitPanFlg),A + LD HL,LeftPanel+PANEL.VIEWFLAG + LD A,(RightPanel+PANEL.VIEWFLAG) + OR (HL) + AND 0x02 + JR NZ,InitPanTree + LD IY,LeftPanel + CALL InitPanelE + LD IY,RightPanel + CALL InitPanelE + JR InitPanExit + +InitPanTree LD IY,LeftPanel + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JR NZ,.L1 + LD IY,RightPanel +.L1 CALL InitPanelE +InitPanExit LD HL,LeftPanel + LD DE,PANEL.CURRPATH + BIT 7,(HL) + JR NZ,.L2 + LD HL,RightPanel +.L2 PUSH HL + ADD HL,DE + SPDSS DSSF.CHDIR + POP IY + RET + +InitPanel SUB A +InitPanel1 LD (InitPanFlg),A +InitPanelE LD A,(InitPanFlg) + BIT 0,A + CALL Z,SetClock + CALL PrintDisks + CALL PrintPath + BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + CALL NZ,PrintDOSPath + LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + JP NZ,InitPPanel + LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + LD (PanelN1),HL + INC HL + INC HL + LD (PanelN2),HL + LD (PanelN6),HL + LD (PanelN3),HL + LD (Nbut1),HL + LD (Nfile),HL + LD DE,0x0010 + ADD HL,DE + LD (PanelN4),HL + LD (Nbut1+2),HL + LD (Nbar1),HL + LD (IY+PANEL.BARXL),L + LD (IY+PANEL.BARXH),H + LD (IY+PANEL.BARYL),0xC9 + LD (IY+PANEL.BARYH),0x00 + LD DE,0x0114 + ADD HL,DE + LD (PanelN5),HL + LD (Nbar2+2),HL + LD (Nbut2),HL + LD (IY+PANEL.BARMLL),E + LD (IY+PANEL.BARMLH),D + LD DE,0x0010 + ADD HL,DE + LD (Nbut2+2),HL + LD (Nfile+2),HL + LD (IY+PANEL.FPL),0x33 + LD (IY+PANEL.FPH),0x00 +; Краткая панель + MAKEWINDOW WINSUBOBJ.WOBIND +PanelN1 EQU $+1 + W_BORDER 0,59,312,151 +PanelN2 EQU $+1 + W_FILL 0,60,308,149,COLORI.PANEL +PanelN3 EQU $+1 + W_ICONLEFTARROW 0,201 +PanelN4 EQU $+1 + W_FILL 0,201,276,8,COLORI.HIGHGRAY +PanelN5 EQU $+1 + W_ICONRIGHTARROW 0,201 +PanelN6 EQU $+1 + W_FILL 0,213,310,12,COLORI.HIGHGRAY + W_END + + LD HL,NormMouse + LD DE,PanelPlaceL + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + JR Z,.L1 + LD DE,PanelPlaceR +.L1 PUSH DE + LD BC,0x0050 + LDIR + POP HL + LD C,0x32 + ADD HL,BC + LD (IY+PANEL.BARLFL),L + LD (IY+PANEL.BARLFH),H + LD C,0x0E + ADD HL,BC + LD (IY+PANEL.BARRTL),L + LD (IY+PANEL.BARRTH),H + JP InitPanEx + +NormMouse +Nfile DEFW 0, 0, 63,199,%0000000000000000,0,NewFile,RESIDENT.MarkFile +Nbut1 DEFW 0, 0,201,209,%0000000000000011,0,ScrollDown,0 +Nbut2 DEFW 0, 0,201,209,%0000000000000011,0,ScrollUp,0 +Nbar1 DEFW 0, 0,201,209,%0000000000000000,0,PageUp,0 +Nbar2 DEFW 0, 0,201,209,%0000000000000000,0,PageDown,0 + +; Подробная панель и панель с деревом +InitPPanel LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + LD (PanelP1),HL + INC HL + INC HL + LD (PanelP2),HL + LD (PanelP6),HL + LD (Pfile),HL + LD DE,0x0124 + ADD HL,DE + LD (PanelP3),HL + LD (PanelP4),HL + LD (PanelP5),HL + LD (Pbut1),HL + LD (Pbut2),HL + LD (Pbar1),HL + LD (Pbar2),HL + LD (Pfile+2),HL + LD (IY+PANEL.BARXL),L + LD (IY+PANEL.BARXH),H + LD DE,0x0010 + ADD HL,DE + LD (Pbut1+2),HL + LD (Pbut2+2),HL + LD (Pbar1+2),HL + LD (Pbar2+2),HL + LD (IY+PANEL.BARYL),0x44 + LD (IY+PANEL.BARYH),0x00 + LD (IY+PANEL.BARMLL),0x85 + LD (IY+PANEL.BARMLH),0x00 + LD (IY+PANEL.FPL),0x12 + LD (IY+PANEL.FPH),0x00 + MAKEWINDOW WINSUBOBJ.WOBIND +PanelP1 EQU $+1 + W_BORDER 0,59,312,151 +PanelP2 EQU $+1 + W_FILL 0,60,308,149,COLORI.PANEL +PanelP3 EQU $+1 + W_ICONUPARROW 0,60 +PanelP4 EQU $+1 + W_FILL 0,68,16,133,COLORI.HIGHGRAY +PanelP5 EQU $+1 + W_ICONDOWNARROW 0,201 +PanelP6 EQU $+1 + W_FILL 0,213,310,12,COLORI.HIGHGRAY + W_END + + LD HL,PodrMouse + LD DE,PanelPlaceL + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + JR Z,.L1 + LD DE,PanelPlaceR +.L1 PUSH DE + LD BC,0x0050 + LDIR + POP HL + LD BC,0x0036 + ADD HL,BC + LD (IY+PANEL.BARLFL),L + LD (IY+PANEL.BARLFH),H + LD BC,0x000E + ADD HL,BC + LD (IY+PANEL.BARRTL),L + LD (IY+PANEL.BARRTH),H + JP InitPanEx + +PodrMouse +Pfile DW 0, 0, 63,207,%0000000000000000,0,NewFile,RESIDENT.MarkFile +Pbut1 DW 0, 0, 60, 68,%0000000000000011,0,ScrollDown,0 +Pbut2 DW 0, 0,201,209,%0000000000000011,0,ScrollUp,0 +Pbar1 DW 0, 0, 68, 0,%0000000000000000,0,PageUp,0 +Pbar2 DW 0, 0, 0,209,%0000000000000000,0,PageDown,0 + +InitPanEx LD A,(InitPanFlg) + BIT 0,A + JR NZ,.L2 + PUSH IY + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + SPDSS DSSF.CHDIR + POP IY + JR NC,.L1 + CALL DOSError + PUSH IY + SPDSS DSSF.CURDISK + POP IY + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + PUSH IY + SPDSS DSSF.CURDIR + POP IY + JP InitPanel + +.L1 CALL ReadDIR + LD A,(InitPanFlg) + BIT 1,A + CALL NZ,FindPrevFile +.L2 CALL PrintDIR + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar + CALL SetMouse + LD A,(InitPanFlg) + BIT 0,A + RET NZ + LD HL,LeftPanel+PANEL.VIEWFLAG + LD A,(RightPanel+PANEL.VIEWFLAG) + OR (HL) + AND 0x02 + RRCA + LD (TreeFlag),A + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET Z + PUSH IY + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD IY,RightPanel + LD HL,LeftPanel + PANEL.CURRPATH + LD DE,RightPanel + PANEL.CURRPATH + JR Z,.L3 + LD IY,LeftPanel + LD HL,RightPanel + PANEL.CURRPATH + LD DE,LeftPanel + PANEL.CURRPATH +.L3 SUB A +.L4 LDI + CP (HL) + JR NZ,.L4 + LD (DE),A + CALL InitPanelE + POP IY + RET + +InitPanFlg DEFB 0x00 diff --git a/fninput.a80 b/fninput.a80 new file mode 100644 index 0000000..af8baf6 --- /dev/null +++ b/fninput.a80 @@ -0,0 +1,801 @@ + +; LAST UPDATE: 20.03.2025 savelij + +;[]----------------------------------------------------------[] +InputLine LD (InpLnData),IX + LD (.InpMous),HL + SET 7,(IX+0x01) + SUB A + LD (IX+0x02),A + LD (IX+0x03),A + CALL InsInpLnCol + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + PUSH HL + LD E,(IX+0x04) + ADD HL,DE + LD (HL),D + LD (IX+0x02),E + POP HL + LD DE,WorkBuffer + LD A,(IX+0x02) + LD (DE),A + INC DE + LD A,(IX+0x03) + LD (DE),A + INC DE + LD A,(IX+0x04) + LD (DE),A + INC DE + LD C,A + LD B,0x00 + OR B + JR Z,.L1 + LDIR +.L1 CALL PrintInpLn.L1 +.InpLineLp HALT + CALL ChCursor + LD IX,0x0000 +.InpMous EQU $-2 + CALL TestCoords + SPDSS DSSF.TESTKEY + JR Z,.InpLineLp + RES 7,D + BIT KEYBSTAT.B_ALT,B + JR NZ,.InpLineLp + LD IX,InpTable2 + BIT KEYBSTAT.B_CTRL,B + JR NZ,.NextInpKeys + LD IX,InpTable1 +.NextInpKeys LD L,(IX+0x00) + INC L + JR Z,.InpLineLp1 + INC IX + DEC L + LD H,(IX+0x00) + INC IX + LD C,(IX+0x00) + INC IX + LD B,(IX+0x00) + INC IX + OR A + SBC HL,DE + JR NZ,.NextInpKeys + LD IX,(InpLnData) + LD HL,.InpLineLp + PUSH HL + PUSH BC + PUSH IX + SPDSS DSSF.SCANKEY + POP IX + RET + +.InpLineLp1 LD IX,(InpLnData) + LD HL,.InpLineLp + PUSH HL + PUSH IX + SPDSS DSSF.SCANKEY + POP IX + LD A,E + JR InsertSymbol + +.InpLnExtN POP HL + LD IX,(InpLnData) + CALL ResCursor + XOR A + RET + +.InpLnExtC POP HL + LD IX,(InpLnData) + CALL ResCursor + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + EX DE,HL + LD HL,WorkBuffer + LD A,(HL) + INC HL + LD (IX+0x02),A + LD A,(HL) + INC HL + LD (IX+0x03),A + LD A,(HL) + INC HL + LD (IX+0x04),A + LD C,A + LD B,0x00 + LD A,B + OR C + SCF + RET Z + LDIR + RET + +InpLnData DEFW 0x0000 ; Адрес описателя строки + ; +00 Максимальная длина строки + ; +01 Флаг готовности + ; +02 текущая X позиция курсора + ; +03 текущая AddX + ; +04 количество введенных символов + ; +05 X позиция строки на экране + ; +07 Y позиция строки на экране + ; +09 X длина строки на экране + ; +0B Цвет строки + ; +0C ...сама строка + +InpTable1 DW SC.ESC << 8 | 0x1B, InputLine.InpLnExtC + DW SC.ENTER << 8 | 0x0D, InputLine.InpLnExtN + DW SC.XENTER << 8 | 0x0D, InputLine.InpLnExtN + DW SC.X4 << 8, ILleft + DW SC.X6 << 8, ILright + DW SC.BKSP << 8 | 0x08, ILdelet + DW SC.XDEL << 8, IL_del_ + DW SC.X7 << 8, ILhome + DW SC.X1 << 8, ILend + DB 0xFF + +InpTable2 DW SC.X4 << 8, ILwordL + DW SC.X6 << 8, ILwordR + DW SC.BKSP << 8, ILdelWR + DB 0xFF + +InsertSymbol CP ' ' + RET C + EX AF,AF' + BIT 7,(IX+0x01) ; ready + CALL NZ,ClearInpLn + LD A,(IX+0x04) ; InpytSymb + SUB (IX+0x00) ; Max len + RET NC + LD A,(IX+0x04) + SUB (IX+0x02) + JR Z,NotInsert +; Ввод в середину текста + LD C,A + LD B,0x00 + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x04) + ADD HL,DE + LD E,L + LD D,H + DEC HL + LDDR +NotInsert PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x02) + ADD HL,DE + EX AF,AF' + LD (HL),A + INC (IX+0x04) + INC (IX+0x02) + JP PrintInpLn + +; Clear Buffer +ClearInpLn RES 7,(IX+0x01) + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD B,(IX+0x00) + SUB A +.L1 LD (HL),A + INC HL + DJNZ .L1 + LD (IX+0x02),A + LD (IX+0x03),A + LD (IX+0x04),A + JP PrintInpLn + +; Курсор влево на одно место +ILleft RES 7,(IX+0x01) + LD A,(IX+0x02) + DEC A + RET M + LD (IX+0x02),A + JP PrintInpLn + +; Курсор вправо на одно место +ILright RES 7,(IX+0x01) + LD A,(IX+0x02) + CP (IX+0x04) + RET Z + INC (IX+0x02) + JP PrintInpLn + +; delete +ILdelet BIT 7,(IX+0x01) ; ready + CALL NZ,ClearInpLn + LD A,(IX+0x02) + OR A + RET Z + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x02) + ADD HL,DE + LD E,L + LD D,H + DEC DE + LD A,(IX+0x04) + SUB (IX+0x02) + JR Z,ILDel1 + LD C,A + LD B,0x00 + LDIR + SUB A +ILDel1 LD (DE),A + DEC (IX+0x02) + DEC (IX+0x04) + JP PrintInpLn + +; Delete Char in Current Position +IL_del_ BIT 7,(IX+0x01) ; ready + CALL NZ,ClearInpLn + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x02) + ADD HL,DE + INC HL + LD E,L + LD D,H + DEC DE + LD A,(IX+0x04) + SUB (IX+0x02) + RET Z + LD C,A + LD B,0x00 + LDIR + SUB A + LD (DE),A + DEC (IX+0x04) + JP PrintInpLn + +; Home +ILhome RES 7,(IX+0x01) + LD A,(IX+0x02) + OR A + RET Z + SUB A + LD (IX+0x02),A + JP PrintInpLn + +; End string +ILend RES 7,(IX+0x01) + LD A,(IX+0x04) + CP (IX+0x02) + RET Z + LD (IX+0x02),A + JP PrintInpLn + +; Word right +ILwordR RES 7,(IX+0x01) + LD A,(IX+0x04) + SUB (IX+0x02) + RET Z + LD B,A + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x02) + ADD HL,DE + LD C,E +.L2 LD A,(HL) + CP ' ' + JR Z,.L3 + CP ',' + JR Z,.L3 + CP '.' + JR Z,.L3 + CP '\\' + JR Z,.L3 + INC HL + INC C + DJNZ .L2 + JR .L4 + +.L3 LD A,(HL) + CP ' ' + JR Z,.L1 + CP ',' + JR Z,.L1 + CP '.' + JR Z,.L1 + CP '\\' + JR NZ,.L4 +.L1 INC HL + INC C + DJNZ .L3 +.L4 LD (IX+0x02),C + JP PrintInpLn + +; Word left +ILwordL RES 7,(IX+0x01) + LD A,(IX+0x02) + OR A + RET Z + LD B,A + LD C,B + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,C + ADD HL,DE +.L3 DEC HL + DEC C + LD A,(HL) + CP ' ' + JR Z,.L2 + CP ',' + JR Z,.L2 + CP '.' + JR Z,.L2 + CP 0x5C + JR Z,.L2 + DJNZ .L3 + JR .L5 + +.L2 LD A,(HL) + CP ' ' + JR Z,.L1 + CP ',' + JR Z,.L1 + CP '.' + JR Z,.L1 + CP '\\' + JR NZ,.L4 +.L1 DEC HL + DEC C + DJNZ .L2 +.L4 INC C +.L5 LD (IX+0x02),C + JP PrintInpLn + +; Delete word +ILdelWR RES 7,(IX+0x01) + LD A,(IX+0x02) + OR A + RET Z + LD B,A + LD C,B + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,C + ADD HL,DE + LD A,(IX+0x04) + SUB B + LD E,A + PUSH HL + DEC HL + DEC C + LD A,(HL) + CP ' ' + JR Z,.L4 + CP ',' + JR Z,.L4 + CP '.' + JR Z,.L4 + CP '\\' + JR Z,.L4 + DEC B + JR Z,.L6 +.L3 DEC HL + DEC C + LD A,(HL) + CP ' ' + JR Z,.L2 + CP ',' + JR Z,.L2 + CP '.' + JR Z,.L2 + CP '\\' + JR Z,.L2 + DJNZ .L3 + JR .L6 + +.L4 LD A,(HL) + CP ' ' + JR Z,.L1 + CP ',' + JR Z,.L1 + CP '.' + JR Z,.L1 + CP '\\' + JR NZ,.L2 +.L1 DEC HL + DEC C + DJNZ .L4 +.L2 INC HL + INC C +.L6 LD A,(IX+0x02) + LD (IX+0x02),C + SUB C + LD C,A + EX AF,AF' + LD A,(IX+0x04) + SUB C + LD (IX+0x04),A + LD C,E + LD B,0x00 + EX DE,HL + POP HL + LD A,C + OR A + JR Z,.L7 + LDIR +.L7 EX DE,HL + EX AF,AF' + LD B,A + SUB A +.L5 LD (HL),A + INC HL + DJNZ .L5 + JP PrintInpLn + +;[]----------------------------------------------------------[] +InsInpLnCol LD L,(IX+0x07) + LD H,(IX+0x08) + LD (FillILy),HL + LD A,(IX+0x0B) + AND 0x0F ; INK + LD C,A + RLCA + RLCA + RLCA + RLCA + OR C + LD HL,PrnINKl ; INK буфер + LD B,0x08 + CPL +.L1 LD (HL),A + INC HL + DJNZ .L1 + LD B,A + LD A,(IX+0x0B) + AND 0xF0 ; PAPER + LD C,A + RRCA + RRCA + RRCA + RRCA + LD (FillILc),A + OR C + XOR B + LD HL,PrnPAPl ; PAPER буфер + LD B,0x08 +.L2 LD (HL),A + INC HL + DJNZ .L2 + RET + +PrintInpLn CALL ResCursor +.L1 LD A,(IX+0x02) + SUB (IX+0x03) + JR NC,PrnInpLn1 + LD A,(IX+0x03) + SUB Step + LD (IX+0x03),A + JR PrintInpLn.L1 + +PrnInpLn1 PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x03) + ADD HL,DE + OR A + CALL NZ,TstInpLnLen ; На вход: HL-начало вывода + ; А -кол.симв.до курсора + PUSH IY + PUSH IX + LD A,(IX+0x07) + LD IYL,A ; Y координата + LD A,(IX+0x04) + LD IYH,A + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + PUSH AF + EXX + LD HL,PrnPAPl + LD DE,PrnINKl + LD C,(IX+0x05) + LD B,(IX+0x06) + SRL B + RR C + SET 6,B + EXX + LD C,(IX+0x09) + LD B,(IX+0x0A) + SRL B + RR C + LD IXL,C + LD C,L ; Адрес строки + LD B,H + GETPORT WINSP.CPU1 + LD IXH,A + DI + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x08 + ACCEL ACCELCMD.OFF + LD A,IYH + OR A + JR Z,PrnInpE + LD A,(BC) + INC BC +PInpLnP LD L,A + LD H,HIGH (FONT_RAW)-0xC0 + PUSH BC + LD B,(HL) ; длина символа + INC H + LD E,(HL) + INC H + LD D,(HL) + LD HL,0x0008 + EX DE,HL + SETPORT WINSP.CPU1,0x50 +PrnLoopInp + ACCEL ACCELCMD.COPY + LD A,(HL) + ACCEL ACCELCMD.OFF + EXX + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY + OR (HL) + EX DE,HL + XOR (HL) + ACCEL ACCELCMD.COPY_VERT + LD (BC),A + ACCEL ACCELCMD.OFF + EX DE,HL + INC BC + EXX + ADD HL,DE + DEC IXL + JR Z,.L1 + DJNZ PrnLoopInp +.L1 POP BC + LD A,IXH + SETPORT WINSP.CPU1,,0 + LD A,IXL + OR A + JR Z,PrnInpE + DEC IYH + JR Z,PrnInpE + LD A,(BC) + INC BC + OR A + JR NZ,PInpLnP +PrnInpE POP AF + SETPORT WINSP.CPU0,,0 + EI + POP AF + SETPORT WINSP.Y_PORT,,0 + LD A,IXL + OR A + JR Z,PrnInE1 + LD L,A + LD H,0x00 + ADD HL,HL + LD (FillILl),HL + EXX + PUSH BC + EXX + POP HL + RES 6,H + ADD HL,HL + LD (FillILx),HL + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 0x0000,0x0000,0x0000,8,0x00 + W_END +FillILx EQU $-10 +FillILy EQU $-8 +FillILl EQU $-6 +FillILc EQU $-2 + +PrnInE1 POP IX + POP IY + JP SetCursor + +PrnINKl DB 8 DUP 0 +PrnPAPl DB 8 DUP 0 + +TstInpLnLen PUSH IY + LD IYL,A + LD IYH,A + DI + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + LD D,HIGH (FONT_RAW)-0xC0 +TstInpLn PUSH HL + LD BC,0x0000 +TstInpL LD E,(HL) + INC HL + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + DEC IYL + JR NZ,TstInpL + LD L,(IX+0x09) + LD H,(IX+0x0A) + OR A + SBC HL,BC + JR NC,TstInpE + POP HL + LD BC,Step + ADD HL,BC + LD A,(IX+0x03) + ADD A,C + LD (IX+0x03),A + LD A,IYH + SUB C + LD IYH,A + LD IYL,A + JR TstInpLn + +TstInpE POP HL + POP AF + SETPORT WINSP.CPU0,,0 + EI + POP IY + RET + +SetCursor PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x03) + ADD HL,DE + LD BC,0x0000 + LD A,(IX+0x02) + SUB E + JR Z,StCurs1 + EX AF,AF' + DI + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + LD D,HIGH (FONT_RAW)-0xC0 + EX AF,AF' +StCurs0 EX AF,AF' + LD E,(HL) + INC HL + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + EX AF,AF' + DEC A + JR NZ,StCurs0 + POP AF + SETPORT WINSP.CPU0,,0 + EI +StCurs1 LD (CurShiftX),BC + LD A,0x01 + LD (CurCursor),A + LD A,CursTimer + LD (CrTimer),A +SetCr LD L,(IX+0x05) + LD H,(IX+0x06) + LD BC,(CurShiftX) + ADD HL,BC + SRL H + RR L + SET 6,H + GETPORT WINSP.CPU1 + LD C,A + GETPORT WINSP.Y_PORT + LD B,A + PUSH BC + LD DE,CursBuffer + LD C,(IX+0x07) + DEC C + LD A,(IX+0x0B) + AND 0x0F + LD B,A + RLCA + RLCA + RLCA + RLCA + OR B + LD B,A + SETPORT WINSP.CPU1,0x50 + DI + LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x09 + ACCEL ACCELCMD.COPY_VERT + LD A,(HL) + ACCEL ACCELCMD.COPY + LD (DE),A + ACCEL ACCELCMD.OFF + LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),B + ACCEL ACCELCMD.OFF + EI + POP BC + LD A,B + SETPORT WINSP.Y_PORT,,0 + LD A,C + SETPORT WINSP.CPU1,,0 + RET + +ResCursor LD L,(IX+0x05) + LD H,(IX+0x06) + LD BC,(CurShiftX) + ADD HL,BC + SRL H + RR L + SET 6,H + GETPORT WINSP.CPU1 + LD C,A + GETPORT WINSP.Y_PORT + LD B,A + PUSH BC + LD DE,CursBuffer + LD B,(IX+0x07) + DEC B + LD C,WINSP.Y_PORT + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x09 + ACCEL ACCELCMD.COPY + LD A,(DE) + OUT (C),B + ACCEL ACCELCMD.COPY_VERT + LD (HL),A + ACCEL ACCELCMD.OFF + EI + POP BC + LD A,B + SETPORT WINSP.Y_PORT,,0 + LD A,C + SETPORT WINSP.CPU1,,0 + RET + +ChCursor LD HL,CrTimer + DEC (HL) + RET NZ + LD (HL),CursTimer + LD IX,(InpLnData) + LD A,(CurCursor) + XOR 0x01 + LD (CurCursor),A + JR Z,ResCursor + JP SetCr + +CurShiftX DEFW 0x00 +CrTimer DEFB 0x00 +CurCursor DEFB 0x00 +CursBuffer DB 9 DUP 0 diff --git a/fnmain.a80 b/fnmain.a80 new file mode 100644 index 0000000..34d592d --- /dev/null +++ b/fnmain.a80 @@ -0,0 +1,570 @@ + +; LAST UPDATE: 26.05.2025 savelij + +;[]=======================================================================[] +; FLEX NAVIGATOR ; +; v1.11 ; +; Last edition: 03/02/2000 ; +;[]=======================================================================[] + +; flex navigator equs + include fn_const.a80 + include fn_macros.a80 + +;[]-----------------------------------------------------------------------[] +; org BASE_ADDR ;0x8000 +; section .bss + +;WorkBuffer: EQU 0x8000 + ;resb 0x400 ; work buffer for func/procs + +;[]-----------------------------------------------------------------------[] +; ; org 0x8400 +; section .bss + +;PagesList: EQU 0x8400 + ;resb 0x100 ; buffer for memory pages +;[]-----------------------------------------------------------------------[] +; ; org 0x8500 +; section .text + PHASE BASE_ADDR +START_BLOCK_1 + +;[]=======================================================================[] +; section .text + +;EntryPoint: + JP StartPoint ; entry point + + JP ClearScreen ; 8603->86BB + JP MakeWindow ; 8606->86F0 + JP InvertRectan ; 8609->8DA0 + JP PrnTxtLnIFF ; 860C->8FB0 + JP PrnTxtLnNorm ; 860F->9024 + JP PrnTxtLnNormC ; 8612->909B + JP PrnRangPathL ; 8615->8E48 + JP PrnRangPathR ; 8618->8EB2 + JP PrnRangPathC ; 861B->8F36 + JP InputLine ; 861E->915F + JP InputLine.InpLnExtN ; 8621->9205 + JP InputLine.InpLnExtC ; 8624->920F + JP DOSError ; 8627->86A8 + JP InitScrollBar ; 862A->96EB + JP PrnHScrBar ; 862D->9729 + JP PrnVScrBar ; 8630->9882 + JP InitProcess ; 8633->99DA + JP PrnProcess ; 8636->9A39 + JP InitScrollBar + + DB JUMPS.JUMPSIZE * 4 DUP 0xC9 + + JP ResFire ; 8648->9B01 + JP TestCoords ; 864B->9B10 + JP SetCMOSPrint ; 864E->9EA9 + JP ResCMOSPrint ; 8651->9EF3 + JP SetClock ; 8654->A08E + JP SetMouse ; 8657->A0BB + + DB JUMPS.JUMPSIZE * 4 DUP 0xC9 + + JP ConvNumTxt40 ; 8666->A1F7 + JP MoveBytes ; 8669->A3B6 + JP MoveBytesUp ; 866C->A3E3 + JP Mult8 ; 866F->A0E8 + JP Mult16X8 ; 8672->A124 + JP Mult16 ; 8675->A110 + JP Mult16X16 ; 8678->A124 + JP Mult32 ; 867B->A149 + JP Divis16X16 ; 867E->A16B + JP Divis24X16 ; 8681->A195 + JP Divis32X16 ; 8684->A1B8 + JP Divis32 ; 8687->A1CD + JP ConvNumTxt32 ; 868A->A236 + JP ConvNumTxt16 ; 868D->A2AA + JP ConvNumTxt8 ; 8690->A2DE + JP ConvTxtNum32 ; 8693->A35D + JP ConvTxtNum16 ; 8696->A395 + JP Resident ; 8699->A40B + + DB 0xC0 - LOW ($) DUP 0xC9 + +;[]-----------------------------------------------------------------------[] +; flex navigator settings +NUM_DEVICES DB 0 ; Кол-во устройств +TreeFlag DB 0 ; Флаг дерева +CMOSFlag DB 0 ; Флаг CMOS 0 - нет + ; 1 - есть +MouseFlag DB 1 ; Флаг мыши 0 - нет + ; 1 - есть +CMOSPrint: DB 1 +RAMPAGES +.FNPAGESID DB 0 ; Индеф.памяти где FN +.FNFUNCT DB 0 ; Страница с функциями FN +.FNVIEW DB 0 ; Страница с FileViewer +.FNEDIT DB 0 ; Страница с FileEditor +.FNHELP DB 0 ; Страница FN HELP +.FNFONT DB 0 ; Страница шрифтов +.BufferID DB 0 ; Индентификатор памяти под буфера +.FLX DB 0 ; Страница для подгрузки FLX просмотр. FLX утилит +.LEFTPANEL DB 0 ; Страница каталога Левой панели +.RIGHTPANEL DB 0 ; Страница каталога Правой панели +; Буферные страницы под интерфейс +.BuffPg1 DB 0 + DB 0 +.BuffPg3 DB 0 + DB 0 + DB 0 + + DB LOW (-$) DUP 0 + +;UI palette & stack memory +;PALETTE: B G R + DB 0x00,0x00,0x00,0x00 ; Black 00 00 + DB 0x00,0x00,0xFF,0x00 ; B.Red 01 + DB 0x00,0x80,0x00,0x00 ; Green 02 08 + DB 0x00,0xFF,0xFF,0x00 ; B.Yellow 03 + DB 0x80,0x00,0x00,0x00 ; Blue 04 10 + DB 0xFF,0xFF,0x00,0x00 ; Invert paper 05 + DB 0x80,0x00,0x00,0x00 ; Invert ink 06 18 + DB 0x80,0x80,0x80,0x00 ; BlackGray 07 + DB 0xC0,0xC0,0xC0,0x00 ; HighGray 08 20 + DB 0x80,0x00,0x00,0x00 ; Panel 09 + DB 0xFF,0xFF,0x00,0x00 ; Files 0A 28 + DB 0x00,0xFF,0xFF,0x00 ; Select Files 0B + DB 0x00,0xFF,0xFF,0x00 ; InvSel Files 0C 30 + DB 0xC0,0xC0,0xC0,0x00 ; Reserved 0D + DB 0xFF,0xFF,0xFF,0x00 ; White 0E 38 + DB 0xFF,0xFF,0xFF,0x00 ; White 0F + +DOSError EX AF,AF' + GETPORT WINSP.CPU1 + PUSH AF + LD A,(RAMPAGES.FNFUNCT) + SETPORT WINSP.CPU1,,0 + EX AF,AF' + CALL DOSErrorR + EX AF,AF' + POP AF + SETPORT WINSP.CPU1,,0 + EX AF,AF' + RET + + include fnwin.a80 + include fnprint.a80 + include fninput.a80 + include fnbar.a80 + include fnmouse.a80 + include fnsys.a80 + +;[]=======================================================================[] +;Старт +StartPoint: DI + LD SP,STACK +ReStartPoint: + SETPORT BORDER,0 + SETPORT WINSP.Y_PORT,0xC0 + CALL InitVideoMode + CALL InitDrivers + CALL InitScreen + CALL ClearDOSline + SUB A + CALL InitPanels + CALL ResFire +MainLoop: LD IX,FilePanelLeft + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + JR Z,.L1 + LD IX,FilePanelRight +.L1 CALL TestCoords + CALL TestKeys + CALL C,DOSline + LD A,(TreeFlag) + OR A + IF TREE_REZID + CALL NZ,RESIDENT.TestTree + ELSE + CALL NZ,TestTreeR + ENDIF + JR MainLoop + +;[]-----------------------------------------------------------------------[] +TestKeys + SPDSS DSSF.TESTKEY + JR Z,KeyExit + RES 7,D + LD A,B + AND KEYBSTAT.M_ALT | KEYBSTAT.M_CTRL + CP KEYBSTAT.M_ALT | KEYBSTAT.M_CTRL + RET Z + LD IX,HOTKEYS.SHIFTKeys + LD A,B + AND KEYBSTAT.M_LEFTSHIFT | KEYBSTAT.M_RIGHTSHIFT + JR NZ,.L1 + LD IX,HOTKEYS.CTRLKeys + BIT KEYBSTAT.B_CTRL,B + JR NZ,.L1 + LD IX,HOTKEYS.ALTKeys + BIT KEYBSTAT.B_ALT,B + JR NZ,.L1 + LD IX,HOTKEYS.ASCIIKeys +.L1 LD L,(IX+0x00) ; скан код + INC IX + INC L + SCF + RET Z + DEC L + LD H,(IX+0x00) ; ASCII код + INC IX + LD C,(IX+0x00) ; LOW адрес вызова + INC IX + LD B,(IX+0x00) ; HIGH адрес вызова + INC IX + OR A + SBC HL,DE + JR NZ,.L1 + LD (KeyCALL),BC + SPDSS DSSF.SCANKEY + CALL 0x0000 +KeyCALL EQU $-2 +KeyExit XOR A + RET + +;[]-----------------------------------------------------------------------[] +MouseOnOff LD A,(MouseFlag) + XOR 0x01 + LD (MouseFlag),A + LD C,MOUSEF.INIT + JR NZ,.L1 + LD C,MOUSEF.HIDE +.L1 + SPMOUSE + RET + +;[]-----------------------------------------------------------------------[] +ComExit CALL ResDrivers + CALL ResVideoMode + LD HL,thanks + SPDSS DSSF.PCHARS + LD A,(RAMPAGES.FNPAGESID) + SPDSS DSSF.FREEMEM + SPDSS DSSF.EXIT,0 + +thanks DZ "\r\nThank you for using Flex Navigator.\r\n" + +; (ADR) + BCDE = BCDE +BCDEHLP: LD A,(HL) + INC HL + ADD A,E + LD E,A + LD A,(HL) + INC HL + ADC A,D + LD D,A + LD A,(HL) + INC HL + ADC A,C + LD C,A + LD A,(HL) + ADC A,B + LD B,A + RET + +GET_DWORD: LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD C,(HL) + INC HL + LD B,(HL) + RET + +SET_DWORD: LD (HL),E + INC HL + LD (HL),D + INC HL + LD (HL),C + INC HL + LD (HL),B + RET + +;[]=======================================================================[] +; discription of flex navigator file panels +LeftPanel: DB 0x80 ; Флаг панели бит 7 - бит выделенности + ; бит 0 - номер панели + DB 0x00 ; Флаг вида панели 0 - краткая панель + ; бит 0 - подробная панель + ; бит 1 - дерево + ; бит 2 - ужатое дерево + DB 0x01 ; Вид сортировки + ; бит 0 - по имени + ; бит 1 - по расширению + ; бит 2 - по размеру + ; бит 3 - по дате + ; бит 4 - execute file + ; бит 5 - file mask + DW 4 ; X позиция панели + DW 0 ; X позиция скролбара + DW 0 ; Y позиция скролбара + DW 0 ; Max длина скролбара + DW 0 ; тек.длина скролбара + DW 0 ; Адрес ячейки BarLeft + DW 0 ; Адрес ячейки BarRight + DW 0 ; Кол-во файлов на странице + DW 0 ; Общее кол-во файлов + DW 0 ; Первый файл на странице + DW 0 ; Tекущий файл на странице + DW 0 ; Кол-во маркированных файлов + DD 0 ; Кол-во маркированных байтов + DB 0 + DB "*.*" ; Maска для файлов + DB 0x0A DUP 0 + DB 0x100 DUP 0 ; Путь к текущей директории + +RightPanel: DB 0x01 ; Флаг панели бит 7 - бит выделенности + ; бит 0 - номер панели + DB 0x00 ; Флаг вида панели 0 - краткая панель + ; бит 0 - подробная панель + ; бит 1 - дерево + ; бит 2 - ужатое дерево + DB 0x01 ; Вид сортировки + ; бит 0 - по имени + ; бит 1 - по расширению + ; бит 2 - по размеру + ; бит 3 - по дате + ; бит 4 - execute file + ; бит 5 - file mask + DW 324 ; X позиция панели + DW 0 ; X позиция скролбара + DW 0 ; Y позиция скролбара + DW 0 ; Max длина скролбара + DW 0 ; тек.длина скролбара + DW 0 ; Адрес ячейки BarLeft + DW 0 ; Адрес ячейки BarRight + DW 0 ; Кол-во файлов на странице + DW 0 ; Общее кол-во файлов + DW 0 ; Первый файл на странице + DW 0 ; Tекущий файл на странице + DW 0 ; Кол-во маркированных файлов + DD 0 ; Кол-во маркированных байтов + DB 0 + DB "*.*" ; Maска для файлов + DB 0x0A DUP 0 + DB 0x100 DUP 0 ; Путь к текущей директории + +;[]=======================================================================[] + +START_SORT + include fnsort.a80 +END_SORT + IF TREE_REZID = 0 +START_TREE + include fntree.a80 +END_TREE + ENDIF + include fnpanel.a80 + include fndos.a80 + + include fnwork.a80 + +; вызов функции в страницах +RESIDENT +;[]----------------------------------------------------------[] +.CopyFiles: LD DE,CopyFilesR +; resident 2 +.FunctResident: LD A,(RAMPAGES.FNFUNCT) + LD C,WINSP.CPU1 + JP Resident + +;[]----------------------------------------------------------[] +.ReName: LD DE,ReNameR + jr .FunctResident + +;[]----------------------------------------------------------[] +.MakeDIR: LD DE,MakeDIRR + jr .FunctResident + +;[]----------------------------------------------------------[] +.DeleteFiles: LD DE,DeleteFilesR + jr .FunctResident + +;[]----------------------------------------------------------[] +.Quit: CALL ResInvert +.QuitL1 LD DE,QuitConfirmWin + CALL .FunctResident + JP C,SetInvert + LD HL,ComExit + EX (SP),HL + RET + +;[]==========================================================[] +.Setup: LD DE,SetupR + jr .FunctResident + +;[]----------------------------------------------------------[] +.FileInfo: CALL ResInvert +.FileInfoL2 LD HL,SetInvert + PUSH HL + LD DE,FileInfoR + jr .FunctResident + +;[]----------------------------------------------------------[] +.PrintFile: CALL ResInvert +.PrintFileL3 LD HL,SetInvert + PUSH HL + LD DE,PrintFileR + jr .FunctResident + +;[]----------------------------------------------------------[] +.DiskInfo: CALL ResInvert +.DiskInfoL4: LD DE,DiskInfoR + jr .FunctResident + +;[]----------------------------------------------------------[] +.SystemInfo: LD DE,SystemInfoR + jr .FunctResident + +;[]----------------------------------------------------------[] +.Version: LD DE,VersionR + jr .FunctResident + +;[]----------------------------------------------------------[] +.QSearch: LD DE,QSearchR + jr .FunctResident + + IF TREE_REZID +.TestTree LD DE,TestTreeR + jr .FunctResident + +.TestTreeBeg LD DE,TestTreeR.TestTreeBeg + jr .FunctResident + +.ReadTree LD DE,ReadTreeR + jr .FunctResident + +.MakeTreePath LD DE,MakeTreePathR + jr .FunctResident + +.FindTreeDIR LD DE,FindTreeDIRR + jr .FunctResident + ENDIF + +;[]==========================================================[] +.MarkFile: LD DE,MarkFileR +; resident 3 +.HelpResident: LD A,(RAMPAGES.FNHELP) + LD C,WINSP.CPU1 + JP Resident + + IF MARK_DIR +.GetDirSize: LD DE,GetDirSizeR + JR .HelpResident + ENDIF + +.UnMarkGroup: LD DE,UnMarkGroupR + jr .HelpResident + +.UnMarkGroupN: LD DE,UnMarkGroupRN + jr .HelpResident + +.MarkGroup: LD DE,MarkGroupR + jr .HelpResident + +.MarkGroupN: LD DE,MarkGroupRN + jr .HelpResident + +.SelectAll: LD DE,SelectAllR + jr .HelpResident + +.SelectAllN: LD DE,SelectAllRN + jr .HelpResident + +.UnSelectAll: LD DE,UnSelectAllR + jr .HelpResident + +.UnSelectAllN: LD DE,UnSelectAllRN + jr .HelpResident + +.InvertSelect: LD DE,InvertSelectR + jr .HelpResident + +.InvertSelectN: LD DE,InvertSelectRN + jr .HelpResident + + include fnmenu.a80 + include fninit.a80 + include fndosline.a80 + include fntab.a80 +END_BLOCK_1: + DEPHASE ; BASE_ADDR + +;[]=======================================================================[] + PHASE 0x4000 +; section .text +START_BLOCK_2 +FlexDIRECTORY: DB 0x100 DUP 0 + + include rez2_fnfunct.a80 + include rez2_fnmisc.a80 + include rez2_fnsearch.a80 + include rez2_fnconfig.a80 + include rez2_fnerror.a80 + include rez2_fntab1.a80 + IF TREE_REZID + include fntree.a80 + ENDIF +END_BLOCK_2: + DEPHASE ; 0x4000 + +START_BLOCK_EDITOR + PHASE 0xC000 + include plugins/fnviewer/fviewer.a80 + DEPHASE ; 0xC000 +END_BLOCK_EDITOR + +START_BLOCK_VIEWER + PHASE 0xC000 + include plugins/fneditor/feditor.a80 + DEPHASE ; 0xC000 +END_BLOCK_VIEWER + +;[]-----------------------------------------------------------------------[] + PHASE 0x4000 +; section .text +START_BLOCK_3 + +DOShistory: DB DOShistory_Size DUP 0 ;times 0x200 db 0 +fn_ext: DB WorkBuffer_Size DUP 0 ;times 0x400 db 0 +fnview_ext: DB WorkBuffer_Size DUP 0 ;times 0x400 db 0 +fnedit_ext: DB WorkBuffer_Size DUP 0 ;times 0x400 db 0 + + include rez3_fnnext.a80 + include rez3_fnmark.a80 + +WINSP_CPU EQU WINSP.CPU3 ; окно проецирования +WINSP_ADR EQU 0xC000 ; адрес окна + + include plugins/help/help.a80 +HelpText: include plugins/help/help_t.a80 +HelpTextEnd: +END_BLOCK_3: + DEPHASE ; 0x4000 + +;[]=======================================================================[] + PHASE 0xC000 +; section .data +START_BLOCK_4 + +FONT_RAW_PACK binclude tmp/font_raw.pack +IFFFONT_RAW_PACK binclude tmp/iff_font_raw.pack +IFFFONT_RAW_END + +END_BLOCK_4: + DEPHASE ; 0xC000 + +; чисто для отладки +BLOCK1_SIZE EQU END_BLOCK_1 - START_BLOCK_1 +BLOCK2_SIZE EQU END_BLOCK_2 - START_BLOCK_2 +BLOCK3_SIZE EQU END_BLOCK_3 - START_BLOCK_3 +EDITOR_SIZE EQU END_BLOCK_EDITOR - START_BLOCK_EDITOR +VIEWER_SIZE EQU END_BLOCK_VIEWER - START_BLOCK_VIEWER +SORT_SIZE EQU END_SORT - START_SORT +TREE_SIZE EQU END_TREE - START_TREE diff --git a/fnmenu.a80 b/fnmenu.a80 new file mode 100644 index 0000000..b1c15b9 --- /dev/null +++ b/fnmenu.a80 @@ -0,0 +1,1232 @@ + +; LAST UPDATE: 27.05.2025 savelij + +;[]==========================================================[] +PullDown: CALL ResInvert + CALL SetPullInvert +PullLoop: LD IX,PullTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,PullLoop + LD A,B + OR A + JR NZ,PullLoop + LD HL,PullLoop + PUSH HL + LD A,E + CP 0x1B + JR Z,PullExit + CP 0x0D + JR Z,PullEnter + OR A + RET NZ + LD A,D + CP SC.X2 + JR Z,PullEnter + CP SC.X8 + JR Z,PullEnter + CP SC.X4 + JR Z,PullLeft + CP SC.X6 + JR Z,PullRight + RET + +PullExit: POP DE +.L1 CALL ResPullInvert + JP SetInvert + +PullLeft: LD A,(CurrMenu) + DEC A + JP P,.L1 + LD A,MainPullMenu-1 +.L1 LD (CurrMenu),A + CALL ResPullInvert + JP SetPullInvert + +PullRight: LD A,(CurrMenu) + INC A + CP MainPullMenu + JR NZ,.L1 + SUB A +.L1 LD (CurrMenu),A + CALL ResPullInvert + JP SetPullInvert + +PullEnter: LD A,0x01 + LD (MKeyFlg),A + LD HL,MFile + LD A,(CurrMenu) + OR A + JR Z,.L1 + LD HL,MSelect + DEC A + JR Z,.L1 + LD HL,MOption + DEC A + JR Z,.L1 + LD HL,MView + DEC A + JR Z,.L1 + LD HL,MConfig + DEC A + JR Z,.L1 + LD HL,MAbout +.L1 EX (SP),HL + RET + +ResPullInvert: LD DE,(COLORP.BLUE + COLORI.WHITE) << 8 | (COLORP.HIGHGRAY + COLORI.BLACK);0x4F80 + LD A,0 +PrevMenu EQU $-1 + JR PullInvert + +SetPullInvert: LD DE,(COLORP.HIGHGRAY + COLORI.BLACK) << 8 | (COLORP.BLUE + COLORI.WHITE);0x804F + LD A,0 +CurrMenu EQU $-1 + LD (PrevMenu),A +PullInvert: LD L,A + LD H,0 + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + ADD HL,HL ; *16 + LD BC,PullTab + ADD HL,BC + PUSH HL + POP IX + LD L,(IX + FORMTABL.XMINL) + LD H,(IX + FORMTABL.XMINH) + LD C,(IX + FORMTABL.YMINL) + LD B,(IX + FORMTABL.YMINH) + LD A,(IX + FORMTABL.XMAXL) + SUB (IX + FORMTABL.XMINL) + EX AF,AF' + LD A,(IX + FORMTABL.YMAXL) + SUB (IX + FORMTABL.YMINL) + LD IXH,A + EX AF,AF' + SRL A + LD IXL,A + JP InvertRectan + +MFile: CALL ResPullInvert + JP MenuFile.L1 + +MSelect: CALL ResPullInvert + JP MenuSelect.L1 + +MOption: CALL ResPullInvert + JP MenuOption.L1 + +MView: CALL ResPullInvert + JP MenuView.L7 + +MConfig: CALL ResPullInvert + JP MenuConfig.L1 + +MAbout: CALL ResPullInvert + JP MenuAbout.L1 + +;[]==========================================================[] +MenuFile: CALL ResInvert +.L2 SUB A + LD (MKeyFlg),A +.L1 CALL STORE_PANELFLAG + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 4,26,160,54 + W_TEXT 16,6,COLORP.HIGHGRAY,"File info..." + W_TEXT 100,6,COLORP.HIGHGRAY,"ALT+ENT" + W_TEXT 16,20,COLORP.HIGHGRAY,"Print" + W_TEXT 100,20,COLORP.HIGHGRAY,"CTRL+F9" + W_HORIZLINE 4,33,152 + W_TEXT 16,40,COLORP.HIGHGRAY,"Exit" + W_TEXT 100,40,COLORP.HIGHGRAY,"F10" + W_END + LD HL,FileTab + LD BC,3 + JP MenuWork + +MenuSelect: CALL ResInvert +.L2 SUB A + LD (MKeyFlg),A +.L1 CALL STORE_PANELFLAG + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 40,26,160,76 + W_TEXT 16,6,COLORP.HIGHGRAY,"Mark group..." + W_TEXT 112,6,COLORP.HIGHGRAY,"+" + W_TEXT 16,20,COLORP.HIGHGRAY,"Unmark group..." + W_TEXT 112,20,COLORP.HIGHGRAY,"-" + W_TEXT 16,34,COLORP.HIGHGRAY,"Mark all" + W_TEXT 112,34,COLORP.HIGHGRAY,"CTRL+" + W_TEXT 16,48,COLORP.HIGHGRAY,"Unmark all" + W_TEXT 112,48,COLORP.HIGHGRAY,"CTRL-" + W_TEXT 16,62,COLORP.HIGHGRAY,"Invert selection" + W_TEXT 112,62,COLORP.HIGHGRAY,"*" + W_END + LD HL,SelectTab + LD BC,1 << 8 | 5 + JP MenuWork + +MenuOption: CALL ResInvert +.L2 SUB A + LD (MKeyFlg),A +.L1 CALL STORE_PANELFLAG + MAKEWINDOW WINSUBOBJ.STORE + IF PLUGS_ENABLE + W_MAIN 84,26,208,54+14 + ELSE + W_MAIN 84,26,208,54 + ENDIF + W_TEXT 16,6,COLORP.HIGHGRAY,"Refresh tree" ; 00 + W_TEXT 152,6,COLORP.HIGHGRAY,"ALT+F10" + W_TEXT 16,20,COLORP.HIGHGRAY,"Disk info..." ; 01 + W_TEXT 152,20,COLORP.HIGHGRAY,"CTRL+L" + W_HORIZLINE 4,33,200 + W_TEXT 16,40,COLORP.HIGHGRAY,"System information..." ; 02 + IF PLUGS_ENABLE + W_TEXT 16,54,COLORP.HIGHGRAY,"Plugins..." ; 03 + ENDIF + W_END + LD HL,OptionTab + IF PLUGS_ENABLE + LD BC,2 << 8 | 4 + ELSE + LD BC,2 << 8 | 3 + ENDIF + JP MenuWork + +MenuView: CALL ResInvert +.L8 SUB A + LD (MKeyFlg),A +.L7 CALL STORE_PANELFLAG + LD A,(IY + PANEL.VIEWFLAG) + OR A + LD BC,0xFFFE + LD E,0xFE + JR Z,.L1 + LD BC,0xFEFF + LD E,0xFE + BIT VIEWFLAG.B_FULL,A + JR NZ,.L1 + LD BC,0xFEFE + LD E,0xFF +.L1 LD A,B + LD (MenuView.view1),A + LD A,C + LD (MenuView.view2),A + LD A,E + LD (MenuView.view3),A + LD A,(IY + PANEL.SORTFLAG) + AND SORTFLAG.MASKH + LD BC,0xFFFE + LD E,0xFE + JR Z,.L2 + BIT SORTFLAG.B_EXEC,A + LD BC,0xFEFF + LD E,0xFE + JR NZ,.L2 + LD BC,0xFEFE + LD E,0xFF +.L2 LD A,B + LD (MenuView.filt1),A + LD A,C + LD (MenuView.filt2),A + LD A,E + LD (MenuView.filt3),A + LD A,(IY + PANEL.SORTFLAG) + AND SORTFLAG.MASK + LD BC,0xFEFE + LD DE,0xFEFE + LD L,0xFF + JR Z,.L3 + BIT SORTFLAG.B_NAME,A + LD BC,0xFFFE + LD DE,0xFEFE + LD L,0xFE + JR NZ,.L3 + BIT SORTFLAG.B_EXT,A + LD BC,0xFEFF + LD DE,0xFEFE + LD L,0xFE + JR NZ,.L3 + BIT SORTFLAG.B_DATE,A + LD BC,0xFEFE + LD DE,0xFFFE + LD L,0xFE + JR NZ,.L3 + LD BC,0xFEFE + LD DE,0xFEFF + LD L,0xFE +.L3 LD A,B + LD (MenuView.sort1),A + LD A,C + LD (MenuView.sort2),A + LD A,D + LD (MenuView.sort3),A + LD A,E + LD (MenuView.sort4),A + LD A,L + LD (MenuView.sort5),A + PUSH IY + POP HL + LD BC,PANEL.FILEMASK + ADD HL,BC + LD DE,MenuView.Tfilter + LD C,STRLEN("*.* ");0x0C + SUB A +.L4 LDI + CP (HL) + JR NZ,.L4 + LD A,C + OR A + JR Z,.L6 + LD B,A + LD A,' ' +.L5 LD (DE),A + INC DE + DJNZ .L5 +.L6 + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 138,26,190,186 + W_TEXT 16,6,COLORP.HIGHGRAY,"Brief" + W_TEXT 110,6,COLORP.HIGHGRAY,"\xFE CTRL+F1" +.view1 EQU $ - STRLEN ("v CTRL+F1v") + W_TEXT 16,20,COLORP.HIGHGRAY,"Full" + W_TEXT 110,20,COLORP.HIGHGRAY,"\xFE CTRL+F2" +.view2 EQU $ - STRLEN ("v CTRL+F2 ") + W_TEXT 16,34,COLORP.HIGHGRAY,"Tree" + W_TEXT 110,34,COLORP.HIGHGRAY,"\xFE CTRL+F8" +.view3 EQU $ - STRLEN("v CTRL+F8v") + W_HORIZLINE 4,47,182 + W_TEXT 16,54,COLORP.HIGHGRAY,"All files" + W_TEXT 110,54,COLORP.HIGHGRAY,"\xFE CTRL+F10" +.filt1 EQU $ - STRLEN("v CTRL+F10v") + W_TEXT 16,68,COLORP.HIGHGRAY,"Execute files" + W_TEXT 110,68,COLORP.HIGHGRAY,"\xFE CTRL+F11" +.filt2 EQU $ - STRLEN("v CTRL+F11v") + W_TEXT 16,82,COLORP.HIGHGRAY,"*.* " +.Tfilter EQU $ - STRLEN("*.* ") + W_TEXT 110,82,COLORP.HIGHGRAY,"\xFE" +.filt3 EQU $ - 2 + W_TEXT 16,96,COLORP.HIGHGRAY,"Filter..." + W_TEXT 110,96,COLORP.HIGHGRAY,"\xFE CTRL+F12" + W_HORIZLINE 4,109,182 + W_TEXT 16,116,COLORP.HIGHGRAY,"Name" + W_TEXT 110,116,COLORP.HIGHGRAY,"\xFE CTRL+F3" +.sort1 EQU $ - STRLEN("v CTRL+F3v") + W_TEXT 16,130,COLORP.HIGHGRAY,"Extension" + W_TEXT 110,130,COLORP.HIGHGRAY,"\xFE CTRL+F4" +.sort2 EQU $ - STRLEN("v CTRL+F4v") + W_TEXT 16,144,COLORP.HIGHGRAY,"Date" + W_TEXT 110,144,COLORP.HIGHGRAY,"\xFE CTRL+F5" +.sort3 EQU $ - STRLEN("v CTRL+F5v") + W_TEXT 16,158,COLORP.HIGHGRAY,"Size" + W_TEXT 110,158,COLORP.HIGHGRAY,"\xFE CTRL+F6" +.sort4 EQU $ - STRLEN("v CTRL+F6v") + W_TEXT 16,172,COLORP.HIGHGRAY,"Unsorted" + W_TEXT 110,172,COLORP.HIGHGRAY,"\xFE CTRL+F7" +.sort5 EQU $ - STRLEN("v CTRL+F7v") + W_END + LD HL,ViewTab + LD BC,3 << 8 | 12 + JP MenuWork + +MenuConfig: CALL ResInvert +.L2 SUB A + LD (MKeyFlg),A +.L1 CALL STORE_PANELFLAG + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 174,26,96,20 + W_TEXT 16,6,COLORP.HIGHGRAY,"Setup..." + W_END + LD HL,ConfigTab + LD BC,4 << 8 | 1 + JP MenuWork + +MenuAbout: CALL ResInvert +.L2 SUB A + LD (MKeyFlg),A +.L1 CALL STORE_PANELFLAG + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 222,26,112,20 + W_TEXT 16,6,COLORP.HIGHGRAY,"Version..." + W_END + LD HL,AboutTab + LD BC,5 << 8 | 1 +; HL - адрес таблицы активных зон +; B - текущий пункт меню +; C - количество пунктов подменю +MenuWork: LD (CurWTab),HL + LD A,C + LD (MaxLines),A + LD A,B + LD (CurrMenu),A + LD (PrevMenu),A + SUB A + LD (CurMLine),A + LD IX,(CurWTab) + CALL TestCoords + CALL TestInvert + JR NZ,MenuLoop + LD A,0 +MKeyFlg EQU $-1 + OR A + CALL NZ,SetMSelect +MenuLoop: LD IX,0x0000 +CurWTab EQU $-2 + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,MenuLoop + LD A,B + OR A + JR NZ,MenuLoop + LD HL,MenuLoop + PUSH HL + LD A,E + CP 0x1B + JR Z,MenuKExt + CP 0x0D + JP Z,ChangeSet + CP ' ' + JP Z,ChangeSet + OR A + RET NZ + LD A,D + CP SC.X4 + JR Z,MenuLeft + CP SC.X6 + JP Z,MenuRight + CP SC.X8 + JP Z,MenuUp + CP SC.X2 + JP Z,MenuDown + CP SC.X7 + JP Z,MenuHome + CP SC.X1 + JP Z,MenuEnd + RET + +TestInvert: LD HL,(CurWTab) + LD DE,FORMTABL.FLAGH + ADD HL,DE + LD A,0 +MaxLines EQU $-1 + LD B,A + LD C,0 + LD DE,FORMTABL.SIZE +.L2 BIT FORMTABL.B_FIRENOINV,(HL) + JR Z,.L1 + LD A,C + SET 7,A + LD (CurMLine),A +.L1 INC C + ADD HL,DE + DJNZ .L2 + LD A,0 +CurMLine EQU $-1 + BIT 7,A + RES 7,A + LD (CurMLine),A + RET + +; Выход по Esc +MenuKExt: POP DE + WINDOWCLOSE + JP PullLoop + +; временное сохранение флагов вывода панели +STORE_PANELFLAG LD A,(IY + PANEL.SORTFLAG) + LD (PANEL_SORTFLAG),A + LD A,(IY + PANEL.VIEWFLAG) + LD (PANEL_VIEWFLAG),A + RET + +MenuExit: LD A,0 +PANEL_VIEWFLAG EQU $-1 + CP (IY+PANEL.VIEWFLAG) + JP NZ,InitPanel + LD A,0 +PANEL_SORTFLAG EQU $-1 + CP (IY+PANEL.SORTFLAG) + JP NZ,InitPanel + JP SetInvert + +MenuLeft: + WINDOWCLOSE + LD A,(CurrMenu) + DEC A + JP P,.L1 + LD A,MainPullMenu-1 +.L1 LD (CurrMenu),A + JP PullEnter + +MenuRight: + WINDOWCLOSE + LD A,(CurrMenu) + INC A + CP MainPullMenu + JR NZ,.L1 + SUB A +.L1 LD (CurrMenu),A + JP PullEnter + +MenuUp: CALL TestInvert + JR Z,.L1 + LD A,(MaxLines) + DEC A + RET Z + CALL ResMSelect + LD A,(CurMLine) + OR A + JR NZ,.L2 +.L1 LD A,(MaxLines) +.L2 DEC A + LD (CurMLine),A + JP SetMSelect + +MenuDown: CALL TestInvert + JR Z,.L1 + LD A,(MaxLines) + DEC A + RET Z + CALL ResMSelect + LD A,(MaxLines) + LD B,A + LD A,(CurMLine) + INC A + CP B + JR NZ,.L2 +.L1 SUB A +.L2 LD (CurMLine),A + JP SetMSelect + +MenuHome: CALL TestInvert + JR Z,.L1 + LD A,(CurMLine) + OR A + RET Z + CALL ResMSelect +.L1 SUB A + LD (CurMLine),A + JP SetMSelect + +MenuEnd: CALL TestInvert + JR Z,.L1 + LD A,(MaxLines) + LD B,A + LD A,(CurMLine) + INC A + CP B + RET Z + CALL ResMSelect +.L1 LD A,(MaxLines) + DEC A + LD (CurMLine),A + JP SetMSelect + +ResMSelect: LD HL,ResSelect1 + JR SetMSelect.L1 + +SetMSelect: LD HL,SetSelect1 +.L1 PUSH HL + LD A,(CurMLine) + LD L,A + LD H,0x00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,(CurWTab) + ADD HL,BC + PUSH HL + POP IX + RET + +ChangeSet: CALL TestInvert + JP Z,MenuKExt + LD A,(CurMLine) + LD L,A + LD H,0x00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,(CurWTab) + ADD HL,BC + PUSH HL + POP IX + LD C,(IX + FORMTABL.FIRELEFTL) ; запуск по левой кнопке + LD B,(IX + FORMTABL.FIRELEFTH) + LD A,B + OR C + RET Z + BIT FORMTABL.B_EXECNORETLMB,(IX + FORMTABL.FLAGL) ; запуск без возврата + JR Z,.L1 + POP AF +.L1 PUSH BC + BIT FORMTABL.B_INV1,(IX + FORMTABL.FLAGL) + CALL NZ,ResSelect1 + CALL ResSelect2 + BIT FORMTABL.B_CLOSEWIN,(IX + FORMTABL.FLAGH) + RET Z + WINDOWCLOSE + RET + +; brief +ChView1: RES VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + RES VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP MenuExit + +; full +ChView2: SET VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + RES VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP MenuExit + +; tree +ChView3: LD A,(TreeFlag) + OR A + JP NZ,MenuExit + RES VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + SET VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP MenuExit + +; all files +ChFilt1: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,MenuExit + RES SORTFLAG.B_EXEC,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_FILTER,(IY+PANEL.SORTFLAG) + JP MenuExit + +; execute files +ChFilt2: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,MenuExit + SET SORTFLAG.B_EXEC,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_FILTER,(IY+PANEL.SORTFLAG) + JP MenuExit + +; filter +ChFilt3: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,MenuExit + RES SORTFLAG.B_EXEC,(IY+PANEL.SORTFLAG) + SET SORTFLAG.B_FILTER,(IY+PANEL.SORTFLAG) + JP MenuExit + +; name +ChSort1: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,MenuExit + SET SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + JP MenuExit + +; extension +ChSort2: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,MenuExit + RES SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + SET SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + JP MenuExit + +; date +ChSort3: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,MenuExit + RES SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + SET SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + JP MenuExit + +; size +ChSort4: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,MenuExit + RES SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + SET SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + JP MenuExit + +; unsorted +ChSort5: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,MenuExit + LD A,(IY+PANEL.SORTFLAG) + AND SORTFLAG.MASKH + LD (IY+PANEL.SORTFLAG),A + JP MenuExit + +;[]==========================================================[] +Brief: LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + RET Z + RES VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + RES VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP InitPanel + +Full: BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + RET NZ + SET VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + RES VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP InitPanel + +Tree: LD A,(TreeFlag) + OR A + RET NZ + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + RES VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + SET VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP InitPanel + +AllFiles: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + LD A,(IY+PANEL.SORTFLAG) + AND SORTFLAG.MASKEXECFILTER + RET Z + RES SORTFLAG.B_EXEC,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_FILTER,(IY+PANEL.SORTFLAG) + JP InitPanel + +ExeFiles: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + BIT SORTFLAG.B_EXEC,(IY+PANEL.SORTFLAG) + RET NZ + SET SORTFLAG.B_EXEC,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_FILTER,(IY+PANEL.SORTFLAG) + JP InitPanel + +NameS: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + BIT SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + RET NZ + SET SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + JP InitPanel + +Extention: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + BIT SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + RET NZ + RES SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + SET SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + JP InitPanel + +Data: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + BIT SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + RET NZ + RES SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + SET SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + JP InitPanel + +Size: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + BIT SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + RET NZ + RES SORTFLAG.B_NAME,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_EXT,(IY+PANEL.SORTFLAG) + RES SORTFLAG.B_DATE,(IY+PANEL.SORTFLAG) + SET SORTFLAG.B_SIZE,(IY+PANEL.SORTFLAG) + JP InitPanel + +UnSort: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + LD A,(IY+PANEL.SORTFLAG) + AND SORTFLAG.MASK + RET Z + LD A,(IY+PANEL.SORTFLAG) + AND SORTFLAG.MASKH + LD (IY+PANEL.SORTFLAG),A + JP InitPanel + +;[]==========================================================[] +RefreshTree: LD A,(TreeFlag) + OR A + JR Z,RfTree1 + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JR NZ,RfTree1 + PUSH IY + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 CALL RfTree1 + POP IY + RET + +RfTree1: LD HL,BegDIR + PUSH IY + SPDSS DSSF.CHDIR + POP IY + RET C + LD HL,TreeName + PUSH IY + SPDSS DSSF.DELETE,,0 + POP IY + RES VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + SET VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP InitPanel + +;[]==========================================================[] +NewFilter: CALL ResInvert +.L1 LD HL,SetInvert + PUSH HL + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 208,81,224,62 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 98,3,COLORI.WHITE,"Filter" + W_BUTTON 32,42,72,14 + W_TEXT 60,45,COLORP.HIGHGRAY,"Ok" + W_BUTTON 120,42,72,14 + W_TEXT 140,45,COLORP.HIGHGRAY,"Cancel" + W_TEXT 16,25,COLORP.HIGHGRAY,"New filter:" + W_BORDER 70,22,134,12 + W_FILL 72,23,130,10,COLORI.WHITE + W_END + PUSH IY + POP HL + LD BC,PANEL.FILEMASK + ADD HL,BC + LD DE,CurFilt + SUB A + LD C,A +.L3 LDI + CP (HL) + JR NZ,.L3 + LD A,C + NEG + LD (FiltLen),A + LD IX,FilterStr + LD HL,FilterTab + CALL InputLine + WINDOWCLOSE + RET C + LD A,(FiltLen) + OR A + RET Z + LD HL,CurFilt + LD DE,SelMask + CALL MakeMask + RET NC + PUSH IY + POP HL + LD DE,PANEL.FILEMASK + ADD HL,DE + EX DE,HL + LD HL,CurFilt + LD A,(FiltLen) + LD B,A +.L2 LD A,(HL) + CALL CorrBigChar + LD (DE),A + INC HL + INC DE + DJNZ .L2 + SUB A + LD (DE),A + LD A,(IY+PANEL.SORTFLAG) + AND SORTFLAG.MASK + SET SORTFLAG.B_FILTER,A + LD (IY+PANEL.SORTFLAG),A + POP HL + JP InitPanel + +FilterStr: DEFB 0x0C,0x00,0x00,0x00 +FiltLen: DEFB 0x00 + DEFW 0x011A,0x006A + DEFW 0x0068 + DEFB 0xF0 +CurFilt: DUPL 0x0D,0x00 + +;[]==========================================================[] +LeftDrive: CALL ResInvert + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 32,92,224,36 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 86,3,COLORI.WHITE,"Left drive" + W_END + LD HL,LeftTab + LD DE,DriveTab + LD BC,0x0020 + LDIR + LD IX,LeftPanel + LD HL,0x0032 + JP ChangeDrv + +LeftTab: DEFW 0x0000,0x0020,0x0000,0x0100,0x20,0x0000,DriveExit,0x0000 + DEFW 0x0100,0x0280,0x0000,0x0100,0x20,0x0000,DriveExit,0x0000 + +RightDrive: CALL ResInvert + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 352,92,224,36 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 86,3,COLORI.WHITE,"Right drive" + W_END + LD HL,RightTab + LD DE,DriveTab + LD BC,0x0020 + LDIR + LD IX,RightPanel + LD HL,0x0172 + JR ChangeDrv + +RightTab: DEFW 0x0000,0x0160,0x0000,0x0100,0x20,0x0000,DriveExit,0x0000 + DEFW 0x0240,0x0280,0x0000,0x0100,0x20,0x0000,DriveExit,0x0000 + +ChangeDrv: PUSH IY + PUSH IX + POP IY + LD IX,BegDrive + LD A,(NUM_DEVICES) + ADD A,A + LD C,A + ADD A,A + ADD A,A + ADD A,A + ADD A,C + SUB 11*0x12 + NEG + SRL A + ADD A,L + LD E,A + LD A,H + ADC A,0x00 + LD D,A + LD HL,Drive + LD (HL),'A' + LD BC,0x0070 + LD A,(NUM_DEVICES) +.Drive1 PUSH AF + PUSH IX + PUSH HL + PUSH DE + PUSH BC + LD A,0x80 + CALL PrnTxtLnIFF + POP BC + POP DE + POP HL + POP IX + LD A,E + SUB 0x06 + LD (IX+0x00),A + LD A,D + SBC A,0x00 + LD (IX+0x01),A + LD A,E + ADD A,0x12 + LD E,A + JR NC,.L1 + INC D +.L1 LD A,E + SUB 0x06 + LD (IX+0x02),A + LD A,D + SBC A,0x00 + LD (IX+0x03),D + LD A,IXL + ADD A,0x10 + LD IXL,A + JR NC,.L2 + INC IXH +.L2 INC (HL) + POP AF + DEC A + JR NZ,.Drive1 + LD (IX+0x00),0x00 + LD (IX+0x01),0x80 + LD A,(IY + PANEL.CURRPATH) + SUB 'A' + LD (CurDrive),A + CALL SetDriveInv +DriveLoop: LD IX,DriveTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,DriveLoop + LD A,B + OR A + JR NZ,DriveLoop + LD A,E + CP 0x1B + JR Z,DriveExit + CP 0x0D + JR Z,DriveEnter + OR A + JR Z,DriveLoop1 + LD A,(NUM_DEVICES) + LD C,A + LD A,E + RES 5,A + SUB 'A' + JR C,DriveLoop + CP C + JR NC,DriveLoop + LD (CurDrive),A + JR DriveEnter + +DriveLoop1: LD HL,DriveLoop + PUSH HL + LD A,D + CP 0x54 + JR Z,DriveLeft + CP 0x56 + JR Z,DriveRight + RET + +DriveExit: + WINDOWCLOSE + POP IY + JP SetInvert + +DriveLeft: LD A,(NUM_DEVICES) + DEC A + RET Z + LD A,(CurDrive) + OR A + JR NZ,.L1 + LD A,(NUM_DEVICES) +.L1 DEC A + PUSH AF + CALL ResDriveInv + POP AF + LD (CurDrive),A + JP SetDriveInv + +DriveRight: LD A,(NUM_DEVICES) + CP 0x01 + RET Z + LD B,A + LD A,(CurDrive) + INC A + CP B + JR NZ,.L1 + SUB A +.L1 PUSH AF + CALL ResDriveInv + POP AF + LD (CurDrive),A + JP SetDriveInv + +DriveMouse: LD IX,BegDrive + LD C,(IX+0x00) + LD B,(IX+0x01) + OR A + SBC HL,BC + LD BC,0x0012 + LD A,0xFF +.L1 INC A + SBC HL,BC + JR NC,.L1 + JR SetDrive + +DriveEnter: LD A,(CurDrive) +SetDrive: LD HL,NewDrive + ADD A,'A' + LD (HL),A + LD (IY+PANEL.CURRPATH),0x00 + WINDOWCLOSE + EX (SP),IY + CALL SetInvert + EX (SP),IY + LD HL,NewDrive + CALL NewDIRECTORY + ld a,0 +AutoActivatePanel EQU $-1 + and a + jr nz,.old + bit 7,(IY+0x00) + jp z,.chPanel + push ix + pop hl + jr .readDir + +.chPanel: pop iy + jp ChPanel + +.old: LD HL,LeftPanel + BIT 7,(HL) + JR NZ,.readDir + LD HL,RightPanel +.readDir: LD DE,PANEL.CURRPATH + ADD HL,DE + SPDSS DSSF.CHDIR + POP IY + RET + +ResDriveInv: LD DE,0x4F80 ; TODO + LD A,(CurDrive) + JR DriveInvert + +SetDriveInv: LD DE,0x804F ; TODO + LD A,(CurDrive) +DriveInvert: LD L,A + LD H,0x00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,BegDrive + ADD HL,BC + PUSH HL + POP IX + LD L,(IX + FORMTABL.XMINL) + LD H,(IX + FORMTABL.XMINH) + LD C,(IX + FORMTABL.YMINL) + LD B,(IX + FORMTABL.YMINH) + LD A,(IX + FORMTABL.XMAXL) + SUB (IX + FORMTABL.XMINL) + EX AF,AF' + LD A,(IX + FORMTABL.YMAXL) + SUB (IX + FORMTABL.YMINL) + LD IXH,A + EX AF,AF' + SRL A + LD IXL,A + JP InvertRectan + +CurDrive: DEFB 0x00 +Drive: DEFB " ",0 + + IF PLUGS_ENABLE +GetPlugins: LD HL,WorkBuffer + 0x300 ; буфер сохранения текущего пути + SPDSS DSSF.CURDIR + LD HL,StackTree + LD (.CURRNAME),HL + LD HL,FLXDir ; путь до диры с плагинами + SPDSS DSSF.CHDIR + LD HL,FLXExt + LD DE,WorkBuffer + 0x200 + PUSH DE + SPDSS DSSF.F_FIRST,0, DIR.M_Archive + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly + POP HL + RET C +.L1 CALL .ADDFILENAME + LD DE,WorkBuffer + 0x200 + PUSH DE + SPDSS DSSF.F_NEXT + POP HL + JR NC,.L1 + LD HL,(.CURRNAME) + LD DE,StackTree + AND A + SBC HL,DE + LD A,L + SRL H + RRA + SRL H + RRA + SRL H + RRA ; A-количество найденых плагинов + LD HL,StackTree + LD DE,WorkBuffer + 0x200 + EXX + LD HL,.ADR00 + LD BC,7 + EXX +; уложить адрес текста +.L2 PUSH DE + EXX + POP DE + LD (HL),E + INC HL + LD (HL),D + ADD HL,BC + EXX + LD BC,8 + LDIR + EX DE,HL + LD (HL),B + INC HL + EX DE,HL + DEC A + JR NZ,.L2 +; генерация меню запуска плагина + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 300,20,108,166 + W_FILL 4,2,100,10,COLORI.BLUE + W_TEXT 40,3,COLORI.WHITE,"Plugins" + W_ADRTEXT 16,14,COLORP.HIGHGRAY,0 +.ADR00 EQU $-2 + W_ADRTEXT 16,28,COLORP.HIGHGRAY,0 +.ADR01 EQU $-2 + W_ADRTEXT 16,42,COLORP.HIGHGRAY,0 +.ADR02 EQU $-2 + W_ADRTEXT 16,56,COLORP.HIGHGRAY,0 +.ADR03 EQU $-2 + W_ADRTEXT 16,70,COLORP.HIGHGRAY,0 +.ADR04 EQU $-2 + W_ADRTEXT 16,84,COLORP.HIGHGRAY,0 +.ADR05 EQU $-2 + W_ADRTEXT 16,98,COLORP.HIGHGRAY,0 +.ADR06 EQU $-2 + W_ADRTEXT 16,112,COLORP.HIGHGRAY,0 +.ADR07 EQU $-2 + W_ADRTEXT 16,126,COLORP.HIGHGRAY,0 +.ADR08 EQU $-2 + W_ADRTEXT 16,140,COLORP.HIGHGRAY,0 +.ADR09 EQU $-2 + W_ADRTEXT 16,154,COLORP.HIGHGRAY,0 +.ADR10 EQU $-2 + W_BUTTON 30,176,72,14 + W_TEXT 50,179,COLORP.HIGHGRAY,"Cancel" + W_END +.Loop LD IX,PluginsTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,.Loop + LD A,B +; AND 0x3F +; JR Z,SetupLoop0 + BIT 4,B + JR NZ,.Loop +; BIT 5,B +; JR Z,SetupLoop +; LD HL,SetupLoop +; PUSH HL +; LD A,D +; AND 0x7F +; CP SC.R +; JP Z,InputRED +; CP SC.G +; JP Z,InputGREEN +; CP SC.B +; JP Z,InputBLUE + RET + +.ADDFILENAME LD DE,FFIRST.Name + ADD HL,DE + LD DE,0 +.CURRNAME EQU $-2 + LD BC,8 + LDIR + LD (.CURRNAME),DE + RET + +SelectPlugin +.NUM00 +.NUM01 +.NUM02 +.NUM03 +.NUM04 +.NUM05 +.NUM06 +.NUM07 +.NUM08 +.NUM09 +.NUM10 +.CANCEL + JR $ + +FLXDir: DZ "C:\\FN\\FLX" +FLXExt: DZ "*.FLX" + ENDIF diff --git a/fnmouse.a80 b/fnmouse.a80 new file mode 100644 index 0000000..d93e2a1 --- /dev/null +++ b/fnmouse.a80 @@ -0,0 +1,498 @@ + +; LAST UPDATE: 20.04.2025 savelij + +;[]----------------------------------------------------------[] +ResFire: LD A,(MouseFlag) + OR A + RET Z +RsFire1 CALL TestCMOS + SPMOUSE MOUSEF.READ_STATE + OR A + RET Z + JR RsFire1 + +;[]----------------------------------------------------------[] +; Проверка координат мыши по таблице +; На вход: +; IX - Адрес таблицы +TestCoords: CALL TestCMOS + SPMOUSE MOUSEF.READ_STATE + EX AF,AF' + LD BC,0x0000 +.PrvTabl EQU $-2 + LD A,IXL + CP C + JR NZ,.L2 + LD A,IXH + CP B + JR Z,.L3 +.L2 LD (.PrvTabl),IX + CALL ResMInvert + LD BC,ResFire + PUSH BC + SUB A + LD (RunFlag),A + JR .L4 + +.L3 LD A,0x01 + LD (RunFlag),A + EX AF,AF' + OR A + JR NZ,.L4 + PUSH HL + LD BC,0x0000 +.PrMousX EQU $-2 + OR A + SBC HL,BC + POP HL + JR NZ,.L4 + EX DE,HL + PUSH HL + LD BC,0x0000 +.PrMousY EQU $-2 + OR A + SBC HL,BC + POP HL + EX DE,HL + RET Z +.L4 LD (.PrMousX),HL + LD (.PrMousY),DE +CoordLp LD C,(IX+FORMTABL.XMINL) ; 00 + LD B,(IX+FORMTABL.XMINH) ; 01 + OR A + SBC HL,BC + ADD HL,BC + JP C,NxtCrds + LD C,(IX+FORMTABL.XMAXL) ; 02 + LD B,(IX+FORMTABL.XMAXH) ; 03 + SBC HL,BC + ADD HL,BC + JP NC,NxtCrds + LD C,(IX+FORMTABL.YMINL) ; 04 + LD B,(IX+FORMTABL.YMINH) ; 05 + OR A + EX DE,HL + SBC HL,BC + ADD HL,BC + EX DE,HL + JP C,NxtCrds + LD C,(IX+FORMTABL.YMAXL) ; 06 + LD B,(IX+FORMTABL.YMAXH) ; 07 + EX DE,HL + SBC HL,BC + ADD HL,BC + EX DE,HL + JP NC,NxtCrds + LD C,A + LD A,(MouseFlag) + OR A + LD A,C + JR Z,CoordL1 + BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,SetSelect1 +CoordL1 BIT FORMTABL.B_STATICINV,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,SetSelect2 + LD C,0x00 +RunFlag EQU $-1 + DEC C + JP NZ,NxtCrds1 + LD C,A + LD A,(MouseFlag) + OR A + RET Z + LD A,C + OR A ; нет огня + JR Z,Execute1 + BIT 0,A + JR Z,Execute2 + BIT FORMTABL.B_BUTTON,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,PushButton + CCF + RET NC + OR A + BIT FORMTABL.B_WORKBUTTON,(IX+FORMTABL.FLAGL) ; 08 ; рабочая кнопка + RET NZ + LD C,(IX+FORMTABL.FIRELEFTL) ; 0C ; запуск по левой кнопке + LD B,(IX+FORMTABL.FIRELEFTH) ; 0D + LD A,B + OR C + JP Z,NxtCrds1 + BIT FORMTABL.B_EXECNORETLMB,(IX+FORMTABL.FLAGL) ; 08 ; запуск без возврата + JR Z,.L1 + POP AF +.L1 PUSH BC + BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,ResSelect1 + CALL ResSelect2 + OR A + BIT FORMTABL.B_CLOSEWIN,(IX+FORMTABL.FLAGH) ; 09 + RET Z + WINDOWCLOSE + RET + +Execute1 LD C,(IX+FORMTABL.FIRENOL) ; 0A ; запуск без огня + LD B,(IX+FORMTABL.FIRENOH) ; 0B + LD A,B + OR C + JR Z,NxtCrds1 + BIT FORMTABL.B_EXECONLY,(IX+FORMTABL.FLAGL) ; 08 ; запуск без возврата + JR Z,.L1 + POP AF +.L1 PUSH BC + BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,ResSelect1 + CALL ResSelect2 + OR A + BIT FORMTABL.B_EXECNOPRESS,(IX+FORMTABL.FLAGL) ; 08 + RET Z + WINDOWCLOSE + RET + +Execute2 LD C,(IX+FORMTABL.FIRERIGHTL) ; 0E ; запуск по правой кнопке + LD B,(IX+FORMTABL.FIRERIGHTH) ; 0F + LD A,B + OR C + JR Z,NxtCrds1 + BIT FORMTABL.B_EXECNORETRMB,(IX+FORMTABL.FLAGL) ; 08 ; запуск без возврата + JR Z,.L1 + POP AF +.L1 PUSH BC + BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,ResSelect1 + CALL ResSelect2 + OR A + BIT FORMTABL.B_WORKBUTTON,(IX+FORMTABL.FLAGH) ; 09 + RET Z + WINDOWCLOSE + RET + +NxtCrds LD C,A + LD A,(MouseFlag) + OR A + LD A,C + JR Z,NxtCrds0 + BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,ResSelect1 +NxtCrds0 BIT FORMTABL.B_STATICINV,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,SetSelect2 +NxtCrds1 LD BC,FORMTABL.SIZE;0x0010 + ADD IX,BC + BIT FORMTABL.B_ENDTABL,(IX+FORMTABL.XMINH) ; конец таблицы? + JP Z,CoordLp + OR A + RET + +ResMInvert PUSH IX + PUSH HL + PUSH DE + PUSH AF + LD BC,FORMTABL.SIZE;0x0010 +ResCrds RES FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 + RES 6,(IX+FORMTABL.FLAGH) ; 09 + ADD IX,BC + BIT FORMTABL.B_ENDTABL,(IX+FORMTABL.XMINH) + JR Z,ResCrds + POP AF + POP DE + POP HL + POP IX + RET + +SetSelect1 BIT FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 + RET NZ + SET FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 + PUSH AF + PUSH HL + PUSH DE + PUSH IX + LD L,(IX+FORMTABL.XMINL) ; 00 + LD H,(IX+FORMTABL.XMINH) ; 01 + LD C,(IX+FORMTABL.YMINL) ; 04 + LD B,(IX+FORMTABL.YMINH) ; 05 + LD A,(IX+FORMTABL.XMAXL) ; 02 + SUB (IX+FORMTABL.XMINL) ; 00 + EX AF,AF' + LD A,(IX+FORMTABL.YMAXL) ; 06 + SUB (IX+FORMTABL.YMINL) ; 04 + LD IXH,A + EX AF,AF' + SRL A + LD IXL,A + LD DE,(COLORP.HIGHGRAY + COLORI.BLACK) << 8 | (COLORP.BLUE + COLORI.WHITE);0x804F + CALL InvertRectan + POP IX + PUSH IX +NxCrds1 LD BC,FORMTABL.SIZE;0x0010 + ADD IX,BC + BIT FORMTABL.B_ENDTABL,(IX+FORMTABL.XMINH) ; 01 ; проверка конца таблицы? + JR NZ,NxCrds2 + BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 + CALL NZ,ResSelect1 + JR NxCrds1 + +NxCrds2 POP IX + POP DE + POP HL + POP AF + RET + +ResSelect1 BIT FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 + RET Z + RES FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 + PUSH IX + PUSH HL + PUSH DE + LD L,(IX+FORMTABL.XMINL) ; 00 + LD H,(IX+FORMTABL.XMINH) ; 01 + LD C,(IX+FORMTABL.YMINL) ; 04 + LD B,(IX+FORMTABL.YMINH) ; 05 + LD A,(IX+FORMTABL.XMAXL) ; 02 + SUB (IX+FORMTABL.XMINL) ; 00 + EX AF,AF' + LD A,(IX+FORMTABL.YMAXL) ; 06 + SUB (IX+FORMTABL.YMINL) ; 04 + LD IXH,A + EX AF,AF' + SRL A + LD IXL,A + LD DE,(COLORP.BLUE + COLORI.WHITE) << 8 | (COLORP.HIGHGRAY + COLORI.BLACK);0x4F80 + CALL InvertRectan + POP DE + POP HL + POP IX + RET + +SetSelect2 BIT 6,(IX+FORMTABL.FLAGH) ; 09 + RET NZ + SET 6,(IX+FORMTABL.FLAGH) ; 09 + PUSH IX + PUSH HL + PUSH DE + PUSH AF + LD L,(IX+FORMTABL.XMINL) ; 00 + LD H,(IX+FORMTABL.XMINH) ; 01 + LD C,(IX+FORMTABL.YMINL) ; 04 + LD B,(IX+FORMTABL.YMINH) ; 05 + LD A,(IX+FORMTABL.XMAXL) ; 02 + SUB (IX+FORMTABL.XMINL) ; 00 + EX AF,AF' + LD A,(IX+FORMTABL.YMAXL) ; 06 + SUB (IX+FORMTABL.YMINL) ; 04 + LD IXH,A + EX AF,AF' + SRL A + LD IXL,A + LD DE,(COLORP.HIGHGRAY + COLORI.BLACK) << 8 | (COLORP.BLUE + COLORI.WHITE);0x804F + CALL InvertRectan + POP AF + POP DE + POP HL + POP IX + RET + +ResSelect2 PUSH HL + PUSH DE + PUSH IX + LD IX,(TestCoords.PrvTabl) + LD BC,FORMTABL.SIZE;0x0010 +NxCrds3 BIT FORMTABL.B_STATICINV,(IX+FORMTABL.FLAGL) ; 08 + JR NZ,ResSel22 + ADD IX,BC + BIT FORMTABL.B_ENDTABL,(IX+FORMTABL.XMINH) ; 01 ; проверка конца таблицы? + JR NZ,ResSel2E + JR NxCrds3 + +ResSel22 BIT 6,(IX+FORMTABL.FLAGH) ; 09 + JR Z,ResSel2E + RES 6,(IX+FORMTABL.FLAGH) ; 09 + LD L,(IX+FORMTABL.XMINL) ; 00 + LD H,(IX+FORMTABL.XMINH) ; 01 + LD C,(IX+FORMTABL.YMINL) ; 04 + LD B,(IX+FORMTABL.YMINH) ; 05 + LD A,(IX+FORMTABL.XMAXL) ; 02 + SUB (IX+FORMTABL.XMINL) ; 00 + EX AF,AF' + LD A,(IX+FORMTABL.YMAXL) ; 06 + SUB (IX+FORMTABL.YMINL) ; 04 + LD IXH,A + EX AF,AF' + SRL A + LD IXL,A + LD DE,(COLORP.BLUE + COLORI.WHITE) << 8 | (COLORP.HIGHGRAY + COLORI.BLACK);0x4F80 + CALL InvertRectan +ResSel2E POP IX + POP DE + POP HL + RET + +PushButton PUSH HL + PUSH DE + LD L,(IX+FORMTABL.XMINL) ; 00 + LD H,(IX+FORMTABL.XMINH) ; 01 + LD E,(IX+FORMTABL.YMINL) ; 04 + LD D,(IX+FORMTABL.YMINH) ; 05 + LD A,(IX+FORMTABL.XMAXL) ; 02 + SUB (IX+FORMTABL.XMINL) ; 00 + LD C,A + LD A,(IX+FORMTABL.YMAXL) ; 06 + SUB (IX+FORMTABL.YMINL) ; 04 + LD B,A + PUSH HL + PUSH DE + PUSH BC + CALL PutPushBut + LD A,0x0A + LD (PausePh+1),A +PushLp PUSH IX + CALL TestRun + POP IX +PushLp1 + SPMOUSE MOUSEF.READ_STATE + OR A + JR Z,PushButtEx + BIT 0,A + JR Z,PushButtEx + LD C,(IX+FORMTABL.XMINL) ; 00 + LD B,(IX+FORMTABL.XMINH) ; 01 + OR A + SBC HL,BC + ADD HL,BC + JR C,PushButtEx + LD C,(IX+FORMTABL.XMAXL) ; 02 + LD B,(IX+FORMTABL.XMAXH) ; 03 + SBC HL,BC + ADD HL,BC + CCF + JR C,PushButtEx + EX DE,HL + LD C,(IX+FORMTABL.YMINL) ; 04 + LD B,(IX+FORMTABL.YMINH) ; 05 + OR A + SBC HL,BC + ADD HL,BC + JR C,PushButtEx + LD C,(IX+FORMTABL.YMAXL) ; 06 + LD B,(IX+FORMTABL.YMAXH) ; 07 + SBC HL,BC + CCF + JR C,PushButtEx +PausePh LD A,0x00 + OR A + JR Z,PushLp + DEC A + LD (PausePh+1),A + HALT + JR PushLp1 + +PushButtEx POP BC + POP DE + POP HL + PUSH AF + CALL PutPopBut + POP AF + POP DE + POP HL + RET + +TestRun BIT FORMTABL.B_WORKBUTTON,(IX+FORMTABL.FLAGL) ; 08 + RET Z + LD C,(IX+FORMTABL.FIRELEFTL) ; 0C + LD B,(IX+FORMTABL.FIRELEFTH) ; 0D + PUSH BC + RET + +PutPushBut LD A,COLORP.WHITE | COLORI.BLACKGRAY;0xF7 + JR PutButt + +PutPopBut LD A,COLORP.BLACKGRAY | COLORI.WHITE;0x7F +PutButt PUSH IY + EX AF,AF' + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + GETPORT WINSP.Y_PORT + PUSH AF + SRL H + RR L + SET 6,H + LD IYL,E + SRL C + DEC C + DEC C + LD A,C + LD (ButLen3),A + LD A,B + SUB 0x02 + LD (ButLen1),A + LD (ButLen2),A + ADD A,IYL + INC A + LD IYH,A + EX AF,AF' + PUSH AF + AND 0xF0 + LD E,A + RRCA + RRCA + RRCA + RRCA + OR E + LD D,A + POP AF + AND 0x0F + LD E,A + RLCA + RLCA + RLCA + RLCA + OR E + LD E,A + DI + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + LD (HL),E + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +ButLen1 EQU $-1 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),E + INC HL + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +ButLen3 EQU $-1 + ACCEL ACCELCMD.OFF + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL + LD (HL),E + ACCEL ACCELCMD.OFF + LD A,IYH + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL + LD (HL),D + ACCEL ACCELCMD.OFF + LD B,0x00 + ADD HL,BC + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + LD (HL),D + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +ButLen2 EQU $-1 + ACCEL ACCELCMD.FILL_VERT + LD (HL),D + ACCEL ACCELCMD.OFF + LD (HL),D + EI + POP AF + SETPORT WINSP.Y_PORT,,0 + POP AF + SETPORT WINSP.CPU1,,0 + POP IY + RET diff --git a/fnpanel.a80 b/fnpanel.a80 new file mode 100644 index 0000000..7c8182c --- /dev/null +++ b/fnpanel.a80 @@ -0,0 +1,1239 @@ + +; LAST UPDATE: 27.04.2025 savelij + +;[]----------------------------------------------------------[] +PrintDisks LD L,(IY + PANEL.XL) + LD H,(IY + PANEL.XH) + INC HL + INC HL + LD (.DiskX1),HL + LD DE,0x0004 + ADD HL,DE + LD (.DiskX2),HL + LD DE,0x0006 + ADD HL,DE + LD (.NameX),HL + LD A,'A' + LD (.DISK),A + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + LD A,(HL) + SUB 'A' + LD C,A + LD A,(NUM_DEVICES) + LD B,A +.L1 LD A,C + OR A + LD DE,(COLORP.BLACK + COLORI.BLACKGRAY) << 8 | (COLORP.BLACKGRAY + COLORI.YELLOW) + JR Z,.L2 + LD DE,(COLORP.BLACK + COLORI.HIGHGRAY) << 8 | (COLORP.HIGHGRAY + COLORI.BLACK) +.L2 LD A,D + LD (.ColRect),A + LD A,E + LD (.ColName),A + MAKEWINDOW WINSUBOBJ.WOBIND + W_BUTTON 0,30,28,12 +.DiskX1 EQU $ - 8 +.LnDiskX EQU $ - 4 + W_FILL 0,32,20,8,COLORI.BLACK +.DiskX2 EQU $ - 9 +.ColRect EQU $ - 1 + W_TEXT 0,32,COLORI.BLACK," " +.NameX EQU $ - 7 +.ColName EQU $ - 3 +.DISK EQU $ - 2 + W_END + LD HL,(.DiskX1) + LD DE,(.LnDiskX) + ADD HL,DE + LD (.DiskX1),HL + LD HL,(.DiskX2) + ADD HL,DE + LD (.DiskX2),HL + LD HL,(.NameX) + ADD HL,DE + LD (.NameX),HL + LD HL,.DISK + INC (HL) + DEC C + DJNZ .L1 + RET + +;[]----------------------------------------------------------[] +PrintPath BIT PANELFLAG.B_PRNDOSPATH,(IY + PANEL.PANELFLAG) + LD A,COLORP.BLACK + COLORI.BLACK + LD C,COLORP.BLACK + COLORI.WHITE + JR NZ,.L1 + LD A,COLORP.BLACK + COLORI.BLACKGRAY + LD C,COLORP.BLACKGRAY + COLORI.WHITE +.L1 LD (.HeadCol),A + LD A,C + LD (.PathCol),A + LD L,(IY + PANEL.XL) + LD H,(IY + PANEL.XH) + LD (.PanelHX),HL + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 0,46,310,12,COLORI.BLACK +.PanelHX EQU $ - 9 +.HeadCol EQU $ - 1 + W_END + + PUSH IY + POP HL + LD BC,PANEL.CURRPATH + ADD HL,BC + PUSH HL + LD DE,WorkBuffer + SUB A +.L2 LDI + CP (HL) + JR NZ,.L2 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L3 + LD (DE),A + INC DE +.L3 POP HL + SUB A + LD (DE),A + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,.PrPath1 + LD BC,0x000D + SBC HL,BC + BIT SORTFLAG.B_FILTER,(IY + PANEL.SORTFLAG) + JR NZ,.L4 + LD HL,NORMmask +.L4 LDIR +.PrPath1 LD IX,300 + LD HL,(.PanelHX) + LD DE,WorkBuffer + LD BC,0x0006 + ADD HL,BC + EX DE,HL + LD C,0x30 + LD A,0x00 +.PathCol EQU $-1 + JP PrnRangPathL + +;[]----------------------------------------------------------[] +PrintDOSPath PUSH IY + POP HL + LD BC,PANEL.CURRPATH + ADD HL,BC + LD DE,WorkBuffer + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L2 + LD (DE),A + INC DE +.L2 LD A,'>' + LD (DE),A + INC DE + SUB A + LD (DE),A + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 4,231,246,8,COLORI.HIGHGRAY + W_END + + LD IX,246 + LD HL,WorkBuffer + LD DE,250 + LD BC,231 + LD A,COLORP.HIGHGRAY + COLORI.BLACK + JP PrnRangPathR + +;[]----------------------------------------------------------[] +PrnFileInfo BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JP NZ,PrnTreeInfo ;Tree + LD A,(IY + PANEL.MFL) + OR (IY + PANEL.MFH) + JP NZ,PrnSelInfo + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 + LD DE,WorkBuffer + LD BC,FileHDR.SIZE + CALL MoveBytes + POP AF + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + FileHDR.SIZE;0x18 + LD B,38 + LD A,' ' +.L2 LD (HL),A + INC HL + DJNZ .L2 + LD (HL),0x00 + LD IX,WorkBuffer + LD HL,WorkBuffer+1 + LD A,(HL) + OR A + JR Z,PrntFI + LD DE,WorkBuffer + FileHDR.SIZE;0x18 + LD B,0x08 +.EFI0 LD A,(HL) + CP ' ' + JR Z,.EFI1 + INC HL + LD (DE),A + INC DE + DJNZ .EFI0 +.EFI1 LD A,B + OR A + JR Z,.L3 +.L4 INC HL + DJNZ .L4 +.L3 LD B,0x03 + INC HL + LD A,(HL) + CP ' ' + JR NZ,.EFI3 +.EFI2 LD A,(HL) + INC HL + LD (DE),A + INC DE + DJNZ .EFI2 +.EFI3 LD A,B + OR A + JR Z,.EndFI + LD A,'.' + LD (DE),A + INC DE +.EFI4 LD A,(HL) + INC HL + LD (DE),A + INC DE + DJNZ .EFI4 +.EndFI LD DE,WorkBuffer + FileHDR.SIZE + FileHDR.Zero;0x18 + 0x0D + CALL GetFileLen + LD DE,WorkBuffer + FileHDR.SIZE + FileHDR.SIZE;0x18+0x18 + CALL GetData + INC DE + CALL GetTime +PrntFI LD HL,WorkBuffer + FileHDR.SIZE;0x18 + LD E,(IY+PANEL.XL) + LD D,(IY+PANEL.XH) + INC DE + INC DE + INC DE + INC DE + LD BC,215 + LD A,COLORP.HIGHGRAY + COLORI.BLACK + JP PrnTxtLnNorm + +GetFileLen BIT DIR.B_Dir,(IX + FileHDR.Attr) + JP NZ,PDirectory + RES DIR.B_Device,(IX + FileHDR.Attr) + LD HL,GetLenExit + LD (ChooseStringFormat.address),HL + LD L,(IX + FileHDR.SizeBytes) + LD H,(IX + FileHDR.SizeBytes + 1) + EXX + LD L,(IX + FileHDR.SizeBytes + 2) + LD H,(IX + FileHDR.SizeBytes + 3) + EXX + JP ConvNumTxt32_Shared + +GetLenExit CP 0x30 + JR Z,.L1 + SET DIR.B_Device,(IX + FileHDR.Attr) +.L1 BIT DIR.B_Device,(IX + FileHDR.Attr) + JR NZ,.L2 + LD A,0x20 +.L2 LD (DE),A + INC DE + RET + +PDirectory LD HL,DirText + LD BC,0x000A + LDIR + RET + +DirText DEFB " " + +; Дата +GetData EX DE,HL + LD A,(IX + FileHDR.Date) + CALL Get8Bit + LD (HL),'.' + INC HL + LD A,(IX + FileHDR.Month) + CALL Get8Bit + LD (HL),'.' + INC HL + LD A,(IX + FileHDR.Year) ;Год + CALL Get8Bit + EX DE,HL + RET + +; Время +GetTime EX DE,HL + LD A,(IX + FileHDR.Hours) ;Часы + CALL Get8Bit + LD (HL),':' + INC HL + LD A,(IX + FileHDR.Minutes) + CALL Get8Bit + EX DE,HL + RET + +Get8Bit LD B,'0' - 1 +.L1 INC B + SUB 10 + JR NC,.L1 + ADD A,10 + LD (HL),B + INC HL + ADD A,'0' + LD (HL),A + INC HL + RET + +PrnTreeInfo + IF TREE_REZID + CALL RESIDENT.MakeTreePath + ELSE + CALL MakeTreePathR + ENDIF + EX DE,HL + PUSH IY + POP HL + LD BC,PANEL.CURRPATH + ADD HL,BC + INC HL + INC HL + EX DE,HL + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + CALL PrintPath + BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + JP NZ,PrintDOSPath + RET + +PrnSelInfo LD L,(IY+PANEL.MBL1) + LD H,(IY+PANEL.MBH1) + LD C,(IY+PANEL.MBL2) + LD B,(IY+PANEL.MBH2) + LD A,(IY+PANEL.MBL3) ; [ ] FAT32 + LD DE,WorkBuffer + CALL ConvNumTxt40 ; [ ] fat32 + LD HL,CrSizeT + LD BC,0x000A + LDIR + LD L,(IY+PANEL.MFL) + LD H,(IY+PANEL.MFH) + CALL ConvNumTxt16 + LD HL,CrSelT + LD BC,0x000F + LDIR + LD A,E + LD DE,WorkBuffer+0x100 + LD C,A + SUB 38 + NEG + SRL A + LD B,A + JR Z,.PrSelI1 + LD A,0x20 +.L1 LD (DE),A + INC E + DJNZ .L1 +.PrSelI1 LD HL,WorkBuffer + LDIR + LD A,38 + SUB E + JR Z,.PrSelI2 + LD B,A + LD A,0x20 +.L2 LD (DE),A + INC E + DJNZ .L2 +.PrSelI2 SUB A + LD (DE),A + LD HL,WorkBuffer+0x100 + LD E,(IY+PANEL.XL) + LD D,(IY+PANEL.XH) + INC DE + INC DE + INC DE + INC DE + LD BC,215 + LD A,COLORP.HIGHGRAY + COLORI.BLACK + JP PrnTxtLnNorm + +CrSizeT DEFB " bytes in " +CrSelT DEFB " selected files" + +;[]----------------------------------------------------------[] +PrintDIR LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + JR NZ,PrnDIRECT + LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + INC HL + INC HL + LD (.ClrDIR1),HL + LD HL,308 + LD DE,141 + LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + JR Z,.L1 + LD HL,292 + LD DE,149 +.L1 LD (.H),HL + LD (.V),DE + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 0,60,0,0,COLORI.PANEL +.ClrDIR1 EQU $ - 9 +.H EQU $ - 5 +.V EQU $ - 3 + W_END + RET + +PrnDIRECT BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + JP NZ,PrintFULL + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,PrintTREE +; Краткий список + PUSH IY + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 + LD DE,WorkBuffer + LD BC,0x33 * FileHDR.SIZE;0x18 + CALL MoveBytes + POP AF + SETPORT WINSP.CPU1,,0 + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD HL,WorkBuffer + PUSH HL + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD HL,PositTABLeft + JR Z,.L2 + LD HL,PositTABRight +.L2 LD B,0x33 +.PrnDIR1 LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD C,(HL) + INC HL + EX (SP),HL + PUSH HL + PUSH BC + LD B,0x0C + CALL PrintName + POP BC + POP HL + LD DE,0x0019 + ADD HL,DE + LD A,(HL) + DEC HL + OR A + JR Z,PrnDIR2 + EX (SP),HL + DJNZ .PrnDIR1 + JR PrnDIRe + +PrnDIR2 DEC B + JR Z,PrnDIRe + LD HL,EmptyFile + EX (SP),HL +PrnDIR3 LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD C,(HL) + INC HL + EX (SP),HL + PUSH HL + PUSH BC + LD B,0x0C + CALL PrintName + POP BC + POP HL + EX (SP),HL + DJNZ PrnDIR3 +PrnDIRe POP HL + POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + POP IY + RET + +EmptyFile DB 0x00," ",0x01," ",0x00 + +; Подробный список +PrintFULL PUSH IY + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 + LD DE,WorkBuffer + LD BC,0x12 * FileHDR.SIZE;0x18 + CALL MoveBytes + POP AF + SETPORT WINSP.CPU1,,0 + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD HL,WorkBuffer + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD DE,8 + JR Z,.L2 + LD DE,328 +.L2 LD BC,0x123F +.PrnDIRp PUSH HL + PUSH DE + PUSH BC + PUSH HL + LD DE,WorkBuffer+0x200 + LD BC,0x000D + LDIR + LD A,0x01 + LD (DE),A + INC DE + POP IX + BIT DIR.B_Dir,(IX + FileHDR.Attr) + CALL NZ,PutDIRTxt + CALL Z,GetFileLen + LD A,0x01 + LD (DE),A + INC DE + CALL GetData + LD A,0x01 + LD (DE),A + INC DE + CALL GetTime + POP BC + POP DE + POP HL + PUSH DE + PUSH BC + PUSH HL + LD HL,WorkBuffer+0x200 + LD B,0x26 + CALL PrintName + POP HL + LD BC,0x0019 + ADD HL,BC + POP BC + LD A,C + ADD A,0x08 + LD C,A + POP DE + LD A,(HL) + DEC HL + OR A + JR Z,.PrnDIRp2 + DJNZ .PrnDIRp + JR .PrnDIRpE + +.PrnDIRp2 DEC B + JR Z,.PrnDIRpE + LD HL,EmptyFile1 +.PrnDIRp3 PUSH HL + PUSH DE + PUSH BC + LD B,0x26 + CALL PrintName + POP BC + LD A,C + ADD A,0x08 + LD C,A + POP DE + POP HL + DJNZ .PrnDIRp3 +.PrnDIRpE POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + POP IY + RET + +PutDIRTxt EX AF,AF' + LD HL,DIRt1 + LD A,(IX + FileHDR.Name) + CP '.' + JR Z,.L1 + LD HL,DIRt2 +.L1 LD BC,0x000A + LDIR + EX AF,AF' + RET + +DIRt1 DEFB 0x20,0x10,"UP--DIR",0x11 +DIRt2 DEFB 0x20,0x10,"SUB-DIR",0x11 + +EmptyFile1 DEFB 0x00," " + DEFB 0x01," " + DEFB 0x01," " + DEFB 0x01," " + DEFB 0x01," " + +; Дерево каталогов +PrintTREE + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + LD B,0x18 + LD A,0x80 + PUSH HL +.L2 LD (HL),A + INC L + DJNZ .L2 + POP DE + LD HL,0x4000 + LD C,(IY+PANEL.FFL) + LD B,(IY+PANEL.FFH) + LD A,B + OR C + JR Z,.PrDIRb2 +.PrDIRb1 PUSH BC + LD A,(HL) + AND 0x7F + LD E,A + LD A,(HL) + LD (DE),A + LD BC,0x0010 + ADD HL,BC + POP BC + DEC BC + LD A,B + OR C + JR NZ,.PrDIRb1 +.PrDIRb2 LD DE,WorkBuffer+0x100 + LD BC,0x12*0x10 + CALL MoveBytes + POP AF + SETPORT WINSP.CPU1,,0 + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD HL,WorkBuffer+0x100 + LD DE,10 + JR Z,.L3 + LD DE,330 +.L3 LD BC,0x123F +.PrnDIRt PUSH HL + PUSH DE + PUSH BC + LD DE,WorkBuffer+0x300 + CALL MakeTreeLine + POP BC + POP DE + POP HL + PUSH DE + PUSH BC + PUSH HL + LD HL,WorkBuffer+0x300 + LD B,0x24 + PUSH IY + CALL PrintName + POP IY + POP HL + LD BC,0x000F + ADD HL,BC + POP BC + LD A,C + ADD A,0x08 + LD C,A + POP DE + LD A,(HL) + INC HL + INC A + JR Z,.PrnDIRt2 + DEC B + JP NZ,.PrnDIRt + JR .PrnDIRtE + +.PrnDIRt2 DEC B + JR Z,.PrnDIRtE + LD HL,EmptyFile2 + PUSH IY +.PrnDIRt3 PUSH HL + PUSH DE + PUSH BC + LD B,0x24 + CALL PrintName + POP BC + LD A,C + ADD A,0x08 + LD C,A + POP DE + POP HL + DJNZ .PrnDIRt3 + POP IY +.PrnDIRtE POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + RET + +MakeTreeLine SUB A + LD (DE),A + INC E + LD C,(HL) + INC HL + LD A,(HL) + INC HL + LD IXL,A + LD A,' ' + LD (DE),A + INC E + INC C + DEC C ; r.C=0 "\" + JR Z,.MTreeL2 + PUSH HL + LD A,C + AND 0x7F + LD B,A + LD HL,WorkBuffer + PUSH HL + LD L,A + LD (HL),C + POP HL + DEC B + JR Z,.MTreeL1 +.MTreeL0 INC HL + BIT 7,(HL) + LD A,0xB3 + JR Z,.L1 + LD A,' ' +.L1 LD (DE),A + INC E + BIT VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) + JR NZ,.L2 + LD A,' ' + LD (DE),A + INC E +.L2 DJNZ .MTreeL0 +.MTreeL1 BIT 7,C + LD A,0xC3 + JR Z,.L3 + LD A,0xC0 +.L3 LD (DE),A + INC E + BIT VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) + JR NZ,.L4 + LD A,0xC4 + LD (DE),A + INC E +.L4 POP HL +.MTreeL2 LD A,IXL + BIT 1,A + JR Z,.MTreeL3 + BIT VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) + JR NZ,.L5 + DEC E +.L5 LD A,0xDD + LD (DE),A + INC E + LD A,IXL +.MTreeL3 BIT 0,A + LD A,0x02 + JR NZ,.L6 + INC A +.L6 LD (DE),A + INC E + SUB A +.L7 LDI + CP (HL) + JR NZ,.L7 + LD A,0x03 + LD (DE),A + INC E + LD A,IXL + BIT 1,A + JR Z,.MTreeL5 + LD A,0xDE + LD (DE),A + INC E +.MTreeL5 LD A,0x28 + SUB E + JR Z,.MTreeL6 + JR C,.MTreeL6 + LD B,A + LD A,0x20 +.L8 LD (DE),A + INC E + DJNZ .L8 +.MTreeL6 LD A,IXL + BIT 0,A + RET Z + LD E,0x26 + LD A,0x02 + LD (DE),A + INC E + LD A,0x11 + LD (DE),A + RET + +EmptyFile2 DEFB 0x00 + DB 0x24 DUP ' ' + +InsPrnColor LD HL,PrnINKd1 ; INK буфер + LD DE,PrnPAPd1 ; PAPER буфер + PUSH BC + LD A,B + PUSH AF + AND 0x0F ; INK + LD C,A + RLCA + RLCA + RLCA + RLCA + OR C + CPL + LD B,0x08 +.L1 LD (HL),A + INC HL + DJNZ .L1 + LD B,A + POP AF + AND 0xF0 ; PAPER + LD C,A + RRCA + RRCA + RRCA + RRCA + OR C + XOR B ; XOR с INK + LD B,0x08 +.L2 LD (DE),A + INC DE + DJNZ .L2 + POP BC + LD HL,PrnINKd2 ; INK буфер + LD DE,PrnPAPd2 ; PAPER буфер + LD A,C + PUSH AF + AND 0x0F ; INK + LD C,A + RLCA + RLCA + RLCA + RLCA + OR C + CPL + LD B,0x08 +.L3 LD (HL),A + INC HL + DJNZ .L3 + LD B,A + POP AF + AND 0xF0 ; PAPER + LD C,A + RRCA + RRCA + RRCA + RRCA + OR C + XOR B ; XOR с INK + LD B,0x08 +.L4 LD (DE),A + INC DE + DJNZ .L4 + RET + +PrnINKd1 DB 8 DUP 0 +PrnPAPd1 DB 8 DUP 0 +PrnINKd2 DB 8 DUP 0 +PrnPAPd2 DB 8 DUP 0 + +PrintName LD IYL,C ; Y координата + LD A,(HL) + INC HL + PUSH DE + EXX + LD HL,PrnPAPd1 ; INK буфер + LD DE,PrnINKd1 ; PAPER буфер + OR A + JR Z,.L1 + LD HL,PrnPAPd2 ; INK буфер + LD DE,PrnINKd2 ; PAPER буфер +.L1 POP BC + SRL B + RR C + SET 6,B + EXX + DI + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + LD A,B + LD C,L ; Адрес строки + LD B,H + ACCEL ACCELCMD.SET_BUFFER + LD H,0x08 + ACCEL ACCELCMD.OFF +.L2 EX AF,AF' + LD A,(BC) + INC BC + CP 0x03 + JR NZ,.L3 + EXX + LD HL,PrnPAPd1 ; INK буфер + LD DE,PrnINKd1 ; PAPER буфер + EXX + JR .L5 + +.L3 CP 0x02 + JR NZ,.L4 + EXX + LD HL,PrnPAPd2 ; INK буфер + LD DE,PrnINKd2 ; PAPER буфер + EXX +.L5 LD A,(BC) + INC BC +.L4 PUSH BC + CP 0x01 + LD B,0x04 + JR NZ,.L6 + LD B,0x02 + LD A,0x20 +.L6 LD L,A + LD H,HIGH (IFFFONT_RAW)-0xC0 + LD E,(HL) + INC H + LD A,(HL) + ADD A,HIGH (IFFFONT_RAW)-0xC0 + LD D,A + LD HL,0x0008 + EX DE,HL +.L7 + ACCEL ACCELCMD.COPY + LD A,(HL) + ACCEL ACCELCMD.OFF + EXX + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY + OR (HL) + EX DE,HL + XOR (HL) + ACCEL ACCELCMD.COPY_VERT + LD (BC),A + ACCEL ACCELCMD.OFF + EX DE,HL + INC BC + EXX + ADD HL,DE + DJNZ .L7 + POP BC + EX AF,AF' + DEC A + JR NZ,.L2 + POP AF + SETPORT WINSP.CPU0,,0 + EI + RET + +PositTABLeft +.COUNT := 63 + REPT 17 + DW 10 + DB .COUNT +.COUNT := .COUNT + 8 + ENDM +.COUNT := 63 + REPT 17 + DW 114 + DB .COUNT +.COUNT := .COUNT + 8 + ENDM +.COUNT := 63 + REPT 17 + DW 218 + DB .COUNT +.COUNT := .COUNT + 8 + ENDM + +PositTABRight +.COUNT := 63 + REPT 17 + DW 330 + DB .COUNT +.COUNT := .COUNT + 8 + ENDM +.COUNT := 63 + REPT 17 + DW 434 + DB .COUNT +.COUNT := .COUNT + 8 + ENDM +.COUNT := 63 + REPT 17 + DW 538 + DB .COUNT +.COUNT := .COUNT + 8 + ENDM + +;[]----------------------------------------------------------[] +SetInvert BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + RET Z + LD HL,(COLORP.PANEL + COLORI.FILES) << 8 | (COLORP.PANEL + COLORI.SELECTFILES) + LD BC,(COLORP.INVERTPAPER + COLORI.INVERTINK) << 8 | (COLORP.INVERTPAPER + COLORI.INVSELFILES) + JR PrnInvert + +ResInvert BIT PANELFLAG.B_PRNDOSPATH,(IY + PANEL.PANELFLAG) + RET Z + LD HL,(COLORP.INVERTPAPER + COLORI.INVERTINK) << 8 | (COLORP.INVERTPAPER + COLORI.INVSELFILES) + LD BC,(COLORP.PANEL + COLORI.FILES) << 8 | (COLORP.PANEL + COLORI.SELECTFILES) +PrnInvert LD A,(IY + PANEL.EFL) + OR (IY + PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JP NZ,PrnTreeInv + PUSH HL + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0xC000 + LD E,(HL) + POP AF + SETPORT WINSP.CPU1,,0 + POP HL + LD A,E + OR A + LD E,B + LD D,H + JR Z,.L2 + LD E,C + LD D,L +.L2 BIT VIEWFLAG.B_FULL,(IY + PANEL.VIEWFLAG) + JR NZ,PrnInvertP + LD L,(IY + PANEL.CFL) + LD H,(IY + PANEL.CFH) + LD C,L + LD B,H + ADD HL,HL + ADD HL,BC + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD BC,PositTABLeft + JR Z,.L3 + LD BC,PositTABRight +.L3 ADD HL,BC + PUSH DE + LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD C,(HL) + LD B,0x00 + EX DE,HL + POP DE + LD IX,8 << 8 + 48 + DEC HL + DEC HL + JP InvertRectan + +PrnInvertP LD L,(IY + PANEL.CFL) + LD H,(IY + PANEL.CFH) + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,0x003F + ADD HL,BC + LD C,L + LD B,0x00 + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,6 + JR Z,.L1 + LD HL,326 +.L1 LD IX,8 << 8 + 146 + JP InvertRectan + +PrnTreeInv PUSH HL + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + ADD HL,HL ; *10 + SET 6,H ; | 0x4000 + LD A,(HL) + EX AF,AF' + INC HL + LD A,(HL) + LD IXH,A + LD IXL,0xFF +.L2 INC IXL + INC HL + LD A,(HL) + OR A + JR NZ,.L2 + LD A,IXL + ADD A,A + ADD A,A + LD IXL,A + POP AF + SETPORT WINSP.CPU1,,0 + POP HL + LD A,IXH + OR A + LD E,B + LD D,H + JR Z,.L3 + LD E,C + LD D,L +.L3 LD L,(IY+PANEL.CFL) + LD H,(IY+PANEL.CFH) + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,0x003F + ADD HL,BC + LD C,L + LD B,0x00 + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD HL,0x0012 + JR Z,.L4 + LD HL,0x0152 +.L4 BIT VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) + JR Z,.PrTreeI + EX AF,AF' + OR A + JR Z,.PrTreeI1 + EX AF,AF' + LD A,IXH + OR A + JR Z,.PrTreeI + PUSH BC + LD C,0x08 + ADD HL,BC + POP BC +.PrTreeI EX AF,AF' +.PrTreeI1 PUSH BC + AND 0x7F + LD C,A + SLA C + RL B + SLA C + RL B + SLA C + RL B + ADD HL,BC + BIT VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) + JR NZ,.L5 + ADD HL,BC +.L5 POP BC + LD IXH,0x08 + JP InvertRectan diff --git a/fnprint.a80 b/fnprint.a80 new file mode 100644 index 0000000..ddd5c7f --- /dev/null +++ b/fnprint.a80 @@ -0,0 +1,620 @@ + +; LAST UPDATE: 20.02.2025 savelij + +;[]----------------------------------------------------------[] +; Процедура вывода текстовых строк на графический экран 640x256 +; с обрезанием левого края текста +; На вход: +; IX - Кол-во пикселей под вывод строки +; HL - адрес текстовой строки +; DE - позиция вывода по X +; BC - позиция вывода по Y +; A - цвет печати (7-4бит PAPER, 3-0бит INK) +; (конец строки - 0) +PrnRangPathL PUSH DE + PUSH BC + PUSH AF + DI + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + LD BC,0x0000 + LD D,HIGH (FONT_RAW)-0xC0 + PUSH HL + LD A,(HL) +PrRangL INC HL + LD E,A + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + LD A,(HL) + OR A + JR NZ,PrRangL + PUSH IX + POP HL + SBC HL,BC + LD C,L + LD B,H + POP HL + JR NC,PrRngLE + LD A,C + SUB 0x1A + LD IXL,A + LD A,B + SBC A,0x00 + LD IXH,A + LD A,(HL) + EX AF,AF' + INC HL + INC HL +PrRngL0 LD BC,0x0000 + INC HL + LD A,(HL) +PrRngL1 INC HL + LD E,A + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + LD A,(HL) + CP 0x5C + JR NZ,PrRngL1 + ADD IX,BC + JR NC,PrRngL0 + DEC HL + LD (HL),'.' + DEC HL + LD (HL),'.' + DEC HL + LD (HL),'\\' + DEC HL + LD (HL),':' + DEC HL + EX AF,AF' + LD (HL),A +PrRngLE POP AF + SETPORT WINSP.CPU0,,0 + EI + POP AF + POP BC + POP DE + JP PrnTxtLnIFF + +;[]----------------------------------------------------------[] +; Процедура вывода текстовых строк на графический экран 640x256 +; с обрезанием левого края текста +; На вход: +; IX - Кол-во пикселей под вывод строки +; HL - адрес текстовой строки +; DE - позиция вывода по X +; BC - позиция вывода по Y +; A - цвет печати (7-4бит PAPER, 3-0бит INK) +; (конец строки - 0) +PrnRangPathR PUSH AF + PUSH BC + PUSH DE + DI + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + LD BC,0x0000 + LD D,HIGH (FONT_RAW)-0xC0 + PUSH HL + LD A,(HL) +PrRangR INC HL + LD E,A + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + LD A,(HL) + OR A + JR NZ,PrRangR + PUSH IX + POP HL + SBC HL,BC + EX DE,HL + POP HL + JR NC,PrRngRE + LD A,E + SUB 0x1A + LD IXL,A + LD A,D + SBC A,0x00 + LD IXH,A + LD D,HIGH (FONT_RAW)-0xC0 + LD A,(HL) + EX AF,AF' + INC HL + INC HL +PrRngR0 LD BC,0x0000 + INC HL + LD A,(HL) +PrRngR1 INC HL + LD E,A + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + LD A,(HL) + CP 0x5C + JR NZ,PrRngR1 + ADD IX,BC + JR NC,PrRngR0 + DEC HL + LD (HL),'.' + DEC HL + LD (HL),'.' + DEC HL + LD (HL),'\\' + DEC HL + LD (HL),':' + DEC HL + EX AF,AF' + LD (HL),A + LD BC,0x0000 + PUSH HL + LD A,(HL) +PrRngR2 INC HL + LD E,A + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + LD A,(HL) + OR A + JR NZ,PrRngR2 + POP HL +PrRngRE POP AF + SETPORT WINSP.CPU0,,0 + EI + POP DE + EX DE,HL + OR A + SBC HL,BC + EX DE,HL + POP BC + POP AF + JP PrnTxtLnIFF + +;[]----------------------------------------------------------[] +; Процедура вывода текстовых строк на графический экран 640x256 +; с обрезанием левого края текста +; На вход: +; IX - Кол-во пикселей под вывод строки +; HL - адрес текстовой строки +; DE - центр вывода по X +; BC - позиция вывода по Y +; A - цвет печати (7-4бит PAPER, 3-0бит INK) +; (конец строки - 0) +PrnRangPathC PUSH BC + PUSH AF + PUSH DE + DI + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 +PrnRangC LD BC,0x0000 + LD D,HIGH (FONT_RAW)-0xC0 + PUSH HL + LD A,(HL) +PrRangC INC HL + LD E,A + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + LD A,(HL) + OR A + JR NZ,PrRangC + PUSH IX + POP HL + SBC HL,BC + EX DE,HL + POP HL + JR NC,PrRngCE + PUSH IX + LD A,E + SUB 0x1A + LD IXL,A + LD A,D + SBC A,0x00 + LD IXH,A + LD A,(HL) + EX AF,AF' + INC HL + INC HL + LD D,HIGH (FONT_RAW)-0xC0 +PrRngC0 LD BC,0x0000 + INC HL + LD A,(HL) +PrRngC1 INC HL + LD E,A + LD A,(DE) + ADD A,A + ADD A,C + LD C,A + LD A,B + ADC A,0x00 + LD B,A + LD A,(HL) + CP 0x5C + JR NZ,PrRngC1 + ADD IX,BC + JR NC,PrRngC0 + DEC HL + LD (HL),'.' + DEC HL + LD (HL),'.' + DEC HL + LD (HL),'\\' + DEC HL + LD (HL),':' + DEC HL + EX AF,AF' + LD (HL),A + POP IX + JR PrnRangC +PrRngCE POP AF + SETPORT WINSP.CPU0,,0 + EI + POP DE + EX DE,HL + SRL B + RR C + OR A + SBC HL,BC + EX DE,HL + POP AF + POP BC + JP PrnTxtLnIFF + +;[]----------------------------------------------------------[] +; Процедура вывода текстовых строк на графический экран 640x256; +; в режиме IFF шрифта +; На вход: +; HL - адрес текстовой строки +; DE - позиция вывода по X +; BC - позиция вывода по Y +; A - цвет печати (7-4бит PAPER, 3-0бит INK) +; (конец строки - 0) +PrnTxtLnIFF PUSH IY + LD IYL,C ; Y координата + LD B,A + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + PUSH AF + GETPORT WINSP.CPU1 + LD IYH,A + DI + EXX + SPMOUSE MOUSEF.REFRESH + EXX + CALL InsPrintColor + PUSH DE ; X координата + EXX + POP BC + SRL B + RR C + SET 6,B + LD HL,PrnPAPp ; PAPER буфер + LD DE,PrnINKp ; INK буфер + EXX + LD C,L ; Адрес строки + LD B,H +; Итак: +; BC - Aдрес строки +; 'HL - буфер PAPER +; 'DE - буфер INK +; 'BC - X координата печати в видео ОЗУ +; LY - Y координата печати + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x08 + ACCEL ACCELCMD.OFF + LD A,(BC) + INC BC + OR A + JR Z,PrnIFFe +PrnIFFloop LD L,A + LD H,HIGH (FONT_RAW)-0xC0 + PUSH BC + LD B,(HL) ; длина символа + INC H + LD E,(HL) + INC H + LD D,(HL) + LD HL,0x0008 + EX DE,HL + SETPORT WINSP.CPU1,0x50 +PrnIFFlp1 + ACCEL ACCELCMD.COPY + LD A,(HL) + ACCEL ACCELCMD.OFF + EXX + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY + OR (HL) + EX DE,HL + XOR (HL) + ACCEL ACCELCMD.COPY_VERT + LD (BC),A + ACCEL ACCELCMD.OFF + EX DE,HL + INC BC + EXX + ADD HL,DE + DJNZ PrnIFFlp1 + POP BC + LD A,IYH + SETPORT WINSP.CPU1,,0 + LD A,(BC) + INC BC + OR A + JR NZ,PrnIFFloop +PrnIFFe LD L,C ; Адрес строки + LD H,B + POP AF + SETPORT WINSP.CPU0,,0 + EI + POP AF + SETPORT WINSP.Y_PORT,,0 + POP IY + RET + +;[]----------------------------------------------------------[] +; Процедура вывода текстовых строк на графический экран 640x256; +; На вход: +; HL - адрес текстовой строки +; DE - позиция вывода по X +; BC - позиция вывода по Y +; A - цвет печати (7-4бит PAPER, 3-0бит INK) +; (конец строки - 0) +PrnTxtLnNorm PUSH IY + LD IYL,C ; Y координата + LD B,A + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + PUSH AF + GETPORT WINSP.CPU1 + LD IYH,A + DI + EXX + SPMOUSE MOUSEF.REFRESH + EXX + CALL InsPrintColor + PUSH DE ; X координата + EXX + POP BC + SRL B + RR C + SET 6,B + LD HL,PrnPAPp ; PAPER буфер + LD DE,PrnINKp ; INK буфер + EXX + LD C,L ; Адрес строки + LD B,H +; Итак: +; BC - Aдрес строки +; 'HL - буфер PAPER +; 'DE - буфер INK +; 'BC - X координата печати в видео ОЗУ +; LY - Y координата печати + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x08 + ACCEL ACCELCMD.OFF + LD A,(BC) + INC BC + OR A + JR Z,PrnNORe +PrnNORloop LD L,A + LD H,HIGH (IFFFONT_RAW)-0xC0 + PUSH BC + LD E,(HL) + INC H + LD A,(HL) + ADD A,HIGH (IFFFONT_RAW)-0xC0 + LD D,A + LD HL,0x0008 + EX DE,HL + SETPORT WINSP.CPU1,0x50 + LD B,0x04 +PrnNORlp1 + ACCEL ACCELCMD.COPY + LD A,(HL) + ACCEL ACCELCMD.OFF + EXX + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY + OR (HL) + EX DE,HL + XOR (HL) + ACCEL ACCELCMD.COPY_VERT + LD (BC),A + ACCEL ACCELCMD.OFF + EX DE,HL + INC BC + EXX + ADD HL,DE + DJNZ PrnNORlp1 + POP BC + LD A,IYH + SETPORT WINSP.CPU1,,0 + LD A,(BC) + INC BC + OR A + JR NZ,PrnNORloop +PrnNORe LD L,C ; Адрес строки + LD H,B + POP AF + SETPORT WINSP.CPU0,,0 + EI + POP AF + SETPORT WINSP.Y_PORT,,0 + POP IY + RET + +;[]----------------------------------------------------------[] +; Процедура вывода текстовых строк на графический экран 640x256; +; На вход: +; HL - адрес текстовой строки +; DE - позиция вывода по X +; C - позиция вывода по Y +; B - кол-во печатаемых символов +; A - цвет печати (7-4бит PAPER, 3-0бит INK) +; (конец строки - 0) +PrnTxtLnNormC PUSH IY + LD IYL,C ; Y координата + LD IYH,B ; кол-во симв + LD B,A + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + PUSH AF + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + DI + EXX + SPMOUSE MOUSEF.REFRESH + EXX + CALL InsPrintColor + PUSH DE ; X координата + EXX + POP BC + SRL B + RR C + SET 6,B + LD HL,PrnPAPp ; PAPER буфер + LD DE,PrnINKp ; INK буфер + EXX + LD C,L ; Адрес строки + LD B,H +; Итак: +; BC - Aдрес строки +; 'HL - буфер PAPER +; 'DE - буфер INK +; 'BC - X координата печати в видео ОЗУ +; LY - Y координата печати +; IN A,(PAGE0) + GETPORT WINSP.CPU0 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU0,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x08 + ACCEL ACCELCMD.OFF +PrnNORloopC LD A,(BC) + INC BC + LD L,A + LD H,HIGH (IFFFONT_RAW)-0xC0 + PUSH BC + LD E,(HL) + INC H + LD A,(HL) + ADD A,HIGH (IFFFONT_RAW)-0xC0 + LD D,A + LD HL,0x0008 + EX DE,HL + LD B,0x04 +PrnNORlp1c + ACCEL ACCELCMD.COPY + LD A,(HL) + ACCEL ACCELCMD.OFF + EXX + LD A,IYL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY + OR (HL) + EX DE,HL + XOR (HL) + ACCEL ACCELCMD.COPY_VERT + LD (BC),A + ACCEL ACCELCMD.OFF + EX DE,HL + INC BC + EXX + ADD HL,DE + DJNZ PrnNORlp1c + POP BC + DEC IYH + JR NZ,PrnNORloopC + POP AF + SETPORT WINSP.CPU0,,0 + EI + POP AF + SETPORT WINSP.CPU1,,0 + POP AF + SETPORT WINSP.Y_PORT,,0 + POP IY + RET + +InsPrintColor LD A,B + CP 0x00 +.PrvCOLp EQU $-1 + RET Z + LD (.PrvCOLp),A + AND 0x0F ; INK + LD C,A + RLCA + RLCA + RLCA + RLCA + OR C + EXX + LD HL,PrnINKp ; INK буфер + CPL + REPT 7 + LD (HL),A + INC HL + ENDM + LD (HL),A + EXX + LD A,B + AND 0xF0 ; PAPER + LD B,A + RRCA + RRCA + RRCA + RRCA + OR B + EXX + LD DE,PrnPAPp ; PAPER буфер + XOR (HL) ; XOR с INK + REPT 7 + LD (DE),A + INC DE + ENDM + LD (DE),A + EXX + RET + +PrnINKp DB 8 DUP 0 +PrnPAPp DB 8 DUP 0 diff --git a/fnsort.a80 b/fnsort.a80 new file mode 100644 index 0000000..aca2d73 --- /dev/null +++ b/fnsort.a80 @@ -0,0 +1,690 @@ + +; LAST UPDATE: 28.05.2025 savelij + +;[]----------------------------------------------------------[] +ReadDIR BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + IF TREE_REZID + JP NZ,RESIDENT.ReadTree + ELSE + JP NZ,ReadTreeR + ENDIF + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + PUSH IY + POP HL + LD BC,PANEL.EFL + ADD HL,BC + LD B,PANEL.FILEMASK - PANEL.EFL +.L5 LD (HL),0 + INC HL + DJNZ .L5 + BIT SORTFLAG.B_FILTER,(IY + PANEL.SORTFLAG) + JR NZ,.L2 + LD HL,NORMmask +.L2 LD DE,FILEmask + LD C,MASK_SIZE + LDIR + LD IX,0x0000 + LD HL,CPU3 + LD (AdrNxtFile),HL + LD B,0x08 + SUB A +.L3 LD (HL),A + INC HL + DJNZ .L3 + CALL FindFILES + LD E,IXL + LD D,IXH + LD HL,(AdrNxtFile) + LD B,0x08 + SUB A +.L4 LD (HL),A + INC HL + DJNZ .L4 + POP AF + SETPORT WINSP.CPU3,,0 + LD (IY + PANEL.EFL),E ;EQUIP FIL + LD (IY + PANEL.EFH),D + LD A,(IY + PANEL.SORTFLAG) + AND SORTFLAG.MASK + JP NZ,SortDIR + RET + +AdrNxtFile DEFW 0x0000 +FileAtribut DB DIR.M_Archive + \ + DIR.M_Dir + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly +NORMmask DEFB "*.*" + DB MASK_SIZE - STRLEN("*.*") DUP 0 +FILEmask DB MASK_SIZE DUP 0 + +FindFILES BIT SORTFLAG.B_FILTER,(IY + PANEL.SORTFLAG) + JR NZ,FindFILESm + LD HL,FILEmask + LD DE,WorkBuffer + LD A,(FileAtribut) + PUSH IY + PUSH IX + PUSH DE + SPDSS DSSF.F_FIRST,0 + POP HL + POP IX + POP IY + RET C +FndFILE CALL InsFileInfo + RET C + LD DE,WorkBuffer + PUSH IY + PUSH IX + PUSH DE + SPDSS DSSF.F_NEXT + POP HL + POP IX + POP IY + JR NC,FndFILE + RET + +FindFILESm LD HL,NORMmask + LD DE,WorkBuffer + LD A,(FileAtribut) + AND DIR.M_Archive + \ + DIR.M_Dir + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly + PUSH IY + PUSH IX + PUSH DE + SPDSS DSSF.F_FIRST,0 + POP HL + POP IX + POP IY + RET C +FFILEm1 LD A,(WorkBuffer + FFIRST.Attr);+0x20) + AND DIR.M_Dir;0x10 + CALL NZ,InsFileInfo + RET C + LD DE,WorkBuffer + PUSH IY + PUSH IX + PUSH DE + SPDSS DSSF.F_NEXT + POP HL + POP IX + POP IY + JR NC,FFILEm1 + LD HL,FILEmask + LD DE,WorkBuffer + LD A,(FileAtribut) + AND DIR.M_Archive + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly + PUSH IY + PUSH IX + PUSH DE + SPDSS DSSF.F_FIRST,0 + POP HL + POP IX + POP IY + RET C +FFILEm2 CALL InsFileInfo + RET C + LD DE,WorkBuffer + PUSH IY + PUSH IX + PUSH DE + SPDSS DSSF.F_NEXT + POP HL + POP IX + POP IY + JR NC,FFILEm2 + RET + +InsFileInfo EX DE,HL + LD HL,(AdrNxtFile) + LD BC,FileHDR.SIZE + ADD HL,BC + SBC HL,BC + EX DE,HL + RET C + SUB A + LD (DE),A + INC DE + PUSH HL + LD BC,FFIRST.Attr;0x20 + ADD HL,BC + LD B,(HL) ; FFIRST.Attr + INC HL + LD A,B + EX AF,AF' + LD A,(HL) ; FFIRST.Name + INC HL + LD C,(HL) ; FFIRST.Name + 1 + DEC HL +; проверка на поддиректорию + CP '.' + JR NZ,InsF1 + LD A,' ' + SUB C + JR NZ,InsF1 +; пропуск если имя "." +InsFext POP HL + OR A + RET + +InsF1 BIT DIR.B_Dir,B ; директория или файл? + JR NZ,InsF2 +; это файл + OR A + BIT SORTFLAG.B_EXEC,(IY + PANEL.SORTFLAG) + CALL NZ,TestExe + JR C,InsFext + LD B,FileHDR.Name_Size +.L1 LD A,(HL) + CALL CorrBigChar + LD (DE),A + INC HL + INC DE + DJNZ .L1 + LD A,0x01 + LD (DE),A + INC DE + LD B,FileHDR.Ext_Size +.L2 LD A,(HL) + CALL CorrBigChar + LD (DE),A + INC HL + INC DE + DJNZ .L2 + JR InsF3 + +; это дира +InsF2 LD BC,DIR.Name_Size + LDIR + LD A,0x01 + LD (DE),A + INC DE + LD C,DIR.Ext_Size + LDIR +InsF3 SUB A + LD (DE),A + INC DE + EX AF,AF' + LD (DE),A ; DIR.Attr + INC DE + POP HL + PUSH HL + LD BC,DIR.FileSize + ADD HL,BC + LD C,DIR.FileSize_Size + LDIR + POP HL + PUSH HL + LD C,DIR.WrtDate + ADD HL,BC + LD A,(HL) + AND 0x1F ; Число + LD (DE),A + INC DE + LD C,(HL) + INC HL + LD B,(HL) + LD H,B + LD L,C + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD A,H + AND 0x0F ; Месяц + LD (DE),A + INC DE + LD A,B + SRL A + ADD A,80 +.L1 SUB 100 + JR NC,.L1 + ADD A,100 ; Год + LD (DE),A + INC DE + POP HL + LD BC,DIR.WrtTime + ADD HL,BC + LD C,(HL) + INC HL + LD B,(HL) + LD A,B + AND 0xF8 + RRA + RRA + RRA + LD (DE),A ; Часы + INC DE + LD H,B + LD L,C + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD A,H + AND 0x3F + LD (DE),A ; Минуты + INC DE + LD (AdrNxtFile),DE + INC IX + RET + +TestExe PUSH HL + LD A,L + ADD A,8 + LD L,A + JR NC,.L1 + INC H +.L1 LD A,(HL) + INC HL + CP 'E' + JR NZ,TestExe1 + LD A,(HL) + INC HL + CP 'X' + JR NZ,TestExe1 + LD A,(HL) + CP 'E' + JR NZ,TestExe1 + POP HL + OR A + RET + +TestExe1 POP HL + PUSH HL + LD A,L + ADD A,8 + LD L,A + JR NC,.L1 + INC H +.L1 LD A,(HL) + INC HL + CP 'T' + JR NZ,TestExeC + LD A,(HL) + INC HL + CP 'R' + JR NZ,TestExeC + LD A,(HL) + CP 'D' + JR NZ,TestExeC + POP HL + OR A + RET + +TestExeC POP HL + SCF + RET + +; Процедура коррекции буквы к маленькой букве +CorrBigChar CP 'A' + RET C + CP 'Z' + 1 + JR NC,CorrCh1 + SET 5,A + RET + +CorrCh1 CP 0x80 + RET C + CP 0xA0 + RET NC + ADD A,0x20 + CP 0xB0 + RET C + ADD A,0x30 + RET + +; Процедура коррекции буквы к большой букве +CorrSmallChar CP 'a' + RET C + CP 'z' + 1 + JR NC,.CorrCh2 + RES 5,A + RET + +.CorrCh2 CP 0xA0 + RET C + CP 0xB0 + JR NC,.CorrCh3 + SUB 0x20 + RET + +.CorrCh3 CP 0xE0 + RET C + SUB 0x50 + RET + +;[]----------------------------------------------------------[] +SortDIR + GETPORT WINSP.CPU1 + LD C,A + GETPORT WINSP.CPU3 + LD B,A + PUSH BC + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD A,(RAMPAGES.BuffPg3) + SETPORT WINSP.CPU3,,0 + LD HL,CPU3 + LD (EndSort),HL + SUB A + LD (HL),A + INC HL + LD (HL),A + LD (BegSort),HL + LD A,(IY + PANEL.SORTFLAG) + RRA + LD HL,SortABC ; сортировка по Name CTRL+F3 + JR C,.SortBeg + RRA + LD HL,SortExt ; сортировка по Extension CTRL+F4 + JR C,.SortBeg + RRA + LD HL,SortData ; сортировка по Date CTRL+F5 + JR C,.SortBeg + LD HL,SortSize ; сортировка по Size CTRL+F6 +.SortBeg LD (.Scall1),HL + LD (.Scall2),HL + LD (.Scall3),HL + LD IX,CPU1 + 1 + LD HL,CPU1 + 1 +; проверка что в поддиректории + BIT DIR.B_Dir,(IX + FileHDR.Attr - 1) + JR Z,.SortStart +; если поддиректория то проверка на имя ".." + LD A,(HL) + CP '.' + JR NZ,.SortStart + INC HL + LD A,(HL) + DEC HL + CP '.' + JR NZ,.SortStart +; заносим диру ".." + PUSH HL + CALL 0 +.Scall3 EQU $-2 + LD BC,FileHDR.SIZE + LD HL,CPU3 + ADD HL,BC + LD (EndSort),HL + LD (HL),0 + INC HL + LD (HL),0 + LD (BegSort),HL + POP HL + ADD IX,BC + ADD HL,BC +; начало сортировки всего остального +.SortStart PUSH IX + PUSH HL +.SortDIRlp1 LD A,(HL) + OR A + JR Z,.SortDIRnxt + BIT DIR.B_Dir,(IX + FileHDR.Attr - 1) + PUSH HL + CALL NZ,0x0000 ; проверка для DIR +.Scall1 EQU $-2 + POP HL + LD BC,FileHDR.SIZE + ADD IX,BC + ADD HL,BC + JR .SortDIRlp1 + +.SortDIRnxt LD HL,(EndSort) + SUB A + LD (HL),A + INC HL + LD (HL),A + LD (BegSort),HL + POP HL + POP IX +.SortDIRlp2 LD A,(HL) + OR A + JR Z,.SortDIRext + BIT DIR.B_Dir,(IX + FileHDR.Attr - 1) + PUSH HL + CALL Z,0x0000 ; проверка для файла +.Scall2 EQU $-2 + POP HL + LD BC,FileHDR.SIZE + ADD IX,BC + ADD HL,BC + JR .SortDIRlp2 + +.SortDIRext LD HL,(EndSort) + LD B,0x08 + SUB A +.L3 LD (HL),A + INC HL + DJNZ .L3 + GETPORT WINSP.CPU1 + LD (RAMPAGES.BuffPg3),A + GETPORT WINSP.CPU3 + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,RAMPAGES.LEFTPANEL + JR Z,.L2 + LD HL,RAMPAGES.RIGHTPANEL +.L2 LD (HL),A + POP BC + LD A,B + SETPORT WINSP.CPU3,,0 + LD A,C + SETPORT WINSP.CPU1,,0 + RET + +BegSort DEFW 0x0000 +EndSort DEFW 0x0000 + +; сортировка по Name CTRL+F3 +SortABC EX DE,HL + LD HL,(BegSort) +.Sabc1 LD A,(HL) + OR A + JP Z,SortDIRins + PUSH DE + PUSH HL + LD B,12 +.Sabc2 LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.Sabc3 + INC DE + INC HL + DJNZ .Sabc2 +.Sabc3 POP HL + POP DE + JP C,SortDIRins + LD BC,FileHDR.SIZE + ADD HL,BC + JR .Sabc1 + +; сортировка по Extension CTRL+F4 +SortExt EX DE,HL + LD HL,(BegSort) +.Sext1 LD A,(HL) + OR A + JP Z,SortDIRins + PUSH DE + PUSH HL + LD BC,0x0009 + ADD HL,BC + EX DE,HL + ADD HL,BC + EX DE,HL + LD B,03 +.Sext2 LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.Sext4 + INC DE + INC HL + DJNZ .Sext2 + POP HL + POP DE + PUSH DE + PUSH HL + LD B,8 +.Sext3 LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.Sext4 + INC DE + INC HL + DJNZ .Sext3 +.Sext4 POP HL + POP DE + JP C,SortDIRins + LD BC,FileHDR.SIZE + ADD HL,BC + JR .Sext1 + +; сортировка по Date CTRL+F5 +SortData EX DE,HL + LD HL,(BegSort) +.Sdata1 LD A,(HL) + OR A + JP Z,SortDIRins + PUSH DE + PUSH HL + LD BC,0x0014 + ADD HL,BC + EX DE,HL + ADD HL,BC + EX DE,HL + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SdataE + DEC DE + DEC HL + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SdataE + DEC DE + DEC HL + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SdataE + INC HL + INC HL + INC HL + INC DE + INC DE + INC DE + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SdataE + INC DE + INC HL + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SdataE + POP HL + POP DE + PUSH DE + PUSH HL + LD B,12 +.Sdata2 LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SdataE + INC DE + INC HL + DJNZ .Sdata2 +.SdataE POP HL + POP DE + JR C,SortDIRins + LD BC,FileHDR.SIZE + ADD HL,BC + JR .Sdata1 + +; сортировка по Size CTRL+F6 +SortSize EX DE,HL + LD HL,(BegSort) +.Ssize1 LD A,(HL) + OR A + JR Z,SortDIRins + PUSH DE + PUSH HL + LD BC,0x0011 + ADD HL,BC + EX DE,HL + ADD HL,BC + EX DE,HL + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SsizeE + DEC DE + DEC HL + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SsizeE + DEC DE + DEC HL + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SsizeE + DEC DE + DEC HL + LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SsizeE + POP HL + POP DE + PUSH DE + PUSH HL + LD B,12 +.Ssize2 LD A,(DE) ;(DE) < (HL) "C" + CP (HL) ;(DE) >= (HL) "NC" + JR NZ,.SsizeE + INC DE + INC HL + DJNZ .Ssize2 +.SsizeE POP HL + POP DE + JR C,SortDIRins + LD BC,FileHDR.SIZE + ADD HL,BC + JR .Ssize1 + +SortDIRins DEC HL + DEC DE + PUSH DE + PUSH HL + EX DE,HL + LD HL,(EndSort) + PUSH HL + OR A + SBC HL,DE + LD B,H + LD C,L + POP DE + LD HL,FileHDR.SIZE + ADD HL,DE + LD (EndSort),HL + SUB A + LD (HL),A + INC HL + LD (HL),A + DEC HL + EX DE,HL + LD A,B + OR C + CALL NZ,MoveBytesUp + POP DE + POP HL + LD BC,FileHDR.SIZE + LDIR + RET diff --git a/fnsys.a80 b/fnsys.a80 new file mode 100644 index 0000000..1391926 --- /dev/null +++ b/fnsys.a80 @@ -0,0 +1,948 @@ + +; LAST UPDATE: 08.03.2025 savelij + +;[]-----------------------------------------------------------[] +;Процедура умножения (8*8bit) +;На вход: E*C +;На выход:HL-результат +Mult8 SUB A + LD L,A + LD H,A + LD D,A + CP C + RET Z + CP E + RET Z + LD H,C + LD B,0x08 +.L1 ADD HL,HL + JR NC,.L2 + ADD HL,DE +.L2 DJNZ .L1 + RET + +;Процедура умножения (16*8bit) +;На вход: DE*C +;На выход:A+HL-результат +Mult16X8 SUB A + LD L,A + LD H,A + CP C + RET Z + OR D + OR E + RET Z + LD A,C + LD BC,8 << 8 +.L1 ADD HL,HL + RLA + JR NC,.L2 + ADD HL,DE + ADC A,C +.L2 DJNZ .L1 + RET + +;Процедура умножения (16*16bit) +;На вход: DE*BC +;На выход:HL-результат +Mult16 LD HL,0x0000 + LD A,0x10 +.L1 RR B + RR C + JR NC,.L2 + ADD HL,DE +.L2 RL E + RL D + DEC A + JR NZ,.L1 + RET + +;Процедура умножения (32bit) +;На вход: DE*BC +;На выход:HL+DE-результат +Mult16X16 PUSH IX + EX DE,HL + LD E,0x00 + LD D,E + LD IXL,E + LD IXH,D + LD A,0x20 +.L1 ADD IX,IX + ADC HL,HL + RL E + RL D + JR NC,.L2 + ADD IX,BC + JR NC,.L2 + INC HL +.L2 DEC A + JR NZ,.L1 + LD E,IXL + LD D,IXH + POP IX + RET + +;Процедура умножения (32bit) +;На вход: HL+DE*BC +;На выход:HL+DE-результат +Mult32 PUSH IX + LD IX,0x0000 + LD A,0x20 + EX DE,HL +.L1 ADD IX,IX + ADC HL,HL + RL E + RL D + JR NC,.L2 + ADD IX,BC + JR NC,.L2 + INC HL +.L2 DEC A + JR NZ,.L1 + LD E,IXL + LD D,IXH + POP IX + RET + +;Процедура деления (16bit) +;На вход: BC/DE +;На выход:BC-результат +; HL-остаток +Divis16X16 LD A,D + OR E + RET Z + LD HL,0x0000 + LD A,B + LD B,0x10 +.L1 RL C + RLA + ADC HL,HL + SBC HL,DE + CCF + JR NC,.L4 +.L2 DJNZ .L1 + RL C + RLA + LD B,A + RET +.L3 RL C + RLA + ADC HL,HL + ADD HL,DE + JR C,.L2 +.L4 DJNZ .L3 + RL C + RLA + ADD HL,DE + LD B,A + RET + +;Процедура деления (24x16bit) +;На вход: H+L+C/DE +;На выход:A -результат +; HL-остаток +Divis24X16 LD A,D + CPL + LD D,A + LD A,E + CPL + LD E,A + INC DE + LD A,C + LD B,0x08 +.L1 ADD HL,HL + JR C,.L2 + ADD A,A + JR NC,.L4 + INC HL +.L4 PUSH HL + ADD HL,DE + JR NC,.L5 + EX (SP),HL + INC A +.L5 POP HL + DJNZ .L1 + RET +.L2 ADC A,A + JR NC,.L3 + INC HL +.L3 ADD HL,DE + DJNZ .L1 + RET + +;Процедура деления 32/16bit=16bit +;На вход: HL+DE/BC +;На выход:DE-результат +; HL-остаток +Divis32X16 LD A,0x10 +.L2 EX DE,HL + ADD HL,HL + EX DE,HL + ADC HL,HL + SBC HL,BC + JR NC,.L1 + ADD HL,BC + DEC A + JR NZ,.L2 + RET +.L1 INC DE + DEC A + JR NZ,.L2 + RET + +;Процедура деления 32/16bit=32bit +;На вход: HL+DE/BC +;На выход:HL+DE-результат +; BC-остаток +Divis32 PUSH IX + LD IXL,E + LD IXH,D + EX DE,HL + LD HL,0x0000 + LD A,0x20 +.L1 ADD IX,IX + RL E + RL D + ADC HL,HL + SBC HL,BC + JR NC,.L2 + DEC IX + ADD HL,BC +.L2 INC IX + DEC A + JR NZ,.L1 + LD C,L + LD B,H + EX DE,HL + LD E,IXL + LD D,IXH + POP IX + RET + +;[]===================================================================[] +;На вход: +; A:BC:HL - число 40 бит +; DE - буфер +ConvNumTxt40: PUSH IX + LD IX,ConvertFlg + RES 7,(IX+0x00) + PUSH BC + EXX + LD HL,ConNumbExit + LD (ChooseStringFormat.address),HL + POP HL + LD E,0x17 + LD BC,0x4876 + EXX + ld bc,0xE800 + ; E':BC':BC = 100,000,000,000 + call ConNumb40 + exx + ld e,0x02 + ld bc,0x540B + exx + ld bc,0xE400 + ; E':BC':BC = 10,000,000,000 + CALL ConNumb40 + exx + ld e,0x00 + ld bc,0x3B9A + exx + ld bc,0xCA00 + ; E':BC':BC = 1,000,000,000 + CALL ConNumb40 + ; E':BC':BC = 100,000,000 + CALL ConvNumTxt32_Shared.skip_1 + POP IX + RET + +;[]-----------------------------------------------------------[] +;Конвертер числа 32бит в текст +;На вход: +; BC+HL - число 32 бит +; DE - буфер +ConvNumTxt32 PUSH IX + LD IX,ConvertFlg + RES 7,(IX+0x00) + PUSH BC + EXX + LD HL,ConNumbExit + LD (ChooseStringFormat.address),HL + POP HL + EXX + call ConvNumTxt32_Shared + POP IX + RET + +ConvNumTxt32_Shared: + LD BC,0xCA00 + EXX + LD BC,0x3B9A ;1'000'000'000 + EXX + CALL ConNumb32 +.skip_1: LD BC,0xE100 + EXX + LD BC,0x05F5 ;100'000'000 + EXX + CALL ConNumb32 + LD BC,0x9680 + EXX + LD BC,0x0098 ;10'000'000 + EXX + CALL ConNumb32 + LD BC,0x4240 + EXX + LD BC,0x000F ;1'000'000 + EXX + CALL ConNumb32 + LD BC,0x86A0 + EXX + LD BC,0x0001 ;100'000 + EXX + CALL ConNumb32 + LD BC,10000 ;10'000 + EXX + LD BC,0x0000 + EXX + CALL ConNumb32 + LD BC,1000 ;1'000 + CALL ConNumb16 + LD BC,100 ;100 + CALL ConNumb16 + LD BC,10 ;10 + CALL ConNumb16 + LD A,L + ADD A,'0' + LD (DE),A + INC DE + RET + +;Конвертер числа 16бит в текст +;На вход: +; HL - число 16 бит +; DE - буфер +ConvNumTxt16 PUSH IX + PUSH BC + LD IX,ConNumbExit + ld (ChooseStringFormat.address),IX + LD IX,ConvertFlg + RES 7,(IX+0x00) + LD BC,10000 ;10'000 + CALL ConNumb16 + LD BC,1000 ;1'000 + CALL ConNumb16 + LD BC,100 ;100 + CALL ConNumb16 + LD BC,10 ;10 + CALL ConNumb16 + LD A,L + ADD A,'0' + LD (DE),A + INC DE + POP BC + POP IX + RET + +;Конвертер числа 8бит в текст +;На вход: +; A - число 8 бит +; DE - буфер +ConvNumTxt8 PUSH IX + PUSH BC + LD IX,ConNumbExit + ld (ChooseStringFormat.address),IX + LD IX,ConvertFlg + RES 7,(IX+0x00) + LD C,100 + CALL ConNumb8 + LD C,10 + CALL ConNumb8 + ADD A,'0' + LD (DE),A + INC DE + POP BC + POP IX + RET + +;----------------------------------------------------------------------; +ConNumb40: exx + ld d,'0'-1 + exx + and a +.loop: sbc hl,bc + exx + sbc hl,bc + sbc a,e + inc d + exx + jp nc,.loop + add hl,bc + exx + adc hl,bc + adc a,e + ex af,af' + ld a,d + exx + JR ConNumb8.exit + +ConNumb32: LD A,'0' - 1 + OR A +.loop: INC A + SBC HL,BC + EXX + SBC HL,BC + EXX + JR NC,.loop + ADD HL,BC + EXX + ADC HL,BC + EXX + JR ChooseStringFormat + +ConNumb16: LD A,'0' - 1 + OR A +.loop: INC A + SBC HL,BC + JR NC,.loop + ADD HL,BC + JR ChooseStringFormat + +ConNumb8: LD B,'0' - 1 +.loop: INC B + SUB C + JR NC,.loop + ADD A,C + EX AF,AF' + LD A,B +.exit: CALL ChooseStringFormat + EX AF,AF' + RET + +ConvertFlg DEFB 0x00 + +ChooseStringFormat: + JP 0x0000 +.address: equ $-2 + +ConNumbExit: CP "0" + JR Z,.skip + SET 7,(IX+0x00) +.skip: BIT 7,(IX+0x00) + RET Z + LD (DE),A + INC DE + RET + +;[]-----------------------------------------------------------[] +;Конвертер текста в число 32 бит +;На вход: +; DE - текст +;На выход: +; HL+IX - число +; CY - ошибка +ConvTxtNum32 LD IX,0x0000 + LD HL,0x0000 +ConvTN1 LD A,(DE) + CP 0x21 + CCF + RET NC + SUB 0x30 + RET C + CP 0x0A + CCF + RET C + INC DE + ADD IX,IX + ADC HL,HL + RET C + PUSH HL + PUSH IX + ADD IX,IX + ADC HL,HL + RET C + ADD IX,IX + ADC HL,HL + RET C + POP BC + ADD IX,BC + POP BC + ADC HL,BC + RET C + LD C,A + LD B,0x00 + ADD IX,BC + LD C,B + ADC HL,BC + RET C + JR ConvTN1 + +;Конвертер текста в число 16 бит +;На вход: +; DE - текст +;На выход: +; HL - число +; CY - ошибка +ConvTxtNum16 LD HL,0x0000 +ConvTN2 LD A,(DE) + CP 0x21 + CCF + RET NC + SUB 0x30 + RET C + CP 0x0A + CCF + RET C + INC DE + ADD HL,HL + RET C + PUSH HL + ADD HL,HL + RET C + ADD HL,HL + RET C + POP BC + ADD HL,BC + RET C + LD C,A + LD B,0x00 + ADD HL,BC + RET C + JR ConvTN2 + +;[]-----------------------------------------------------------[] +MoveBytes LD A,B + OR A + JR Z,MvByte1 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +MvByte0 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF + INC H + INC D + DEC B + JR NZ,MvByte0 + EI +MvByte1 LD A,C + OR A + RET Z + LD (Mvlen1),A + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +Mvlen1 EQU $-1 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF + EI + LD A,C + ADD A,E + LD E,A + JR NC,.L1 + INC D +.L1 LD A,C + ADD A,L + LD L,A + RET NC + INC H + RET + +MoveBytesUp LD A,B + OR A + JR Z,MovUp1 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +MovUp0 DEC H + DEC D + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF + DEC B + JR NZ,MovUp0 + EI +MovUp1 LD A,C + OR A + RET Z + LD (LenUp+1),A + SBC HL,BC + EX DE,HL + SBC HL,BC + EX DE,HL + DI + ACCEL ACCELCMD.SET_BUFFER +LenUp LD A,0x00 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF + EI + RET + +;[]----------------------------------------------------------[] +Resident LD (ResCall),DE + IN B,(C) + PUSH BC + OUT (C),A + CALL 0x0000 +ResCall EQU $-2 + POP BC + OUT (C),B + RET + +;[]----------------------------------------------------------[] +; Конкатенация строки. Добавляется строка из hl в конец строки в de. Нуль копируется тоже. +; (hl) -> (de) +ConcatString: ex hl,de +.loop: ld a,(hl) + or a + jr z,.end + inc hl + jr .loop + +.end: ex hl,de ;Внимание!!! ожидается, что дальше +; идет CopyString, поэтому если между этими п/п добавили что-то - добавь вызов CopyString! +;[]----------------------------------------------------------[] +; Копирование строки до нуля. Нуль копируется тоже. +; (hl) -> (de) +CopyString: ld a,(hl) + ldi + or a + jr nz,CopyString + dec de + ret + +;[]----------------------------------------------------------[] +; Копирование строки до нуля или пробела. В конец добавляется нуль. +; (hl) -> (de) +;!FIXIT если не будет 0 и пробела - может много запороть +CopyWord: ld bc, 0x20FF +.loop: ld a,(hl) + ldi + or a + ret z + cp b + jr nz,.loop + dec de + xor a + ld (de),a + ret + +;[]----------------------------------------------------------[] +; Сравнение строки с учетом регистра. +; (образец должен заканчиваться нулем) +; вход: de - string1 +; hl - string2 (образец) +; выход: "z" - string1 = string2 +; "c" - string1 < string2 +; иначе - string1 > string2 +;[]----------------------------------------------------------[] +CompareStrings: ld a,(de) + cp (hl) + ret nz + inc hl + inc de + ld a,(hl) + or a + jr nz,CompareStrings ; образец не закончен + ld a,(de) + cp (hl) + ret + +;Поиск конца слова или строки +;> hl - строка +;< hl - конец строки или +SkipWord: ld b,0x20 +.loop: ld a,(hl) + inc hl + cp b + jr z,.skipSpace + and a + jr nz,.loop +.end: dec hl + ret + +.skipSpace: ld a,(hl) + cp b + ret nz + inc hl + jr .skipSpace + +;[]----------------------------------------------------------[] +SetCMOSPrint: EX AF,AF' + LD (CMOSposXT),HL + LD (CMOSposYT),DE + LD A,B + LD (CMOSColorT),A + SUB A + LD L,A + LD H,A + LD (CMOSPrint),A + LD (CMOSTime),HL + LD (CMOSTime+2),A + LD (CMOSData),HL + LD (CMOSData+2),A + LD HL,CMOSTimeT + LD DE,CMOSDataT + LD A,'0' + LD B,0x03 +.L1 LD (HL),A + INC HL + LD (HL),A + INC HL + INC HL + LD (DE),A + INC DE + LD (DE),A + INC DE + INC DE + DJNZ .L1 + EX AF,AF' + LD (CMOSOut),A + OR A + JR Z,TestCMOS + EXX + LD (CMOSposXD),HL + LD (CMOSposYD),DE + LD A,B + LD (CMOSColorD),A + EXX + JR TestCMOS + +ResCMOSPrint: LD A,0x01 + LD (CMOSPrint),A + RET + +TestCMOS: LD A,(CMOSFlag) + OR A + RET Z + LD A,(CMOSPrint) + OR A + RET NZ + PUSH IX + HALT + ;!TEST + ;DI + SPDSS DSSF.GETTIME + ;!TEST + ;EI + PUSH DE + PUSH IX + EX DE,HL + LD HL,(CMOSTime) + OR A + SBC HL,DE + JR NZ,PrnCMOSTime + LD A,(CMOSTime+2) + CP B + JR Z,TCMOS1 +PrnCMOSTime: EX DE,HL + LD (CMOSTime),HL + LD A,B + LD (CMOSTime+2),A + LD DE,CMOSTimeT + LD A,H + CALL GetCMOS + INC DE + LD A,L + CALL GetCMOS + INC DE + LD A,(CMOSTime+2) + CALL GetCMOS + LD HL,CMOSTimeT + LD DE,(CMOSposXT) + LD BC,(CMOSposYT) + LD A,(CMOSColorT) + CALL PrnTxtLnIFF +TCMOS1 POP IX + POP DE + LD A,(CMOSOut) + OR A + JP Z,TCMOSex + PUSH IX + POP HL + LD BC,1900 + OR A + SBC HL,BC + LD B,L + LD HL,(CMOSData) + OR A + SBC HL,DE + JR NZ,PrnCMOSData + LD A,(CMOSData+2) + CP B + JP Z,TCMOSex +PrnCMOSData EX DE,HL + LD (CMOSData),HL + LD A,B + LD (CMOSData+2),A + LD DE,CMOSDataT + LD A,H + CALL GetCMOS + INC DE + LD A,L + CALL GetCMOS + INC DE + LD A,(CMOSData+2) + CALL GetCMOS + LD A,(CMOSOut) + DEC A + JR NZ,TCMOS2 + LD HL,CMOSDataT + LD DE,(CMOSposXD) + LD BC,(CMOSposYD) + LD A,(CMOSColorD) + CALL PrnTxtLnIFF + JR TCMOSex + +TCMOS2 LD DE,CMOSDataT1 + LD A,H + CALL ConvNumTxt8 + LD A,' ' + LD (DE),A + INC DE + LD A,L + DEC A + ADD A,A + LD L,A + ADD A,A + ADD A,L + LD HL,Month + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD A,' ' +.L2 LDI + CP (HL) + JR NZ,.L2 + LD (DE),A + INC DE + PUSH IX + POP HL + CALL ConvNumTxt16 + SUB A + LD (DE),A + LD HL,(CMOSposXD) + LD (CMOSclX),HL + LD HL,(CMOSposYD) + LD (CMOSclY),HL + LD A,(CMOSColorD) + AND 0xF0 + RRCA + RRCA + RRCA + RRCA + LD (CMOScol),A + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 0,0,76,8,COLORI.BLACK + W_END +CMOSclX EQU $ - 10 +CMOSclY EQU $ - 8 +CMOScol EQU $ - 2 + LD HL,CMOSDataT1 + LD DE,(CMOSposXD) + LD BC,(CMOSposYD) + LD A,(CMOSColorD) + CALL PrnTxtLnIFF +TCMOSex POP IX + RET + +;CMOSPrint: DB 0x01 +CMOSOut: DB 0 +CMOSposXT: DW 0 +CMOSposYT: DW 0 +CMOSColorT: DB 0 +CMOSTime: DB 3 DUP 0 +CMOSTimeT: DB "00:00:00",0 +CMOSposXD: DW 0 +CMOSposYD: DW 0 +CMOSColorD: DB 0 +CMOSData: DB 3 DUP 0 +CMOSDataT: DB "00/00/00",0 +CMOSDataT1: DB 14 DUP ' ' + +GetCMOS: EX DE,HL + LD BC,(('0' - 1) << 8) | 10;0x2F0A +.L1 INC B + SUB C + JR NC,.L1 + ADD A,C + LD (HL),B + INC HL + ADD A,'0' + LD (HL),A + INC HL + EX DE,HL + RET + +Month: DB "Jan " + DB "Febr " + DB "March " + DB "Apr " + DB "May " + DB "June " + DB "July " + DB "Aug " + DB "Sept " + DB "Oct " + DB "Nov " + DB "Dec " + +;[]----------------------------------------------------------[] +SetClock: LD A,(MouseFlag) + OR A + RET Z + PUSH IY + PUSH IX + PUSH HL + PUSH DE + PUSH BC + GETPORT WINSP.CPU3 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU3,,0 + LD IX,CLOCK_BMP;ClockBMP + LD HL,14 << 8 + 9 + LD DE,7 << 8 | 4 + SPMOUSE MOUSEF.LOAD_IMAGE + POP AF + SETPORT WINSP.CPU3,,0 + POP BC + POP DE + POP HL + POP IX + POP IY + HALT + RET + +SetMouse LD A,(MouseFlag) + OR A + RET Z + PUSH IY + PUSH IX + PUSH HL + PUSH DE + PUSH BC + GETPORT WINSP.CPU3 + PUSH AF + LD A,(RAMPAGES.FNFONT) + SETPORT WINSP.CPU3,,0 + LD IX,MOUSE_BMP;MouseBMP + LD HL,13 << 8 + 9 + LD DE,0 + SPMOUSE MOUSEF.LOAD_IMAGE + POP AF + SETPORT WINSP.CPU3,,0 + POP BC + POP DE + POP HL + POP IX + POP IY + HALT + RET diff --git a/fntab.a80 b/fntab.a80 new file mode 100644 index 0000000..2d04d11 --- /dev/null +++ b/fntab.a80 @@ -0,0 +1,369 @@ + +; LAST UPDATE: 02.05.2025 savelij + +;[]==========================================================[] +; Формат таблицы +; +00 2 Xmin +; +02 2 Xmax +; +04 2 Ymin +; +06 2 Ymax +; +08 2 0 - простой об'ект +; бит 0 - кнопка +; бит 1 - рабочая кнопка +; бит 2 - инверт 1 +; бит 3 - статичный инверт +; бит 4 - программа запускается без адреса возвр. +; и без огня +; бит 5 - программа запускается без адреса возвр. +; по левой кнопке огня +; бит 6 - программа запускается без адреса возвр. +; по правой кнопке огня +; бит 7 - вызвать функцию закрытия окна перед +; запуском программы без огня +; бит 8 - вызвать функцию закрытия окна перед +; запуском программы по левой кнопке +; бит 9 - вызвать функцию закрытия окна перед +; запуском программы по правой кнопке +; бит15 - это переключатель (инверт при огне не +; убирать) +; +0A 2 Адрес обработчика при не нажатом огне +; +0C 2 Адрес обработчика при нажатом огне (лев) +; +0E 2 Адрес обработчика при нажатом огне (прав) +FilePanelLeft DW 6, 40, 15, 26,%0000000000000000,0,MenuFile,0 + DW 40, 84, 15, 26,%0000000000000000,0,MenuSelect,0 + DW 84,138, 15, 26,%0000000000000000,0,MenuOption,0 + DW 138,174, 15, 26,%0000000000000000,0,MenuView,0 + DW 174,222, 15, 26,%0000000000000000,0,MenuConfig,0 + DW 222,262, 15, 26,%0000000000000000,0,MenuAbout,0 + DW 324,636, 44,225,%0000000000000000,0,ChPanel,0 + +PanelPlaceL DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 254,634,229,239,%0000000000000000,0,DOSloop,0 + DW 0, 80,242,256,%0000000000000001,0,Help,0 + DW 80,160,242,256,%0000000000000001,0,ViewFile,0 + DW 160,240,242,256,%0000000000000001,0,EditFile,0 + DW 240,320,242,256,%0000000000000001,0,RESIDENT.CopyFiles,0 + DW 320,400,242,256,%0000000000000001,0,RESIDENT.ReName,0 + DW 400,480,242,256,%0000000000000001,0,RESIDENT.MakeDIR,0 + DW 480,560,242,256,%0000000000000001,0,RESIDENT.DeleteFiles,0 + DW 560,640,242,256,%0000000000000001,0,RESIDENT.Quit,0 + +BgDISKl DW 6, 34, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; A + DW 326,354, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 34, 62, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; B + DW 354,382, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 62, 90, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; C + DW 382,410, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 90,118, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; D + DW 410,438, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 118,146, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; E + DW 438,466, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 146,174, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; F + DW 466,494, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 174,202, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; G + DW 494,522, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 202,230, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; H + DW 522,550, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 230,258, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; I + DW 550,578, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 258,286, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; J + DW 578,606, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 286,314, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; K + DW 606,634, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 0x8000 + +;[]==========================================================[] +FilePanelRight DW 6, 40, 15, 26,%0000000000000000,0,MenuFile,0 + DW 40, 84, 15, 26,%0000000000000000,0,MenuSelect,0 + DW 84,138, 15, 26,%0000000000000000,0,MenuOption,0 + DW 138,174, 15, 26,%0000000000000000,0,MenuView,0 + DW 174,222, 15, 26,%0000000000000000,0,MenuConfig,0 + DW 222,262, 15, 26,%0000000000000000,0,MenuAbout,0 + DW 4,316, 44,225,%0000000000000000,0,ChPanel,0 + +PanelPlaceR DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 0, 0, 0, 0,%0000000000000000,0,0,0 + DW 254,634,229,239,%0000000000000000,0,DOSloop,0 + DW 0, 80,242,256,%0000000000000001,0,Help,0 + DW 80,160,242,256,%0000000000000001,0,ViewFile,0 + DW 160,240,242,256,%0000000000000001,0,EditFile,0 + DW 240,320,242,256,%0000000000000001,0,RESIDENT.CopyFiles,0 + DW 320,400,242,256,%0000000000000001,0,RESIDENT.ReName,0 + DW 400,480,242,256,%0000000000000001,0,RESIDENT.MakeDIR,0 + DW 480,560,242,256,%0000000000000001,0,RESIDENT.DeleteFiles,0 + DW 560,640,242,256,%0000000000000001,0,RESIDENT.Quit,0 + +BgDISKr DW 6, 34, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; A + DW 326,354, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 34, 62, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; B + DW 354,382, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 62, 90, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; C + DW 382,410, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 90,118, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; D + DW 410,438, 30, 42,%0000000000000001,0,ChangeDriveR,0;0x0800 + DW 118,146, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; E + DW 438,466, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 146,174, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; F + DW 466,494, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 174,202, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; G + DW 494,522, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 202,230, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; H + DW 522,550, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 230,258, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; I + DW 550,578, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 258,286, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; J + DW 578,606, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 286,314, 30, 42,%0000000000000001,0,ChangeDriveL,0 ; K + DW 606,634, 30, 42,%0000000000000001,0,ChangeDriveR,0 + DW 0x8000 + +;[]==========================================================[] +FileTab DW 8,160, 29, 43,%0000000100100100,0,RESIDENT.FileInfoL2,0 + DW 8,160, 43, 57,%0000000100100100,0,RESIDENT.PrintFileL3,0 + DW 8,160, 63, 77,%0000000100100100,0,RESIDENT.QuitL1,0 + DW 6, 40, 15, 26,%0000000100101000,0,MenuExit,0 + DW 40, 84, 15, 26,%0000000010010000,MenuSelect.L2,0,0 + DW 84,138, 15, 26,%0000000010010000,MenuOption.L2,0,0 + DW 138,174, 15, 26,%0000000010010000,MenuView.L8,0,0 + DW 174,222, 15, 26,%0000000010010000,MenuConfig.L2,0,0 + DW 222,262, 15, 26,%0000000010010000,MenuAbout.L2,0,0 + DW 0,640, 0, 26,%0000000100100000,0,MenuExit,0 + DW 0,640, 80,256,%0000000100100000,0,MenuExit,0 + DW 0, 4, 0,256,%0000000100100000,0,MenuExit,0 + DW 164,640, 0,256,%0000000100100000,0,MenuExit,0 + DW 0x8000 + +SelectTab DW 44,196, 29, 43,%0000000100100100,0,RESIDENT.MarkGroupN,0 + DW 44,196, 43, 57,%0000000100100100,0,RESIDENT.UnMarkGroupN,0 + DW 44,196, 57, 71,%0000000100100100,0,RESIDENT.SelectAllN,0 + DW 44,196, 71, 85,%0000000100100100,0,RESIDENT.UnSelectAllN,0 + DW 44,196, 85, 99,%0000000100100100,0,RESIDENT.InvertSelectN,0 + DW 6, 40, 15, 26,%0000000010010000,MenuFile.L2,0,0 + DW 40, 84, 15, 26,%0000000100101000,0,MenuExit,0 + DW 84,138, 15, 26,%0000000010010000,MenuOption.L2,0,0 + DW 138,174, 15, 26,%0000000010010000,MenuView.L8,0,0 + DW 174,222, 15, 26,%0000000010010000,MenuConfig.L2,0,0 + DW 222,262, 15, 26,%0000000010010000,MenuAbout.L2,0,0 + DW 0,640, 0, 26,%0000000100100000,0,MenuExit,0 + DW 0,640,102,256,%0000000100100000,0,MenuExit,0 + DW 0, 40, 0,256,%0000000100100000,0,MenuExit,0 + DW 200,640, 0,256,%0000000100100000,0,MenuExit,0 + DW 0x8000 + +; подменю "Options" +OptionTab DW 88,288, 29, 43,%0000000100100100,0,RefreshTree,0 ; Options->Refresh tree + DW 88,288, 43, 57,%0000000100100100,0,RESIDENT.DiskInfoL4,0 ; Options->Disk info + DW 88,288, 63, 77,%0000000100100100,0,RESIDENT.SystemInfo,0 ; Options->System information + IF PLUGS_ENABLE + DW 88,288, 77, 91,%0000000100100100,0,GetPlugins,0 ; Options->Plugins + ENDIF + DW 6, 40, 15, 26,%0000000010010000,MenuFile.L2,0,0 ; File + DW 40, 84, 15, 26,%0000000010010000,MenuSelect.L2,0,0 ; Select + DW 84,138, 15, 26,%0000000100101000,0,MenuExit,0 ; + DW 138,174, 15, 26,%0000000010010000,MenuView.L8,0,0 ; View + DW 174,222, 15, 26,%0000000010010000,MenuConfig.L2,0,0 ; Config + DW 222,262, 15, 26,%0000000010010000,MenuAbout.L2,0,0 ; About + DW 0,640, 0, 26,%0000000100100000,0,MenuExit,0 + DW 0,640, 80,256,%0000000100100000,0,MenuExit,0 + DW 0, 84, 0,256,%0000000100100000,0,MenuExit,0 + DW 292,640, 0,256,%0000000100100000,0,MenuExit,0 + DW 0x8000 + +; подменю "View" +ViewTab DW 142,324, 29, 43,%0000000100100100,0,ChView1,0 + DW 142,324, 43, 57,%0000000100100100,0,ChView2,0 + DW 142,324, 57, 71,%0000000100100100,0,ChView3,0 + DW 142,324, 77, 91,%0000000100100100,0,ChFilt1,0 + DW 142,324, 91,105,%0000000100100100,0,ChFilt2,0 + DW 142,324,105,119,%0000000100100100,0,ChFilt3,0 + DW 142,324,119,133,%0000000100100100,0,NewFilter.L1,0 + DW 142,324,139,153,%0000000100100100,0,ChSort1,0 + DW 142,324,153,167,%0000000100100100,0,ChSort2,0 + DW 142,324,167,181,%0000000100100100,0,ChSort3,0 + DW 142,324,181,195,%0000000100100100,0,ChSort4,0 + DW 142,324,195,209,%0000000100100100,0,ChSort5,0 + DW 6, 40, 15, 26,%0000000010010000,MenuFile.L2,0,0 + DW 40, 84, 15, 26,%0000000010010000,MenuSelect.L2,0,0 + DW 84,138, 15, 26,%0000000010010000,MenuOption.L2,0,0 + DW 138,174, 15, 26,%0000000100101000,0,MenuExit,0 + DW 174,222, 15, 26,%0000000010010000,MenuConfig.L2,0,0 + DW 222,262, 15, 26,%0000000010010000,MenuAbout.L2,0,0 + DW 0,640, 0, 26,%0000000101100000,0,MenuExit,0 + DW 0,640,184,256,%0000000101100000,0,MenuExit,0 + DW 0,138, 0,256,%0000000101100000,0,MenuExit,0 + DW 330,640, 0,256,%0000000101100000,0,MenuExit,0 + DW 0x8000 + +ConfigTab DW 178,266, 29, 43,%0000000100100100,0,RESIDENT.Setup,0 + DW 6, 40, 15, 26,%0000000010010000,MenuFile.L2,0,0 + DW 40, 84, 15, 26,%0000000010010000,MenuSelect.L2,0,0 + DW 84,138, 15, 26,%0000000010010000,MenuOption.L2,0,0 + DW 138,174, 15, 26,%0000000010010000,MenuView.L8,0,0 + DW 174,222, 15, 26,%0000000100101000,0,MenuExit,0 + DW 222,262, 15, 26,%0000000010010000,MenuAbout.L2,0,0 + DW 0,640, 0, 26,%0000000100100000,0,MenuExit,0 + DW 0,640, 46,256,%0000000100100000,0,MenuExit,0 + DW 0,174, 0,256,%0000000100100000,0,MenuExit,0 + DW 270,640, 0,256,%0000000100100000,0,MenuExit,0 + DW 0x8000 + +AboutTab DW 226,330, 29, 43,%0000000100100100,0,RESIDENT.Version,0 + DW 6, 40, 15, 26,%0000000010010000,MenuFile.L2,0,0 + DW 40, 84, 15, 26,%0000000010010000,MenuSelect.L2,0,0 + DW 84,138, 15, 26,%0000000010010000,MenuOption.L2,0,0 + DW 138,174, 15, 26,%0000000010010000,MenuView.L8,0,0 + DW 174,222, 15, 26,%0000000010010000,MenuConfig.L2,0,0 + DW 222,262, 15, 26,%0000000100101000,0,MenuExit,0 + DW 0,640, 0, 26,%0000000100100000,0,MenuExit,0 + DW 0,640, 46,256,%0000000100100000,0,MenuExit,0 + DW 0,222, 0,256,%0000000100100000,0,MenuExit,0 + DW 334,640, 0,256,%0000000100100000,0,MenuExit,0 + DW 0x8000 + +PullTab DW 6, 40, 15, 26,%0000000000100000,0,MFile,0 + DW 40, 84, 15, 26,%0000000000100000,0,MSelect,0 + DW 84,138, 15, 26,%0000000000100000,0,MOption,0 + DW 138,174, 15, 26,%0000000000100000,0,MView,0 + DW 174,222, 15, 26,%0000000000100000,0,MConfig,0 + DW 222,262, 15, 26,%0000000000100000,0,MAbout,0 + DW 0,640, 0, 15,%0000000000100000,0,PullExit.L1,0 + DW 0,640, 26,256,%0000000000100000,0,PullExit.L1,0 + DW 0, 6, 0,256,%0000000000100000,0,PullExit.L1,0 + DW 222,640, 0,256,%0000000000100000,0,PullExit.L1,0 + DW 0x8000 + +;[]==========================================================[] +FilterTab DW 240,312,123,137,%0000000000000001,0,InputLine.InpLnExtN,0 + DW 328,400,123,137,%0000000000000001,0,InputLine.InpLnExtC,0 + DW 0,208, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 432,640, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640, 0, 81,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640,143,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0x8000 + +SMaskTab DW 240,312,123,137,%0000000000000001,0,InputLine.InpLnExtN,0 + DW 328,400,123,137,%0000000000000001,0,InputLine.InpLnExtC,0 + DW 0,208, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 432,640, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640, 0, 81,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640,143,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0x8000 + +DOSTab DW 0,256, 0,256,%0000000000000000,0,DOSLnExtC,0 + DW 636,640, 0,256,%0000000000000000,0,DOSLnExtC,0 + DW 0,640, 0,229,%0000000000000000,0,DOSLnExtC,0 + DW 0,640,239,256,%0000000000000000,0,DOSLnExtC,0 + DW 0x8000 + +ViewEditTab DW 240,312,123,137,%0000000000000001,0,InputLine.InpLnExtN,0 + DW 328,400,123,137,%0000000000000001,0,InputLine.InpLnExtC,0 + DW 0,200, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 440,640, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640, 0, 81,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640,143,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0x8000 + +;[]==========================================================[] +DriveTab DW 0, 0, 0, 0,%0000000000100000,0,DriveExit,0 + DW 0, 0, 0, 0,%0000000000100000,0,DriveExit,0 + DW 0,640, 0, 92,%0000000000100000,0,DriveExit,0 + DW 0,640,128,256,%0000000000100000,0,DriveExit,0 + +BegDrive DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0, 0,110,121,%0000000000100000,0,DriveMouse,0 + DW 0x8000 + + IF PLUGS_ENABLE +; области выбора в меню плагинов +PluginsTab: DW 4, 13,100, 10,%0000000000000000,0,SelectPlugin.NUM00,0 + DW 4, 23,100, 10,%0000000000000000,0,SelectPlugin.NUM01,0 + DW 4, 33,100, 10,%0000000000000000,0,SelectPlugin.NUM02,0 + DW 4, 43,100, 10,%0000000000000000,0,SelectPlugin.NUM03,0 + DW 4, 53,100, 10,%0000000000000000,0,SelectPlugin.NUM04,0 + DW 4, 63,100, 10,%0000000000000000,0,SelectPlugin.NUM05,0 + DW 4, 73,100, 10,%0000000000000000,0,SelectPlugin.NUM06,0 + DW 4, 83,100, 10,%0000000000000000,0,SelectPlugin.NUM07,0 + DW 4, 93,100, 10,%0000000000000000,0,SelectPlugin.NUM08,0 + DW 4,103,100, 10,%0000000000000000,0,SelectPlugin.NUM09,0 + DW 4,113,100, 10,%0000000000000000,0,SelectPlugin.NUM10,0 + DW 30,176, 72, 14,%0000000000000000,0,SelectPlugin.CANCEL,0 + DW 0x8000 + ENDIF + +;[]==========================================================[] +;Формат таблицы +; +00 2 ASCII + SCANCOD +; +02 2 Execute program +HOTKEYS +.ASCIIKeys DW SC.TAB << 8 | 0x09, ChPanel + DW SC.X8 << 8, CursUp + DW SC.X2 << 8, CursDown + DW SC.X4 << 8, CursLeft + DW SC.X6 << 8, CursRight + DW SC.X9 << 8, PageUp + DW SC.X3 << 8, PageDown + DW SC.X7 << 8, Home + DW SC.X1 << 8, End + DW SC.F9 << 8, PullDown + DW SC.XDOTZAP << 8 | '+', RESIDENT.MarkGroup + DW SC.XMINUS << 8 | '-', RESIDENT.UnMarkGroup + DW SC.XMUL << 8 | '*', RESIDENT.InvertSelect + DW SC.X0 << 8, RESIDENT.MarkFile + DW SC.F1 << 8, Help + DW SC.F3 << 8, ViewFile + DW SC.F4 << 8, EditFile + DW SC.F5 << 8, RESIDENT.CopyFiles + DW SC.F6 << 8, RESIDENT.ReName + DW SC.F7 << 8, RESIDENT.MakeDIR + DW SC.F8 << 8, RESIDENT.DeleteFiles + DW SC.F10 << 8, RESIDENT.Quit + DB 0xFF + +.SHIFTKeys DW SC.F3 << 8, ViewFileSH + DW SC.F4 << 8, EditFileSH + DB 0xFF + +.CTRLKeys DW SC.F9 << 8, RESIDENT.PrintFile + DW SC.XDOTZAP << 8, RESIDENT.SelectAll + DW SC.XMINUS << 8, RESIDENT.UnSelectAll + DW SC.L << 8, RESIDENT.DiskInfo + DW SC.F1 << 8, Brief + DW SC.F2 << 8, Full + DW SC.F8 << 8, Tree + DW SC.F10 << 8, AllFiles + DW SC.F11 << 8, ExeFiles + DW SC.F12 << 8, NewFilter + DW SC.F3 << 8, NameS + DW SC.F4 << 8, Extention + DW SC.F5 << 8, Data + DW SC.F6 << 8, Size + DW SC.F7 << 8, UnSort + DW SC.U << 8, ReplacePanels + DW SC.O << 8, ShowDOSscreen + DW SC.BSLASH << 8, BegDIRECTORY + DB 0xFF + +.ALTKeys DW SC.ESC << 8, MouseOnOff + DW SC.ENTER << 8, RESIDENT.FileInfo + DW SC.F1 << 8, LeftDrive + DW SC.F2 << 8, RightDrive + DW SC.F3 << 8, StViewFile + DW SC.F4 << 8, StEditFile + DW SC.F10 << 8, RefreshTree + DB 0xFF diff --git a/fntree.a80 b/fntree.a80 new file mode 100644 index 0000000..0928f61 --- /dev/null +++ b/fntree.a80 @@ -0,0 +1,734 @@ + +; LAST UPDATE: 28.05.2025 savelij + +MAX_LEVEL_DIR EQU 21 + +;[]----------------------------------------------------------[] +ReadTreeR PUSH IY + POP HL + LD BC,PANEL.EFL + ADD HL,BC + LD B,PANEL.FILEMASK - PANEL.EFL +.LL1 LD (HL),0 + INC HL + DJNZ .LL1 + LD HL,BegDIR + PUSH IY + SPDSS DSSF.CHDIR + POP IY + LD HL,TreeName + PUSH IY + SPDSS DSSF.OPEN,,0 + POP IY + JP NC,LoadTreeR +; файл с деревом каталогов не найден, сканируем и создаем +.ScanTree + GETPORT WINSP.CPU1 + LD C,A + GETPORT WINSP.CPU3 + LD B,A + PUSH BC + LD A,(RAMPAGES.BuffPg3) + SETPORT WINSP.CPU1,,0 + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + PUSH IY + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 240,96,160,40 + W_FILL 4,2,152,10,COLORI.BLACK + W_TEXT 44,3,COLORI.WHITE,"Scanning tree" + W_TEXT 32,20,COLORP.HIGHGRAY,"Directories:" + W_END + LD (.TreeSP1),SP + SUB A + LD (CurTree),A + LD SP,STACKTREE + LD HL,0 + PUSH HL + LD (LoadItemDIRR.CurTAdr),HL + LD HL,CPU3 + TreeHead_Size + LD (EndTree),HL + LD B,0x10 + SUB A +.L2 LD (HL),A + INC HL + DJNZ .L2 + LD HL,1 + LD (TreeDIRS),HL + CALL LoadItemDIRR + JR NC,.TreeExit ; NC - нет директорий +.TreeLoop PUSH HL + SPDSS DSSF.SCANKEY + LD A,E + SUB 0x1B + POP HL + JP Z,AbortTree + LD A,(CurTree) + INC A + CP MAX_LEVEL_DIR + JR Z,.DIRSend + LD (CurTree),A + LD DE,(TreeDIRS) + BIT 2,D ; DE >= 1024 + JR NZ,.TreeExit + PUSH HL + LD A,(HL) + OR A + JR Z,.DIRSend + LD (LoadItemDIRR.CurTAdr),HL + SPDSS DSSF.CHDIR + CALL LoadItemDIRR + JR C,.TreeLoop ; C - есть директории +.DIRSend + SPDSS DSSF.SCANKEY + LD A,E + SUB 0x1B + JP Z,AbortTree + POP HL + LD A,H + OR L + JR Z,.TreeExit + PUSH HL + LD HL,CurTree + DEC (HL) + LD HL,UpDIR + SPDSS DSSF.CHDIR + POP HL + LD DE,0x000F + ADD HL,DE + LD A,(HL) + INC HL + INC A + JR NZ,.TreeLoop + JR .DIRSend + +.TreeExit + SETPORT WINSP.Y_PORT,0xC0 + LD SP,STACKTREE + LD IX,0 + PUSH IX + LD HL,CPU1 + LD DE,TreeHead + LD BC,TreeHead_Size + EX DE,HL + LDIR ; занесли заголовок дерева каталогов FN + LD HL,(TreeDIRS) + DEC HL + LD A,H + OR L + JR Z,.TreeExit1 + LD HL,CPU3 + TreeHead_Size +.TreeEndLp INC IXL + PUSH HL + PUSH DE + LD A,IXL + CP IXH + JR C,.L3 + LD IXH,A +.L3 LD (DE),A + INC DE + SUB A + LD (DE),A + INC DE + LD BC,0x000C + LDIR + LD (DE),A + INC DE + LD (DE),A + INC DE + INC HL + LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD A,(HL) + AND 0x80 + POP HL + OR (HL) + LD (HL),A + LD L,C + LD H,B + LD A,H + OR L + JR NZ,.TreeEndLp +.TreeEndLp1 DEC IXL + POP HL + LD A,H + OR L + JR Z,.TreeExit1 + LD BC,0x000F + ADD HL,BC + LD A,(HL) + INC HL + INC A + JR NZ,.TreeEndLp + JR .TreeEndLp1 + +.TreeExit1 LD (EndTree),DE + DEC DE + LD A,0xFF + LD (DE),A + LD SP,0 +.TreeSP1 EQU $-2 + POP IY + RES VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) + LD A,IXH + CP 0x0B + JR C,.L4 + SET VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) +.L4 + GETPORT WINSP.CPU3 + LD (RAMPAGES.BuffPg3),A + GETPORT WINSP.CPU1 + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD HL,RAMPAGES.LEFTPANEL + JR Z,.L5 + LD HL,RAMPAGES.RIGHTPANEL +.L5 LD (HL),A + WINDOWCLOSE + POP BC + LD A,B + SETPORT WINSP.CPU3,,0 + LD A,C + SETPORT WINSP.CPU1,,0 + LD HL,(TreeDIRS) + LD (IY+PANEL.EFL),L ; EQUIP FIL + LD (IY+PANEL.EFH),H + PUSH IY + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L6 + LD A,(RAMPAGES.RIGHTPANEL) +.L6 + SETPORT WINSP.CPU3,,0 + LD HL,BegDIR + SPDSS DSSF.CHDIR + LD HL,TreeName + SPDSS DSSF.CREATE,,0 + JR C,.TreeErr + PUSH AF + LD HL,CPU3 + LD DE,(EndTree) + RES 6,D + SPDSS DSSF.WRITE + POP AF + SPDSS DSSF.CLOSE +.TreeErr LD A,1 + LD (CPU3 + 1),A + POP AF + SETPORT WINSP.CPU3,,0 + POP IY + JP LoadTreeR.TreeOkey + +; загрузка дерева каталогов из файла +LoadTreeR EX AF,AF' + PUSH IY + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + EX AF,AF' + PUSH AF + LD HL,CPU3 + LD DE,0x4000 + SPDSS DSSF.READ + EX AF,AF' + LD HL,CPU3 + LD DE,WorkBuffer + LD BC,0x0010 + LDIR + POP AF + SPDSS DSSF.CLOSE + POP AF + SETPORT WINSP.CPU3,,0 + POP IY + EX AF,AF' + JP C,ReadTreeR.ScanTree ; Error + LD HL,WorkBuffer + 2 + LD DE,TreeHead + 2 + LD B,TreeHead_Size - 3 +.L2 LD A,(DE) + CP (HL) + JP NZ,ReadTreeR.ScanTree ; Error + INC HL + INC DE + DJNZ .L2 + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L3 + LD A,(RAMPAGES.RIGHTPANEL) +.L3 + SETPORT WINSP.CPU3,,0 + LD HL,CPU3 + LD DE,0x000E + LD BC,0 + LD IXH,0 +.LoadTr1 LD A,(HL) + AND 0x7F + CP IXH + JR C,.L4 + LD IXH,A +.L4 INC HL + LD (HL),0 + INC BC + ADD HL,DE + LD A,(HL) + INC HL + INC A + JR NZ,.LoadTr1 + RES VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) + LD A,IXH + CP 0x0B + JR C,.L5 + SET VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) +.L5 LD (IY+PANEL.EFL),C ; EQUIP FILES + LD (IY+PANEL.EFH),B + BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + LD A,1 + JR NZ,.L6 + LD A,3 +.L6 LD (CPU3 + 1),A + POP AF + SETPORT WINSP.CPU3,,0 +.TreeOkey PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + INC HL + INC HL + JP FindTreeDIRR + +AbortTree LD SP,(ReadTreeR.TreeSP1) + POP IY + POP BC + LD A,B + SETPORT WINSP.CPU3,,0 + LD A,C + SETPORT WINSP.CPU1,,0 + RES VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) + RES VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + WINDOWCLOSE + LD HL,InitPanels + EX (SP),HL + SUB A + RET + +TreeName DZ FILENAME.FNTREE_FLN +TreeHead DB 0,0,0x5C,0,0,0,0xAE,"FlexTree",0 +TreeHead_Size EQU $ - TreeHead +BegDIR DB 0x5C,0 +UpDIR DB "..",0 +CurTree DB 0 +TreeDIRS DW 0 ; количество найденых дир +EndTree DW 0 ; текущий адрес в таблице директорий + +; чтение описателей директорий +LoadItemDIRR: LD DE,(EndTree) + PUSH DE + LD IX,0 + LD HL,NORMmask + LD DE,WorkBuffer + LD A,(FileAtribut) + AND DIR.M_Archive + \ + DIR.M_Dir + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly + PUSH IX + PUSH DE + SPDSS DSSF.F_FIRST,1 + POP HL + POP IX + JR C,.FndFLtrE ; ничего не найдено? на выход +.FndFLtr LD A,(WorkBuffer + 0x20) + AND DIR.M_Dir ; это дира? + CALL NZ,.ADD_DIR ; если да то добавляем + JR C,.FndFLtrE ; ошибка добавления? выходим +; читаем следующий описатель + LD DE,WorkBuffer + PUSH IX + PUSH DE + SPDSS DSSF.F_NEXT + POP HL + POP IX + JR NC,.FndFLtr +; завершение создания дерева +.FndFLtrE LD HL,(EndTree) + DEC HL + LD (HL),0xFF + LD C,IXL + LD B,IXH + LD HL,(TreeDIRS) + ADD HL,BC + LD (TreeDIRS),HL + POP HL + LD A,B + OR C + RET Z + PUSH HL + CALL .PRT_NUM_DIR ; обновляем количество найденных дир + POP HL + LD DE,0 +.CurTAdr EQU $-2 + LD A,D + OR E + SCF + RET Z + EX DE,HL + LD BC,0x000D + ADD HL,BC + LD (HL),E + INC HL + LD (HL),D + EX DE,HL + SCF + RET + +; занесение в таблицу элемента директории +.ADD_DIR EX DE,HL + LD HL,(EndTree) + LD BC,0x0010 + ADD HL,BC + SBC HL,BC + EX DE,HL + RET C + LD BC,FFIRST.Name + ADD HL,BC + LD A,(HL) + CP '.' ; первый символ имени точка? + RET Z + LD C,0x10 ; длина элемента в таблице + SUB A +; перенос имени до 0 +.L1 LDI + CP (HL) + JR NZ,.L1 + LD B,C +; остаток заполняем нулем +.L2 LD (DE),A + INC DE + DJNZ .L2 + LD (EndTree),DE + INC IX + RET + +; конверсия и печать числа количества директорий в дереве +.PRT_NUM_DIR LD HL,(TreeDIRS) + DEC HL + LD DE,.CurDNumb + PUSH DE + LD B,4 + LD A,' ' +.L3 LD (DE),A + INC DE + DJNZ .L3 + POP DE + EXX + LD C,0 + EXX + LD BC,1000 ; 1'000 + CALL .GetN16 + LD BC,100 ; 100 + CALL .GetN16 + LD BC,10 ; 10 + CALL .GetN16 + LD A,L + ADD A,'0' + LD (DE),A + LD HL,.CurDNumb + LD DE,336 ; X pos + LD BC,116 ; Y pos + LD A,COLORP.HIGHGRAY + JP PrnTxtLnIFF + +.GetN16 LD A,'0' - 1 + OR A +.L4 INC A + SBC HL,BC + JR NC,.L4 + ADD HL,BC + CP '0' + JR Z,.L5 + EXX + SET 0,C + EXX +.L5 EXX + BIT 0,C + EXX + RET Z + LD (DE),A + INC DE + RET + +.CurDNumb DEFB " ",0 + +;[]=========================================================[] +TestTreeR BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET Z + LD B,0x28 +.TstTree PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + OR A + RET NZ + PUSH BC + SPDSS DSSF.TESTKEY + POP BC + RET NZ + HALT + DJNZ .TstTree + IFNDEF TREE_DIR_ENTER + LD A,E + CP 0x0D ; смена директории из дерева только по ENTER + RET NZ + ENDIF +.TestTreeBeg + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L14 + LD A,(RAMPAGES.RIGHTPANEL) +.L14 + SETPORT WINSP.CPU1,,0 + SETPORT WINSP.Y_PORT,0xC0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + SET 6,H + INC HL + BIT 0,(HL) + JR NZ,.L2 + EX DE,HL + LD HL,CPU1 + LD BC,0x000E +.L1 INC HL + RES 0,(HL) + ADD HL,BC + LD A,(HL) + INC HL + INC A + JR NZ,.L1 + EX DE,HL + SET 0,(HL) + CALL PrintDIR + CALL SetInvert + CALL MakeTreePathR + PUSH IY + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L3 + LD IY,LeftPanel +.L3 CALL NewDIRECTORY + POP IY +.L2 POP AF + SETPORT WINSP.CPU1,,0 + RET + +;[]==========================================================[] +MakeTreePathR + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L5 + LD A,(RAMPAGES.RIGHTPANEL) +.L5 + SETPORT WINSP.CPU1,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + SET 6,H + LD DE,WorkBuffer+0xFF + LD BC,0x0010 + SUB A + LD (DE),A + DEC DE + LD A,(HL) + OR A + JR Z,.L4 + AND 0x7F + INC A + LD IXL,A + ADD HL,BC + INC DE +.L3 SBC HL,BC + PUSH HL + LD A,(HL) + INC HL + AND 0x7F + CP IXL + JR NC,.L2 + LD IXL,A + LD B,0xFF + SUB A +.L6 INC B + INC HL + CP (HL) + JR NZ,.L6 +.L1 DEC HL + DEC DE + LD A,(HL) + LD (DE),A + DJNZ .L1 + DEC DE + LD A,'\\' + LD (DE),A +.L2 POP HL + LD A,(HL) + AND 0x7F + CP 2 + JR NC,.L3 +.L4 EX DE,HL + LD (HL),'\\' + POP AF + SETPORT WINSP.CPU1,,0 + RET + +;[]==========================================================[] +FindTreeDIRR + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.Y_PORT,0xC0 + LD IX,LeftPanel + BIT VIEWFLAG.B_TREE,(IX+PANEL.VIEWFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR NZ,.L14 + LD A,(RAMPAGES.RIGHTPANEL) +.L14 + SETPORT WINSP.CPU1,,0 + LD DE,CPU1 + LD BC,0 +.L1 LD A,(DE) + AND 0x7F + LD IXL,A +.L2 PUSH HL + PUSH DE + LD A,(DE) + AND 0x7F + CP IXL + JR NZ,.L4 + INC DE + INC DE +.L3 LD A,(DE) + CP (HL) + JR NZ,.L4 + INC HL + INC DE + LD A,(DE) + OR A + JR Z,.L6 + LD A,(HL) + CP '\\' + JR NZ,.L3 +.L4 POP HL + LD DE,0x000F + ADD HL,DE + EX DE,HL + POP HL + INC BC + LD A,(DE) + INC DE + INC A + JR NZ,.L2 +.L5 POP AF + SETPORT WINSP.CPU1,,0 + SCF + RET + +.L6 LD A,IXL + OR A + JR Z,.L7 + LD A,(HL) + INC HL + CP '\\' + JR Z,.L7 + DEC HL + OR A + JR NZ,.L4 +.L7 POP DE + INC SP + INC SP + LD A,E + ADD A,0x0F + LD E,A + JR NC,.L15 + INC D +.L15 INC BC + LD A,(HL) + OR A + JR Z,.L8 + LD A,(DE) + INC DE + INC A + JR Z,.L5 + JR .L1 + +.L8 DEC BC + PUSH BC + LD HL,CPU1 + LD BC,0x000E +.L9 INC HL + LD (HL),B + ADD HL,BC + LD A,(HL) + INC HL + INC A + JR NZ,.L9 + POP HL + LD A,E + SUB 0x0E + LD E,A + JR NC,.L10 + DEC D +.L10 LD IX,LeftPanel + BIT VIEWFLAG.B_TREE,(IX+PANEL.VIEWFLAG) + JR NZ,.L11 + LD IX,RightPanel +.L11 BIT PANELFLAG.B_PRNDOSPATH,(IX+PANEL.PANELFLAG) + LD A,1 + JR NZ,.L12 + LD A,3 +.L12 LD (DE),A + POP AF + SETPORT WINSP.CPU1,,0 + LD E,L + LD D,H + LD BC,4 + OR A + SBC HL,BC + JR NC,.L13 + LD HL,0 +.L13 LD (IX+PANEL.FFL),L + LD (IX+PANEL.FFH),H + EX DE,HL + OR A + SBC HL,DE + LD (IX+PANEL.CFL),L + LD (IX+PANEL.CFH),H + OR A + RET diff --git a/fnwin.a80 b/fnwin.a80 new file mode 100644 index 0000000..d98877f --- /dev/null +++ b/fnwin.a80 @@ -0,0 +1,1124 @@ + +; LAST UPDATE: 30.03.2025 savelij + +;[]----------------------------------------------------------[] +;Процедура отчиски 0 экрана +;На вход: A - цвет отчистки (00-0Fh) +ClearScreen AND 0x0F + LD E,A + RLCA + RLCA + RLCA + RLCA + OR E + LD E,A + GETPORT WINSP.Y_PORT + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD HL,0x4000 + LD BC,320 + DI + EXX + SPMOUSE MOUSEF.REFRESH + EXX + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +InScrLp + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + INC HL + DEC BC + LD A,B + OR C + JR NZ,InScrLp + EI + POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + RET + +;[]----------------------------------------------------------[] +; Процедура вывода окон на графический экран 640x256x16 ; +;[]----------------------------------------------------------[] +MakeWindow: EX (SP),IY + PUSH IX + PUSH HL + PUSH DE + PUSH BC + PUSH AF + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + PUSH AF + LD A,(IY+0x00) + LD (MakeWindow.Type),A + BIT 7,A + JR Z,.L4 + INC IY + LD HL,0x0000 + LD (MakeWindow.PositX),HL + LD (MakeWindow.PositY),HL + LD (MakeWindow.LenX),HL + LD (MakeWindow.LenY),HL + JR .L2 + +.L4 CP 0x7F + JR Z,.L2 + LD L,(IY+0x01) ; Координата X + LD H,(IY+0x02) + SRL H + RR L + LD (MakeWindow.PositX),HL + LD L,(IY+0x03) ; Координата Y + LD H,(IY+0x04) + LD (MakeWindow.PositY),HL + LD L,(IY+0x05) ; H Длина окна по X + LD H,(IY+0x06) + SRL H + RR L + LD (MakeWindow.LenX),HL + LD L,(IY+0x07) ; V Длина окна по Y + LD H,(IY+0x08) + LD (MakeWindow.LenY),HL + LD A,(MakeWindow.Type) + DEC A + JR NZ,.L3 + LD HL,MakeWindow.Buffer + LD A,(MakeWindow.Open) + ADD A,A + LD C,A + ADD A,A + ADD A,A + ADD A,C + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD DE,(MakeWindow.PositX) + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,(MakeWindow.PositY) + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,(MakeWindow.LenX) + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,(MakeWindow.LenY) + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,(MakeWindow.Free) + LD (HL),E + INC HL + LD (HL),D +.L3 LD DE,0x0009 + ADD IY,DE ; Описатель на начало подоб'ектов + LD A,(MakeWindow.Type) + OR A + CALL NZ,StoreWindow + CALL PutRectan ; Чертим прямоугольник окна +.L2 LD HL,.L2 + PUSH HL + LD A,(IY+0x00) ; текущий подоб'ект окна + INC IY + CP WINSUBOBJ.TEXT;0x01 ; текстовая строка + JP Z,PutTxtLine + CP WINSUBOBJ.FILL;0x02 ; место для заголовка + JP Z,PutHeadPlc + CP WINSUBOBJ.BORDER;0x03 ; углубление в окне + JP Z,PutDRectan + CP WINSUBOBJ.BUTTON;0x04 ; кнопка + JP Z,PutURectan + CP WINSUBOBJ.BUTTONTEXT;0x05 ; кнопка с текстом + JP Z,PutButton + CP WINSUBOBJ.HORIZLINE;0x06 ; горизонтальная линия + JP Z,PutHorizLine + CP WINSUBOBJ.VERTICLINE;0x07 ; вертикальная линия + JP Z,PutVertLine + CP WINSUBOBJ.ICONLEFTARROW;0x08 ; иконка "стрелка влево" + JP Z,PutSBleft + CP WINSUBOBJ.ICONRIGHTARROW;0x09 ; иконка "стрелка вправо" + JP Z,PutSBright + CP WINSUBOBJ.ICONUPARROW;0x0A ; иконка "стрелка вверх" + JP Z,PutSBup + CP WINSUBOBJ.ICONDOWNARROW;0x0B ; иконка "стрелка вниз" + JP Z,PutSBdown + CP WINSUBOBJ.RESTOREWIN;0x7F ; восстановление части экрана + JP Z,RestoreWindow + CP WINSUBOBJ.ADRTEXT + JP Z,PutAdrTxtLine + POP HL + POP AF + SETPORT WINSP.Y_PORT,,0 ; восст. Y port + POP AF + POP BC + POP DE + POP HL + POP IX + EX (SP),IY + RET + +;-------------------------------------------------------------- +; Область данных окна +.PositX DEFW 0x0000 ; адрес X координаты окна +.PositY DEFW 0x0000 ; Y координата окна +.LenX DEFW 0x0000 ; длина окна X/2 +.LenY DEFW 0x0000 ; длина окна Y +.Free DEFW 0x0000 +.Open DEFB 0x00 ; Кол-во открытых окон +.Type DEFB 0x00 +.Buffer DUPL 0x40,0 + +;-------------------------------------------------------------- +; Процедура сохранения прямоугольной плоскости в буфер +StoreWindow DI + PUSH IY + SPMOUSE MOUSEF.REFRESH + POP IY + GETPORT WINSP.CPU3 + PUSH AF + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD HL,(MakeWindow.Free) + LD A,H + AND 0xC0 + RLCA + RLCA + EXX + LD HL,RAMPAGES.BuffPg1 + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD A,(HL) + SETPORT WINSP.CPU3,,0 + EXX + LD A,H + OR 0xC0 + LD H,A + LD DE,(MakeWindow.PositX) + SET 6,D + LD A,(MakeWindow.PositY) + LD IXH,A + LD A,(MakeWindow.LenY) + LD IXL,A + LD (.SavLen1),A + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.SavLen1 EQU $-1 + ACCEL ACCELCMD.OFF + LD BC,(MakeWindow.LenX) +.SavRect PUSH BC + LD B,0x00 + LD C,IXL + PUSH HL + ADC HL,BC + POP HL + JR Z,.L2 + JR NC,.SavRec1 +.L2 LD HL,0xC000 + EXX + INC HL + LD A,(HL) + SETPORT WINSP.CPU3,,0 + EXX +.SavRec1 LD A,IXH + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD A,(DE) + ACCEL ACCELCMD.COPY + LD (HL),A + ACCEL ACCELCMD.OFF + ADD HL,BC + POP BC + INC DE + DEC BC + LD A,B + OR C + JR NZ,.SavRect + EI + POP AF + SETPORT WINSP.CPU1,,0 + POP AF + SETPORT WINSP.CPU3,,0 + LD A,H + AND 0x3F + LD H,A + EXX + LD A,L + SUB LOW (RAMPAGES.BuffPg1) + EXX + RRCA + RRCA + OR H + LD H,A + LD (MakeWindow.Free),HL + LD HL,MakeWindow.Open + INC (HL) + RET + +;[]----------------------------------------------------------[] +; Процедура восстановления прямоугольной плоскости +RestoreWindow LD HL,MakeWindow.Open + LD A,(HL) + OR A + RET Z + DEC (HL) + HALT + DI + PUSH IY + SPMOUSE MOUSEF.REFRESH + POP IY + GETPORT WINSP.CPU3 + PUSH AF + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD HL,MakeWindow.Buffer + LD A,(MakeWindow.Open) + ADD A,A + LD C,A + ADD A,A + ADD A,A + ADD A,C + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD E,(HL) + INC HL + LD D,(HL) + INC HL + SET 6,D + LD A,(HL) + INC HL + INC HL + LD IXH,A + LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD A,(HL) + INC HL + INC HL + LD (.RstLen1),A + LD IXL,A + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + LD (MakeWindow.Free),HL + LD A,H + AND 0xC0 + RLCA + RLCA + EXX + LD HL,RAMPAGES.BuffPg1 + ADD A,L + LD L,A + JR NC,.L2 + INC H +.L2 LD A,(HL) + SETPORT WINSP.CPU3,,0 + EXX + LD A,H + OR 0xC0 + LD H,A + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.RstLen1 EQU $-1 + ACCEL ACCELCMD.OFF +.RstRect PUSH BC + LD B,0x00 + LD C,IXL + PUSH HL + ADC HL,BC + POP HL + JR Z,.L3 + JR NC,.RstRec1 +.L3 LD HL,0xC000 + EXX + INC HL + LD A,(HL) + SETPORT WINSP.CPU3,,0 + EXX +.RstRec1 + ACCEL ACCELCMD.COPY + LD A,(HL) + ACCEL ACCELCMD.OFF + LD A,IXH + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD (DE),A + ACCEL ACCELCMD.OFF + ADD HL,BC + POP BC + INC DE + DEC BC + LD A,B + OR C + JR NZ,.RstRect + EI + POP AF + SETPORT WINSP.CPU1,,0 + POP AF + SETPORT WINSP.CPU3,,0 + RET + +;[]==========================================================[] +; Процедура черчения прямоугольной площади окна +PutRectan HALT + DI + PUSH IY + SPMOUSE MOUSEF.REFRESH + POP IY + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD HL,(MakeWindow.PositX) ; поз. окна + SET 6,H + LD A,(MakeWindow.LenY) ; длина окна -(подсветка+тень) + SUB 0x02 + LD (.TmpLen1),A + LD A,(MakeWindow.PositY) + LD D,A + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.WHITE + COLORI.WHITE;0xFF + LD (HL),E + INC A + SETPORT WINSP.Y_PORT,,0 + LD BC,(MakeWindow.LenX) + DEC BC + DEC BC + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.TmpLen1 EQU $-1 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),COLORP.WHITE + COLORI.BLACKGRAY;0xF7 + INC HL + LD E,COLORP.HIGHGRAY + COLORI.HIGHGRAY;0x88 +.PtRect1 LD A,D + SETPORT WINSP.Y_PORT,,0 + LD (HL),COLORP.WHITE + COLORI.WHITE;0xFF + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + INC HL + DEC BC + LD A,B + OR C + JR NZ,.PtRect1 + LD A,D + SETPORT WINSP.Y_PORT,,0 + LD (HL),COLORP.WHITE + COLORI.BLACKGRAY;0xF7 + INC A + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),E + EI + POP AF + SETPORT WINSP.CPU1,,0 + RET + +; Печать текстовой строки по указанному адресу адресу +PutAdrTxtLine LD HL,(MakeWindow.PositX) + SLA L + RL H + LD E,(IY+0x00) ; Xpos + INC IY + LD D,(IY+0x00) + INC IY + ADD HL,DE + EX DE,HL + LD HL,(MakeWindow.PositY) + LD C,(IY+0x00) ; Ypos + INC IY + LD B,(IY+0x00) + INC IY + ADD HL,BC + LD C,L + LD B,H + LD A,(IY+0x00) ; Color + INC IY + LD L,(IY+0) + INC IY + LD H,(IY+0) ; Адрес текста + INC IY + PUSH IY + LD A,H + OR L + CALL NZ,PrnTxtLnIFF ; печатать если адрес не 0 + POP IY + RET + +;[]===========================================================[] +PutTxtLine LD HL,(MakeWindow.PositX) + SLA L + RL H + LD E,(IY+0x00) ; Xpos + INC IY + LD D,(IY+0x00) + INC IY + ADD HL,DE + EX DE,HL + LD HL,(MakeWindow.PositY) + LD C,(IY+0x00) ; Ypos + INC IY + LD B,(IY+0x00) + INC IY + ADD HL,BC + LD C,L + LD B,H + LD A,(IY+0x00) ; Color + INC IY + PUSH IY + POP HL + CALL PrnTxtLnIFF + PUSH HL + POP IY + RET + +;[]===========================================================[] +PutHeadPlc DI + PUSH IY + SPMOUSE MOUSEF.REFRESH + POP IY + LD HL,(MakeWindow.PositX) + SET 6,H + LD C,(IY+0x00) + INC IY + LD B,(IY+0x00) + INC IY + SRL B + RR C + ADD HL,BC + LD C,(IY+0x00) + INC IY + INC IY + LD A,(MakeWindow.PositY) + ADD A,C + LD IXL,A + LD C,(IY+0x00) + INC IY + LD B,(IY+0x00) + INC IY + SRL B + RR C + LD A,(IY+0x00) + INC IY + INC IY + LD (.TmpLen2),A + LD A,(IY+0x00) + AND 0x0F + RLCA + RLCA + RLCA + RLCA + OR (IY+0x00) + LD D,A + INC IY + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.TmpLen2 EQU $-1 + ACCEL ACCELCMD.OFF +.PtHead1 LD A,IXL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),D + ACCEL ACCELCMD.OFF + INC HL + DEC BC + LD A,B + OR C + JR NZ,.PtHead1 + EI + POP AF + SETPORT WINSP.CPU1,,0 + RET + +;[]===========================================================[] +PutDRectan LD HL,(MakeWindow.PositX) + SET 6,H + LD C,(IY+0x00) + INC IY + LD B,(IY+0x00) + INC IY + SRL B + RR C + ADD HL,BC + LD C,(IY+0x00) + INC IY + INC IY + LD A,(MakeWindow.PositY) + ADD A,C + LD IXL,A + LD C,(IY+0x00) + INC IY + LD B,(IY+0x00) + INC IY + SRL B + RR C + DEC BC + LD A,C + DEC A + LD (.TmpLen4),A + LD A,(IY+0x00) + INC IY + INC IY + SUB 0x02 + LD (.TmpLen3),A + ADD A,IXL + INC A + LD IXH,A + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.TmpLen3 EQU $-1 + ACCEL ACCELCMD.OFF + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + LD (HL),E + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),COLORP.BLACKGRAY + COLORI.WHITE;0x7F + PUSH HL + ADD HL,BC + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.WHITE + COLORI.WHITE;0xFF + LD (HL),E + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),E + POP HL + INC HL + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.TmpLen4 EQU $-1 + ACCEL ACCELCMD.FILL + LD (HL),E + ACCEL ACCELCMD.OFF + LD A,IXH + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.WHITE + COLORI.WHITE;0xFF + ACCEL ACCELCMD.FILL + LD (HL),E + ACCEL ACCELCMD.OFF + EI + POP AF + SETPORT WINSP.CPU1,,0 + RET + +;[]===========================================================[] +PutURectan LD HL,(MakeWindow.PositX) + SET 6,H ; | 0x4000 + LD C,(IY+0x00) ; 00 + INC IY ; 0->1 + LD B,(IY+0x00) ; 01 + INC IY ; 1->2 + SRL B + RR C + ADD HL,BC + LD C,(IY+0x00) ; 02 + INC IY ; 2->3 + INC IY ; 3->4 + LD A,(MakeWindow.PositY) + ADD A,C + LD IXL,A + LD C,(IY+0x00) ; 04 + INC IY ; 4->5 + LD B,(IY+0x00) ; 05 + INC IY ; 5->6 + SRL B + RR C + DEC BC + LD A,C + DEC A + LD (.TmpLen6),A + LD A,(IY+0x00) ; 06 + INC IY ; 6->7 + INC IY ; 7->8 + SUB 0x02 + LD (.TmpLen5),A + ADD A,IXL + INC A + LD IXH,A + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.TmpLen5 EQU $-1 + ACCEL ACCELCMD.OFF + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.WHITE + COLORI.WHITE;0xFF + LD (HL),E + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),COLORP.WHITE + COLORI.BLACKGRAY;0xF7 + PUSH HL + ADD HL,BC + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + LD (HL),E + INC A + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + LD (HL),E + POP HL + INC HL + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.WHITE + COLORI.WHITE;0xFF + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.TmpLen6 EQU $-1 + ACCEL ACCELCMD.FILL + LD (HL),E + ACCEL ACCELCMD.OFF + LD A,IXH + SETPORT WINSP.Y_PORT,,0 + LD E,COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + ACCEL ACCELCMD.FILL + LD (HL),E + ACCEL ACCELCMD.OFF + EI + POP AF + SETPORT WINSP.CPU1,,0 + RET + +;[]===========================================================[] +PutButton LD HL,(MakeWindow.PositX) + SLA L + RL H + LD E,(IY+0x00) ; Xpos + LD D,(IY+0x01) + ADD HL,DE + INC HL + INC HL + INC HL + INC HL + EX DE,HL + LD HL,(MakeWindow.PositY) + LD C,(IY+0x02) ; Ypos + LD B,(IY+0x03) + ADD HL,BC + INC HL + LD C,L + LD B,H + PUSH DE + PUSH BC + CALL PutURectan + POP BC + POP DE + LD A,(IY+0x00) ; Color + INC IY + PUSH IY + POP HL + CALL PrnTxtLnIFF + PUSH HL + POP IY + RET + +;[]===========================================================[] +PutHorizLine LD HL,(MakeWindow.PositX) + SET 6,H + LD C,(IY+0x00) + INC IY + LD B,(IY+0x00) + INC IY + SRL B + RR C + ADD HL,BC + LD C,(IY+0x00) + INC IY + INC IY + LD A,(MakeWindow.PositY) + ADD A,C + LD IXL,A + LD C,(IY+0x00) + INC IY + LD B,(IY+0x00) + INC IY + SRL B + RR C + LD E,COLORP.BLACKGRAY + COLORI.BLACKGRAY;0x77 + PUSH HL + CALL .HorizLn + POP HL + INC IXL + LD E,COLORP.WHITE + COLORI.WHITE;0xFF +.HorizLn DI + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + LD A,B + OR A + JR Z,.HorLn1 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 + ACCEL ACCELCMD.FILL + LD (HL),E + ACCEL ACCELCMD.OFF + INC H +.HorLn1 LD A,C + LD (.TmpLen8),A + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.TmpLen8 EQU $-1 + ACCEL ACCELCMD.FILL + LD (HL),E + ACCEL ACCELCMD.OFF + EI + POP AF + SETPORT WINSP.CPU1,,0 + RET + +;[]===========================================================[] +PutVertLine LD HL,(MakeWindow.PositX) + SET 6,H + LD C,(IY+0x00) + INC IY + LD B,(IY+0x00) + INC IY + SRL B + RR C + ADD HL,BC + LD C,(IY+0x00) + INC IY + INC IY + LD A,(MakeWindow.PositY) + ADD A,C + LD IXL,A + LD A,(IY+0x00) + INC IY + INC IY + LD (.TmpLen9),A + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + DI + LD DE,(COLORP.BLACKGRAY + COLORI.BLACKGRAY) << 8 + COLORP.WHITE + COLORI.WHITE;0x77FF + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.TmpLen9 EQU $-1 + ACCEL ACCELCMD.FILL_VERT + LD (HL),D + ACCEL ACCELCMD.OFF + INC HL + LD A,IXL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL_VERT + LD (HL),E + ACCEL ACCELCMD.OFF + EI + POP AF + SETPORT WINSP.CPU1,,0 + RET + +;[]===========================================================[] +PutSBleft LD HL,SBleft + JR PutSButton + +PutSBright LD HL,SBright + JR PutSButton + +PutSBup LD HL,SBup + JR PutSButton + +PutSBdown LD HL,SBdown +PutSButton EX DE,HL + LD HL,(MakeWindow.PositX) + SET 6,H + LD C,(IY+0x00) + INC IY + LD B,(IY+0x00) + INC IY + SRL B + RR C + ADD HL,BC + EX DE,HL + LD C,(IY+0x00) + INC IY + INC IY + LD A,(MakeWindow.PositY) + ADD A,C + LD C,A + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + DI + ACCEL ACCELCMD.SET_BUFFER + LD A,0x08 + ACCEL ACCELCMD.OFF + LD B,0x08 +PutSBlp PUSH BC + LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF + LD BC,0x0008 + ADD HL,BC + POP BC + INC C + DJNZ PutSBlp + EI + POP AF + SETPORT WINSP.CPU1,,0 + RET + +; спрайтик для скроллбара "стрелка влево" +SBleft +; DEFB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x77 +; DEFB 0xFF,0x88,0x88,0x88,0x80,0x00,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x80,0x00,0x00,0x88,0x77 +; DEFB 0xFF,0x88,0x80,0x00,0x00,0x08,0x88,0x77 +; DEFB 0xFF,0x88,0x80,0x00,0x00,0x08,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x00,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x80,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x77,0x77,0x77,0x77,0x77,0x77,0x77 + DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x77 ; 0 + DB 0xFF,0x88,0x88,0x88,0x80,0x00,0x88,0x77 ; 1 + DB 0xFF,0x88,0x88,0x80,0x00,0x08,0x88,0x77 ; 2 + DB 0xFF,0x88,0x80,0x00,0x00,0x88,0x88,0x77 ; 3 + DB 0xFF,0x88,0x80,0x00,0x00,0x88,0x88,0x77 ; 4 + DB 0xFF,0x88,0x88,0x80,0x00,0x08,0x88,0x77 ; 5 + DB 0xFF,0x88,0x88,0x88,0x80,0x00,0x88,0x77 ; 6 + DB 0xFF,0x77,0x77,0x77,0x77,0x77,0x77,0x77 ; 7 + +; спрайтик для скроллбара "стрелка вправо" +SBright +; DEFB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x77 +; DEFB 0xFF,0x88,0x88,0x08,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x00,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x00,0x08,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x00,0x08,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x00,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x08,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x77,0x77,0x77,0x77,0x77,0x77,0x77 + DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0 + DB 0xFF,0x88,0x00,0x08,0x88,0x88,0x88,0x77 ; 1 + DB 0xFF,0x88,0x80,0x00,0x08,0x88,0x88,0x77 ; 2 + DB 0xFF,0x88,0x88,0x00,0x00,0x08,0x88,0x77 ; 3 + DB 0xFF,0x88,0x88,0x00,0x00,0x08,0x88,0x77 ; 4 + DB 0xFF,0x88,0x80,0x00,0x08,0x88,0x88,0x77 ; 5 + DB 0xFF,0x88,0x00,0x08,0x88,0x88,0x88,0x77 ; 6 + DB 0xFF,0x77,0x77,0x77,0x77,0x77,0x77,0x77 ; 7 + +; спрайтик для скроллбара "стрелка вверх" +SBup +; DEFB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x77 +; DEFB 0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x80,0x08,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x00,0x00,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x00,0x00,0x00,0x00,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x77,0x77,0x77,0x77,0x77,0x77,0x77 + DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0 + DB 0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x77 ; 1 + DB 0xFF,0x88,0x88,0x80,0x08,0x88,0x88,0x77 ; 2 + DB 0xFF,0x88,0x88,0x00,0x00,0x88,0x88,0x77 ; 3 + DB 0xFF,0x88,0x80,0x00,0x00,0x08,0x88,0x77 ; 4 + DB 0xFF,0x88,0x00,0x08,0x80,0x00,0x88,0x77 ; 5 + DB 0xFF,0x88,0x00,0x88,0x88,0x00,0x88,0x77 ; 6 + DB 0xFF,0x77,0x77,0x77,0x77,0x77,0x77,0x77 ; 7 + +; спрайтик для скроллбара "стрелка вниз" +SBdown +; DEFB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x77 +; DEFB 0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x00,0x00,0x00,0x00,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x00,0x00,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x80,0x08,0x88,0x88,0x77 +; DEFB 0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x77 +; DEFB 0xFF,0x77,0x77,0x77,0x77,0x77,0x77,0x77 + DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0 + DB 0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x77 ; 1 + DB 0xFF,0x88,0x00,0x88,0x88,0x00,0x88,0x77 ; 2 + DB 0xFF,0x88,0x00,0x08,0x80,0x00,0x88,0x77 ; 3 + DB 0xFF,0x88,0x80,0x00,0x00,0x08,0x88,0x77 ; 4 + DB 0xFF,0x88,0x88,0x00,0x00,0x88,0x88,0x77 ; 5 + DB 0xFF,0x88,0x88,0x80,0x08,0x88,0x88,0x77 ; 6 + DB 0xFF,0x77,0x77,0x77,0x77,0x77,0x77,0x77 ; 7 + +;[]----------------------------------------------------------[] +; Процедура инвертирования прямоугольной плоскости +; На вход: +; HL - X координата +; BC - Y координата +; HX - длина Y +; LX - длина X +; D - текущий цвет +; E - нужный цвет +InvertRectan PUSH IY + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + PUSH AF + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD IYL,C + LD C,IXH + LD B,IXL + SRL H + RR L + SET 6,H + LD IXL,E + LD IXH,D + LD A,D + AND 0xF0 + LD IYH,A + RRCA + RRCA + RRCA + RRCA + OR IYH + LD D,A + AND 0x0F + LD IYH,A + LD E,IXH + LD A,E + AND 0x0F + RLCA + RLCA + RLCA + RLCA + OR IYH + LD IXH,A + EXX + LD A,IXL + AND 0xF0 + LD IYH,A + RRCA + RRCA + RRCA + RRCA + OR IYH + LD D,A + AND 0x0F + LD IYH,A + LD E,IXL + LD A,E + AND 0x0F + RLCA + RLCA + RLCA + RLCA + OR IYH + LD B,A + AND 0xF0 + LD IYH,A + RRCA + RRCA + RRCA + RRCA + OR IYH + LD C,A + EXX +.PrnInvLp LD A,IYL + SETPORT WINSP.Y_PORT,,0 + PUSH HL + EXX + POP HL + EXX + PUSH HL + PUSH BC + CALL InvLnLp + POP BC + POP HL + INC IYL + DEC C + JR NZ,.PrnInvLp + POP AF + SETPORT WINSP.CPU1,,0 + POP AF + SETPORT WINSP.Y_PORT,,0 + POP IY + RET + +InvLnLp LD A,(HL) + INC HL + CP D + JR NZ,CmpInv2 + EXX + LD (HL),D + INC HL + EXX + DJNZ InvLnLp + RET + +CmpInv2 CP E + JR NZ,CmpInv3 + EXX + LD (HL),E + INC HL + EXX + DJNZ InvLnLp + RET + +CmpInv3 CP IXH + JR NZ,SetInv4 + EXX + LD (HL),B + INC HL + EXX + DJNZ InvLnLp + RET + +SetInv4 EXX + LD (HL),C + INC HL + EXX + DJNZ InvLnLp + RET diff --git a/fnwork.a80 b/fnwork.a80 new file mode 100644 index 0000000..b6a9b34 --- /dev/null +++ b/fnwork.a80 @@ -0,0 +1,2077 @@ + +; LAST UPDATE: 27.04.2025 savelij + +;[]===========================================================[] +CursUp LD A,(IY + PANEL.EFL) + OR (IY + PANEL.EFH) + RET Z + LD L,(IY + PANEL.CFL) + LD H,(IY + PANEL.CFH) + LD A,H + OR L + JR NZ,CursUp1 + LD A,(IY + PANEL.FFL) + OR (IY + PANEL.FFH) + RET Z + JR ScrlDn1 + +CursUp1 DEC HL + PUSH HL + CALL ResInvert + POP HL + LD (IY + PANEL.CFL),L + LD (IY + PANEL.CFH),H + CALL SetInvert + JP PrnFileInfo + +ScrollDown: LD A,(IY + PANEL.EFL) + OR (IY + PANEL.EFH) + RET Z + LD A,(IY + PANEL.FFL) + OR (IY + PANEL.FFH) + RET Z +ScrlDn1 BIT VIEWFLAG.B_FULL,(IY + PANEL.VIEWFLAG) + JP NZ,ScrlDnP + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JP NZ,ScrlDnT + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY + PANEL.EFL) + LD H,(IY + PANEL.EFH) + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 - адрес начала страницы + PUSH HL + POP IX + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + DEC HL + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 - адрес начала страницы + LD DE,WorkBuffer + LD BC,FileHDR.Attr + PUSH HL + LDIR + POP HL + LD DE,0x18*0x11 + ADD HL,DE + LD E,IXL + LD D,IXH + OR A + SBC HL,DE + ADD HL,DE + JR C,.L2 + EX DE,HL +.L2 LD DE,WorkBuffer+0x10 + LD C,0x0E + PUSH HL + LDIR + POP HL + LD DE,0x18*0x11 + ADD HL,DE + LD E,IXL + LD D,IXH + OR A + SBC HL,DE + ADD HL,DE + JR C,.L3 + EX DE,HL +.L3 LD DE,WorkBuffer+0x20 + LD C,0x0E + LDIR + POP AF + SETPORT WINSP.CPU1,,0 + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + CALL ResInvert + PUSH IY + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD L,(IY + PANEL.XL) + LD H,(IY + PANEL.XH) + LD DE,6 + ADD HL,DE + LD DE,63 << 8 | 71 + LD BC,128 << 8 | 46 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x01 + LD BC,12 << 8 | 63 + LD A,(HL) + DEC HL + OR A + PUSH DE + CALL NZ,PrintName + POP HL + LD DE,104 + ADD HL,DE + LD DE,63 << 8 | 71 + LD BC,128 << 8 | 46 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x11 + LD BC,12 << 8 | 63 + LD A,(HL) + DEC HL + OR A + PUSH DE + CALL NZ,PrintName + POP HL + LD DE,0x0068 + ADD HL,DE + LD DE,63 << 8 | 71 + LD BC,128 << 8 | 46 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x21 + LD BC,12 << 8 | 63 + LD A,(HL) + DEC HL + OR A + CALL NZ,PrintName + POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + POP IY + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + DEC HL + LD (IY + PANEL.FFL),L + LD (IY + PANEL.FFH),H + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + JP PrnHScrBar + +ScrlDnP + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + DEC HL + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 + LD DE,WorkBuffer + LD BC,FileHDR.SIZE + LDIR + POP AF + SETPORT WINSP.CPU1,,0 + LD IX,WorkBuffer + LD HL,WorkBuffer + LD DE,WorkBuffer+0x200 + LD BC,0x000D + LDIR + LD A,0x01 + LD (DE),A + INC DE + BIT DIR.B_Dir,(IX + FileHDR.Attr) + CALL NZ,PutDIRTxt + CALL Z,GetFileLen + LD A,0x01 + LD (DE),A + INC DE + CALL GetData + LD A,0x01 + LD (DE),A + INC DE + CALL GetTime + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + CALL ResInvert + PUSH IY + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + LD DE,4 + ADD HL,DE + LD DE,63 << 8 | 71 + LD BC,136 << 8 + 144 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x200 + LD BC,38 << 8 + 63 + CALL PrintName + POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + POP IY + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + DEC HL + LD (IY+PANEL.FFL),L + LD (IY+PANEL.FFH),H + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + JP PrnVScrBar + +ScrlDnT + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + LD B,0x18 + LD A,0x80 + PUSH HL +.L2 LD (HL),A + INC L + DJNZ .L2 + POP DE + LD HL,0x4000 + LD C,(IY+PANEL.FFL) + LD B,(IY+PANEL.FFH) + DEC BC + LD A,B + OR C + JR Z,ScrDdn2 +ScrDdn1 PUSH BC + LD A,(HL) + AND 0x7F + LD E,A + LD A,(HL) + LD (DE),A + LD BC,0x0010 + ADD HL,BC + POP BC + DEC BC + LD A,B + OR C + JR NZ,ScrDdn1 +ScrDdn2 LD DE,WorkBuffer+0x100 + LD BC,0x0010 + LDIR + POP AF + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer+0x100 + LD DE,WorkBuffer+0x200 + CALL MakeTreeLine + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + CALL ResInvert + PUSH IY + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + LD DE,6 + ADD HL,DE + LD DE,63 << 8 | 71 + LD BC,136 << 8 | 144 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x200 + LD BC,36 << 8 | 63 + CALL PrintName + POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + POP IY + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + DEC HL + LD (IY+PANEL.FFL),L + LD (IY+PANEL.FFH),H + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + JP PrnVScrBar + +;[]===========================================================[] +CursDown LD C,(IY+PANEL.EFL) + LD B,(IY+PANEL.EFH) + LD A,B + OR C + RET Z + LD L,(IY+PANEL.CFL) + LD H,(IY+PANEL.CFH) + INC HL + PUSH HL + LD E,(IY+PANEL.FFL) + LD D,(IY+PANEL.FFH) + ADD HL,DE + OR A + SBC HL,BC + POP HL + RET NC + LD E,(IY+PANEL.FPL) + LD D,(IY+PANEL.FPH) + OR A + SBC HL,DE + JR NC,ScrlUp1 + ADD HL,DE + PUSH HL + CALL ResInvert + POP HL + LD (IY+PANEL.CFL),L + LD (IY+PANEL.CFH),H + CALL SetInvert + JP PrnFileInfo + +ScrollUp: LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.FPL) + LD D,(IY+PANEL.FPH) + ADD HL,DE + LD E,(IY+PANEL.EFL) + LD D,(IY+PANEL.EFH) + OR A + SBC HL,DE + RET NC +ScrlUp1 BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + JP NZ,ScrlUpP + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,ScrlUpT + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD DE,0x0011 + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + SET 6,H + LD DE,WorkBuffer + LD BC,0x000E + PUSH HL + LDIR + POP HL + LD DE,0x18*0x11 + ADD HL,DE + LD DE,WorkBuffer+0x10 + LD C,0x0E + PUSH HL + LDIR + POP HL + LD DE,0x18*0x11 + ADD HL,DE + LD DE,WorkBuffer+0x20 + LD C,0x0E + LDIR + POP AF + SETPORT WINSP.CPU1,,0 + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + CALL ResInvert + PUSH IY + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + LD DE,6 + ADD HL,DE + LD DE,71 << 8 | 63 + LD BC,128 << 8 | 46 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x01 + LD BC,12 << 8 | 191 + LD A,(HL) + DEC HL + OR A + PUSH DE + CALL NZ,PrintName + POP HL + LD DE,0x0068 + ADD HL,DE + LD D,0x3F+0x08 + LD E,0x3F + LD BC,0x802E + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x11 + LD BC,12 << 8 | 191 + LD A,(HL) + DEC HL + OR A + PUSH DE + CALL NZ,PrintName + POP HL + LD DE,104 + ADD HL,DE + LD DE,71 << 8 | 63 + LD BC,128 << 8 | 46 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x21 + LD BC,12 << 8 | 191 + LD A,(HL) + DEC HL + OR A + CALL NZ,PrintName + POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + POP IY + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + INC HL + LD (IY+PANEL.FFL),L + LD (IY+PANEL.FFH),H + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + JP PrnHScrBar + +ScrlUpP + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD DE,0x0012 + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + SET 6,H + LD DE,WorkBuffer + LD BC,0x0018 + LDIR + POP AF + SETPORT WINSP.CPU1,,0 + LD IX,WorkBuffer + LD HL,WorkBuffer + LD DE,WorkBuffer+0x200 + LD BC,0x000D + LDIR + LD A,0x01 + LD (DE),A + INC DE + BIT DIR.B_Dir,(IX + FileHDR.Attr) + CALL NZ,PutDIRTxt + CALL Z,GetFileLen + LD A,0x01 + LD (DE),A + INC DE + CALL GetData + LD A,0x01 + LD (DE),A + INC DE + CALL GetTime + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + CALL ResInvert + PUSH IY + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + LD DE,4 + ADD HL,DE + LD DE,71 << 8 | 63 + LD BC,136 << 8 | 144 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x200 + LD BC,38 << 8 | 199 + CALL PrintName + POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + POP IY + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + INC HL + LD (IY+PANEL.FFL),L + LD (IY+PANEL.FFH),H + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + JP PrnVScrBar + +ScrlUpT + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + LD B,0x18 + LD A,0x80 + PUSH HL +.L2 LD (HL),A + INC L + DJNZ .L2 + POP DE + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD BC,0x0012 + ADD HL,BC + LD C,L + LD B,H + LD HL,0x4000 +ScrDup1 PUSH BC + LD A,(HL) + AND 0x7F + LD E,A + LD A,(HL) + LD (DE),A + LD BC,0x0010 + ADD HL,BC + POP BC + DEC BC + LD A,B + OR C + JR NZ,ScrDup1 + LD DE,WorkBuffer+0x100 + LD BC,0x0010 + LDIR + POP AF + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer+0x100 + LD DE,WorkBuffer+0x200 + CALL MakeTreeLine + LD B,COLORP.PANEL + COLORI.FILES + LD C,COLORP.PANEL + COLORI.SELECTFILES + CALL InsPrnColor + CALL ResInvert + PUSH IY + GETPORT WINSP.Y_PORT ; Сохраняем Y порт + LD C,A + GETPORT WINSP.CPU1 + LD B,A + PUSH BC + SETPORT WINSP.CPU1,0x50 + LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + LD DE,6 + ADD HL,DE + LD DE,71 << 8 | 63 + LD BC,136 << 8 | 144 + PUSH HL + CALL ScrollDIRDownUp + POP DE + LD HL,WorkBuffer+0x200 + LD BC,36 << 8 | 199 + CALL PrintName + POP BC + LD A,B + SETPORT WINSP.CPU1,,0 + LD A,C + SETPORT WINSP.Y_PORT,,0 + POP IY + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + INC HL + LD (IY+PANEL.FFL),L + LD (IY+PANEL.FFH),H + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + JP PrnVScrBar + +; На вход: +; HL - X позиция +; D - Y откуда +; Е - Y куда +; B - высота +; C - ширина +ScrollDIRDownUp: + SRL H + RR L + SET 6,H + LD A,B + LD (.ScrlLen),A + DI + LD B,C + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.ScrlLen EQU $-1 + ACCEL ACCELCMD.OFF +.ScRect1 LD A,D + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD A,(HL) + ACCEL ACCELCMD.OFF + LD A,E + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD (HL),A + ACCEL ACCELCMD.OFF + INC HL + DJNZ .ScRect1 + EI + RET + +;[]===========================================================[] +CursLeft BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + LD L,(IY+PANEL.CFL) + LD H,(IY+PANEL.CFH) + LD A,H + OR L + JP Z,PageUp + LD DE,0x0011 + SBC HL,DE + JR NC,CursLRex + LD HL,0x0000 + JR CursLRex + +CursRight BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + LD L,(IY+PANEL.CFL) + LD H,(IY+PANEL.CFH) + LD E,(IY+PANEL.FPL) + LD D,(IY+PANEL.FPH) + DEC DE + OR A + PUSH HL + SBC HL,DE + POP HL + JP Z,PageDown + LD DE,0x0011 + ADD HL,DE + BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + JR NZ,.L1 + LD DE,0x0032 +.L1 EX DE,HL + SBC HL,DE + JR NC,CursRg1 + LD E,(IY+PANEL.FPL) + LD D,(IY+PANEL.FPH) + DEC DE +CursRg1 EX DE,HL + PUSH HL + LD E,(IY+PANEL.FFL) + LD D,(IY+PANEL.FFH) + ADD HL,DE + LD C,(IY+PANEL.EFL) + LD B,(IY+PANEL.EFH) + OR A + SBC HL,BC + POP HL + JR C,CursLRex + LD L,C + LD H,B + OR A + SBC HL,DE + DEC HL + PUSH HL + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + OR A + SBC HL,DE + POP HL + RET Z +CursLRex PUSH HL + CALL ResInvert + POP HL + LD (IY+PANEL.CFL),L + LD (IY+PANEL.CFH),H + CALL SetInvert + JP PrnFileInfo + +;[]===========================================================[] +PageUp LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD A,H + OR L + JP Z,Home + PUSH HL + CALL ResInvert + POP HL + LD E,(IY+PANEL.FPL) + LD D,(IY+PANEL.FPH) + OR A + SBC HL,DE + JR NC,.L1 + LD HL,0x0000 +.L1 LD (IY+PANEL.FFL),L + LD (IY+PANEL.FFH),H + JR PageUDex + +PageDown LD C,(IY+PANEL.EFL) + LD B,(IY+PANEL.EFH) + LD A,B + OR C + RET Z + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.FPL) + LD D,(IY+PANEL.FPH) + ADD HL,DE + OR A + SBC HL,BC + JP NC,End + PUSH HL + PUSH BC + CALL ResInvert + POP BC + POP HL + ADD HL,BC + LD (IY+PANEL.FFL),L + LD (IY+PANEL.FFH),H + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + OR A + SBC HL,BC + JR C,PageUDex + LD L,C + LD H,B + LD E,(IY+PANEL.FFL) + LD D,(IY+PANEL.FFH) + OR A + SBC HL,DE + DEC HL + LD (IY+PANEL.CFL),L + LD (IY+PANEL.CFH),H +PageUDex CALL PrintDIR + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar + LD B,0x07 +PgUDext PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ PgUDext + RET + +;[]===========================================================[] +Home LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + LD A,(IY+PANEL.FFL) + OR (IY+PANEL.FFH) + JR NZ,Home1 + LD A,(IY+PANEL.CFL) + OR (IY+PANEL.CFH) + RET Z + CALL ResInvert + SUB A + LD (IY+PANEL.CFL),A + LD (IY+PANEL.CFH),A + CALL SetInvert + JP PrnFileInfo + +Home1 CALL ResInvert + SUB A + LD (IY+PANEL.FFL),A + LD (IY+PANEL.FFH),A + LD (IY+PANEL.CFL),A + LD (IY+PANEL.CFH),A + JR PageUDex + +End LD C,(IY+PANEL.EFL) + LD B,(IY+PANEL.EFH) + LD A,B + OR C + RET Z + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + INC HL + OR A + SBC HL,BC + RET Z + PUSH BC + CALL ResInvert + POP BC + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + LD E,(IY+PANEL.FPL) + LD D,(IY+PANEL.FPH) + ADD HL,DE + INC HL + OR A + SBC HL,BC + JR Z,End1 + JR C,End1 + LD L,(IY+PANEL.EFL) + LD H,(IY+PANEL.EFH) + LD E,(IY+PANEL.FFL) + LD D,(IY+PANEL.FFH) + OR A + SBC HL,DE + DEC HL + LD (IY+PANEL.CFL),L + LD (IY+PANEL.CFH),H + CALL SetInvert + CALL PrnFileInfo + RET +End1 LD L,C + LD H,B + OR A + SBC HL,DE + LD (IY+PANEL.FFL),L + LD (IY+PANEL.FFH),H + BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + LD L,(IY+PANEL.FPL) + LD H,(IY+PANEL.FPH) + DEC HL + LD (IY+PANEL.CFL),L + LD (IY+PANEL.CFH),H + JP PageUDex + +;[]==========================================================[] +NewFile LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + LD A,0x00 + JR NZ,NewFile1 + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD BC,0x0068 + JR Z,.L1 + LD BC,0x01A8 +.L1 OR A + SBC HL,BC + JR C,NewFile1 + ADD HL,BC + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD BC,0x0070 + JR Z,.L2 + LD BC,0x01B0 +.L2 SBC HL,BC + RET C + ADD HL,BC + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD BC,0x00D0 + JR Z,.L3 + LD BC,0x0210 +.L3 SBC HL,BC + LD A,0x11 + JR C,NewFile1 + ADD HL,BC + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD BC,0x00D8 + JR Z,.L4 + LD BC,0x0218 +.L4 SBC HL,BC + RET C + ADD HL,BC + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD BC,0x0138 + JR Z,.L5 + LD BC,0x0278 +.L5 SBC HL,BC + RET NC + LD A,0x22 +NewFile1 LD HL,0x003F + OR A + EX DE,HL + SBC HL,DE + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD C,A + LD B,0x00 + ADD HL,BC + LD C,(IY+PANEL.CFL) + LD B,(IY+PANEL.CFH) + OR A + SBC HL,BC + JP Z,OpenFile + ADD HL,BC + LD E,(IY+PANEL.FFL) + LD D,(IY+PANEL.FFH) + ADD HL,DE + LD C,(IY+PANEL.EFL) + LD B,(IY+PANEL.EFH) + OR A + SBC HL,BC + RET NC + ADD HL,BC + OR A + SBC HL,DE + PUSH HL + CALL ResInvert + POP HL + LD (IY+PANEL.CFL),L + LD (IY+PANEL.CFH),H + CALL SetInvert + CALL PrnFileInfo + JP ResFire + +;[]==========================================================[] +OpenFile BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + IF TREE_REZID + JP NZ,RESIDENT.TestTreeBeg + ELSE + JP NZ,TestTreeR.TestTreeBeg + ENDIF + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 + LD DE,WorkBuffer + LD BC,FileHDR.Attr + PUSH HL + ADD HL,BC + LDI + POP HL + INC HL + CALL MakeDOSname + POP AF + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + BIT 4,(HL) + INC HL + JP Z,RunEXEfile + LD A,(HL) + CP '.' + JR NZ,OpenF2 + PUSH HL + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + SUB A +.L2 INC HL + CP (HL) + JR NZ,.L2 + LD A,0x5C + DEC HL + CP (HL) + JR Z,OpenF1 +.L3 DEC HL + CP (HL) + JR NZ,.L3 + INC HL + SUB A + LD DE,PrevDIR +.L4 LDI + CP (HL) + JR NZ,.L4 + LD (DE),A + LD A,'.' +OpenF1 POP HL +OpenF2 PUSH AF + PUSH HL + CALL ResInvert + POP HL + CALL SetClock + PUSH IY + SPDSS DSSF.CHDIR + POP IY + CALL C,DOSError + CALL ReadDIR + PUSH IY + PUSH IY + SPDSS DSSF.CURDISK + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + SPDSS DSSF.CURDIR + POP IY + CALL PrintPath + BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + CALL NZ,PrintDOSPath + POP AF + CP '.' + CALL Z,FindPrevDIR + CALL PrintDIR + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar + CALL SetMouse + LD A,(TreeFlag) + OR A + JP Z,ResFire + PUSH IY + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD IY,LeftPanel + LD HL,RightPanel + JR NZ,.L5 + LD IY,RightPanel + LD HL,LeftPanel +.L5 LD DE,PANEL.CURRPATH + ADD HL,DE + INC HL + INC HL + IF TREE_REZID + CALL RESIDENT.FindTreeDIR + ELSE + CALL FindTreeDIRR + ENDIF + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL PrnVScrBar + POP IY + RET + +;[]==========================================================[] +ChPanel CALL ResInvert + LD A,(LeftPanel) + XOR 0x80 + LD (LeftPanel),A + LD A,(RightPanel) + XOR 0x80 + LD (RightPanel),A + CALL PrintPath + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JR Z,ChPan1 + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU1,,0 + SETPORT WINSP.Y_PORT,0xC0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + SET 6,H + INC HL + SET 1,(HL) + POP AF + SETPORT WINSP.CPU1,,0 + CALL PrintDIR +ChPan1 LD IY,LeftPanel + BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + JR NZ,.L1 + LD IY,RightPanel +.L1 CALL PrintPath + CALL PrintDOSPath + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JR Z,ChPan2 + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L2 + LD A,(RAMPAGES.RIGHTPANEL) +.L2 + SETPORT WINSP.CPU1,,0 + SETPORT WINSP.Y_PORT,0xC0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + SET 6,H + INC HL + RES 1,(HL) + POP AF + SETPORT WINSP.CPU1,,0 + CALL PrintDIR +ChPan2 CALL SetInvert + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + PUSH IY + SPDSS DSSF.CHDIR + POP IY + RET NC + CALL DOSError + JP BegDIRECTORY + +;[]==========================================================[] +ChangeDriveL LD IX,LeftPanel + JR ChangeDrive + +ChangeDriveR LD IX,RightPanel +ChangeDrive PUSH IY + PUSH IX + POP IY + LD C,(IY+PANEL.XL) + LD B,(IY+PANEL.XH) + INC BC + INC BC + OR A + SBC HL,BC + LD BC,0x001C + LD A,0xFF +.L1 INC A + SBC HL,BC + JR NC,.L1 + ADD A,'A' + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + LD (HL),D + LD HL,NewDrive + LD (HL),A + CALL NewDIRECTORY + LD A,(AutoActivatePanel) + AND A + JR NZ,loc_C82E + BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + POP IY + JP Z,ChPanel ; RET NZ + RET + +loc_C82E BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + POP IY + RET NZ + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + PUSH IY + SPDSS DSSF.CHDIR + POP IY + RET NC + CALL DOSError + JP BegDIRECTORY + +NewDrive DZ " :\\" + +;[]==========================================================[] +ReplacePanels LD IX,LeftPanel + SET PANELFLAG.B_SIDE,(IX+PANEL.PANELFLAG) + LD L,(IX+PANEL.XL) + LD H,(IX+PANEL.XH) + LD IX,RightPanel + RES PANELFLAG.B_SIDE,(IX+PANEL.PANELFLAG) + LD E,(IX+PANEL.XL) + LD D,(IX+PANEL.XH) + LD (IX+PANEL.XL),L + LD (IX+PANEL.XH),H + LD IX,LeftPanel + LD (IX+PANEL.XL),E + LD (IX+PANEL.XH),D + LD HL,RAMPAGES.LEFTPANEL + LD DE,RAMPAGES.RIGHTPANEL + LD A,(DE) + LDI + DEC HL + LD (HL),A + LD HL,LeftPanel + LD DE,RightPanel + LD BC,PANEL.CURRPATH + 0x100 +ReplPan LD A,(DE) + LDI + DEC HL + LD (HL),A + INC HL + JP PE,ReplPan + LD A,0x01 + JP InitPanels + +;[]==========================================================[] +ShowDOSscreen CALL ResVideoMode +ShowDSlp + SPDSS DSSF.SCANKEY + JR NZ,ShowDSexit + SPMOUSE MOUSEF.READ_STATE + OR A + JR Z,ShowDSlp +ShowDSexit + SPDSS DSSF.SETVMOD,0,SETVMOD.GRF640X256 + JP ResFire + +;[]==========================================================[] +RunEXEfile: LD IX,fn_ext + LD DE,PrevFile + PUSH DE + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + POP DE + LD L,E + LD H,D + LD A,'.' +.L2 INC HL + CP (HL) + JR NZ,.L2 + INC HL + LD A,(HL) + INC HL + RES 5,A + cp 'B' + jp z,RunBATfile + CP 'F' + JP Z,RunFLXfile + CP 'E' + JP NZ,TestEXT + LD A,(HL) + INC HL + RES 5,A + CP 'X' + JP NZ,TestEXT + LD A,(HL) + RES 5,A + CP 'E' + JP NZ,TestEXT +RunFile: PUSH DE + CALL ResDrivers + SUB A + CALL ClearScreen + CALL ResVideoMode + POP HL + SPDSS DSSF.EXEC,0 + PUSH AF + SETPORT BORDER,0 + ;!FIXIT проверить для это оно или нет SAFE_PORTY + SETPORT WINSP.Y_PORT,0xC0 + CALL InitVideoMode + CALL InitDrivers + CALL InitScreen + CALL ClearDOSline + LD A,0x02 + CALL InitPanels + POP AF + JP C,DOSError + RET + +;[]----------------------------------------------------------[] +RunBATfile: LD A,(HL) + INC HL + RES 5,A + CP 'A' + JP NZ,TestEXT + LD A,(HL) + RES 5,A + CP 'T' + JP NZ,TestEXT + PUSH DE + ld hl,ShellFile + ld de,WorkBuffer + call CopyString + bit PANELFLAG.B_SIDE,(iy+PANEL.PANELFLAG) + ld hl,RightPanel + PANEL.CURRPATH + jr nz,.next + ld hl,LeftPanel + PANEL.CURRPATH +.next: call ConcatString + dec de + ex hl,de + ld a,'\\' + cp (hl) + jr z,.skipSlash + inc hl + ld (hl),a +.skipSlash: inc hl + ex hl,de + pop hl + call CopyString + ld de,WorkBuffer + jr RunFile + +;[]----------------------------------------------------------[] +; запуск FLX плагина из панели по ENTER +RunFLXfile LD A,(HL) + INC HL + RES 5,A + CP 'L' + JP NZ,TestEXT + LD A,(HL) + RES 5,A + CP 'X' + JP NZ,TestEXT + EX DE,HL + LD DE,WorkBuffer + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + CALL RunFLX + JP C,DOSError + RET + +;[]-----------------------------------------------------------[] +TestEXT: PUSH IX + LD IXL,E + LD IXH,D + EX DE,HL + LD A,'.' +.L1 INC HL + CP (HL) + JR NZ,.L1 + INC HL + EX DE,HL + POP HL + GETPORT WINSP.CPU1 + PUSH AF + LD A,(RAMPAGES.FNHELP) + SETPORT WINSP.CPU1,,0 +TestEXT1: LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD A,B + OR C + JR Z,TestEND + PUSH DE + EX DE,HL + LD A,(DE) + INC DE + CP '?' + JR Z,.L1 + CP (HL) + JR NZ,TestEXTn +.L1 INC HL + LD A,(DE) + INC DE + CP '?' + JR Z,.L2 + CP (HL) + JR NZ,TestEXTn +.L2 INC HL + LD A,(DE) + INC DE + CP '?' + JR Z,TestEXTn + CP (HL) +TestEXTn: EX DE,HL + POP DE + JR Z,TestEXTok + LD L,C + LD H,B + JR TestEXT1 + +TestEND: POP AF + SETPORT WINSP.CPU1,,0 + SCF + RET + +TestEXTok: LD DE,WorkBuffer + LD C,0x00 +TstEXT0: LD A,C + LDI + LD C,A + LD A,(HL) + OR A + JR Z,TstEXT2 + CP ' ' + JR Z,TstEXT1 + CP '.' + JR NZ,TstEXT0 + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL + INC DE + CP ' ' + JR Z,TstEXT1 + RES 5,A + CP 'F' + JR NZ,.L1 + SET 0,C +.L1 LD A,(HL) + LD (DE),A + INC HL + INC DE + CP ' ' + JR Z,TstEXT1 + RES 5,A + CP 'L' + JR NZ,.L2 + SET 1,C +.L2 LD A,(HL) + LD (DE),A + INC HL + INC DE + CP ' ' + JR Z,TstEXT1 + RES 5,A + CP 'X' + JR NZ,TstEXT1 + SET 2,C +TstEXT1: LD A,(HL) + CP '!' + JR NZ,TstEX11 + INC HL + LD A,(HL) + CP '.' + JP Z,EName + CP ':' + JP Z,EDrive + CP '\\' + JP Z,EPath + DEC HL +TstEX11: LD (DE),A + INC HL + INC DE + OR A + JR NZ,TstEXT1 +TstEXT2: LD (DE),A + POP AF + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + LD A,C + CP 0x07 + JP Z,RunFLX + LD DE,WorkBuffer+0x100 + PUSH IY + SPDSS DSSF.F_FIRST,1,0x37 + POP IY + JP C,RestoreDIR + CALL ResDrivers + SUB A + CALL ClearScreen + CALL ResVideoMode + LD HL,WorkBuffer + SPDSS DSSF.EXEC,0 + PUSH AF + SETPORT BORDER,0 + ; !FIXIT проверить для это оно или нет SAFE_PORTY + SETPORT WINSP.Y_PORT,0xC0 + CALL InitVideoMode + CALL InitDrivers + CALL InitScreen + CALL ClearDOSline + LD A,0x02 + CALL InitPanels + POP AF + CALL C,DOSError + OR A + RET + +RestoreDIR: PUSH AF + PUSH IY + POP HL + LD BC,PANEL.CURRPATH + ADD HL,BC + PUSH IY + SPDSS DSSF.CHDIR + POP IY + POP AF + RET + +EName: INC HL + LD A,(HL) + DEC HL + CP '!' + JR NZ,TstEX11 + INC HL + PUSH HL + PUSH BC + LD HL,PrevFile + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + POP BC + POP HL + INC HL + JP TstEXT1 +EDrive: LD A,(IY+PANEL.CURRPATH) + LD (DE),A + INC DE + LD A,':' + LD (DE),A + INC DE + INC HL + JP TstEXT1 + +EPath: PUSH HL + PUSH BC + PUSH IY + POP HL + LD BC,PANEL.CURRPATH + ADD HL,BC + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L2 + LD (DE),A + INC DE +.L2 POP BC + POP HL + INC HL + JP TstEXT1 + +; запуск FLX файла +RunFLX: LD HL,RestoreDIR + PUSH HL + LD HL,WorkBuffer + LD A,0x21 +.L1 INC HL + CP (HL) + JR C,.L1 + SUB A + LD (HL),A + INC HL + PUSH HL + LD HL,WorkBuffer + PUSH IY + SPDSS DSSF.OPEN,,1 + POP IY + POP HL + RET C + LD (.FLXHandle),A + PUSH HL + LD IX,0x0000 + LD HL,0x0000 + PUSH IY + SPDSS DSSF.MOVE_FP,2 + POP IY + LD A,IXH + AND 0xC0 + OR H + OR L + POP HL + SCF + LD A,0x1E + RET NZ + PUSH IY + PUSH HL + ; !FIXIT проверить для этого оно или нет SAFE_PORTY + SETPORT WINSP.Y_PORT,0xC0 + LD IX,0x0000 + LD HL,0x0000 + LD A,(.FLXHandle) + SPDSS DSSF.MOVE_FP,0 + GETPORT WINSP.CPU1 + PUSH AF + LD A,(RAMPAGES.FLX) + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + 0x0100 + LD DE,0x0010 + LD A,(.FLXHandle) + PUSH HL + SPDSS DSSF.READ + POP HL + JR C,.L2 + LD A,(HL) + INC HL + CP 'F' + SCF + LD A,0x10 + JR NZ,.L2 + LD A,(HL) + INC HL + CP 'L' + SCF + LD A,0x10 + JR NZ,.L2 + LD A,(HL) + INC HL + CP 'X' + SCF + LD A,0x10 + JR NZ,.L2 + LD L,0x08 + LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD (.FLXexec),BC + LD A,(HL) + INC HL + LD (.FLXmode),A + RES 7,D + SET 6,D + LD HL,0x8000 + OR A + SBC HL,DE + EX DE,HL + LD A,(.FLXHandle) + SPDSS DSSF.READ +.L2: EX AF,AF' + POP AF + SETPORT WINSP.CPU1,,0 + EX AF,AF' + PUSH AF + LD A,(.FLXHandle) + SPDSS DSSF.CLOSE + POP AF + POP HL + POP IY + RET C + LD DE,0x0000 +.FLXexec EQU $-2 + SET 7,D + SET 6,D + LD A,(RAMPAGES.FLX) + LD C,WINSP.CPU3 + PUSH IY + CALL Resident + POP IY + CCF + RET NC + LD A,0x00 +.FLXmode: EQU $-1 + OR A + RET Z + INC SP + INC SP + SETPORT BORDER,0 + ; !FIXIT проверить для это оно или нет SAFE_PORTY + SETPORT WINSP.Y_PORT,0xC0 + CALL InitScreen + CALL ClearDOSline + LD A,0x02 + CALL InitPanels + OR A + RET + +.FLXHandle: DEFB 0x00 + +;[]===========================================================[] +Help: LD DE,HelpR + LD A,(RAMPAGES.FNHELP) + LD C,WINSP.CPU1 + JP Resident + +;[]----------------------------------------------------------[] +ViewFileSH: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + CALL ResInvert + LD HL,SetInvert + PUSH HL + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 200,81,240,62 + W_FILL 4,2,232,10,COLORI.BLACK + W_TEXT 108,3,COLORI.WHITE,"View" + W_BUTTON 40,42,72,14 + W_TEXT 68,45,COLORP.HIGHGRAY,"Ok" + W_BUTTON 128,42,72,14 + W_TEXT 148,45,COLORP.HIGHGRAY,"Cancel" + W_TEXT 12,25,COLORP.HIGHGRAY,"View the file:" + W_BORDER 86,22,134,12 + W_FILL 88,23,130,10,COLORI.WHITE + W_END + LD IX,ViewStr + LD HL,ViewEditTab + CALL InputLine + WINDOWCLOSE + RET C + LD A,(ViewLen) + OR A + RET Z + LD HL,ViewName + LD DE,PrevFile + LD B,A +ViewSH1: LD A,(HL) + CALL CorrBigChar + LD (HL),A + LD (DE),A + INC HL + INC DE + DJNZ ViewSH1 + SUB A + LD (DE),A + POP HL + CALL SetInvert + JP View + +ViewStr: DEFB 0x0C,0x00,0x00,0x00 +ViewLen: DEFB 0x00 + DEFW 0x0122,0x006A + DEFW 0x0068 + DEFB 0xF0 +ViewName: DB 0x0D DUP 0x00 + +;------------------------------------------- +ViewFile: SUB A + JR StViewFile.L1 + +;------------------------------------------- +StViewFile: LD A,0x01 +.L1 LD (VFlag+1),A + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L2 ;!FIXIT + LD A,(RAMPAGES.RIGHTPANEL) +.L2 + SETPORT WINSP.CPU1,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 + LD DE,WorkBuffer + LD BC,FileHDR.Attr + PUSH HL + ADD HL,BC + LDI + POP HL + INC HL + CALL MakeDOSname + POP AF + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + BIT 4,(HL) + RET NZ + INC HL + LD DE,PrevFile + SUB A +.L3 LDI + CP (HL) + JR NZ,.L3 + LD (DE),A +VFlag: LD A,0x00 + OR A + JR NZ,View1 +View: LD IX,fnview_ext + LD DE,PrevFile + CALL TestEXT + RET NC +View1: CALL ResInvert + LD HL,SetInvert + PUSH HL + PUSH IY + LD HL,PrevFile + LD DE,0xC000 + LD A,(RAMPAGES.FNVIEW) + LD C,WINSP.CPU3 + CALL Resident + POP IY + RET C + SETPORT BORDER,0 + ; !FIXIT проверить для это оно или нет SAFE_PORTY + SETPORT WINSP.Y_PORT,0xC0 + CALL InitScreen + CALL ClearDOSline + LD A,0x02 + CALL InitPanels + POP HL + RET + +;[]----------------------------------------------------------[] +EditFileSH: BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + CALL ResInvert + LD HL,SetInvert + PUSH HL + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 200,81,240,62 + W_FILL 4,2,232,10,COLORI.BLACK + W_TEXT 110,3,COLORI.WHITE,"Edit" + W_BUTTON 40,42,72,14 + W_TEXT 68,45,COLORP.HIGHGRAY,"Ok" + W_BUTTON 128,42,72,14 + W_TEXT 148,45,COLORP.HIGHGRAY,"Cancel" + W_TEXT 12,25,COLORP.HIGHGRAY,"Edit the file:" + W_BORDER 86,22,134,12 + W_FILL 88,23,130,10,COLORI.WHITE + W_END + LD IX,EditStr + LD HL,ViewEditTab + CALL InputLine + WINDOWCLOSE + RET C + LD A,(EditLen) + OR A + RET Z + LD HL,EditName + LD DE,PrevFile + LD B,A +EditSH1: LD A,(HL) + CALL CorrBigChar + LD (HL),A + LD (DE),A + INC HL + INC DE + DJNZ EditSH1 + SUB A + LD (DE),A + POP HL + CALL SetInvert + JP Edit + +EditStr: DEFB 0x0C,0x00,0x00,0x00 +EditLen: DEFB 0x00 + DEFW 0x0122,0x006A + DEFW 0x0068 + DEFB 0xF0 +EditName: DB 0x0D DUP 0x00 + +;------------------------------------------- +EditFile: SUB A + JR StEditFile.L1 + +;------------------------------------------- +StEditFile: LD A,0x01 +.L1 LD (EFlag),A + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + GETPORT WINSP.CPU1 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L2 ;!FIXIT + LD A,(RAMPAGES.RIGHTPANEL) +.L2 + SETPORT WINSP.CPU1,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H ; | 0x4000 + LD DE,WorkBuffer + LD BC,FileHDR.Attr + PUSH HL + ADD HL,BC + LDI + POP HL + INC HL + CALL MakeDOSname + POP AF + SETPORT WINSP.CPU1,,0 + LD HL,WorkBuffer + BIT 4,(HL) + RET NZ + INC HL + LD DE,PrevFile + SUB A +.L3 LDI + CP (HL) + JR NZ,.L3 + LD (DE),A + LD A,0x00 +EFlag: EQU $-1 + OR A + JR NZ,Edit1 +Edit: LD IX,fnedit_ext + LD DE,PrevFile + CALL TestEXT + RET NC +Edit1: CALL ResInvert + LD HL,SetInvert + PUSH HL + PUSH IY + LD HL,PrevFile + LD DE,CPU3 + LD A,(RAMPAGES.FNEDIT) + LD C,WINSP.CPU3 + CALL Resident + POP IY + RET C + SETPORT BORDER,0 + ; !FIXIT проверить для это оно или нет SAFE_PORTY + SETPORT WINSP.Y_PORT,0xC0 + CALL InitScreen + CALL ClearDOSline + LD A,0x02 + CALL InitPanels + POP HL + RET diff --git a/font.raw b/font.raw new file mode 100644 index 0000000000000000000000000000000000000000..97d579a48667db46dd44d77129283c958ae0e696 GIT binary patch literal 6888 zcmb7|Er3)<5QLY5aO8I{{{)4MM4pU{L`EW!$jC?}5{X12BO@b`k&(!ixJ!Li-81v{ z76^T}Z{GAzb#?db+r7Ja^Zjym;|zzhGc9NOnSy4K8@j(W_T1S$PPz)`hV53{9%y0` zm}_>oZlPQ?b2qa5&l^yJHv_`!_U+x>2fsf0{n^XE{yE&afBEq7AJ1R?{qNh0pMUx7 z$mlC^`F6^8Q@$Va!;~L~+#T}MlzW!lN6P-{pr5P#m99HocL&Rk z`>VacSg#Jck>1!+pjS}zGN9k@x@w)}yu(vQ~<6e4Trz@{EUVDd2=wdFON*bIB7FUt*m+uJ;UnKwLU_nhh@~0U3I#ie~}q=U~C;@ape?2{fMWc zgVoTyfAp&fNRwa3Tdx>*Zs-GTccz+tJEww$!BIAnu1b}Bu5-l+#b%%;nOM61kk-8MEG#C4~O zY-N|8H(b@BQ1tAr-}W1t6Nfb9Cx*Tv%@I9fJy3;Tj|T+=f93@SS@GRn8359Y6u1by z;G>tiqE%mn8Aq*a;^>CV@iZQ$;h!7n$MZ)Jo{<>IXgKmMcFe6`d8aQ}(iagh=_XFD z)t{$l6Nc>YryQerPDkeoQ#C_w#NnFy8t!C2cwi%1-3Mkq0oa3;)M_AU9` zBp`(5J@?_oM-0J95Ys1#JO$SKTjq4Nox?CC7b8&I`5blJojtHaXi;a2k=C{0`%TvzQuuDCDSd%NJigvpYv{) z?z_iLx%&KegI%XgU9Os5MEs&{L%CscU7}e_(lmKxdGzD4Q z+YBxx%B=^O?|c5fL~s?TTfy^v6;*Q3ZQ|-V(C-_V(7qUnv(L5s)RQl8cvK#L-diu_ zMqdMvBM(&k9mC%9ftRKG-#;P+W_IR=C<|vQ4>7QEUQ9lgi z#80c*)_Zf;#aW!FHIqdMw0=y%A+4nwyvJHv&zc9@Tw@DPXKsI?*#8)(_r111EQ6oy ztv8M~_;>5D^}g5kH;y)&qRQCu+djmIuI=mkEoJDeKteAM#U2HA{W+#$6wys0j>@_?b~+-#loxyK`B>@y zC*+W>c?fcc^dut~JmV5RlA&X-?*=D7xZ9ow!+Me&2Tw$J>56H(nApY32J~_YL4QAW zcf4=C=>^ZY>ck1V-gX65aU^nWbS{0NV!j^mNu?%u?JVKNf3J+s<1~Dss1LXLyJ_fQ z1wKur%lZEX#L%*05i0@OZVUQ|=k3O~25zIwsWcX-{*oX)`0(dfJ5sYwLk63+;o4IF z2<+`#CoAjt`!-|K_wVv@+jQS+2lM^I=|!e}+xC%b{%@|Jaif1?fWg1Hw^#8<7o@gF I^=&fv5Anh>n*aa+ literal 0 HcmV?d00001 diff --git a/iff_font.raw b/iff_font.raw new file mode 100644 index 0000000000000000000000000000000000000000..4660708d1c26f5a5bc43ffa19ab0c7d633519a13 GIT binary patch literal 8704 zcmd^^=h-7S421PKXF2C^*NIDUDK5pOxD=P54&-@f0EX3mI{!C5X-Ogs1|WA=_FZ26 z{>Ptx{r%77e>%QZ@^;BPCGVEJSMq+z2PGetd{pvr$tNYBmV8!nE&06Ui;^!(zAE{; zq-@DBg#RT8kBwh(n6u7@ME0 zYHU7m;{!R-a{^+`UpVIPx~MGzI(0ymI;v5`BVi)y^x@(B3fb(~)OhCV?l`<@H_{xP zpyHJ_?WRw}jeQa?Ep_!Mb{@?{`sy!DF%d>^y9iC6%IvLRmB=J!ME5?u2DZzK58Dc1 z==<1_KSa|%%2SBJ(X+v`^){$Bz;p)c3Mb}p(fOb-p&LlSUSs8>{F=tqlZQ(x;GWQ} z5l(f*)veZ*+a?6M(gHf}JNrNocNiS0$k!^n*H(^8(wy%};%8j1NAQ>&df)olxNf4G zW3!KqJ4b)D!*tJ&QPl~5Gvmgy6y&6Ut3temE}0q@9&Uf|^}}}`M5u^Hx(K21aAqpQhM+!UiQ_+MtEUYF=XEn%p!?8S*eym z03e)2as#CPv-4N9r*Wtj8{hZ0cWGb7kls_Mjdfk;}^Tr zha>eU=bB$NI=7LiCiS?eEIoC6_qX+=4S7#|Awm39pT+N%*s4B?BOk@7rZfJy1QdRf zji36S)@gLStaKtGXPbFX;Xo{sQ@_;z#{PQqoZK8}pZlj3CpG7P_GjN8@u~bSka``= z$$}tPsHTe~$duc|lJijyPTNb*oDo?0%~<+9fZT z(mM7z=uSW;*0Rh536dTZpKsZPM?C!}pM?8EBE5+(@y)&VkEEj>;_a_^!+>kCHkTY0 z7l&erUYvTvUK-N}2TX2>=LHK3Y9yQ!Fi5YwRHF49fgl;GZa~K-zBWDZ^i6n*l+pd& z@NGWkU;596k&j(-f0MegH5%U7zz1*c;nG*ONdDFkPos(Vx0s=q9C|bx@^Atdd##kElc-L>ot7(i#P_c zwO_SQd_~bQS6uo6ol;ibQp?w_gY9OEz$C4c04HVP7@{Hiio@QTTYkz_( zZB!N7sk$Y-URscP#V%BI`pT*D3_HL|!wu!bh27PvU$XhbWya%g8FoJ%2L5I@V{)wG z#~KWjjQdyMl77w=`kue)042|Fh5IoO-s-b?tB>rnj}*_};_vdLcb_Lefw@C6L*b!* z!92BNhLN0TaNQl*1^89C?5^+uzn|ML+C|m)=0Ew#Uoy{?(V^mg&iWiIfY@hzb-4D= z_PDA)&i8;Xt?@N3JF(z6t}h|y`&YQ^Q=ZqRM+ypXb8X?-z;j60(t}T^^KpN9?#HL+ zoR>(Y8*3+|2|>5nbtV5}{nBHCpU3c<=fCwm#xC^EJbAcIsg--iYpvGDo7NujvHNrI zb4d1AHTnJsjsc|UyzZ;k*7J--coZpEAb`^|f>p!Fuja~3yYPXZBQ+ul@BvF|eDr8` zU9od@BE}J~{{oMh{aWl%mMsfi=_qaV#^cXgBZc?|R)PaR^K5|B2hr4_)8oUTi=W37 zpZMG*Z6EOz;6+|LUC(aEPLV|CRsQb!=wQ7v+ExVq= zhdz^>O04JhRIO0k8IcuaR9^ZWC-_2n0e|H8$u#%@pIoi)apoWRjwcUtv~%W1AEwc> zRZnc!6Ss~N|3h3aTff)c){Njbso`HPtTCVIaT)r880(5>ARb|UwEveivCaSJzvD0c z#!y21DySQWxosIs-#A#2L=(k~G4Z4SUSnGIn_tE4@hdtO{|-*6mqlHcLy@qNA? zanQ{D1)}@%PzU7Xz3USXrLjNun|f^EviS@2 z!(*!yy_U+t+sQBB%3!|*fR~3H>ApUCeewHGcD+9AC2LNM)Bx%=>HrpeJ1;hKMB#mq zT@GVm>+bIu{59zv?y-Jg4gA*k*uPJ@USKls6BNRWzE8gEIO4-T@l`0~BnomldhVn? zwaI=0z&`M$_gZ@F{rYud@vChc{x}Q0)=tjvMw%KP^q1zRgE(Lm?yxH!4E0S@yV?o=pD*E65Cj literal 0 HcmV?d00001 diff --git a/plugins/build_all.bat b/plugins/build_all.bat new file mode 100644 index 0000000..854715d --- /dev/null +++ b/plugins/build_all.bat @@ -0,0 +1,20 @@ + +@echo off + +cls + +cd cdplayer +call build +cd ..\date +call build +cd ..\test +call build +cd ..\calc +call build +cd ..\fneditor +call build +cd ..\fnviewer +call build +cd ..\help +call build +cd.. diff --git a/plugins/calc/build.bat b/plugins/calc/build.bat new file mode 100644 index 0000000..635d559 --- /dev/null +++ b/plugins/calc/build.bat @@ -0,0 +1,21 @@ + +@echo off + +if not exist tmp md tmp +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\sprinter_src\tools\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\sprinter_src\;d:\yad\sprinter_src\flexnav\src\ + +asl -U -L -C -x -olist tmp\calc.lst -i %includes% calc.a80 || goto error +p2bin calc.p ..\calc.flx -r $-$ -k + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit diff --git a/plugins/calc/calc.a80 b/plugins/calc/calc.a80 new file mode 100644 index 0000000..91eb8f9 --- /dev/null +++ b/plugins/calc/calc.a80 @@ -0,0 +1,348 @@ + +; LAST UPDATE: 20.03.2025 savelij + + include macros.a80 + include fn_const.a80 + include fn_macros.a80 + include ports_sp.a80 + include define_sp.a80 + include macros_sp.a80 + include dss_sp.a80 + + org PluginOrg ; #C000 - Header lenght +; Flex Navigator plugin header +PluginStart: db "FLX-PLUG" ; Id + dw 0x0000 ; LoadOffset + dw PluginEntry ; EntryOffset + db 0x00 ; PluginMode + db 0x00,0x00,0x00 ; Reserved + +PluginEntry: + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 242,80,155,97 + W_FILL 4,2,147,10,COLORI.BLACK + W_TEXT 6,3,COLORI.WHITE,"Calculator" + W_HORIZLINE 1,13,154 + W_BORDER 8,19,139,11 + W_BUTTON 8,34,26,13 + W_BUTTON 36,34,26,13 + W_BUTTON 64,34,26,13 + W_BUTTON 92,34,26,13 + W_BUTTON 120,34,26,13 + W_BUTTON 8,49,26,13 + W_BUTTON 36,49,26,13 + W_BUTTON 64,49,26,13 + W_BUTTON 92,49,26,13 + W_BUTTON 120,49,26,13 + W_BUTTON 8,64,26,13 + W_BUTTON 36,64,26,13 + W_BUTTON 64,64,26,13 + W_BUTTON 92,64,26,13 + W_BUTTON 120,64,26,28 + W_BUTTON 8,79,26,13 + W_BUTTON 36,79,26,13 + W_BUTTON 64,79,26,13 + W_BUTTON 92,79,26,13 + W_END + ld ix, 16h + ld hl, asc_C36E ; "7" + ld de, 107h + ld bc, 75h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C370 ; "8" + ld de, 123h + ld bc, 75h + ld a, 80h + call JUMPS.PrnRangPathC +sub_C103: ld hl, asc_C372 ; "9" + ld de, 140h + ld bc, 75h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C37F ; "/" + ld de, 15Bh + ld bc, 75h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C374 ; "C" + ld de, 177h + ld bc, 75h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C368 ; "4" + ld de, 107h + ld bc, 84h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C36A ; "5" + ld de, 123h + ld bc, 84h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C36C ; "6" + ld de, 140h + ld bc, 84h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C37D ; "*" + ld de, 15Bh + ld bc, 84h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C376 ; "CE" + ld de, 178h + ld bc, 84h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C362 ; "1" + ld de, 107h + ld bc, 93h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C364 ; "2" + ld de, 123h + ld bc, 93h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C366 ; "3" + ld de, 140h + ld bc, 93h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C37B ; "-" + ld de, 15Bh + ld bc, 93h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C387 ; "=" + ld de, 178h + ld bc, 9Ah + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C360 ; "0" + ld de, 107h + ld bc, 0A2h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C381 ; "+/-" + ld de, 123h + ld bc, 0A2h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C385 ; "." + ld de, 13Fh + ld bc, 0A2h + ld a, 80h + call JUMPS.PrnRangPathC + ld hl, asc_C379 ; "+" + ld de, 15Bh + ld bc, 0A2h + ld a, 80h + call JUMPS.PrnRangPathC + call JUMPS.ResFire +loc_C1F4: call sub_C324 +loc_C1F7: ld ix, PluginMouseTab + call JUMPS.TestCoords + SPDSS DSSF.SCANKEY + jp z, loc_C1F7 + ld a, b + or a + jp nz, loc_C1F7 + ld a, e + cp '0' + jp z, loc_C2CD + cp '1' + jp z, loc_C2CD + cp '2' + jp z, loc_C2CD + cp '3' + jp z, loc_C2CD + cp '4' + jp z, loc_C2CD + cp '5' + jp z, loc_C2CD + cp '6' + jp z, loc_C2CD + cp '7' + jp z, loc_C2CD + cp '8' + jp z, loc_C2CD + cp '9' + jp z, loc_C2CD + cp '.' + jp z, loc_C2CD + cp 'S' + jp z, loc_C283 + cp 's' + jp z, loc_C283 + cp 'R' + jp z, loc_C266 + cp 'r' + jp z, loc_C266 + cp 8 + jp z, loc_C304 + cp 1Bh + jp nz, loc_C1F4 + WINDOWCLOSE + or a + ret + +loc_C266: ld a, 20h ; ' ' + ld (byte_C33F), a + ld a, 30h ; '0' + ld (byte_C340), a + xor a + ld (byte_C33E), a + ld (byte_C33D), a + ld b, 0Ah + ld hl, byte_C341 +loc_C27C: ld (hl), a + inc hl + djnz loc_C27C + jp loc_C1F4 + +loc_C283: ld hl, byte_C340 + ld a, (hl) + cp 30h ; '0' + jp z, loc_C1F7 + ld hl, byte_C33F + ld a, (hl) + xor 0Dh + ld (hl), a + jp loc_C1F4 + +loc_C296: ld a, '0' + jp loc_C2CD + +loc_C29B: ld a, '1' + jp loc_C2CD + +loc_C2A0: ld a, '2' + jp loc_C2CD + +loc_C2A5: ld a, '3' + jp loc_C2CD + +loc_C2AA: ld a, '4' + jp loc_C2CD + +loc_C2AF: ld a, '5' + jp loc_C2CD + +loc_C2B4: ld a, '6' + jp loc_C2CD + +loc_C2B9: ld a, '7' + jp loc_C2CD + +loc_C2BE: ld a, '8' + jp loc_C2CD + +loc_C2C3: ld a, '9' + jp loc_C2CD + +loc_C2C8: ld a, '.' + jp loc_C2CD + +loc_C2CD: ld c, a + ld a, (byte_C33E) + cp 0Bh + jp z, loc_C1F4 + ld e, a + ld d, 0 + ld hl, byte_C340 + ld a, (hl) + cp '0' + jr nz, loc_C2E7 + ld a, c + cp '0' + jp z, loc_C1F4 +loc_C2E7: ld a, c + cp '.' + jr nz, loc_C2F8 + ld a, (byte_C33D) + or a + jp nz, loc_C1F4 + ld a, 0FFh + ld (byte_C33D), a +loc_C2F8: add hl, de + ld (hl), c + ld a, (byte_C33E) + inc a + ld (byte_C33E), a + jp loc_C1F4 + +loc_C304: ld a, (byte_C33E) + cp 1 + jp z, loc_C266 + dec a + ld (byte_C33E), a + ld e, a + ld d, 0 + ld hl, byte_C340 + add hl, de + ld a, (hl) + cp '.' + jr nz, loc_C320 + ld a, d + ld (byte_C33D), a +loc_C320: ld (hl), d + jp loc_C1F4 + +sub_C324: ld hl, asc_C34D + call sub_C32D + ld hl, byte_C33F +sub_C32D: ld ix, 48h + ld de, 183h + ld bc, 65h + ld a, 80h + call JUMPS.PrnRangPathR + ret + +byte_C33D: db 0 +byte_C33E: db 0 +byte_C33F: db 20h +byte_C340: db 30h +byte_C341: db 0Ch DUP 0 +asc_C34D: DB " ",0 +asc_C360: DB "0",0 +asc_C362: DB "1",0 +asc_C364: DB "2",0 +asc_C366: DB "3",0 +asc_C368: DB "4",0 +asc_C36A: DB "5",0 +asc_C36C: DB "6",0 +asc_C36E: DB "7",0 +asc_C370: DB "8",0 +asc_C372: DB "9",0 +asc_C374: DB "C",0 +asc_C376: DB "CE",0 +asc_C379: DB "+",0 +asc_C37B: DB "-",0 +asc_C37D: DB "*",0 +asc_C37F: DB "/",0 +asc_C381: DB "+/-",0 +asc_C385: DB ".",0 +asc_C387: DB "=",0 + +PluginMouseTab: dw 0x00FA,0x0114,0x0072,0x007F,0x0021,0x0000,loc_C2B9,0x0000 + dw 0x0116,0x0130,0x0072,0x007F,0x0021,0x0000,loc_C2BE,0x0000 + dw 0x0132,0x014C,0x0072,0x007F,0x0021,0x0000,loc_C2C3,0x0000 + dw 0x014E,0x0168,0x0072,0x007F,0x0021,0x0000,loc_C266,0x0000 + dw 0x016A,0x0184,0x0072,0x007F,0x0021,0x0000,loc_C266,0x0000 + dw 0x00FA,0x0114,0x0081,0x008E,0x0021,0x0000,loc_C2AA,0x0000 + dw 0x0116,0x0130,0x0081,0x008E,0x0021,0x0000,loc_C2AF,0x0000 + dw 0x0132,0x014C,0x0081,0x008E,0x0021,0x0000,loc_C2B4,0x0000 + dw 0x014E,0x0168,0x0081,0x008E,0x0021,0x0000,loc_C266,0x0000 + dw 0x016A,0x0184,0x0081,0x008E,0x0021,0x0000,loc_C304,0x0000 + dw 0x00FA,0x0114,0x0090,0x009D,0x0021,0x0000,loc_C29B,0x0000 + dw 0x0116,0x0130,0x0090,0x009D,0x0021,0x0000,loc_C2A0,0x0000 + dw 0x0132,0x014C,0x0090,0x009D,0x0021,0x0000,loc_C2A5,0x0000 + dw 0x014E,0x0168,0x0090,0x009D,0x0021,0x0000,loc_C266,0x0000 + dw 0x016A,0x0184,0x0090,0x00AC,0x0021,0x0000,loc_C266,0x0000 + dw 0x00FA,0x0114,0x009F,0x00AC,0x0021,0x0000,loc_C296,0x0000 + dw 0x0116,0x0130,0x009F,0x00AC,0x0021,0x0000,loc_C283,0x0000 + dw 0x0132,0x014C,0x009F,0x00AC,0x0021,0x0000,loc_C2C8,0x0000 + dw 0x014E,0x0168,0x009F,0x00AC,0x0021,0x0000,loc_C266,0x0000 + dw 8000h diff --git a/plugins/cdplayer/INFO b/plugins/cdplayer/INFO new file mode 100644 index 0000000..199f658 --- /dev/null +++ b/plugins/cdplayer/INFO @@ -0,0 +1,21 @@ +INFO FILE CDPLAYER.FLX + +MakeWindow 01 +x0=78 y0=79 +dx=484 dy=96 +02|FILL (82,81) 464x10 44 +01|STR (86,83) 4F 'SHAOS CD-Player v1.0 beta1' +05|BUTTON (546,81) 12x10 80 'x' [546,558,81,91] +03|BUTT0 (86,94) 268x38 [86,354,94,132] +02|FILL (88,95) 264x36 00 +04|BUTTON (360,94) 116x18 [360,476,94,112] +04|BUTTON (480,94) 36x18 [480,516,94,112] +04|BUTTON (520,94) 36x18 [520,556,94,112] +04|BUTTON (360,114) 36x18 [360,396,114,132] +04|BUTTON (400,114) 36x18 [400,436,114,132] +04|BUTTON (440,114) 36x18 [440,476,114,132] +04|BUTTON (480,114) 36x18 [480,516,114,132] +04|BUTTON (520,114) 36x18 [520,556,114,132] +00|END + +MakeWindow 7F diff --git a/plugins/cdplayer/build.bat b/plugins/cdplayer/build.bat new file mode 100644 index 0000000..7a25202 --- /dev/null +++ b/plugins/cdplayer/build.bat @@ -0,0 +1,21 @@ + +@echo off + +if not exist tmp md tmp +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\sprinter_src\tools\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\sprinter_src\;d:\yad\sprinter_src\flexnav\src\ + +asl -U -L -C -x -olist tmp\flx-date.lst -i %includes% cdplayer.a80 || goto error +p2bin cdplayer.p ..\cdplayer.flx -r $-$ -k + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit diff --git a/plugins/cdplayer/cd.a80 b/plugins/cdplayer/cd.a80 new file mode 100644 index 0000000..470de2b --- /dev/null +++ b/plugins/cdplayer/cd.a80 @@ -0,0 +1,138 @@ + +; LAST UPDATE: 03.02.2025 savelij + +cd_play: db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x77,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x77,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x77,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x77,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x77,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x77,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + +cd_paus: db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + +cd_stop: db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + +cd_ll: db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x88,0x70,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88,0x70,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x88,0x70,0x00,0x00,0x88,0x88,0x70,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x70,0x00,0x00,0x00,0x88,0x70,0x00,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x70,0x00,0x00,0x00,0x88,0x70,0x00,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x88,0x70,0x00,0x00,0x88,0x88,0x70,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88,0x70,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x88,0x70,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + +cd_l: db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x88,0x70,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00,0x88,0x88,0x70,0x00,0x00,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x88,0x70,0x00,0x00,0x00,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x88,0x70,0x00,0x00,0x00,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00,0x88,0x88,0x70,0x00,0x00,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x88,0x70,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + +cd_r: db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x07,0x88,0x88,0x88,0x88,0x07,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x07,0x88,0x88,0x88,0x00,0x07,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x07,0x88,0x88,0x00,0x00,0x07,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x07,0x88,0x00,0x00,0x00,0x07,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x07,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x07,0x88,0x00,0x00,0x00,0x07,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x07,0x88,0x88,0x00,0x00,0x07,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x07,0x88,0x88,0x88,0x00,0x07,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x07,0x88,0x88,0x88,0x88,0x07,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + +cd_rr: db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x07,0x88,0x88,0x88,0x88,0x07,0x88,0x88,0x88,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x07,0x88,0x88,0x88,0x00,0x07,0x88,0x88,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x07,0x88,0x88,0x00,0x00,0x07,0x88,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x00,0x07,0x88,0x00,0x00,0x00,0x07,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x00,0x07,0x88,0x00,0x00,0x00,0x07,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x00,0x07,0x88,0x88,0x00,0x00,0x07,0x88,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x00,0x07,0x88,0x88,0x88,0x00,0x07,0x88,0x88,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x07,0x88,0x88,0x88,0x88,0x07,0x88,0x88,0x88,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x00,0x00,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + +cd_ejec: db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x77,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x07,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x07,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x07,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 + db 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88 diff --git a/plugins/cdplayer/cdplayer.a80 b/plugins/cdplayer/cdplayer.a80 new file mode 100644 index 0000000..ee4b509 --- /dev/null +++ b/plugins/cdplayer/cdplayer.a80 @@ -0,0 +1,253 @@ + +; LAST UPDATE: 20.03.2025 savelij + +;// DEVICE ZXSPECTRUM128 +;// include '../FPLUGIN.INC' + include macros.a80 + include fn_const.a80 + include fn_macros.a80 + include accel_sp.a80 + include ports_sp.a80 + include define_sp.a80 + include macros_sp.a80 + include dss_sp.a80 + + org PluginOrg ; #C000 - Header lenght +; Flex Navigator plugin header +PluginStart: db "FLX-PLUG" ; Id + dw 0x0000 ; LoadOffset + dw 0x0000 ; EntryOffset + db 0x00 ; PluginMode + db 0x00,0x00,0x00 ; Reserved + +;// include 'dos_equ.inc' + +PluginEntry: + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 78,79,484,72 + W_FILL 4,2,464,10,COLORI.BLUE + COLORP.BLUE + W_TEXT 8,4,COLORI.WHITE + COLORP.BLUE,"SHAOS CD-Player v1.0 beta1" + W_BUTTONTEXT 468,2,12,10,COLORP.HIGHGRAY,"x" + W_BORDER 8,15,268,38 + W_FILL 10,16,264,36,COLORI.BLACK + W_BUTTON 282,15,116,18 + W_BUTTON 402,15,36,18 + W_BUTTON 442,15,36,18 + W_BUTTON 282,35,36,18 + W_BUTTON 322,35,36,18 + W_BUTTON 362,35,36,18 + W_BUTTON 402,35,36,18 + W_BUTTON 442,35,36,18 + W_HORIZLINE 2,56,480 + W_END + call JUMPS.ResFire + call shows + ld hl,cd_play + ld ix,201 + ld iy,95 + call show + ld hl,cd_paus + ld ix,241 + ld iy,95 + call show + ld hl,cd_stop + ld ix,261 + ld iy,95 + call show + ld hl,cd_ll + ld ix,181 + ld iy,115 + call show + ld hl,cd_l + ld ix,201 + ld iy,115 + call show + ld hl,cd_r + ld ix,221 + ld iy,115 + call show + ld hl,cd_rr + ld ix,241 + ld iy,115 + call show + ld hl,cd_ejec + ld ix,261 + ld iy,115 + call show + call shaos + call CDinit +plugin_loop: ld ix, PluginMouseTab + call JUMPS.TestCoords +; ld c, 0x31 +; rst 0x10 + SPDSS DSSF.SCANKEY + jr z, plugin_loop + ld a, b + or a + jr nz, plugin_loop + ld a, e + cp 0x1B + jr z, PluginExit + cp 0x0D + jr nz, plugin_loop +PluginExit: + WINDOWCLOSE + or a ; cf = 0 + ret + +Ok: ld HL,String + ld DE,0x00CA + ld BC,0x00A0 + ld A,0x80 + call JUMPS.PrnTxtLnIFF + ret + +; hl - bitmap 32x16 for 16-color mode +; ix,iy - coords (320x256) +show: +; in a,(82h) + GETPORT WINSP.CPU0 + ld (shwin),a +; ld a,50h +; out (82h),a + SETPORT WINSP.CPU0,0x50 + push ix + pop de + push iy + pop bc + ld b,16 +show1: ld a,c +; out (89h),a + SETPORT WINSP.Y_PORT,,0 + push de + di +; ACC_SetBlockSize + ACCEL ACCELCMD.SET_BUFFER + ld a,16 +; ACC_CopyBlock + ACCEL ACCELCMD.COPY + ld a,(hl) + ld (de),a +; ACC_Off + ACCEL ACCELCMD.OFF + ei + ld de,16 + add hl,de + pop de + inc c + dec b + jp nz,show1 +; ld a,0xFF +; out (89h),a + SETPORT WINSP.Y_PORT,0xFF + ld a,(shwin) +; out (82h),a + SETPORT WINSP.CPU0,,0 + ret + +shwin db 0 + +; a - digit +; ix,iy - coords (320x256) +showd: rlca + ld e,0 + ld d,a + ld hl,digit0 + add hl,de + call show + ld de,16 + add iy,de + call show + ret + +; Show Digit string +shows: ld ix,46 + ld iy,97 + ld c,8 + ld hl,Digits +shows1: push bc + push hl + push iy + ld a,(hl) + call showd + ld bc,16 + add ix,bc + pop iy + pop hl + pop bc + inc hl + dec c + jp nz,shows1 + ret + + include cdrom.a80 + +CDinit: call CD_INI + jr nc,noCD +yesCD: call SAVE_BUF + ld hl,CD_BUF + ld bc,54 + add hl,bc + ld de,msg_ +yesCD1: ld a,(hl) + ld (de),a + or a + jr z,yesCD0 + inc hl + inc de + jr yesCD1 + +yesCD0: ld hl,msgY + ld a,0x80 + jr CDprn + +noCD: ld hl,msgN + ld a,0x81 +CDprn: ld de,84 + ld bc,140 + call JUMPS.PrnTxtLnIFF + ret + +msgY db "CD-ROM is present " +msg_ DB 100 DUP 0 +msgN db "CD-ROM is absent",0 + +CDplay: ld hl,AP_PLA + call ATAPI + ret + +CDejec: ld hl,AP_CD2 + call ATAPI + ret + + +Digits db 0x00,0x00,0x0B,0x00,0x00,0x0A,0x00,0x00 + + +PluginMouseTab: dw 546,558,81,91,0x21,0,PluginExit,PluginExit + dw 360,476, 94,112,0x01,0,CDplay,0 + dw 480,516, 94,112,0x01,0,0,0 + dw 520,556, 94,112,0x01,0,0,0 + dw 360,396,114,132,0x01,0,0,0 + dw 400,436,114,132,0x01,0,0,0 + dw 440,476,114,132,0x01,0,0,0 + dw 480,516,114,132,0x01,0,0,0 + dw 520,556,114,132,0x01,0,CDejec,0 + +PluginMT2: dw 252,324,138,156,0x01,0,Ok,0 + dw 0x8000 + +StringBuf: db 16,1 + db 0,0,0 + dw 0x00CC,0x0057,0x00E8 + db 0xF0 + +String: DB 16 DUP 0 + DB 13 DUP 0 + + include shaos.a80 + include cd.a80 + include digits.a80 + +PluginEnd: +;// savebin 'Build/FN/Plugins/cdplayer.flx',PluginStart,PluginEnd-PluginStart diff --git a/plugins/cdplayer/cdrom.a80 b/plugins/cdplayer/cdrom.a80 new file mode 100644 index 0000000..b8925f1 --- /dev/null +++ b/plugins/cdplayer/cdrom.a80 @@ -0,0 +1,253 @@ + +; LAST UPDATE: 11.03.2025 savelij + +; CDROM.A - Alexander Shabarshin 13.10.2002 + +IDE_DAW equ 0x0150 +IDE_DAR equ 0x0050 +IDE_HDW equ 0x4152 +IDE_HDR equ 0x4052 +IDE_COM equ 0x4153 +IDE_STA equ 0x4053 +IDE_CIL equ 0x0154 +IDE_CIH equ 0x0155 + +; Based on Vlad Sotnikov source files + +; Wait when device will free +NO_BSY: ld bc,IDE_STA + in a,(c) + rlca + ret nc + jr NO_BSY + +; Wait ready data transfer +WAIT_DRQ: ld bc,IDE_STA + in a,(c) + bit 3,a + ret nz + jr WAIT_DRQ + +; Error test +; --- +; fc - error +IS_ERROR: ld bc,IDE_STA + in a,(c) + rrca + ret + +; Set Slave device +SEL_SLAVE: ld a,0xB0 + jr SEL_DEV + +; Set Master device +SEL_MASTER: ld a,0xA0 + jr SEL_DEV + +; Set device (Slave or Master) +; A - 0xA0 or 0xB0 +; --- +; fc - 1 ??? + +SEL_DEV: ld bc,IDE_HDW + out (c),a + ld bc,IDE_HDR + in a,(c) + rlca + ret + +; Save HL to cilinder register +HL_TO_LEN: ld bc,IDE_CIL + out (c),l + ld bc,IDE_CIH + out (c),h + ret + +; Load HL from cilinder register +LEN_TO_HL: ld bc,IDE_CIL + in l,(c) + ld bc,IDE_CIH + in h,(c) + ret + +; Read from CD-ROM sector 2048 bytes +CD_READ: call NO_BSY + call WAIT_DRQ + ld hl,CD_BUF + ld bc,IDE_DAR + ld d,0 +CD_LOOP: ini + ini + ini + ini + ini + ini + ini + ini + dec d + jr nz,CD_LOOP + ld hl,CD_BUF + ld bc,1024 +CD_TRANS: ld d,(hl) + inc hl + ld e,(hl) + dec hl + ld (hl),e + inc hl + ld (hl),d + inc hl + dec bc + ld a,b + or c + jr nz,CD_TRANS + ret + +; Send ATAPI command +; HL - address of 12-bytes command +SEND_ATAPI: ld de,CD_BUF + di +; ACC_SetBlockSize + ACCEL ACCELCMD.SET_BUFFER + ld a,12 +; ACC_CopyBlock + ACCEL ACCELCMD.COPY + ld a,(hl) + ld (de),a +; ACC_Off + ACCEL ACCELCMD.OFF + ei +SA0: call NO_BSY +; call IS_ERROR +; jr c,SA0 +SA1: call SEL_SLAVE + call NO_BSY +SA2: ld bc,IDE_STA + in a,(c) + and 0x40 + jr z,SA2 + ld a,0xA0 + ld bc,IDE_COM + out (c),a +SA3: call NO_BSY + call IS_ERROR + jp c,SA0 + call WAIT_DRQ + ld hl,CD_BUF + ld bc,IDE_DAW + outi + outi + outi + outi + outi + outi + outi + outi + outi + outi + outi + outi + ret + +; Initialisation slave CD-ROM +; --- +; fc - CD-ROM exists +CD_INI: ld de,0xFFFF + call SEL_SLAVE + ld bc,IDE_STA + in a,(c) + rlca + call c,NO_CDROM + ld hl,0 + call HL_TO_LEN + ld a,0xEC + ld bc,IDE_COM + out (c),a + call NO_BSY + call LEN_TO_HL +; call whl +; call nln + push hl + pop de + ld bc,0xEB14 + or a + sbc hl,bc +; call nz,NO_CDROM + ld a,0xA1 + ld bc,IDE_COM + out (c),a + call CD_READ + ld hl,CD_BUF +; inc hl + ld a,(hl) + and 0x1F + cp 5 + jr nz,NO_CDROM + scf + ret + +NO_CDROM: pop hl + xor a + ret + +SAVE_BUF: push hl + ld hl,FNAME +; ld c,Dss.Create +; ld a,0 +; rst ToDSS + SPDSS DSSF.CREATE,,0 + ld (FHAND),a +; ld c,Dss.Write + ld a,(FHAND) + ld de,2048 + ld hl,CD_BUF +; rst ToDSS + SPDSS DSSF.WRITE +; !FIXIT WRITE ERROR +; ld c,0x12 + ld a,(FHAND) +; rst ToDSS + SPDSS DSSF.CLOSE + pop hl + ret + +FNAME db "cd_buf.dat",0 +FHAND db 0 + +AP_NOP: ld hl,AP_00 + call SEND_ATAPI + ret + +; ATAPI command +; HL - address of ATAPI command (AP_*) +ATAPI: +AP_COM: call SEND_ATAPI + ret + +AP_00 db 0x00 + DB 11 DUP 0 +AP_TR0 db 0x01 + DB 11 DUP 0 +AP_CD1 db 0x1B + DB 3 DUP 0 + db 1 + DB 7 DUP 0 +AP_CD2 db 0x1B + DB 3 DUP 0 + db 2 + DB 7 DUP 0 +AP_CD3 db 0x1B + DB 3 DUP 0 + db 3 + DB 7 DUP 0 +AP_PL0 db 0x4B + DB 11 DUP 0 +AP_PL1 db 0x4B + DB 7 DUP 0 + db 1 + DB 3 DUP 0 +AP_PLA db 0x47 + DB 2 DUP 0 + db 0,2,0 + db 80,0,74 + DB 3 DUP 0 +CD_BUF DB 2048 DUP 0 diff --git a/plugins/cdplayer/digits.a80 b/plugins/cdplayer/digits.a80 new file mode 100644 index 0000000..f3a80fa --- /dev/null +++ b/plugins/cdplayer/digits.a80 @@ -0,0 +1,384 @@ +digit0 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit1 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit2 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit3 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit4 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit5 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit6 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit7 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit8 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digit9 db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digi_sp db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +digi_ss db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 diff --git a/plugins/cdplayer/shaos.a80 b/plugins/cdplayer/shaos.a80 new file mode 100644 index 0000000..f538623 --- /dev/null +++ b/plugins/cdplayer/shaos.a80 @@ -0,0 +1,81 @@ + +; LAST UPDATE: 03.02.2025 savelij + +; Shaos face +shaos: ld hl,shaosraw + ld de,44 + ld c,95 + ld b,36 +; in a,(82h) + GETPORT WINSP.CPU0 + ld (shaowin),a +; ld a,50h +; out (82h),a + SETPORT WINSP.CPU0,0x50 +shaos1: ld a,c +; out (89h),a + SETPORT WINSP.CPU0,,0 + push de + di +; ACC_SetBlockSize + ACCEL ACCELCMD.SET_BUFFER + ld a,32 +; ACC_CopyBlock + ACCEL ACCELCMD.COPY + ld a,(hl) + ld (de),a +; ACC_Off + ACCEL ACCELCMD.OFF + ei + ld de,32 + add hl,de + pop de + inc c + dec b + jp nz,shaos1 +; ld a,0xFF +; out (89h),a + SETPORT WINSP.Y_PORT,0xFF + ld a,(shaowin) +; out (82h),a + SETPORT WINSP.CPU0,,0 + ret + +shaowin db 0 + +shaosraw: db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x88,0x70,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x07,0x07,0x88,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x88,0x77,0x00,0x00,0x70,0x77,0x07,0x00,0x70,0x70,0x70,0x07,0x00,0x70,0x07,0x77,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x77,0x00,0x00,0x70,0x70,0x70,0x07,0x07,0x07,0x07,0x00,0x07,0x00,0x70,0x07,0x00,0x07,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0x00,0x00,0x70,0x70,0x00,0x70,0x70,0x70,0x70,0x70,0x70,0x07,0x00,0x70,0x70,0x70,0x77,0x07,0x07,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0x87,0x00,0x70,0x70,0x70,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x07,0x07,0x07,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x78,0xFF,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xF7,0x00,0x70,0x70,0x70,0x70,0x07,0x07,0x00,0x07,0x00,0x77,0x07,0x00,0x70,0x00,0x70,0x70,0x77,0x70,0x70,0x70,0x70,0x07,0xFF,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xF8,0x00,0x70,0x70,0x00,0x00,0x07,0x00,0x70,0x77,0x77,0x88,0x77,0x77,0x77,0x00,0x70,0x07,0x07,0x00,0x70,0x70,0x70,0x70,0x70,0x78,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xF8,0x00,0x70,0x07,0x07,0x07,0x70,0x77,0x78,0x88,0x8F,0x88,0x88,0x88,0x88,0x77,0x77,0x07,0x07,0x07,0x00,0x70,0x70,0x70,0x00,0x77,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xF7,0x77,0x70,0x70,0x70,0x77,0x78,0x88,0x88,0xF8,0xF8,0x88,0x88,0x78,0x78,0x88,0x77,0x70,0x70,0x77,0x70,0x70,0x07,0x07,0x70,0x07,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xF8,0x7F,0x77,0x77,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x78,0x87,0x87,0x87,0x88,0x77,0x77,0x77,0x70,0x70,0x77,0x07,0x07,0x00,0x07,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xF8,0x87,0x88,0x87,0x88,0x88,0x87,0x87,0x87,0x88,0x88,0x88,0x87,0x87,0x88,0x88,0x87,0x77,0x70,0x77,0x07,0x07,0x70,0x70,0x77,0x07,0x7F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0x77,0x88,0x87,0x87,0x78,0x78,0x77,0x77,0x87,0x87,0x78,0x78,0x78,0x77,0x77,0x88,0x87,0x78,0x77,0x77,0x70,0x70,0x77,0x70,0x00,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xF8,0x77,0x78,0x78,0x77,0x78,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x88,0x78,0x78,0x87,0x77,0x77,0x77,0x07,0x70,0x77,0x07,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xF8,0x07,0x88,0x87,0x87,0x87,0x88,0x88,0x88,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x77,0x88,0x87,0x70,0x77,0x77,0x78,0x88,0x87,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0x78,0x77,0x88,0x78,0x78,0x78,0x88,0x88,0x88,0xF8,0xF8,0x88,0x88,0x77,0x78,0x78,0x87,0x78,0x87,0x77,0x07,0x77,0x88,0x77,0x77,0x07,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0x77,0x87,0x87,0x87,0x87,0x87,0x78,0x88,0x77,0x77,0x77,0x88,0x77,0x87,0x78,0x77,0x88,0x88,0x88,0x77,0x77,0x78,0x87,0x77,0x88,0x77,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xF7,0x77,0x77,0x87,0x77,0x77,0x07,0x00,0x70,0x07,0x07,0x07,0x70,0x77,0x77,0x77,0x77,0x77,0x87,0x88,0x88,0x78,0x87,0x77,0x07,0x77,0x78,0xFF,0xFF,0xFF + db 0xFF,0xFF,0x87,0x00,0x70,0x77,0x77,0x77,0x07,0x07,0x07,0x00,0x70,0x70,0x70,0x07,0x07,0x77,0x77,0x87,0x78,0x78,0x88,0x78,0x88,0x70,0x70,0x77,0x7F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0x80,0x07,0x00,0x07,0x77,0x77,0x70,0x00,0x70,0x77,0x07,0x07,0x70,0x77,0x77,0x78,0x77,0x77,0x87,0x87,0x88,0x88,0x87,0x77,0x70,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xF8,0x07,0x00,0x00,0x78,0x87,0x77,0x77,0x07,0x07,0x77,0x77,0x77,0x77,0x88,0x87,0x87,0x87,0x78,0x78,0x88,0x88,0x77,0x78,0x87,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0x07,0x77,0x07,0x88,0x87,0x77,0x77,0x70,0x77,0x07,0x77,0x78,0x88,0x88,0x88,0x78,0x78,0x78,0x88,0x78,0x88,0x78,0xF8,0x87,0xFF,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0x70,0x77,0x77,0xF8,0x88,0x87,0x88,0x87,0x77,0x77,0x77,0x87,0x88,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x88,0x88,0x88,0x77,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xF8,0x77,0x77,0x78,0xFF,0x87,0x78,0x77,0x78,0x88,0x88,0x88,0x78,0x87,0x87,0x77,0x77,0x87,0x78,0x77,0x87,0x88,0x77,0x77,0x77,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0x77,0x78,0x8F,0xF8,0x88,0x88,0x77,0x70,0x78,0x87,0x87,0x88,0x78,0x77,0x77,0x78,0x78,0x78,0x87,0x87,0x88,0x80,0x77,0x78,0x8F,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0x77,0x77,0x87,0x88,0x87,0x88,0x87,0x77,0x07,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x88,0x88,0x78,0xF7,0x77,0xFF,0xFF,0xFF + db 0xFF,0xFF,0xFF,0xFF,0x77,0x07,0x77,0x07,0x07,0x07,0x07,0x07,0x77,0x70,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x87,0x87,0x77,0x88,0x78,0xF8,0x70,0x00,0x07,0x77,0x7F + db 0xFF,0xFF,0xFF,0xFF,0xF7,0x70,0x77,0x70,0x70,0x77,0x77,0x77,0x88,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x78,0x78,0x78,0x77,0x8F,0x70,0x00,0x70,0x70,0x00,0x70 + db 0xFF,0xFF,0xFF,0xFF,0xF8,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x88,0x77,0x00,0x70,0x70,0x70,0x70,0x70 + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x77,0x77,0x07,0x07,0x07,0x07,0x00,0x70,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x00,0x70,0x70,0x07,0x07,0x07,0x07 + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0x07,0x77,0x77,0x77,0x77,0x77,0x77,0x70,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x70,0x00,0x07,0x00,0x07,0x07,0x07,0x07,0x00 + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x87,0x87,0x77,0x77,0x77,0x78,0x87,0x77,0x70,0x77,0x77,0x77,0x77,0x77,0x77,0x70,0x00,0x70,0x00,0x77,0x07,0x07,0x07,0x07,0x70 + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x77,0x77,0x77,0x77,0x77,0x88,0x77,0x77,0x77,0x77,0x77,0x70,0x70,0x00,0x00,0x07,0x07,0x07,0x00,0x70,0x70,0x70,0x70,0x00 + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x88,0x77,0x77,0x88,0x88,0x77,0x77,0x77,0x77,0x77,0x70,0x70,0x70,0x00,0x07,0x00,0x00,0x70,0x77,0x07,0x00,0x00,0x07,0x70 + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x88,0x88,0x78,0x78,0x77,0x77,0x77,0x70,0x70,0x00,0x00,0x00,0x70,0x00,0x70,0x70,0x70,0x00,0x00,0x70,0x77,0x07,0x07 + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0x77,0x77,0x70,0x70,0x70,0x70,0x07,0x07,0x00,0x70,0x00,0x07,0x00,0x70,0x70,0x07,0x07,0x00,0x70,0x07,0x07,0x70 + db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x87,0x70,0x70,0x77,0x70,0x07,0x00,0x00,0x00,0x00,0x07,0x00,0x70,0x07,0x00,0x70,0x00,0x70,0x70,0x77,0x70,0x77 diff --git a/plugins/date/build.bat b/plugins/date/build.bat new file mode 100644 index 0000000..fefb75f --- /dev/null +++ b/plugins/date/build.bat @@ -0,0 +1,21 @@ + +@echo off + +if not exist tmp md tmp +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\sprinter_src\tools\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\sprinter_src\;d:\yad\sprinter_src\flexnav\src\ + +asl -U -L -C -x -olist tmp\date.lst -i %includes% date.a80 || goto error +p2bin date.p ..\date.flx -r $-$ -k + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit diff --git a/plugins/date/date.a80 b/plugins/date/date.a80 new file mode 100644 index 0000000..860261b --- /dev/null +++ b/plugins/date/date.a80 @@ -0,0 +1,426 @@ + +; LAST UPDATE: 31.03.2025 savelij + + include macros.a80 + include fn_const.a80 + include fn_macros.a80 + include macros_sp.a80 + include dss_sp.a80 + + org PluginOrg +PluginStart: db "FLX-PLUG" + dw 0 + dw PluginEntry + db 0 + db 0,0,0 + + db "Date preferences plug-in for Flex Navigator",0 + db "2003 (c) Mac Buster",0 + db "$VER: 1.0 15-Jul-2003",0 + +PluginEntry: +.L1 + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 152,96,336,66 + W_FILL 4,2,328,10,COLORI.BLACK + W_TEXT 6,3,COLORI.WHITE," Date preferences v1.0" + W_HORIZLINE 1,13,336 + W_HORIZLINE 17,28,304 + W_HORIZLINE 17,46,304 + W_TEXT 18,34,COLORP.HIGHGRAY,"Day" +aDay: EQU $ - STRLEN("Day") - 2 + W_BORDER 38,33,56,10 + W_ICONDOWNARROW 60,34 + W_ICONUPARROW 76,34 + W_TEXT 100,34,COLORP.HIGHGRAY,"Month" +aMonth: EQU $ - STRLEN("Month") - 2 + W_BORDER 133,33,92,10 + W_ICONDOWNARROW 191,34 + W_ICONUPARROW 207,34 + W_TEXT 230,34,COLORP.HIGHGRAY,"Year" +aYear: EQU $ - STRLEN("Year") - 2 + W_BORDER 254,33,64,10 + W_ICONDOWNARROW 285,34 + W_ICONUPARROW 301,34 + W_BUTTONTEXT 18,51,64,11,COLORP.HIGHGRAY," " + W_BUTTONTEXT 86,51,64,11,COLORP.HIGHGRAY," " + W_BUTTONTEXT 254,51,64,11,COLORP.HIGHGRAY," " +; W_TEXT 202,149,COLORP.HIGHGRAY,"Set" +; W_TEXT 270,149,COLORP.HIGHGRAY,"Reset" +; W_TEXT 438,149,COLORP.HIGHGRAY,"Quit" +; W_TEXT 320,114,COLORP.HIGHGRAY,"Today:" + W_END + ld ix,64 + ld hl,aSet ; "Set" + ld de,202 + ld bc,149 + ld a,COLORP.HIGHGRAY;80h + call JUMPS.PrnRangPathC + ld hl,aReset ; "Reset" + ld de,270 + ld bc,149 + ld a,COLORP.HIGHGRAY;80h + call JUMPS.PrnRangPathC + ld hl,aQuit ; "Quit" + ld de,438 + ld bc,149 + ld a,COLORP.HIGHGRAY;80h + call JUMPS.PrnRangPathC + call GetSysTime + call InitDate + ld ix,320 + ld hl,aToday ; "Today:" + ld de,320 + ld bc,114 + ld a,COLORP.HIGHGRAY;80h + call JUMPS.PrnRangPathC + call sub_C2B7 + call PrintMonth + call PrintYear + call JUMPS.ResFire +_plugin_loop: ld ix,PluginMouseTab + call JUMPS.TestCoords + halt + SPDSS DSSF.SCANKEY + jr z,_plugin_loop + ld a,b + or a + jr nz,_plugin_loop + ld a,e + cp 1Bh + jr nz,_plugin_loop +PluginExit: + WINDOWCLOSE + and a + ret + +IncDay: ld a,(max_date) + ld b,a + ld a,(Day) + cp b + jr nz,loc_C198 + ld a,0 +loc_C198: inc a + ld (Day),a +PrintDay: ld a,(Day) + ld l,a + ld h,0 + add hl,hl + add hl,hl + ld de,Days0 + add hl,de + ld ix,14h + ld de,0C3h + ld bc,82h + ld a,80h + call JUMPS.PrnRangPathL + ret + +DecDay: ld a,(max_date) + ld b,a + ld a,(Day) + cp 1 + jr nz,loc_C1C5 + ld a,b + inc a +loc_C1C5: dec a + ld (Day),a + jr PrintDay + +IncMonth: ld a,(Month) + or a + ret z + dec a + ld (Month),a + call sub_C268 + call sub_C2B7 +PrintMonth: ld hl,asc_C374 + call sub_C1F3 + ld a,(Month) + ld c,a + ld b,0FFh + ld hl, asc_C374+0Dh ; "" +loc_C1E9: ld a,(hl) + inc hl + or a + jr nz,loc_C1E9 + inc b + ld a,c + cp b + jr nz,loc_C1E9 +sub_C1F3: ld ix,40h ; '@' + ld de,13Ah + ld bc,82h + ld a,80h + call JUMPS.PrnRangPathC + ret + +DecMonth: ld a,(Month) + cp 0Bh + ret z + inc a + ld (Month),a + call sub_C268 + call sub_C2B7 + jr PrintMonth + +IncYear: ld hl, a0+4 ; " " + ld c,'0' + ld a,'9' + cp (hl) + jr nz,loc_C230 + ld (hl),c + dec hl + cp (hl) + jr nz,loc_C230 + ld (hl),c + dec hl + cp (hl) + jr nz,loc_C230 + ld (hl),c + dec hl + cp (hl) + jr nz,loc_C230 + ld (hl),c + dec (hl) +loc_C230: inc (hl) +PrintYear: ld ix,1Ah + ld hl, a0+1 ; " " + ld de,1A7h + ld bc,82h + ld a,80h + call JUMPS.PrnRangPathC + call sub_C268 + call sub_C2B7 + ret + +DecYear: ld hl, a0+4 ; " " + ld c,'9' + ld a,'0' + cp (hl) + jr nz,loc_C265 + ld (hl),c + dec hl + cp (hl) + jr nz,loc_C265 + ld (hl),c + dec hl + cp (hl) + jr nz,loc_C265 + ld (hl),c + dec hl + cp (hl) + jr nz,loc_C265 + ld (hl),c + inc (hl) +loc_C265: dec (hl) + jr PrintYear + +sub_C268: ld a,(Month) + cp 1 + jr z,loc_C285 + cp 3 + jr z,loc_C27F + cp 5 + jr z,loc_C27F + cp 0Ah + jr z,loc_C27F + ld a,1Fh + jr loc_C281 + +loc_C27F: ld a,1Eh +loc_C281: ld (max_date),a + ret + +loc_C285: ld de, a0+1 ; " " + call JUMPS.ConvTxtNum16 + push hl + pop bc + ld de,190h + push bc + call JUMPS.Divis16X16 + pop bc + ld a,h + or l + jr z,loc_C2AF + ld de,4 + push bc + call JUMPS.Divis16X16 + pop bc + ld a,h + or l + jr nz,loc_C2B3 + ld de,64h ; 'd' + call JUMPS.Divis16X16 + ld a,h + or l + jr z,loc_C2B3 +loc_C2AF: ld a,1Dh + jr loc_C281 + +loc_C2B3: ld a,1Ch + jr loc_C281 + +sub_C2B7: ld a,(Day) + ld b,a + ld a,(max_date) + cp b + jr nc,loc_C2C4 + ld (Day),a +loc_C2C4: call PrintDay + ret + +SetDate: ld de, a0+1 ; " " + call JUMPS.ConvTxtNum16 + push hl + SPDSS DSSF.GETTIME,0 + ld a,(Day) + ld d,a + ld a,(Month) + inc a + ld e,a + pop ix + SPDSS DSSF.SETTIME + call InitDate + jr loc_C2E9 + +ReadDate: call GetSysTime +loc_C2E9: call PrintDay + call PrintMonth + call PrintYear + ret + +GetSysTime: + SPDSS DSSF.GETTIME,0 + ld a,d + ld (Day),a + ld a,e + dec a + ld (Month),a + push ix + ld hl,a0 ; "0 " + ld b,5 +loc_C307: ld (hl),30h ; '0' + inc hl + djnz loc_C307 + pop hl + ld de, a0+1 ; " " + call JUMPS.ConvNumTxt16 +InitDate: ld hl, aToday+6 ; "" + ld b,' ' +loc_C318: ld (hl),0 + inc hl + djnz loc_C318 + ld a,(Day) + ld l,a + ld h,0 + add hl,hl + add hl,hl + ld de,Days0 + add hl,de + ld de, aToday+6 ; "" + ldi + ldi + ldi + ex de,hl + ld (hl),' ' + inc hl + push hl + ld a,(Month) + ld c,a + ld b,0FFh + ld hl, asc_C374+0Dh ; "" +loc_C340: ld a,(hl) + inc hl + or a + jr nz,loc_C340 + inc b + ld a,c + cp b + jr nz,loc_C340 + pop de +loc_C34B: ld a,(hl) + or a + jr z,loc_C354 + ld (de),a + inc hl + inc de + jr loc_C34B + +loc_C354: ex de,hl + ld (hl),20h ; ' ' + inc hl + ex de,hl + ld hl, a0+1 ; " " + ldi + ldi + ldi + ldi + ret + +aSet: db "Set",0 +aReset: db "Reset",0 +aQuit: db "Quit",0 +asc_C374: db " ",0 +aJanuary: db "January",0 +aFebruary: db "February",0 +aMarch: db "March",0 +aApril: db "April",0 +aMay: db "May",0 +aJune: db "June",0 +aJuly: db "July",0 +aAugust: db "August",0 +aSeptember: db "September",0 +aOctober: db "October",0 +aNovember: db "November",0 +aDecember: db "December",0 +aToday: db "Today:",0 + DB 31 DUP 0 +Day: db 12h +Month: db 5 +max_date: db 1Eh +a0: db "0 ",0 +Days0: DB 4 DUP 0 ; Лишние 4 нуля,чтоб не отнимать 1 от номера дня +Days: db " 01",0 + db " 02",0 + db " 03",0 + db " 04",0 + db " 05",0 + db " 06",0 + db " 07",0 + db " 08",0 + db " 09",0 + db " 10",0 + db " 11",0 + db " 12",0 + db " 13",0 + db " 14",0 + db " 15",0 + db " 16",0 + db " 17",0 + db " 18",0 + db " 19",0 + db " 20",0 + db " 21",0 + db " 22",0 + db " 23",0 + db " 24",0 + db " 25",0 + db " 26",0 + db " 27",0 + db " 28",0 + db " 29",0 + db " 30",0 + db " 31",0 + +PluginMouseTab: dw 212,228,130,138,1,0,DecDay,0 + dw 228,244,130,138,1,0,IncDay,0 + dw 342,358,130,138,1,0,DecMonth,0 + dw 358,374,130,138,1,0,IncMonth,0 + dw 437,453,130,138,1,0,DecYear,0 + dw 453,469,130,138,1,0,IncYear,0 + dw 238,302,147,158,1,0,ReadDate,0 + dw 170,234,147,158,1,0,SetDate,0 + dw 406,470,147,158,33,0,PluginExit,0 + dw 0x8000 +PluginEnd: diff --git a/plugins/fneditor/build.bat b/plugins/fneditor/build.bat new file mode 100644 index 0000000..ceee35c --- /dev/null +++ b/plugins/fneditor/build.bat @@ -0,0 +1,21 @@ + +@echo off + +if not exist tmp md tmp +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\sprinter_src\tools\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\sprinter_src\;d:\yad\sprinter_src\flexnav\src\ + +asl -U -L -C -x -olist tmp\fneditor.lst -i %includes% femain.a80 || goto error +p2bin femain.p ..\fneditor.flx -r $-$ -k + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit diff --git a/plugins/fneditor/feditor.a80 b/plugins/fneditor/feditor.a80 new file mode 100644 index 0000000..bf667bb --- /dev/null +++ b/plugins/fneditor/feditor.a80 @@ -0,0 +1,849 @@ + +; LAST UPDATE: 11.03.2025 savelij + + INIT_VAR + SETVAR CursorX ;EQU 0x00 + SETVAR StringX ;EQU 0x01 + SETVAR CursAddX ;EQU 0x02 + SETVAR CursorY ;EQU 0x03 + SETVAR LenString ;EQU 0x04 + SETVAR PrvLenStr ;EQU 0x05 + SETVAR ReadyStr ;EQU 0x06 + SETVAR ReadyFile ;EQU 0x07 + +LineBuffer := WorkBuffer+0x200 +TempBuffer := WorkBuffer+0x300 + +;[]==========================================================[] + JP FileEditor + + DZ FLEX_VERS.EDITOR + +FileEditor CALL FELoadFile + RET C + call ReadEditorIni + LD IY,EditData + SUB A + LD (EditMode),A + LD (HEXmode),A + LD (IY+CursorX),A + LD (IY+StringX),A + LD (IY+CursAddX),A + LD (IY+CursorY),A + LD (IY+ReadyStr),A + LD (IY+ReadyFile),A + INC A + LD (FECrTimer),A + LD HL,0x0000 + LD (CurLine),HL + LD (LineShift),HL + LD (FEPageShift),HL + CALL FEInitScreen +EditorBegin CALL InitStatus + CALL InitFile + CALL PrintPage +EditorLoop CALL FEChCursor + LD A,(EditMode) + OR A + JP NZ,HEditLoop +TEditLoop LD IX,FEASCIItab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиш + JR Z,EditorLoop + LD A,D + CP 0x44 + JP Z,EditorExit + LD A,E ;Е-ASCII код + CP 0x1B ;Esc + JP Z,EditorExit + LD HL,EditorLoop + PUSH HL + OR A + JP NZ,TInsertSymbol + LD A,D + CP 0x3B + JP Z,FEAbout + CP 0x3C + JP Z,SaveFile + CP 0x3E + JP Z,ChEditor ;Просмотр в HEX + CP 0x41 + JP Z,FEPrintFile + CP 0x43 + JP Z,EditorSetup + CP 0x4F + JP Z,TDeleteSymbol + CP 0x54 + JP Z,TCursorLeft + CP 0x56 + JP Z,TCursorRight + CP 0x58 + JP Z,TCursorUp + CP 0x52 + JP Z,TCursorDown + CP 0x57 ;Home + JP Z,THomeString + CP 0x51 ;End + JP Z,TEndString + CP 0x59 ;PageUp + JP Z,FETPageUp + CP 0x53 ;PageDown + JP Z,TPageDown + LD A,B + AND 0x30 + CP 0x30 + RET Z + bit 4,b ;При нажатом Alt + jr z,.ctrl + ld a,d + and 0x7f + CP 0x54 ;Alt+< + JP Z,THomeString + CP 0x56 ;Alt+> + JP Z,TEndString + ret + +.ctrl: BIT 5,B ;При нажатом Ctrl + RET Z + LD A,D + AND 0x7F + CP 0x0E + JP Z,TDeleteWord + CP 0x15 ;Ctrl+Y - Delete String + JP Z,TDeleteString + CP 0x1E ;Ctrl+S + JP Z,SaveFile + CP 0x1F ;Ctrl+D + JP Z,TDoubleString + CP 0x19 ;Ctrl+P + JP Z,FEPrintFile + cp 0x2a ;Ctrl+Z + jp z,Undo + CP 0x54 + JP Z,TWordLeft + CP 0x56 + JP Z,TWordRight + CP 0x58 + JP Z,TScrollUp + CP 0x52 + JP Z,TScrollDown + CP 0x57 ;Ctrl+Home + JP Z,FETBegFile ;в начало файла + CP 0x51 ;Ctrl+PageEnd + JP Z,FETEndFile ;в конец файла + RET + +HEditLoop LD IX,FEHEXtab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиш + JP Z,EditorLoop + LD A,D ; + CP 0x44 ;F10 + JP Z,EditorExit + LD A,E ;Е-ASCII код + CP 0x1B ;Esc + JP Z,EditorExit + LD HL,EditorLoop + PUSH HL + OR A + JP NZ,HPutSymbol + LD A,D + CP 0x3B + JP Z,FEAbout + CP 0x3C + JP Z,SaveFile + CP 0x9E ;Ctrl+S + JP Z,SaveFile + CP 0x3E ;F4 + JP Z,ChEditor ;Просмотр в тексте + CP 0x3F ;F5 + JP Z,FEHGoTo ;Переход на адрес пользователя + CP 0x41 + JP Z,FEPrintFile + CP 0x43 + JP Z,EditorSetup + CP 0x54 + JP Z,HCursorLeft + CP 0x56 + JP Z,HCursorRight + CP 0x57 ;Home + JP Z,HHomeString + CP 0x51 ;End + JP Z,HEndString + CP 0x58 ;Стрелка вверх + JP Z,HCursorUp + CP 0x52 ;Стрелка вниз + JP Z,HCursorDown + CP 0x59 ;PageUp + JP Z,FEHPageUp + CP 0x53 ;PageDown + JP Z,FEHPageDown + LD A,B + AND 0x30 + CP 0x30 + RET Z + BIT 5,B + RET Z + LD A,D + AND 0x7F + CP 0x58 + JP Z,HScrollUp + CP 0x52 + JP Z,HScrollDown + CP 0x57 ;Ctrl+PageUp + JP Z,FEHBegFile ;в начало файла + CP 0x51 ;Ctrl+PageDown + JP Z,FEHEndFile ;в конец файла + CP 0x19 ;Ctrl+P + JP Z,FEPrintFile + RET + +;[]==========================================================[] +EditingFile DUPL 0x30,0 +EditMode DEFB 0x00 +HEXmode DEFB 0x00 +EditData DEFB 0x00 ;Cursor X + DEFB 0x00 ;String X + DEFB 0x00 ;Cursor add X + DEFB 0x00 ;Cursor Y + DEFB 0x00 ;Len String + DEFB 0x00 ;Previos Len String + DEFB 0x00 ;Ready String + DEFB 0x00 ;Ready File +CurLine DEFW 0x0000 +EquipLines DEFW 0x0000 +LineShift DEFW 0x0000 +FEPageShift DEFW 0x0000 +FETempShift DEFW 0x0000 +FEFileLenght DEFW 0x0000 ;Длина файла (16бит) +FEEmptyLines DEFB 0x00 +FEMemIndef DEFB 0x00 +FEFHandle DEFB 0x00 +FEReadLen +SaveLen DEFW 0x0000 + +;[]==========================================================[] +ChEditor LD HL,EditorBegin + EX (SP),HL + LD A,(EditMode) + XOR 0x01 + LD (EditMode),A + JR NZ,HEXEdit +ASCIIEdit LD HL,(LineShift) + LD E,(IY+CursorX) + SRL E + LD D,0x00 + ADD HL,DE + PUSH HL + INC HL + CALL FESearchUp + LD (LineShift),HL + LD (FEPageShift),HL + SUB A + LD (IY+StringX),A + LD (IY+CursorY),A + PUSH HL + CALL GetString + POP DE + POP HL + OR A + SBC HL,DE + LD A,L + CP (IY+LenString) + JR C,.L1 + LD A,(IY+LenString) +.L1 DEC A + LD (IY+StringX),A + JP TCursorRight + +HEXEdit CALL PutString + LD HL,(LineShift) + LD A,(IY+StringX) + CP (IY+LenString) + JR C,.L1 + LD A,(IY+LenString) +.L1 LD E,A + LD D,0x00 + ADD HL,DE + LD A,L + AND 0x0F + ADD A,A + LD (IY+CursorX),A + LD A,L + AND 0xF0 + LD L,A + LD (LineShift),HL + LD (FEPageShift),HL + SUB A + LD (IY+CursorY),A + RET + +;[]==========================================================[] +EditorExit CALL PutString + CALL FEResCursor + LD A,(IY+ReadyFile) + OR A + JP Z,QuitAsk;EditorE + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 208,80,224,60 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 88,3,COLORI.WHITE,"Information" + W_TEXT 64,19,COLORP.HIGHGRAY,"File has been modified." + W_TEXT 96,29,COLORP.HIGHGRAY,"Save ?" + W_BUTTON 32,42,72,14 + W_TEXT 58,45,COLORP.HIGHGRAY,"Yes" + W_BUTTON 120,42,72,14 + W_TEXT 150,45,COLORP.HIGHGRAY,"No" + W_END +SureLoop LD IX,SureTab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY + JR Z,SureLoop + LD A,B + OR A + JR NZ,SureLoop + LD A,E + CP 0x1B + SCF + JR Z,SureExit + CP 0x0D + JR Z,SureExit + RES 5,A + CP 'N' + JR Z,SureExit + CP 'Y' + JR NZ,SureLoop +SureOkey CALL SaveFile + OR A +SureExit + WINDOWCLOSE + JP C,EditorLoop +EditorE LD A,(FEMemIndef) + SPDSS DSSF.FREEMEM + OR A + RET + +;[]==========================================================[] +QuitAsk: ld a,0 +.param EQU $-1 + and a + jr z,EditorE + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 208,88,224,50 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 104,3,COLORI.WHITE,"Quit" + W_TEXT 28,19,COLORP.HIGHGRAY,"Do you want to close the editor?" + W_BUTTON 32,32,72,14 + W_TEXT 58,35,COLORP.HIGHGRAY,"Yes" + W_BUTTON 120,32,72,14 + W_TEXT 150,35,COLORP.HIGHGRAY,"No" + W_END +FEQuitLoop: LD IX,FEQuitTab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY + JR Z,FEQuitLoop + LD A,B + OR A + JR NZ,FEQuitLoop + LD A,E + CP 0x1B + scf + JP Z,SureExit + CP 0x0D + JP Z,SureExit + RES 5,A + CP 'Y' + JP Z,SureExit + CP 'N' + JR NZ,FEQuitLoop +FEQuitAbort: SCF + JP SureExit + +;[]==========================================================[] +FEInitScreen + MAKEWINDOW WINSUBOBJ.NOSTORE + W_MAIN 0,0,640,256 + W_FILL 4,2,632,10,COLORI.BLACK + W_TEXT 16,3,COLORI.WHITE,"FN File Editor v\{FLEX_VERS.EDITOR}" + W_HORIZLINE 0,13,640 + W_TEXT 8,17,COLORP.HIGHGRAY,"Editing:" + W_VERTICLINE 366,16,10 + W_TEXT 400,17,COLORP.HIGHGRAY,"Line:" + W_TEXT 480,17,COLORP.HIGHGRAY,"Col:" + W_TEXT 552,17,COLORP.HIGHGRAY,"Free:" + W_HORIZLINE 0,27,640 + W_HORIZLINE 0,227,640 + W_ICONUPARROW 624,28 + W_FILL 624,36,16,184,COLORI.HIGHGRAY + W_ICONDOWNARROW 624,220 + W_END + SPDSS DSSF.CURDISK + LD HL,WorkBuffer + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + PUSH HL + SPDSS DSSF.CURDIR + POP HL + SUB A +.L1 INC HL + CP (HL) + JR NZ,.L1 + DEC HL + LD A,0x5C + CP (HL) + INC HL + JR Z,.L2 + LD (HL),A + INC HL +.L2 EX DE,HL + LD HL,EditingFile+33 + SUB A +.L3 LDI + CP (HL) + JR NZ,.L3 + LD (DE),A + LD IX,0x0130 + LD HL,WorkBuffer + LD DE,0x0030 + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnRangPathL + LD HL,0x01FC + LD DE,0x0003 + LD B,0x08 + EXX + LD HL,0x022E + LD DE,0x0003 + LD B,0x08 + EXX + LD A,0x02 + CALL JUMPS.SetCMOSPrint + RET + +;[]==========================================================[] +InitStatus LD A,(EditMode) + OR A + JP NZ,InitHEXStatus + MAKEWINDOW WINSUBOBJ.WOBIND + W_HORIZLINE 0,235,626 + W_VERTICLINE 622,228,8 + W_ICONLEFTARROW 0,228 + W_FILL 16,228,592,8,COLORI.HIGHGRAY + W_ICONRIGHTARROW 608,228 + W_HORIZLINE 0,241,640 + W_FILL 2,243,636,12,COLORI.HIGHGRAY + W_HORIZLINE 2,255,637 + W_BUTTON 0,242,80,14 + W_TEXT 18,245,COLORP.HIGHGRAY,"F1 About" + W_BUTTON 80,242,80,14 + W_TEXT 100,245,COLORP.HIGHGRAY,"F2 Save" + W_BUTTON 160,242,80,14 + W_TEXT 184,245,COLORP.HIGHGRAY,"F4 Hex" + W_BUTTON 400,242,80,14 + W_TEXT 422,245,COLORP.HIGHGRAY,"F7 Print" + W_BUTTON 480,242,80,14 + W_TEXT 492,245,COLORP.HIGHGRAY,"F9 Settings" + W_BUTTON 560,242,80,14 + W_TEXT 580,245,COLORP.HIGHGRAY,"F10 Quit" + W_END + RET + +InitHEXStatus + MAKEWINDOW WINSUBOBJ.WOBIND + W_HORIZLINE 0,227,640 + W_FILL 2,229,636,10,COLORI.HIGHGRAY + W_HORIZLINE 2,241,640 + W_FILL 2,243,636,12,COLORI.HIGHGRAY + W_HORIZLINE 2,255,638 + W_BUTTON 0,242,80,14 + W_TEXT 18,245,COLORP.HIGHGRAY,"F1 About" + W_BUTTON 80,242,80,14 + W_TEXT 100,245,COLORP.HIGHGRAY,"F2 Save" + W_BUTTON 160,242,80,14 + W_TEXT 182,245,COLORP.HIGHGRAY,"F4 ASCII" + W_BUTTON 240,242,80,14 + W_TEXT 258,245,COLORP.HIGHGRAY,"F5 Go to" + W_BUTTON 400,242,80,14 + W_TEXT 422,245,COLORP.HIGHGRAY,"F7 Print" + W_BUTTON 480,242,80,14 + W_TEXT 492,245,COLORP.HIGHGRAY,"F9 Settings" + W_BUTTON 560,242,80,14 + W_TEXT 580,245,COLORP.HIGHGRAY,"F10 Quit" + W_END + RET + +;[]==========================================================[] +InitFile LD A,(EditMode) + OR A + JR NZ,InitFileHex + CALL JUMPS.SetClock + LD HL,0x0000 + LD E,L + LD D,H +InitAlp PUSH HL + LD BC,(LineShift) + OR A + SBC HL,BC + POP HL + JR NZ,.L1 + LD (CurLine),DE +.L1 PUSH DE + CALL FESearchDown + POP DE + INC DE + JR NC,InitAlp + DEC DE + LD (EquipLines),DE + LD (ELines),DE + LD HL,TBarU + LD (BarPgU),HL + LD HL,TBarD + LD (BarPgD),HL + LD IX,EditVBar + CALL JUMPS.InitScrBar + LD HL,0x00F0 + LD (CScrnX),HL + LD IX,EditHBar + CALL JUMPS.InitScrBar + LD HL,0xFFFF + LD (CLine),HL + LD H,0x00 + LD (CAddX),HL + CALL JUMPS.SetMouse + RET + +InitFileHex LD HL,(FEFileLenght) + LD A,L + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + AND 0x0F + JR Z,.L1 + INC HL +.L1 LD (EquipLines),HL + LD (ELines),HL + LD HL,(LineShift) + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD (CurLine),HL + LD HL,HBarU + LD (BarPgU),HL + LD HL,HBarD + LD (BarPgD),HL + LD IX,EditVBar + CALL JUMPS.InitScrBar + LD HL,0xFFFF + LD (CLine),HL + RET + +EditVBar DEFW 0x0270 ;X позиция скролбара + DEFW 0x0024 ;Y позиция скролбара + DEFW 0x00B8 ;Max длина скролбара + DEFW 0x0000 ;тек.длина скролбара +BarPgU DEFW 0x0000 ;Адрес ячейки BarLeft +BarPgD DEFW 0x0000 ;Адрес ячейки BarRight + DEFW 0x0019 ;Кол-во строк на странице +ELines DEFW 0x0000 ;Общее кол-во строк +CLine DEFW 0x0000 ;Первая строка на странице +EditHBar DEFW 0x0010 ;X позиция скролбара + DEFW 0x00E4 ;Y позиция скролбара + DEFW 0x0250 ;Max длина скролбара + DEFW 0x0000 ;тек.длина скролбара + DEFW TBarL ;Адрес ячейки BarLeft + DEFW TBarR ;Адрес ячейки BarRight + DEFW 0x004E ;Кол-во строк на странице +CScrnX DEFW 0x0000 ;Общее кол-во строк +CAddX DEFW 0x0000 ;Первая строка на странице + +;[]==========================================================[] +PrintPage LD A,(EditMode) + OR A + JP Z,FEPrnASCIIpage + JP FEPrnHEXpage + +PrnEDITinfo LD A,(EditMode) + OR A + JP Z,PrnASCIIinfo + JP PrnHEXinfo + +;[]==========================================================[] +FEChCursor HALT + LD HL,FECrTimer + DEC (HL) + RET NZ + LD (HL),CursTimer + LD A,(FECurCursor) + XOR 0x01 + LD (FECurCursor),A + JR Z,ResCurs + JR SetCurs + +FESetCursor LD (CursorPos),DE + LD A,0x01 + LD (FECurCursor),A + LD A,CursTimer + LD (FECrTimer),A +SetCurs + GETPORT WINSP.CPU1 + PUSH AF + GETPORT WINSP.Y_PORT + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD DE,(CursorPos) + LD L,E + LD H,0x00 + ADD HL,HL + ADD HL,HL + SET 6,H + LD A,D + ADD A,A + ADD A,A + ADD A,A + ADD A,0x22 + LD C,A + LD B,COLORP.FILES + COLORI.FILES + DI + LD DE,FECursBuffer + LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x04 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.FILL + LD (HL),B + ACCEL ACCELCMD.OFF + INC C + LD DE,FECursBuffer+4 + LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.FILL + LD (HL),B + ACCEL ACCELCMD.OFF + EI + POP AF + SETPORT WINSP.Y_PORT,,0 + POP AF + SETPORT WINSP.CPU1,,0 + RET + +FEResCursor SUB A + LD (FECurCursor),A + INC A + LD (FECrTimer),A +ResCurs + GETPORT WINSP.CPU1 + PUSH AF + GETPORT WINSP.Y_PORT + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD DE,(CursorPos) + LD L,E + LD H,0x00 + ADD HL,HL + ADD HL,HL + SET 6,H + LD A,D + ADD A,A + ADD A,A + ADD A,A + ADD A,0x22 + LD C,A + DI + LD DE,FECursBuffer + LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x04 + ACCEL ACCELCMD.COPY + LD A,(DE) + LD (HL),A + ACCEL ACCELCMD.OFF + INC C + LD DE,FECursBuffer+4 + LD A,C + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY + LD A,(DE) + LD (HL),A + ACCEL ACCELCMD.OFF + EI + POP AF + SETPORT WINSP.Y_PORT,,0 + POP AF + SETPORT WINSP.CPU1,,0 + RET + +FECrTimer DEFB 0x01 +FECurCursor DEFB 0x00 +CursorPos DEFW 0x0000 +FECursBuffer DUPL 8,0 + +;[]==========================================================[] +FEAbout CALL FEResCursor + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 160,72,320,85 + W_FILL 4,2,312,10,COLORI.BLACK + W_TEXT 144,3,COLORI.WHITE,"About" + W_TEXT 96,18,COLORP.HIGHGRAY,"Flex Navigator File Editor" + W_TEXT 144,28,COLORP.HIGHGRAY,"v\{FLEX_VERS.EDITOR}" + W_TEXT 18,40,COLORP.HIGHGRAY,"Programming: (C)2000 Enin Anton" + W_TEXT 92,50,COLORP.HIGHGRAY,"(C)2021 Mikhaltchenkov Dmitry" + W_BUTTON 124,66,72,14 + W_TEXT 154,69,COLORP.HIGHGRAY,"Ok" + W_END +FEAboutLoop LD IX,FEAboutTab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY + JR Z,FEAboutLoop + LD A,B + OR A + JR NZ,FEAboutLoop + LD A,E + CP 0x1B + JR Z,FEAboutExt + CP 0x0D + JR Z,FEAboutExt + RES 5,A + CP 'O' + JR NZ,FEAboutLoop +FEAboutExt + WINDOWCLOSE + RET + +;[]==========================================================[] +FEScrollSCRup LD DE,0x241C + JR FEScrlSCRDnUp + +FEScrollSCRdown LD DE,0x1C24 +;На вход: +; D - Y откуда +; Е - Y куда +FEScrlSCRDnUp DI + PUSH DE + SPMOUSE MOUSEF.REFRESH + POP DE + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD HL,0x4000 + LD BC,312 + ACCEL ACCELCMD.SET_BUFFER + LD A,0xC0 + ACCEL ACCELCMD.OFF +.ScSCRN1 LD A,D + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD A,(HL) + ACCEL ACCELCMD.OFF + LD A,E + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD (HL),A + ACCEL ACCELCMD.OFF + CPI + JP PE,.ScSCRN1 + POP AF + SETPORT WINSP.CPU1,,0 + EI + RET + +;[]==========================================================[] + include fedos.a80 + include fetext.a80 + include fehex.a80 + include feprn.a80 + include fesetup.a80 + +;[]==========================================================[] +FEASCIItab: DW 0x0000,0x0270,0x001C,0x00E4,0x00,0x0000, TNewCrPos, 0x0000 + DW 0x0000,0x0050,0x00F2,0x0100,0x01,0x0000, FEAbout, 0x0000 + DW 0x0050,0x00A0,0x00F2,0x0100,0x01,0x0000, SaveFile, 0x0000 + DW 0x00A0,0x00F0,0x00F2,0x0100,0x01,0x0000, ChEditor, 0x0000 + DW 0x0190,0x01E0,0x00F2,0x0100,0x01,0x0000, EditorSetup, 0x0000 + DW 0x01E0,0x0230,0x00F2,0x0100,0x01,0x0000, FEPrintFile, 0x0000 + DW 0x0230,0x0280,0x00F2,0x0100,0x21,0x0000, EditorExit, 0x0000 + DW 0x0270,0x0280,0x001C,0x0024,0x03,0x0000, TCursorUp, 0x0000 + DW 0x0270,0x0280,0x00DC,0x00E4,0x03,0x0000, TCursorDown, 0x0000 +TBarU EQU $+6 + DW 0x0270,0x0280,0x001C,0x0000,0x00,0x0000, FETPageUp, 0x0000 +TBarD EQU $+4 + DW 0x0270,0x0280,0x0000,0x00E4,0x00,0x0000, TPageDown, 0x0000 + DW 0x0000,0x0010,0x00E4,0x00EC,0x03,0x0000, TCursorLeft, 0x0000 + DW 0x0260,0x0270,0x00E4,0x00EC,0x03,0x0000, TCursorRight, 0x0000 +TBarL EQU $+2 + DW 0x0010,0x0000,0x00E4,0x00EC,0x00,0x0000, TCursorLeft, 0x0000 +TBarR: DW 0x0000,0x0260,0x00E4,0x00EC,0x00,0x0000, TCursorRight, 0x0000 + DEFW 0x8000 + +FEHEXtab: DW 0x0000,0x0050,0x00F2,0x0100,0x01,0x0000, FEAbout, 0x0000 + DW 0x0050,0x00A0,0x00F2,0x0100,0x01,0x0000, SaveFile, 0x0000 + DW 0x00A0,0x00F0,0x00F2,0x0100,0x01,0x0000, ChEditor, 0x0000 + DW 0x00F0,0x0140,0x00F2,0x0100,0x01,0x0000, FEHGoTo, 0x0000 + DW 0x0190,0x01E0,0x00F2,0x0100,0x01,0x0000, EditorSetup, 0x0000 + DW 0x01E0,0x0230,0x00F2,0x0100,0x01,0x0000, FEPrintFile, 0x0000 + DW 0x0230,0x0280,0x00F2,0x0100,0x21,0x0000, EditorExit, 0x0000 + + DW 0x0270,0x0280,0x001C,0x0024,0x03,0x0000, HCursorUp, 0x0000 + DW 0x0270,0x0280,0x00DC,0x00E4,0x03,0x0000, HCursorDown, 0x0000 + DW 0x0048,0x01D8,0x001C,0x00E4,0x00,0x0000, HNewHEXPos, 0x0000 + DW 0x01E8,0x0268,0x001C,0x00E4,0x00,0x0000, HNewASCPos, 0x0000 +HBarU EQU $+6 + DW 0x0270,0x0280,0x001C,0x0000,0x00,0x0000, FEHPageUp, 0x0000 +HBarD EQU $+4 + DW 0x0270,0x0280,0x0000,0x00E4,0x00,0x0000, FEHPageDown, 0x0000 + DEFW 0x8000 + +FEAboutTab: DEFW 0x011C,0x0164,0x008A,0x0098,0x21,0x0000, FEAboutExt, 0x0000 + DEFW 0x0000,0x00A0,0x0000,0x0100,0x20,0x0000, FEAboutExt, 0x0000 + DEFW 0x01E0,0x0280,0x0000,0x0100,0x20,0x0000, FEAboutExt, 0x0000 + DEFW 0x0000,0x0280,0x0000,0x0048,0x20,0x0000, FEAboutExt, 0x0000 + DEFW 0x0000,0x0280,0x009D,0x0100,0x20,0x0000, FEAboutExt, 0x0000 + DEFW 0x8000 + +SureTab: DEFW 0x00F0,0x0138,0x007A,0x0088,0x021,0x0000, SureOkey, 0x0000 + DEFW 0x0148,0x0190,0x007A,0x0088,0x021,0x0000, SureExit, 0x0000 + DEFW 0x0000,0x00D0,0x0000,0x0100,0x120,0x0000, EditorLoop, 0x0000 + DEFW 0x01B0,0x0280,0x0000,0x0100,0x120,0x0000, EditorLoop, 0x0000 + DEFW 0x0000,0x0280,0x0000,0x0050,0x120,0x0000, EditorLoop, 0x0000 + DEFW 0x0000,0x0280,0x008C,0x0100,0x120,0x0000, EditorLoop, 0x0000 + DEFW 0x8000 + +NewFileTab: DEFW 0x00F0,0x0138,0x0082,0x0090,0x021,0x0000, NewFExitO, 0x0000 + DEFW 0x0148,0x0190,0x0082,0x0090,0x021,0x0000, NewFExitC, 0x0000 + DEFW 0x0000,0x00C0,0x0000,0x0100,0x020,0x0000, NewFExitC, 0x0000 + DEFW 0x01C0,0x0280,0x0000,0x0100,0x020,0x0000, NewFExitC, 0x0000 + DEFW 0x0000,0x0280,0x0000,0x0058,0x020,0x0000, NewFExitC, 0x0000 + DEFW 0x0000,0x0280,0x0094,0x0100,0x020,0x0000, NewFExitC, 0x0000 + DEFW 0x8000 + +FEQuitTab: DW 0x00F0,0x0138,0x0078,0x0086,0x21,0x0000, SureExit, 0x0000 + DW 0x0148,0x0190,0x0078,0x0086,0x21,0x0000, FEQuitAbort, 0x0000 + DW 0x0000,0x00D0,0x0000,0x0100,0x20,0x0000, FEQuitAbort, 0x0000 + DW 0x01B0,0x0280,0x0000,0x0100,0x20,0x0000, FEQuitAbort, 0x0000 + DW 0x0000,0x0280,0x0000,0x0058,0x20,0x0000, FEQuitAbort, 0x0000 + DW 0x0000,0x0280,0x008A,0x0100,0x20,0x0000, FEQuitAbort, 0x0000 + DW 0x8000 + +SettingsFileName: + DZ FILENAME.FNEDIT_INI + +;[]==========================================================[] diff --git a/plugins/fneditor/fedos.a80 b/plugins/fneditor/fedos.a80 new file mode 100644 index 0000000..ae65e91 --- /dev/null +++ b/plugins/fneditor/fedos.a80 @@ -0,0 +1,494 @@ + +; LAST UPDATE: 27.05.2025 savelij + +;[]==========================================================[] +FELoadFile CALL JUMPS.SetClock + LD DE,EditingFile + PUSH HL + SPDSS DSSF.F_FIRST,1,0x37 + POP HL + JP C,FENewFile +; LD HL,EditingFile+33 +; LD A,(HL) +;.LoadFl0 CALL FECorrBigChar +; LD (HL),A +; INC HL +; LD A,(HL) +; OR A +; JR NZ,.LoadFl0 + LD IX,EditingFile + LD L,(IX+28) + LD H,(IX+29) + LD A,H + AND 0xC0 + CP 0xC0 + LD A,0x1E + PUSH AF + CALL Z,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти + POP AF + SCF + JP Z,FELoadExit + LD (FEFileLenght),HL + LD A,(IX+30) + OR (IX+31) + LD A,0x1E + PUSH AF + CALL NZ,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти + POP AF + SCF + JP NZ,FELoadExit + SPDSS DSSF.GETMEM,3 + PUSH AF + CALL C,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти + POP AF + JP C,FELoadExit + LD (FEMemIndef),A + LD HL,PagesList + SPBIOS BIOSF.GETMEMBLKPAGES + LD IX,ProcessEdit + LD HL,(FEFileLenght) + LD A,H + AND 0xC0 + RLCA + RLCA + LD (IX+PROC.MAXL1),A + SUB A + LD (IX+PROC.MAXH1),A + LD (IX+PROC.MAXL2),A + LD (IX+PROC.MAXH2),A + CALL JUMPS.InitProcess + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 160,88,320,48 + W_FILL 4,2,312,10,COLORI.BLACK + W_TEXT 112,3,COLORI.WHITE,"FN File Editor v\{FLEX_VERS.EDITOR}" + W_TEXT 8,16,COLORP.HIGHGRAY,"Reading:" + W_BORDER 16,28,288,12 + W_FILL 18,29,284,10,COLORI.WHITE + W_END + SPDSS DSSF.CURDISK + LD HL,WorkBuffer + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + PUSH HL + SPDSS DSSF.CURDIR + POP HL + SUB A +.L1 INC HL + CP (HL) + JR NZ,.L1 + DEC HL + LD A,0x5C + CP (HL) + INC HL + JR Z,.L2 + LD (HL),A + INC HL +.L2 EX DE,HL + LD HL,EditingFile+33 + SUB A +.L3 LDI + CP (HL) + JR NZ,.L3 + LD (DE),A + LD IX,0x0100 + LD HL,WorkBuffer + LD DE,0x00D8 + LD BC,0x0068 + LD A,0x80 + CALL JUMPS.PrnRangPathL + LD HL,EditingFile+33 + SPDSS DSSF.OPEN,,1 + PUSH AF + CALL C,JUMPS.DOSError + POP AF + JP C,FENoRead + LD (FEFHandle),A + LD IX,EditingFile + LD L,(IX+28) + LD H,(IX+29) + LD (FEReadLen),HL + SETPORT WINSP.Y_PORT,0xC0 + GETPORT WINSP.CPU1 + PUSH AF + LD HL,PagesList + LD A,(HL) +.ReadLp1 INC HL + PUSH HL + SETPORT WINSP.CPU1,,0 + SPDSS DSSF.SCANKEY + LD HL,0x011B + OR A + SBC HL,DE + JP Z,FEReadAbort + LD HL,(FEReadLen) + LD BC,0x4000 + OR A + SBC HL,BC + JR C,.ReadEnd + LD (FEReadLen),HL + LD HL,0x4000 + LD DE,0x4000 + LD A,(FEFHandle) + SPDSS DSSF.READ + JP C,FEReadAbort + CALL FENextProcess + POP HL + LD A,(HL) + CP 0xFF + JR NZ,.ReadLp1 + POP AF + SETPORT WINSP.CPU1,,0 + JR .ReadExit + +.ReadEnd LD HL,0x4000 + LD DE,(FEReadLen) + LD A,D + OR E + JR Z,.ReadEn1 + LD A,(FEFHandle) + SPDSS DSSF.READ + JP C,FEReadAbort + CALL FENextProcess +.ReadEn1 POP HL + POP AF + SETPORT WINSP.CPU1,,0 +.ReadExit LD A,(FEFHandle) + SPDSS DSSF.CLOSE + OR A +FELoadExit HALT + HALT + WINDOWCLOSE + PUSH AF + CALL JUMPS.SetMouse + POP AF + RET + +FEReadAbort POP HL + POP AF + SETPORT WINSP.CPU1,,0 +FENoRead LD A,(FEMemIndef) + SPDSS DSSF.FREEMEM + SCF + JR FELoadExit + +;[]==========================================================[] +FENewFile PUSH AF + CALL JUMPS.SetMouse + POP AF + CP 0x03 + JR Z,.NewFile1 + CP 0x06 + JP NZ,EError +.NewFile1 + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 192,88,256,60 + W_FILL 4,2,248,10,COLORI.BLACK + W_TEXT 118,3,COLORI.WHITE,"Edit" + W_TEXT 84,18,COLORP.HIGHGRAY,"Can`t find the file:" + W_BUTTON 48,42,72,14 + W_TEXT 64,45,COLORP.HIGHGRAY,"New file" + W_BUTTON 136,42,72,14 + W_TEXT 154,45,COLORP.HIGHGRAY,"Cancel" + W_END + PUSH HL + LD DE,WorkBuffer + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + LD IX,0x00E0 + LD HL,WorkBuffer + LD DE,0x0140 + LD BC,0x0076 + LD A,0x80 + CALL JUMPS.PrnRangPathC +NewFLoop LD IX,NewFileTab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY + JR Z,NewFLoop + LD A,B + OR A + JR NZ,NewFLoop + LD A,E + CP 0x1B + JR Z,NewFExitC + CP 0x0D + JR Z,NewFExitO + RES 5,A + CP 'N' + JR Z,NewFExitO + CP 'C' + JR NZ,NewFLoop +NewFExitC SCF +NewFExitO + WINDOWCLOSE + POP HL + RET C + LD E,L + LD D,H + LD C,0x00 + LD A,0x21 + DEC HL + DEC C +.L1 INC HL + INC C + CP (HL) + JR C,.L1 + LD A,C + OR A + LD A,0x10 + JP Z,EError + LD B,C + LD A,0x5C +.L2 DEC HL + CP (HL) + JR Z,ChangeDIR + DJNZ .L2 + EX DE,HL + JR NewFileE + +ChangeDIR INC HL + PUSH HL + EX DE,HL + LD DE,WorkBuffer + LD C,B + LD B,0x00 + LDIR + SUB A + LD (DE),A + LD HL,WorkBuffer + SPDSS DSSF.CHDIR + POP DE + JP C,EError +NewFileE LD HL,EditingFile+33 + EX DE,HL + LD A,0x20 + LD C,0x00 +NewFE0 CP (HL) + JR NC,NewFE1 + LDI + JR NewFE0 + +NewFE1 SUB A + LD (DE),A + LD A,C + OR A + LD A,0x10 + JP Z,EError + LD IX,EditingFile + SUB A + LD (IX+28),A + LD (IX+29),A + LD (IX+30),A + LD (IX+31),A + LD (IX+32),A + LD HL,0x0000 + LD (FEFileLenght),HL + SPDSS DSSF.GETMEM,3 + PUSH AF + CALL C,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти + POP AF + JP C,FELoadExit + LD (FEMemIndef),A + LD HL,PagesList + SPBIOS BIOSF.GETMEMBLKPAGES + OR A + RET + +EError PUSH AF + CALL JUMPS.DOSError + POP AF + SCF + RET + +;[]==========================================================[] +SaveFile CALL PutString + CALL JUMPS.SetClock + LD IX,ProcessEdit + LD HL,(FEFileLenght) + LD A,H + AND 0xC0 + RLCA + RLCA + LD B,A + LD A,H + AND 0x3F + OR L + JR Z,.L1 + INC B +.L1 LD (IX+PROC.MAXL1),B + SUB A + LD (IX+PROC.MAXH1),A + LD (IX+PROC.MAXL2),A + LD (IX+PROC.MAXH2),A + CALL JUMPS.InitProcess + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 160,88,320,48 + W_FILL 4,2,312,10,COLORI.BLACK + W_TEXT 112,3,COLORI.WHITE,"FN File Editor v\{FLEX_VERS.EDITOR}" + W_TEXT 8,16,COLORP.HIGHGRAY,"Saving:" + W_BORDER 16,28,288,12 + W_FILL 18,29,284,10,COLORI.WHITE + W_END + PUSH IY + SPDSS DSSF.CURDISK + POP IY + LD HL,WorkBuffer + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + PUSH IY + PUSH HL + SPDSS DSSF.CURDIR + POP HL + POP IY + SUB A +.L2 INC HL + CP (HL) + JR NZ,.L2 + DEC HL + LD A,0x5C + CP (HL) + INC HL + JR Z,.L3 + LD (HL),A + INC HL +.L3 EX DE,HL + LD HL,EditingFile+33 + SUB A +.L4 LDI + CP (HL) + JR NZ,.L4 + LD (DE),A + LD IX,0x0100 + LD HL,WorkBuffer + LD DE,0x00D0 + LD BC,0x0068 + LD A,0x80 + CALL JUMPS.PrnRangPathL + LD HL,EditingFile+33 + LD A,(EditingFile+32) + PUSH IY + SPDSS DSSF.CREATE + POP IY + PUSH AF + CALL C,JUMPS.DOSError + POP AF + JP C,SaveExit1 + LD (FEFHandle),A + LD HL,(FEFileLenght) + LD (SaveLen),HL + SETPORT WINSP.Y_PORT,0xC0 + GETPORT WINSP.CPU1 + PUSH AF + LD HL,PagesList + LD A,(HL) +SaveLp1 INC HL + PUSH HL + SETPORT WINSP.CPU1,,0 + LD HL,(SaveLen) + LD BC,0x4000 + OR A + SBC HL,BC + JR C,SaveEnd + LD (SaveLen),HL + LD HL,0x4000 + LD DE,0x4000 + LD A,(FEFHandle) + PUSH IY + SPDSS DSSF.WRITE + POP IY + JP C,SaveAbort + CALL FENextProcess + POP HL + LD A,(HL) + CP 0xFF + JR NZ,SaveLp1 + POP AF + SETPORT WINSP.CPU1,,0 + JP SaveExit + +SaveEnd LD HL,0x4000 + LD DE,(SaveLen) + LD A,D + OR E + JR Z,SaveEn1 + LD A,(FEFHandle) + PUSH IY + SPDSS DSSF.WRITE + POP IY + JP C,SaveAbort + CALL FENextProcess +SaveEn1 POP HL + POP AF + SETPORT WINSP.CPU1,,0 +SaveExit SUB A + LD (IY+ReadyFile),A + CALL PrnEDITinfo + LD A,(FEFHandle) + PUSH IY + SPDSS DSSF.CLOSE + POP IY +SaveExit1 HALT + HALT + WINDOWCLOSE + CALL JUMPS.SetMouse + RET + +SaveAbort POP HL + POP AF + SETPORT WINSP.CPU1,,0 + JR SaveExit1 + +;[]----------------------------------------------------------[] +FENextProcess LD IX,ProcessEdit + LD L,(IX+PROC.CURL1) + LD H,(IX+PROC.CURH1) + INC HL + LD (IX+PROC.CURL1),L + LD (IX+PROC.CURH1),H + LD A,H + OR L + JR NZ,.NextPr1 + LD L,(IX+PROC.CURL2) + LD H,(IX+PROC.CURH2) + INC HL + LD (IX+PROC.CURL2),L + LD (IX+PROC.CURH2),H +.NextPr1 CALL JUMPS.PrnProcess + RET + +ProcessEdit DEFW 0x00B2 + DEFW 0x0075 + DEFW 0x011C + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFB 0x4F + +;FECorrBigChar CP 0x41 +; RET C +; CP 0x5B +; JR NC,.CorrCh1 +; SET 5,A +; RET + +;.CorrCh1 CP 0x80 +; RET C +; CP 0xA0 +; RET NC +; SET 5,A +; CP 0x90 +; RET C +; SET 6,A +; RES 4,A +; RET diff --git a/plugins/fneditor/fehex.a80 b/plugins/fneditor/fehex.a80 new file mode 100644 index 0000000..9614b07 --- /dev/null +++ b/plugins/fneditor/fehex.a80 @@ -0,0 +1,1228 @@ + +; LAST UPDATE: 20.03.2025 savelij + +;[]==========================================================[] +;Процедура печати страницы дампа с тек.смещ. от начала файла +;На вход: +; None +;На выход: +; None +FEPrnHEXpage LD HL,PrnHEXinfo + PUSH HL + LD HL,(FEPageShift) + LD (FETempShift),HL ;Запоминаем тек.смещение + LD HL,LineBuffer + LD BC,0x4E20 +.L1 LD (HL),C + INC L + DJNZ .L1 + LD B,0x1C ;Изнач.позиция печати +FEPrnHEXl PUSH BC + CALL FEPutHLine ;Выводим строку в буфер и на экран + POP BC + JR C,FEFillDwnHex ;CY-Закончились байты для печати + LD HL,(FETempShift) + LD DE,0x0010 ;Адрес дампа+16 + ADD HL,DE + LD (FETempShift),HL + LD A,B + ADD A,0x08 + LD B,A + CP 0xE4 + JR NZ,FEPrnHEXl +PrHEXCr LD HL,CursorTab1 + LD A,(HEXmode) + OR A + JR Z,.L1 + LD HL,CursorTab2 +.L1 LD A,(IY+CursorX) + ADD A,L + LD L,A + LD A,H + ADC A,0x00 + LD H,A + LD E,(HL) + LD D,(IY+CursorY) + CALL FESetCursor + RET + +;Процедура отчистки нижней области экрана +FEFillDwnHex LD A,B + CP 0xE4 + JR Z,PrHEXCr ;Z-нет отчистки + LD (FEFPosHex),A + LD A,0xE4 + SUB B + LD (FEFLenHex),A + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 0,0,624,0,COLORI.PANEL +FEFPosHex EQU $ - 7 +FEFLenHex EQU $ - 3 + W_END + JR PrHEXCr + +;Процедура печати тек.строки в буфер и на экран +FEPutHLine LD IXL,0x00 + LD IXH,B + LD HL,(FEFileLenght) + LD BC,(FETempShift) + OR A + SBC HL,BC + RET C + LD B,0x10 + LD A,H + OR A + JR NZ,.PutHLn + LD A,L + CP B + JR NC,.PutHLn + LD B,L +.PutHLn + GETPORT WINSP.CPU1 + PUSH AF + LD DE,(FETempShift) + LD A,D ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + EXX + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX + RES 7,D ;Вкл.с 0x4000 + SET 6,D + LD HL,LineBuffer+1 ;буфер строки + EXX + LD HL,LineBuffer+0x3D ;место для ASCII кодов + EXX + LD (HL),'0' + INC L + LD A,(FETempShift+1) + CALL FEPutHexNumb + LD A,(FETempShift) + CALL FEPutHexNumb + LD (HL),':' + INC L + INC L + INC L + LD A,B + OR A + JR Z,PutHLp2 +FEPutHLoop BIT 7,D + JR Z,PutHLp1 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PutHLp1 LD A,(DE) + INC DE + EXX + LD (HL),A + INC L + EXX + CALL FEPutHexNumb ;Процедура конверта + INC L + INC IXL ;Увелич.кол-во введенных байтов + LD A,IXL + AND 0x03 + JR NZ,.L1 + INC L +.L1 DJNZ FEPutHLoop +PutHLp2 POP AF + SETPORT WINSP.CPU1,,0 +;Процедура отчистки закончившихся байтов +FEFillHex LD A,0x10 ;Макс.байтов + SUB IXL ;Тек.кол-во байтов + JR Z,.FillE2 + LD B,A + LD C,0x20 +.FillE1 LD (HL),C + INC L + LD (HL),C + INC L + INC L + EXX + LD (HL),0x20 + INC L + EXX + INC IXL + LD A,IXL ;В центре 2 пробела + AND 0x03 + JR NZ,.L1 + INC L +.L1 DJNZ .FillE1 +.FillE2 LD HL,LineBuffer + LD DE,0x0000 + LD B,0x4E + LD C,IXH + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + OR A + RET ;CY-была последняя строка + +;Процедура преобразования 8битовых чисел в шестнадц. текст +;На вход: +; HL - адрес буфера +; А - байт +;На выход: +; буфер с текст.числом +FEPutHexNumb PUSH AF + RRCA + RRCA + RRCA + RRCA + AND 0x0F + ADD A,0x90 + DAA + ADC A,0x40 + DAA + LD (HL),A + INC L + POP AF + AND 0x0F + ADD A,0x90 + DAA + ADC A,0x40 + DAA + LD (HL),A + INC L + RET + +CursorTab1 DEFB 9,10,12,13,15,16,18,19 + DEFB 22,23,25,26,28,29,31,32 + DEFB 35,36,38,39,41,42,44,45 + DEFB 48,49,51,52,54,55,57,58 + +CursorTab2 DEFB 61,61,62,62,63,63,64,64 + DEFB 65,65,66,66,67,67,68,68 + DEFB 69,69,70,70,71,71,72,72 + DEFB 73,73,74,74,75,75,76,76 + +;[]==========================================================[] +PrnHEXinfo LD HL,LineH + LD DE,ColH + LD BC,FreeH + LD A,0x01 + REPT 0x04 + LD (HL),A + INC HL + LD (DE),A + INC DE + LD (BC),A + INC BC + ENDM + LD (HL),A + LD (DE),A + LD (BC),A + LD HL,(CurLine) + LD DE,LineH + INC HL + CALL JUMPS.ConvNumTxt16 + LD DE,ColH + LD A,(IY+CursorX) + SRL A + INC A + CALL JUMPS.ConvNumTxt8 + LD HL,0xC000 + LD DE,FreeH + LD BC,(FEFileLenght) + OR A + SBC HL,BC + CALL JUMPS.ConvNumTxt16 + LD HL,ReadyNo + LD A,(IY+ReadyFile) + OR A + JR Z,.L1 + LD HL,ReadyYes +.L1 LD DE,0x017E + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnIFF + LD HL,LineH + LD DE,0x01AE + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnIFF + LD HL,ColH + LD DE,0x01F8 + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnIFF + LD HL,FreeH + LD DE,0x0248 + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnIFF + LD IX,EditVBar + LD HL,(ELines) + LD DE,(EquipLines) + OR A + SBC HL,DE + JR Z,TstLinH + LD (ELines),DE + CALL JUMPS.InitScrBar + LD HL,(CurLine) + LD (CLine),HL + CALL JUMPS.PrnVScrBar + RET + +TstLinH LD HL,(CLine) + LD DE,(CurLine) + OR A + SBC HL,DE + RET Z + LD (CLine),DE + CALL JUMPS.PrnVScrBar + RET + +LineH DUPL 6,0 +ColH DUPL 6,0 +FreeH DUPL 6,0 + +;[]==========================================================[] +HPutSymbol CP 0x08 + JP Z,HDeleteByte + CP 0x09 + JP Z,ChHEXmode + LD C,A + LD HL,(LineShift) + LD E,(IY+CursorX) + SRL E + LD D,0x00 + ADD HL,DE + LD A,H + CP 0xC0 + RET NC + LD A,(HEXmode) + OR A + JR NZ,HPutSymbA + LD A,C + CP 'a' + JR C,.L1 + RES 5,A +.L1 CP '0' + RET C + CP 'F'+1 + RET NC + SUB '0' + CP 0x0A + JR C,HPutSH1 + SUB 0x07 + CP 0x0A + RET C +HPutSH1 LD C,A + BIT 0,(IY+CursorX) + LD B,0xF0 + JR NZ,HPutSH2 + LD B,0x0F + RLC C + RLC C + RLC C + RLC C +HPutSH2 EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,DE + EX DE,HL + LD A,0x00 + JR Z,.L2 + LD A,0x01 +.L2 EX AF,AF' + GETPORT WINSP.CPU1 + PUSH AF + LD A,H ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + RES 7,H ;Вкл.с 0x4000 + SET 6,H + EX AF,AF' + OR A + JR NZ,.L3 + LD (HL),A +.L3 EX AF,AF' + LD A,(HL) + AND B + OR C + LD (HL),A + POP AF + SETPORT WINSP.CPU1,,0 + JR HPrnSymbol + +HPutSymbA EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,DE + EX DE,HL + LD A,0x00 + JR Z,.L1 + LD A,0x01 +.L1 EX AF,AF' + GETPORT WINSP.CPU1 + PUSH AF + LD A,H ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + RES 7,H ;Вкл.с 0x4000 + SET 6,H + LD (HL),C + POP AF + SETPORT WINSP.CPU1,,0 +HPrnSymbol EX AF,AF' + OR A + JR NZ,HPrnS1 + LD HL,(FEFileLenght) + INC HL + LD (FEFileLenght),HL +HPrnS1 CALL HPrnS2 + LD (IY+ReadyFile),0x01 + CALL HCursorRight + LD HL,(LineShift) + LD E,(IY+CursorX) + SRL E + LD D,0x00 + ADD HL,DE + EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,DE + RET NZ + LD A,(IY+CursorX) + OR A + RET NZ +HPrnS2 CALL FEResCursor + LD HL,(LineShift) + LD (FETempShift),HL + LD A,(IY+CursorY) + ADD A,A + ADD A,A + ADD A,A + ADD A,0x1C + LD B,A + CALL FEPutHLine + CALL PrHEXCr + RET + +;[]----------------------------------------------------------[] +HDeleteByte LD HL,(LineShift) + LD E,(IY+CursorX) + SRL E + LD D,0x00 + ADD HL,DE + EX DE,HL + LD HL,(FEFileLenght) + OR A + PUSH HL + SBC HL,DE + POP HL + JP NZ,HCursorLeft + LD A,H + OR L + RET Z + DEC HL + LD (FEFileLenght),HL + LD A,E + AND 0x0F + JR NZ,HDelS1 + LD HL,EmptyAddr + LD DE,0x0008 + LD A,(IY+CursorY) + ADD A,A + ADD A,A + ADD A,A + ADD A,0x1C + LD C,A + LD B,0x06 + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC +HDelS1 LD (IY+ReadyFile),0x01 + RES 0,(IY+CursorX) + LD A,0x01 + CALL HCursorLeft+3 + CALL FEResCursor + LD HL,(LineShift) + LD (FETempShift),HL + LD A,(IY+CursorY) + ADD A,A + ADD A,A + ADD A,A + ADD A,0x1C + LD B,A + CALL FEPutHLine + CALL PrHEXCr + RET + +EmptyAddr DEFB " " + +;[]----------------------------------------------------------[] +ChHEXmode CALL FEResCursor + RES 0,(IY+CursorX) + LD A,(HEXmode) + XOR 0x01 + LD (HEXmode),A + CALL PrHEXCr + RET + +;[]----------------------------------------------------------[] +;Курсор влево на одно место +HCursorLeft LD A,(HEXmode) + LD C,A + LD A,(IY+CursorX) + DEC A + AND 0x1F + CP 0x1F + JR NZ,HCurLf1 + LD B,A + LD HL,(LineShift) + LD A,H + OR L + RET Z + LD A,B + SUB C + LD (IY+CursorX),A + JP HCursorUp + +HCurLf1 SUB C + LD (IY+CursorX),A + CALL FEResCursor + CALL PrHEXCr + CALL PrnHEXinfo + RET + +;[]----------------------------------------------------------[] +;Курсор вправо на одно место +HCursorRight LD HL,(LineShift) + LD DE,(FEFileLenght) + LD C,(IY+CursorX) + SRL C + LD B,0x00 + ADD HL,BC + SBC HL,DE + RET Z + LD A,(HEXmode) + LD C,A + LD A,(IY+CursorX) + INC A + ADD A,C + AND 0x1F + JR NZ,HCurRg1 + LD B,A + LD HL,(LineShift) + LD DE,0x0010 + ADD HL,DE + EX DE,HL + LD HL,(FEFileLenght) + SBC HL,DE + RET C + LD A,B + LD (IY+CursorX),A + JP HCursorDown + +HCurRg1 LD (IY+CursorX),A + CALL FEResCursor + CALL PrHEXCr + CALL PrnHEXinfo + RET + +;[]----------------------------------------------------------[] +HHomeString LD A,(IY+CursorX) + CP 0x02 + RET C + LD (IY+CursorX),0x00 + CALL FEResCursor + CALL PrHEXCr + CALL PrnHEXinfo + RET + +;[]----------------------------------------------------------[] +HEndString LD A,(IY+CursorX) + CP 0x1E + RET NC + LD (IY+CursorX),0x1E + CALL FEResCursor + CALL PrHEXCr + CALL PrnHEXinfo + RET + +;[]----------------------------------------------------------[] +HCursorUp LD HL,(LineShift) + LD A,H + OR L + RET Z + LD A,(IY+CursorY) + OR A + JP Z,HScrollUp + LD DE,0x0010 + SBC HL,DE + LD (LineShift),HL + DEC (IY+CursorY) + CALL FEResCursor + CALL PrHEXCr + JP HCursorExit + +HCursorDown LD HL,(FEFileLenght) + LD DE,(LineShift) + LD A,(IY+CursorX) + SRL A + ADD A,0x10 + LD C,A + LD B,0x00 + EX DE,HL + ADD HL,BC + EX DE,HL + SBC HL,DE + JP C,FEHEndFile + LD A,(IY+CursorY) + CP 0x18 + JP Z,HScrollDown + LD A,E + AND 0xF0 + LD E,A + LD (LineShift),DE + INC (IY+CursorY) + CALL FEResCursor + CALL PrHEXCr + JP HCursorExit + +HScrollUp LD HL,(FEPageShift) + LD A,H + OR L + JP Z,HCursorUp + LD DE,0x0010 + SBC HL,DE + LD (FEPageShift),HL + LD (FETempShift),HL + LD HL,(LineShift) + SBC HL,DE + LD (LineShift),HL + CALL FEResCursor + CALL FEScrollSCRdown + LD B,0x1C + CALL FEPutHLine + CALL PrHEXCr + JP HCursorExit + +HScrollDown LD HL,(FEPageShift) + LD DE,0x0190 + ADD HL,DE + EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,DE ;Проверяем на конец файла + JP C,HCursorDown + LD (FETempShift),DE ;Запоминаем тек.смещение + LD HL,(FEPageShift) + LD DE,0x0010 + ADD HL,DE + LD (FEPageShift),HL + LD HL,(LineShift) + ADD HL,DE + LD (LineShift),HL + CALL FEResCursor + CALL FEScrollSCRup + LD B,0xDC + CALL FEPutHLine + CALL PrHEXCr +HCursorExit LD HL,(LineShift) + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD (CurLine),HL + CALL PrnHEXinfo + RET + +;[]----------------------------------------------------------[] +FEHPageUp LD HL,(FEPageShift) + LD A,H + OR L + JP Z,FEHBegFile + LD DE,0x0190 + OR A + SBC HL,DE + JR NC,.L1 + LD HL,0x0000 +.L1 LD (FEPageShift),HL + LD HL,(LineShift) + OR A + SBC HL,DE + JR NC,.L2 + LD HL,0x0000 +.L2 LD (LineShift),HL + JR HPageExit + +;[]----------------------------------------------------------[] +FEHPageDown LD HL,(FEPageShift) + LD BC,0x0190 + ADD HL,BC + EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,DE ;Проверяем на конец файла + JP C,FEHEndFile + LD (FEPageShift),DE + LD HL,(LineShift) + ADD HL,BC + EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,DE ;Проверяем на конец файла + JP C,FEHEndFile + LD (LineShift),DE +HPageExit LD HL,(LineShift) + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD (CurLine),HL + CALL FEPrnHEXpage ;Печатаем страницу + RET + +;[]----------------------------------------------------------[] +;В начало файла +FEHBegFile LD HL,(LineShift) + LD A,(IY+CursorX) + OR H + OR L + RET Z + SUB A + LD (IY+CursorX),A + LD (IY+CursorY),A + LD HL,0x0000 ;Смещение = 0000 + LD (LineShift),HL + LD (FEPageShift),HL + LD (CurLine),HL + CALL FEPrnHEXpage ;Печатаем страницу + RET + +;[]----------------------------------------------------------[] +;В конец файла +FEHEndFile LD HL,(LineShift) + LD E,(IY+CursorX) + SRL E + LD D,0x00 + ADD HL,DE + EX DE,HL + LD HL,(FEFileLenght) + OR A + PUSH HL + SBC HL,DE ;Проверяем на конец файла + POP HL + RET Z + LD HL,(FEPageShift) + LD BC,0x0190 + ADD HL,BC + EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,DE ;Проверяем на конец файла + ADD HL,DE + JR C,.HEnd1 + SBC HL,BC + LD A,L + AND 0xF0 + LD L,A + LD DE,0x0010 + ADD HL,DE + LD (FEPageShift),HL +.HEnd1 LD HL,(FEFileLenght) + LD DE,(FEPageShift) + OR A + SBC HL,DE + PUSH HL + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD (IY+CursorY),L + POP DE + LD A,E + AND 0xF0 + LD E,A + LD HL,(FEPageShift) + ADD HL,DE + LD (LineShift),HL + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD (CurLine),HL + LD A,(FEFileLenght) + AND 0x0F + ADD A,A + LD (IY+CursorX),A + CALL FEPrnHEXpage ;Печатаем страницу + RET + +;[]----------------------------------------------------------[] +HNewHEXPos EX DE,HL + LD BC,0x001C + OR A + SBC HL,BC + LD A,L + AND 0xF8 + LD L,A + SLA L + RL H + PUSH HL + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD A,L + EX AF,AF' + EX DE,HL + LD BC,0x0048 + OR A + SBC HL,BC + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD A,L + LD HL,HNewPosTb + ADD A,A + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD A,(HL) + INC HL + LD L,(HL) + LD H,A + POP DE + OR A + RET M + PUSH HL + LD HL,(FEPageShift) + ADD HL,DE + EX DE,HL + PUSH DE + ADD A,E + LD E,A + JR NC,.L2 + INC D +.L2 LD HL,(FEFileLenght) + OR A + SBC HL,DE + POP DE + POP HL + RET C + LD A,H + ADD A,A + ADD A,L + LD (IY+CursorX),A + EX AF,AF' + LD (IY+CursorY),A + LD (LineShift),DE + SRL D + RR E + SRL D + RR E + SRL D + RR E + SRL D + RR E + LD (CurLine),DE + CALL FEResCursor + SUB A + LD (HEXmode),A + CALL PrHEXCr + CALL PrnHEXinfo + RET + +HNewPosTb DEFB 0,0,0,1,-1,-1 + DEFB 1,0,1,1,-1,-1 + DEFB 2,0,2,1,-1,-1 + DEFB 3,0,3,1,-1,-1,-1,-1 + DEFB 4,0,4,1,-1,-1 + DEFB 5,0,5,1,-1,-1 + DEFB 6,0,6,1,-1,-1 + DEFB 7,0,7,1,-1,-1,-1,-1 + DEFB 8,0,8,1,-1,-1 + DEFB 9,0,9,1,-1,-1 + DEFB 10,0,10,1,-1,-1 + DEFB 11,0,11,1,-1,-1,-1,-1 + DEFB 12,0,12,1,-1,-1 + DEFB 13,0,13,1,-1,-1 + DEFB 14,0,14,1,-1,-1 + DEFB 15,0,15,1,-1,-1,-1,-1 + +HNewASCPos EX DE,HL + LD BC,0x001C + OR A + SBC HL,BC + LD A,L + AND 0xF8 + LD L,A + SLA L + RL H + PUSH HL + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD A,L + EX AF,AF' + EX DE,HL + LD BC,0x01E8 + OR A + SBC HL,BC + SRL H + RR L + SRL H + RR L + SRL H + RR L + POP DE + LD A,L + PUSH HL + LD HL,(FEPageShift) + ADD HL,DE + EX DE,HL + PUSH DE + ADD A,E + LD E,A + JR NC,.L1 + INC D +.L1 LD HL,(FEFileLenght) + OR A + SBC HL,DE + POP DE + POP HL + RET C + LD A,L + ADD A,A + LD (IY+CursorX),A + EX AF,AF' + LD (IY+CursorY),A + LD (LineShift),DE + SRL D + RR E + SRL D + RR E + SRL D + RR E + SRL D + RR E + LD (CurLine),DE + CALL FEResCursor + LD A,0x01 + LD (HEXmode),A + CALL PrHEXCr + CALL PrnHEXinfo + RET + +;[]----------------------------------------------------------[] +;Процедура ввода нового указателя смещения в файле +FEHGoTo LD HL,(FEFileLenght) + LD A,H ;Проверяем,что длина + OR A ;файла больше 16 байт + JR NZ,.HGoToOk + LD A,L + CP 0x11 + RET C ;меньше 16байт +.HGoToOk CALL FEResCursor + LD HL,FENewShift ;Буфер для ввода нового указ. + SUB A + LD (FECursPos),A ;Позиция ввода в буфере + INC A + LD (FEBuffFlg),A + LD (HL),'0' + INC HL + LD A,(FEPageShift+1) + CALL FEPutHexNumb ;Заносим в буфер текущее смещ. + LD A,(FEPageShift) ;в текстовом виде + CALL FEPutHexNumb +;Выводим на экран буфер и +FEHGoToRet CALL FEPrintHGT ;печатаем курсор +FEHGoToLp HALT ;Ожидаем прерывание + CALL FEChangeCurs ;проверям на смену курсора + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + JP NZ,FEHGTescape + SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиши + JR Z,FEHGoToLp ;Z - не нажата + LD A,B + AND 0x3F + JR NZ,FEHGoToLp + LD A,E + OR A + JR Z,FEHGoToSys ;A=0 сист.клавиша + CP 0x0D + JP Z,FEHGTenter ;нажат Enter + CP 0x08 + JR Z,FEHGTdelete ;нажат BackSpace + CP 0x1B + JP Z,FEHGTescape ;нажат Esc + CP 0x20 + JR C,FEHGoToLp ;код<0x20 нам не подходит + LD C,A ;сохр. ASCII код + LD A,0x00 +FEBuffFlg EQU $-1 + OR A + CALL NZ,FEClearBuff + LD A,0x00 ;тек.позиция печати в буфере +FECursPos EQU $-1 + LD B,A ;сохр.тек.поз. + LD HL,FENewShift ;Смещ.от начала буфера + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD (HL),C ;Заносим код в буфер + LD A,B ;тек.поз. + CP 0x04 ;Позиция в буфере (7-последняя) + JR Z,FEHGoToRet ;печатаем строку и курсор + INC A ;след.позиция + LD (FECursPos),A + JR FEHGoToRet ;печатаем строку и курсор + +FEClearBuff LD HL,FENewShift + LD B,0x05 + LD A,0x20 +.L2 LD (HL),A + INC HL + DJNZ .L2 + SUB A + LD (FEBuffFlg),A + RET + +;Забой +FEHGTdelete SUB A + LD (FEBuffFlg),A + LD A,(FECursPos) ;Тек.позиция в буфере + OR A + JR Z,FEHGoToLp ;0 - выходим + DEC A + LD (FECursPos),A ;предид.позиция + LD HL,FENewShift + ADD A,L ;смещ.в буфере + LD L,A + JR NC,.L1 + INC H +.L1 LD (HL),' ' ;Забиваем пробелом + JR FEHGoToRet + +;системная клавиша +FEHGoToSys LD A,D + CP 0x54 ;<- + JR Z,.HGTleft + CP 0x56 ;-> + JR Z,.HGTright + JR FEHGoToLp + +;Курсор влево +.HGTleft SUB A + LD (FEBuffFlg),A + LD A,(FECursPos) ;Тек.позиция в буфере + OR A + JP Z,FEHGoToLp ;0 - выходим + DEC A + LD (FECursPos),A ;Уменьш.поз. + JP FEHGoToRet + +.HGTright SUB A + LD (FEBuffFlg),A + LD A,(FECursPos) ;Тек.позиция в буфере + CP 0x04 + JP Z,FEHGoToLp ;7 - последняя + INC A + LD (FECursPos),A ;Увелич.поз. + JP FEHGoToRet + +;Процедура вывода строки и курсора +FEPrintHGT LD HL,FENewShift + LD DE,0x0008 + LD BC,0x051C + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + LD A,(FECursPos) ;Позиция вывода курсора + INC A + LD L,A + LD H,0x00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,FETCursor + LD (HL),0xAB;'<' + LD BC,0x011C + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + LD A,0x01 ;Номер выведенного курсора + LD (FECurCurs),A + LD A,0x06 ;Ожидание для смены курсора + LD (FECurWait),A + RET + +;Процедура смены курсора +FEChangeCurs LD A,0x00 ;Задержка между сменой курсора +FECurWait EQU $-1 + DEC A + LD (FECurWait),A + RET NZ ;еще не время + LD A,(FECursPos) + INC A + LD L,A + LD H,0x00 ;Тек.знакоместо + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,FENewShift ;Смещ.в буфере + LD A,(FECursPos) + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD A,0x00 ;Номер текущего курсора +FECurCurs EQU $-1 + XOR 0x01 ;Меняем курсор + LD (FECurCurs),A + LD A,(HL) + JR Z,.L2 ;Печатаем + LD A,0xBB;'<' +.L2 LD HL,FETCursor + LD (HL),A + LD BC,0x011C + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + LD A,0x0C ;Ожидание для смены курсора + LD (FECurWait),A + RET + +FETCursor DEFB ' ' + +;Клавиша ENTER +FEHGTenter SUB A ;При ошибке вернемся с курсором + LD (FECursPos),A ;в нулевой позиции + LD BC,FENewShift ;Буфер строки + CALL GetHexNum16 ;Переводим текст в 32бит число + JP C,FEHGoToRet ;CY - синтакс.ошибка + LD C,E + LD B,D + LD A,L ;Адрес кратный 16 + AND 0xF0 + LD L,A + EX DE,HL ;Смещ.в BC+DE + LD HL,(FEFileLenght) ;Проверяем,что смещение в + OR A ;пределах файла + SBC HL,DE + EX DE,HL + JR NC,.HGTent1 ;NZ-в пределах + LD HL,(FEFileLenght) + LD A,L + AND 0xF0 + LD L,A +.HGTent1 LD (FEPageShift),HL + LD (LineShift),HL + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD (CurLine),HL + SUB A + LD (IY+CursorX),A + LD (IY+CursorY),A + CALL FEPrnHEXpage ;Печатаем страницу + RET + +;Нажат Escape +FEHGTescape LD HL,FENewShift ;Буфер строки + PUSH HL + LD (HL),'0' + INC HL + LD A,(FEPageShift+1) ;Заносим тек.смещение + CALL FEPutHexNumb + LD A,(FEPageShift) + CALL FEPutHexNumb + POP HL + LD DE,0x0008 + LD BC,0x051C + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + CALL PrHEXCr + CALL JUMPS.ResFire + RET ;Выходим + +FENewShift DEFB " ",0 + +;Процедура конвертирования 32битового шестн.текстового числа +;На вход: +; BC - Адрес буфера с текстом (0-конец буфера) +;На выход: +; DE+HL - Число 32бит +; CY - синтаксическая ошибка +GetHexNum16 LD HL,0x0000 +FEGetHNlp LD A,(BC) + INC BC + OR A + RET Z + CP ' ' + JR Z,FEGetHNlp + CP 0x61 + JR C,.L1 + SUB 0x20 +.L1 CP 0x30 + RET C + CP 0x47 + CCF + RET C + SUB 0x30 + CP 0x0A + JR C,FEGetHNum + SUB 0x07 + CP 0x0A + RET C +FEGetHNum ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + OR L + LD L,A + JR FEGetHNlp diff --git a/plugins/fneditor/femain.a80 b/plugins/fneditor/femain.a80 new file mode 100644 index 0000000..2412d30 --- /dev/null +++ b/plugins/fneditor/femain.a80 @@ -0,0 +1,24 @@ + +; LAST UPDATE: 20.03.2025 savelij + + include macros.a80 + include fn_const.a80 + include fn_macros.a80 + include fn_version.a80 + include accel_sp.a80 + include ports_sp.a80 + include define_sp.a80 + include macros_sp.a80 + include dss_sp.a80 + include bios_sp.a80 + include mouse_sp.a80 + + org PluginOrg ; #C000 - Header lenght +; Flex Navigator plugin header +PluginStart: db "FLX-PLUG" ; Id + dw 0x0000 ; LoadOffset + dw 0x0000 ; EntryOffset + db 0x00 ; PluginMode + db 0x00,0x00,0x00 ; Reserved + +PluginEntry: include feditor.a80 diff --git a/plugins/fneditor/feprn.a80 b/plugins/fneditor/feprn.a80 new file mode 100644 index 0000000..e38224d --- /dev/null +++ b/plugins/fneditor/feprn.a80 @@ -0,0 +1,340 @@ + +; LAST UPDATE: 20.03.2025 savelij + +;[]==========================================================[] +FEPrintFile CALL FEResCursor + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 168,96,304,50 + W_FILL 4,2,296,10,COLORI.BLACK + W_TEXT 132,3,COLORI.WHITE,"Print file" + W_BORDER 16,16,272,12 + W_FILL 18,17,268,10,COLORI.WHITE + W_BUTTON 116,32,72,14 + W_TEXT 140,35,COLORP.HIGHGRAY,"Stop" + W_END + LD IX,FEPrintTab + CALL JUMPS.TestCoords + LD IX,FEProcessPrn + LD HL,(FEFileLenght) + LD A,L + LD L,H + LD H,0x00 + OR A + JR Z,.InitPrn + INC HL +.InitPrn LD (IX+PROC.MAXL1),L + LD (IX+PROC.MAXH1),H + LD (IX+PROC.MAXL2),0X00 + LD (IX+PROC.MAXH2),0x00 + CALL JUMPS.InitProcess + LD A,(EditMode) + OR A + JP NZ,FEPrintHEX +FEPrintASCII LD HL,0x0000 + LD (FETempShift),HL + LD HL,(FEFileLenght) + GETPORT WINSP.CPU1 + PUSH AF + LD DE,(FETempShift) + LD A,D ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + EXX + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX + RES 7,D ;Вкл.с 0x4000 + SET 6,D +FEPrnASCII BIT 7,D + JR Z,PrnASC + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PrnASC LD A,(DE) + INC DE + CALL FEPrintCHAR + JR C,FEPrnASCIIext + CALL FENxtPrnProc + DEC HL + LD A,H + OR L + JR NZ,FEPrnASCII + CALL FEEndJob + jr c,FEPrnASCIIext + LD DE,0x0000 + CALL FENxtPrnProc + HALT + HALT +FEPrnASCIIext POP AF + SETPORT WINSP.CPU1,,0 + WINDOWCLOSE + RET + +FEPrintHEX LD HL,0x0000 + LD (FETempShift),HL + LD HL,LineBuffer + LD BC,0x4E20 +.L1 LD (HL),C + INC L + DJNZ .L1 +FEPrintHEXlp CALL FEPrnHEXline + JR C,FEPrintHEXext + LD HL,(FETempShift) + LD DE,0x0010 ;Адрес дампа+16 + ADD HL,DE + LD (FETempShift),HL + JR FEPrintHEXlp + +FEPrintHEXext CALL FEEndJob + OR A + JR NZ,.PrnHEXe + LD DE,0x0000 + CALL FENxtPrnProc + HALT + HALT +.PrnHEXe + WINDOWCLOSE + RET + +FEPrnHEXline LD IXL,0x00 + LD IXH,B + LD HL,(FEFileLenght) + LD BC,(FETempShift) + OR A + SBC HL,BC + LD A,0x00 + RET C + LD B,0x10 + LD A,H + OR A + JR NZ,.PrnHLn + LD A,L + CP B + JR NC,.PrnHLn + LD B,L +.PrnHLn + GETPORT WINSP.CPU1 + PUSH AF + LD DE,(FETempShift) + LD A,D ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + EXX + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX + RES 7,D ;Вкл.с 0x4000 + SET 6,D + LD HL,LineBuffer+1 ;буфер строки + EXX + LD HL,LineBuffer+0x3D ;место для ASCII кодов + EXX + LD (HL),'0' + INC L + LD A,(FETempShift+1) + CALL FEPutHexNumb + LD A,(FETempShift) + CALL FEPutHexNumb + LD (HL),':' + INC L + INC L + INC L + LD A,B + OR A + JR Z,PrnHLp2 +FEPrnHLoop BIT 7,D + JR Z,PrnHLp1 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PrnHLp1 LD A,(DE) + INC DE + EXX + CP 0x20 + JR NC,.L1 + LD A,'.' +.L1 LD (HL),A + INC L + EXX + CALL FEPutHexNumb ;Процедура конверта + INC L + INC IXL ;Увелич.кол-во введенных байтов + LD A,IXL + AND 0x03 + JR NZ,.L2 + INC L +.L2 DJNZ FEPrnHLoop +PrnHLp2 POP AF + SETPORT WINSP.CPU1,,0 +;Процедура отчистки закончившихся байтов +FillHeP LD A,0x10 ;Макс.байтов + SUB IXL ;Тек.кол-во байтов + JR Z,FEFillP2 + LD B,A + LD C,0x20 +FEFillP1 LD (HL),C + INC L + LD (HL),C + INC L + INC L + EXX + LD (HL),0x20 + INC L + EXX + INC IXL + LD A,IXL ;В центре 2 пробела + AND 0x03 + JR NZ,.L1 + INC L +.L1 DJNZ FEFillP1 +FEFillP2 LD HL,LineBuffer + LD B,0x4E +FEPrnHEX LD A,(HL) + INC HL + CALL FEPrintCHAR + LD A,0x01 + RET C + DJNZ FEPrnHEX + LD A,0x0D + CALL FEPrintCHAR + RET C + LD A,0x0A + CALL FEPrintCHAR + RET + +FEPrintCHAR LD IXL,A + PUSH IX + PUSH HL + PUSH DE + PUSH BC + EXX + PUSH DE + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + JR Z,.PrnCH1 + LD IX,FEPrintTab + CALL JUMPS.TestCoords + JR C,.PrnCH2 +.PrnCH1 + SPDSS DSSF.SCANKEY + LD A,E +.PrnCH2 POP DE + EXX + POP BC + POP DE + POP HL + POP IX + RET C + JR Z,FEPrnCHAR + CP 0x1B + SCF + RET Z + RES 5,A + CP 'S' + JR NZ,FEPrnCHAR +FEStopPrint SCF + RET + +FEPrnCHAR PUSH HL + PUSH DE + PUSH BC + EXX + PUSH DE + LD A,IXL + SPDSS DSSF.PRINT + POP DE + LD A,B + EXX + POP BC + POP DE + POP HL + RET NC + HALT + JR FEPrintCHAR + +FEPrintTab DEFW 0x011C,0x0164,0x0080,0x008E,0x01,0x0000,FEStopPrint,0x0000 + DEFW 0x8000 + +FENxtPrnProc LD A,E + OR A + RET NZ + PUSH HL + PUSH DE + PUSH BC + EXX + PUSH DE + LD IX,FEProcessPrn + LD L,(IX+PROC.CURL1) + LD H,(IX+PROC.CURH1) + INC HL + LD (IX+PROC.CURL1),L + LD (IX+PROC.CURH1),H + LD A,H + OR L + JR NZ,.NxtProc + LD L,(IX+PROC.CURL2) + LD H,(IX+PROC.CURH2) + INC HL + LD (IX+PROC.CURL2),L + LD (IX+PROC.CURH2),H +.NxtProc CALL JUMPS.PrnProcess + POP DE + EXX + POP BC + POP DE + POP HL + RET + +FEEndJob: PUSH AF + PUSH HL + PUSH BC + EXX + PUSH DE + ld a,0x0C + CALL FEPrintCHAR + jr c,.print_cancel + ld a,0x1B + CALL FEPrintCHAR + jr c,.print_cancel + ld a,0x40 + CALL FEPrintCHAR + jr c,.print_cancel + POP DE + EXX + POP BC + POP HL + POP AF + ret + +.print_cancel: POP DE + EXX + POP BC + POP HL + POP AF + SCF + RET + +FEProcessPrn DEFW 0x00BA + DEFW 0x0071 + DEFW 0x010C + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFB 0x4F diff --git a/plugins/fneditor/fesetup.a80 b/plugins/fneditor/fesetup.a80 new file mode 100644 index 0000000..7096e45 --- /dev/null +++ b/plugins/fneditor/fesetup.a80 @@ -0,0 +1,314 @@ + +; LAST UPDATE: 24.03.2025 savelij + +FECSign: DB "FEC" +HomeKeyFlag: DB 0 +IndentFlag: DB 0 +BracketsFlag: DB 0 +ExitDlgFlag: DB 0 + +;[]==========================================================[] +ReadEditorIni: ld a,0 +.iniReaded EQU $-1 + and a + ret nz + inc a + ld (.iniReaded),a + PUSH IY + SPDSS DSSF.CURDISK + POP IY + LD HL,WorkBuffer + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + PUSH IY + SPDSS DSSF.CURDIR + POP IY + GETPORT WINSP.CPU1 + PUSH AF + LD A,(JUMPS.FNFUNCT) + SETPORT WINSP.CPU1,,0 + LD HL,ADDR.FlexDIRECTORY + PUSH IY + SPDSS DSSF.CHDIR + POP IY + EX AF,AF' + POP AF + SETPORT WINSP.CPU1,,0 + EX AF,AF' + JP C,.exit + LD HL,SettingsFileName + PUSH IY + SPDSS DSSF.OPEN,,1 + pop iy + jr c,.exit + ld (.file),a + ld hl,LineBuffer + push hl + ld de,LineBuffer+1 + ld (hl),0 + ld bc,7 + ldir + pop hl + ld de,7 + PUSH IY + SPDSS DSSF.READ + pop iy + jr c,.close + ld hl,(LineBuffer) + ld de,'EF' + and a + sbc hl,de + jr nz,.close + ld hl,LineBuffer+2 + ld a,(hl) + cp 'C' + jr nz,.close + inc hl + ld a,(hl) + ld (THomeString.param),a + inc hl + ld a,(hl) + ld (CalcStartTabs.param),a + inc hl + ld a,(hl) + ld (AutoBrackets),a + inc hl + ld a,(hl) + ld (QuitAsk.param),a +.close: ld a,0 +.file EQU $-1 + PUSH IY + SPDSS DSSF.CLOSE + pop IY +.exit: LD HL,WorkBuffer + PUSH IY + SPDSS DSSF.CHDIR + POP IY + ret + +;[]==========================================================[] +EditorSetup: CALL PutString + CALL FEResCursor + LD A,(QuitAsk.param) + ld (ExitDlgFlag),a + CALL ParamToSymbol + LD (ExitDlgFlg),A + LD A,(THomeString.param) + ld (HomeKeyFlag),a + CALL ParamToSymbol + LD (HomeKeyFlg),A + LD A,(CalcStartTabs.param) + ld (IndentFlag),a + CALL ParamToSymbol + LD (IndentFlg),A + LD A,(AutoBrackets) + ld (BracketsFlag),a + CALL ParamToSymbol + LD (BracketsFlg),A + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 200,80,240,110 + W_FILL 4,2,232,10,COLORI.BLACK + W_TEXT 84,3,COLORI.WHITE,"Editor settings" + W_BORDER 16,19,20,11 + W_FILL 18,20,16,9,COLORI.WHITE + W_TEXT 20,21,COLORP.WHITE,"\xFF" +ExitDlgFlg: EQU $ - 2 + W_TEXT 40,22,COLORP.HIGHGRAY,"Confirmation of closing the editor" + W_BORDER 16,35,20,11 + W_FILL 18,36,16,9,COLORI.WHITE + W_TEXT 20,37,COLORP.WHITE,"\xFF" +HomeKeyFlg: EQU $-2 + W_TEXT 40,38,COLORP.HIGHGRAY,"find first symbol on Home key" + W_BORDER 16,51,20,11 + W_FILL 18,52,16,9,COLORI.WHITE + W_TEXT 20,53,COLORP.WHITE,"\xFF" +IndentFlg: EQU $-2 + W_TEXT 40,54,COLORP.HIGHGRAY,"auto Indent" + W_BORDER 16,67,20,11 + W_FILL 18,68,16,9,COLORI.WHITE + W_TEXT 20,69,COLORP.WHITE,"\xFF" +BracketsFlg: EQU $-2 + W_TEXT 40,70,COLORP.HIGHGRAY,"auto Brackets" + W_HORIZLINE 4,84,232 + W_BUTTON 77,90,72,14 + W_TEXT 96,93,COLORP.HIGHGRAY,"Cancel" + W_BUTTON 160,90,64,14 + W_TEXT 188,93,COLORP.HIGHGRAY,"Ok" + W_END + +FESetupLoop: LD IX,FESetupTab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY + JR Z,FESetupLoop + LD A,E + RES 5,A + CP 0x1B + JP Z,FESetupCancel + CP 0x0D + JP Z,FESetupOkey + CP 'O' + JP Z,FESetupOkey + ld hl,FESetupLoop + push hl + CP 'B' + JP Z,SetupAutoBracketsInvert + CP 'C' + JP Z,SetupConfirmDlgInvert + CP 'H' + JP Z,SetupHomeKeyInvert + CP 'I' + JP Z,SetupAutoIndentInvert + ret + +;A - parameter +;Out - A = A == 0 ? " " : "v" +ParamToSymbol: OR A + LD A,0xFE + RET Z + INC A + RET + +CheckTxt: DEFB 0x00,0x00 + +SetupConfirmDlgInvert: + LD HL,CheckTxt + LD A,(ExitDlgFlag) + XOR 0x01 + LD (ExitDlgFlag),A + call ParamToSymbol + LD (HL),A + LD DE,0x00DC + LD BC,0x0065 + LD A,0xF0 + CALL JUMPS.PrnTxtLnIFF + JP JUMPS.ResFire + +SetupHomeKeyInvert: + LD HL,CheckTxt + LD A,(HomeKeyFlag) + XOR 0x01 + LD (HomeKeyFlag),A + call ParamToSymbol + LD (HL),A + LD DE,0x00DC + LD BC,0x0075 + LD A,0xF0 + CALL JUMPS.PrnTxtLnIFF + JP JUMPS.ResFire + +SetupAutoIndentInvert: + LD HL,CheckTxt + LD A,(IndentFlag) + XOR 0x01 + LD (IndentFlag),A + call ParamToSymbol + LD (HL),A + LD DE,0x00DC + LD BC,0x0085 + LD A,0xF0 + CALL JUMPS.PrnTxtLnIFF + JP JUMPS.ResFire + +SetupAutoBracketsInvert: + LD HL,CheckTxt + LD A,(BracketsFlag) + XOR 0x01 + LD (BracketsFlag),A + call ParamToSymbol + LD (HL),A + LD DE,0x00DC + LD BC,0x0095 + LD A,0xF0 + CALL JUMPS.PrnTxtLnIFF + JP JUMPS.ResFire + +FESetupOkey: ld a,(ExitDlgFlag) + LD (QuitAsk.param),a + LD A,(HomeKeyFlag) + LD (THomeString.param),A + ld A,(IndentFlag) + LD (CalcStartTabs.param),A + ld a,(BracketsFlag) + LD (AutoBrackets),a + PUSH IY + SPDSS DSSF.CURDISK ;Write ini-file + LD HL,WorkBuffer + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + SPDSS DSSF.CURDIR + GETPORT WINSP.CPU1 + PUSH AF + LD A,(JUMPS.FNFUNCT) + SETPORT WINSP.CPU1,,0 + LD HL,ADDR.FlexDIRECTORY + SPDSS DSSF.CHDIR + EX AF,AF' + POP AF + SETPORT WINSP.CPU1,,0 + EX AF,AF' + JP C,.exit + LD HL,SettingsFileName + SPDSS DSSF.CREATE,,0x20 + jr c,.exit + ld (.file),a + jr c,.close + ld hl,FECSign + ld de,7 + SPDSS DSSF.WRITE +.close: ld a,0 +.file EQU $-1 + SPDSS DSSF.CLOSE +.exit: LD HL,WorkBuffer + SPDSS DSSF.CHDIR + POP IY +FESetupCancel: + WINDOWCLOSE + RET + +;[]==========================================================[] +;Формат таблицы +; +00 2 Xmin +; +02 2 Xmax +; +04 2 Ymin +; +06 2 Ymax +; +08 2 0 - простой об'ект +; бит 0 - кнопка +; бит 1 - рабочая кнопка +; бит 2 - инверт 1 +; бит 3 - статичный инверт +; бит 4 - программа запускается без адреса возвр. +; и без огня +; бит 5 - программа запускается без адреса возвр. +; по левой кнопке огня +; бит 6 - программа запускается без адреса возвр. +; по правой кнопке огня +; бит 7 - вызвать функцию закрытия окна перед +; запуском программы без огня +; бит 8 - вызвать функцию закрытия окна перед +; запуском программы по левой кнопке +; бит 9 - вызвать функцию закрытия окна перед +; запуском программы по правой кнопке +; бит15 - это переключатель (инверт при огне не +; убирать) +; +0A 2 Адрес обработчика при не нажатом огне +; +0C 2 Адрес обработчика при нажатом огне (лев) +; +0E 2 Адрес обработчика при нажатом огне (прав) + +;[]==========================================================[] +FESetupTab: DEFW 0x0114,0x015C,0x00AA,0x00B8,0x0021,0x0000,FESetupCancel,0x0000 + DEFW 0x0168,0x01A8,0x00AA,0x00B8,0x0021,0x0000,FESetupOkey,0x0000 + DEFW 0x00D8,0x0192,0x0063,0x006D,0x0000,0x0000,SetupConfirmDlgInvert,0x0000 + DEFW 0x00D8,0x0186,0x0073,0x007D,0x0000,0x0000,SetupHomeKeyInvert,0x0000 + DEFW 0x00D8,0x0129,0x0083,0x008D,0x0000,0x0000,SetupAutoIndentInvert,0x0000 + DEFW 0x00D8,0x0132,0x0093,0x009D,0x0000,0x0000,SetupAutoBracketsInvert,0x0000 + DEFW 0x0000,0x00C8,0x0000,0x0100,0x0020,0x0000,FESetupCancel,0x0000 + DEFW 0x01B8,0x0280,0x0000,0x0100,0x0020,0x0000,FESetupCancel,0x0000 + DEFW 0x0000,0x0280,0x0000,0x0050,0x0020,0x0000,FESetupCancel,0x0000 + DEFW 0x0000,0x0280,0x00BC,0x0100,0x0020,0x0000,FESetupCancel,0x0000 + DEFW 0x8000 diff --git a/plugins/fneditor/fetext.a80 b/plugins/fneditor/fetext.a80 new file mode 100644 index 0000000..4d30f77 --- /dev/null +++ b/plugins/fneditor/fetext.a80 @@ -0,0 +1,1946 @@ + +; LAST UPDATE: 20.03.2025 savelij + +;[]==========================================================[] +FEPrnASCIIpage LD HL,PrnASCIIinfo + PUSH HL + LD HL,(FEPageShift) + LD (FETempShift),HL + LD B,0x1C +FEPrnASCIIlp PUSH BC + CALL PrnASCIIline ;Выводим строку в буф и на экран + POP BC + JR C,FillASCII ;CY-Закончились байты для печати + LD A,B + ADD A,0x08 + LD B,A + CP 0xE4 + JR NZ,FEPrnASCIIlp + SUB A + LD (FEEmptyLines),A + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + CALL GetString + RET + +;Процедура отчистки нижней области экрана +FillASCII LD A,0xE4 + SUB B + LD (FEFLenASC),A + JR Z,FEFASCIIe ;Z-нет отчистки + LD A,B + LD (FEFPosASC),A + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 0,0,624,0,COLORI.PANEL +FEFPosASC EQU $ - 7 +FEFLenASC EQU $ - 3 + W_END + +FEFASCIIe LD A,(FEFLenASC) + SRL A + SRL A + SRL A + LD (FEEmptyLines),A + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + CALL GetString + RET + +;[]----------------------------------------------------------[] +RefrASCIIpage LD HL,PrnASCIIinfo + PUSH HL + CALL FEResCursor + LD HL,(FEPageShift) + LD (FETempShift),HL + LD B,0x1C + LD C,(IY+CursorY) +.RefrASCIIlp PUSH BC + LD A,C + OR A + JR NZ,.RfASCII + CALL PrnASCIIstring + LD HL,(FETempShift) + CALL FESearchDown + LD (FETempShift),HL + JR .L1 + +.RfASCII CALL PrnASCIIline ;Выводим строку в буф и на экран +.L1 POP BC + RET C ;CY-Закончились байты для печати + DEC C + LD A,B + ADD A,0x08 + LD B,A + CP 0xE4 + JR NZ,.RefrASCIIlp + RET + +;[]----------------------------------------------------------[] +;Процедура печати тек.строки в буфер и на экран +PrnASCIIline LD IXH,B + LD C,0xF0 + LD HL,(FEFileLenght) + LD DE,(FETempShift) + OR A + SBC HL,DE + RET C + LD B,0xF0 + LD A,H + OR A + JR NZ,PutASCIIln + OR L + SCF + RET Z + LD B,L +PutASCIIln LD HL,TempBuffer + GETPORT WINSP.CPU1 + PUSH AF + LD DE,(FETempShift) + LD A,D ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + EXX + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX + RES 7,D ;Вкл.с 0x4000 + SET 6,D +PutASCIIlnLp BIT 7,D + JR Z,PutLnA1 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PutLnA1 LD A,(DE) + INC DE + CP 0x0D + JR NZ,PutLineA1 + BIT 7,D + JR Z,PutLnA2 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PutLnA2 LD A,(DE) + CP 0x0A + JR NZ,PutLnExitA + INC DE + JR PutLnExitA + +PutLineA1 CP 0x0A + JR Z,PutLnExitA + CP 0x09 + JR NZ,PutLineA2 +PutTabA LD (HL),0x20 + INC L + LD A,L + CP C + JR Z,PutLnEA1 + AND 0x07 + JR NZ,PutTabA + JR PutLineA3-2 + +PutLnEA0 BIT 7,D + JR Z,PutLEA1 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PutLEA1 LD A,(DE) + CP 0x0D + JR Z,PutLineA3 + INC DE + CP 0x0A + JR Z,PutLnExitA +PutLnEA1 DJNZ PutLnEA0 + JR PutLineA3 + +PutLineA2 LD (HL),A + INC L + LD A,L + CP C + JR Z,PutLineA3 + DJNZ PutASCIIlnLp +PutLineA3 BIT 7,D + JR Z,PutLnA3 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PutLnA3 LD A,(DE) + CP 0x0D + JR NZ,PutLnExitA + INC DE + BIT 7,D + JR Z,PutLnA4 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PutLnA4 LD A,(DE) + CP 0x0A + JR NZ,PutLnExitA + INC DE +PutLnExitA RES 6,D + EXX + LD A,E + EXX + BIT 7,D + RES 7,D + JR Z,.L1 + INC A +.L1 RRCA + RRCA + OR D + LD D,A + LD (FETempShift),DE + POP AF + SETPORT WINSP.CPU1,,0 + LD A,(IY+CursAddX) + ADD A,0x4E + SUB L + JR Z,PutLnExA + JR C,PutLnExA + LD B,A + LD A,0x20 +.L2 LD (HL),A + INC L + DJNZ .L2 +PutLnExA LD L,(IY+CursAddX) + LD H,HIGH (TempBuffer) + LD DE,0x0000 + LD B,0x4E + LD C,IXH + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + OR A + RET + +;[]==========================================================[] +PrnASCIIstring LD HL,TempBuffer + LD DE,LineBuffer + LD A,(IY+LenString) + OR A + JR Z,PrASCIIexit + LD B,A + LD C,0xF0 +PrASCIIstr1 LD A,(DE) + INC E + CP 0x09 + JR NZ,PrASCIIstr2 +PutTabS LD (HL),0x20 + INC L + LD A,L + CP C + JR Z,PrASCIIexit + AND 0x07 + JR NZ,PutTabS + JR PrASCIIstr3 + +PrASCIIstr2 LD (HL),A + INC L +PrASCIIstr3 DJNZ PrASCIIstr1 +PrASCIIexit LD A,(IY+CursAddX) + ADD A,0x4E + SUB L + JR Z,PrASCIIex1 + JR C,PrASCIIex1 + LD B,A + LD A,0x20 +.L1 LD (HL),A + INC L + DJNZ .L1 +PrASCIIex1 CALL FEResCursor + LD L,(IY+CursAddX) + LD H,HIGH (TempBuffer) + LD DE,0x0000 + LD B,0x4E + LD A,(IY+CursorY) + ADD A,A + ADD A,A + ADD A,A + ADD A,0x1C + LD C,A + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + RET + +;[]==========================================================[] +FESearchUp LD B,0xF0 + LD A,H + OR A + JR NZ,.SearchUpBeg + OR L + SCF + RET Z + LD B,L +.SearchUpBeg PUSH HL + GETPORT WINSP.CPU1 + PUSH AF + LD A,H ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + LD E,A + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H + LD C,0x00 + LD IXL,C + INC C + DEC B + DEC HL + BIT 6,H + JR NZ,.SrchUp0 + DEC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + SET 6,H +.SrchUp0 LD A,(HL) + CP 0x0A + JR NZ,FESrchUp1+1 + LD A,B + OR A + JR Z,FESrchUpEx + INC C + DEC B + DEC HL + BIT 6,H + JR NZ,FESrchUp1 + DEC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + SET 6,H +FESrchUp1 LD A,(HL) + CP 0x0D + JR Z,FESearchUpLp + DEC C + INC B + INC HL + BIT 7,H + JR Z,FESearchUpLp1 + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H + JR FESearchUpLp1 + +FESearchUpLp LD A,B + OR A + JR Z,FESrchUpEx +FESearchUpLp1 DEC HL + BIT 6,H + JR NZ,.SrchUp2 + DEC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + SET 6,H +.SrchUp2 LD A,(HL) + CP 0x0A + JR Z,FESrchUpEx + CP 0x0D + JR Z,FESrchUpEx + INC IXL + INC C + DJNZ FESearchUpLp1 +FESrchUpEx POP AF + SETPORT WINSP.CPU1,,0 + POP HL + LD B,0x00 + OR A + SBC HL,BC + RET + +;[]----------------------------------------------------------[] +FESearchDown LD B,0xF0 + EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,DE + EX DE,HL + RET C + LD A,D + OR A + JR NZ,.SearchDnBeg + OR E + SCF + RET Z + LD B,E +.SearchDnBeg PUSH HL + GETPORT WINSP.CPU1 + PUSH AF + LD A,H ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + LD E,A + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H + LD C,0x00 + DEC HL +FESearchDnLp INC C + INC HL + BIT 7,H + JR Z,.SrchDn0 + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H +.SrchDn0 LD A,(HL) + CP 0x0D + JR NZ,.SrchE1 + INC HL + BIT 7,H + JR Z,.SrchDn1 + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H +.SrchDn1 LD A,(HL) + CP 0x0A + JR NZ,.SrchEEx + INC C + JR .SrchEEx + +.SrchE1 CP 0x0A + JR Z,.SrchEEx + DJNZ FESearchDnLp + INC HL + BIT 7,H + JR Z,.SrchDnE + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H +.SrchDnE LD A,(HL) + CP 0x0D + JR NZ,.SrchEEx + INC C + INC HL + BIT 7,H + JR Z,.SrchDE1 + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H +.SrchDE1 LD A,(HL) + CP 0x0A + JR NZ,.SrchEEx + INC C +.SrchEEx POP AF + SETPORT WINSP.CPU1,,0 + POP HL + LD B,0x00 + ADD HL,BC + RET + +;[]==========================================================[] +GetString LD HL,(FEFileLenght) + LD DE,(LineShift) + OR A + SBC HL,DE + RET C + LD B,0xF0 + LD C,B + LD A,H + OR A + JR NZ,GetLine + LD B,L +GetLine LD HL,LineBuffer + LD A,B + OR A + JR Z,GetLnE1 + GETPORT WINSP.CPU1 + PUSH AF + LD A,D ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + EXX + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX + RES 7,D ;Вкл.с 0x4000 + SET 6,D +GetLnLoop BIT 7,D + JR Z,GetLn1 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +GetLn1 LD A,(DE) + INC DE + CP 0x0D + JR Z,GetLnExit + CP 0x0A + JR Z,GetLnExit + LD (HL),A + INC L + DJNZ GetLnLoop +GetLnExit POP AF + SETPORT WINSP.CPU1,,0 +GetLnE1 SUB A + LD (IY+ReadyStr),A + LD A,L + LD (IY+LenString),A + LD (IY+PrvLenStr),A + push af + neg + ld b,a + LD A,0x20 +.L1 LD (HL),A + INC L + DJNZ .L1 + pop af + SUB (IY+StringX) + RET NC + LD A,(IY+StringX) + LD (IY+LenString),A + RET + +;[]----------------------------------------------------------[] +PutString LD A,(IY+ReadyStr) + OR A + RET Z + LD A,(IY+LenString) + OR A + JR Z,PutStr2 + LD L,A + LD H,HIGH (LineBuffer) +PutStr1 DEC L + LD A,0x20 + CP (HL) + JR NZ,PutStr2 + DEC (IY+LenString) + LD A,L + OR A + JR NZ,PutStr1 +PutStr2 + SETPORT WINSP.Y_PORT,0xC0 + LD A,(IY+PrvLenStr) + SUB (IY+LenString) + CALL NZ,CorrectFile +PutStrN SUB A + LD (IY+ReadyStr),A + LD HL,LineBuffer + LD A,(IY+LenString) + LD (IY+PrvLenStr),A + OR A + RET Z + LD B,A + GETPORT WINSP.CPU1 + PUSH AF + LD DE,(LineShift) + LD A,D ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + EXX + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX + RES 7,D ;Вкл.с 0x4000 + SET 6,D +PutStringLp BIT 7,D + JR Z,PutStr3 + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX +PutStr3 LD A,(HL) + LD (DE),A + INC DE + INC L + DJNZ PutStringLp + POP AF + SETPORT WINSP.CPU1,,0 + RET + +CorrectFile JR NC,MinusBytes +PlusBytes NEG + LD C,A + LD B,0x00 + LD HL,(FEFileLenght) + LD E,L + LD D,H + ADD HL,BC + LD A,H + CP 0xC0 + JP NC,NoMemSpace + LD (FEFileLenght),HL + EX DE,HL + PUSH HL + LD BC,(LineShift) + OR A + SBC HL,BC + LD C,L + LD B,H + POP HL + DI + EXX + GETPORT WINSP.CPU0 + LD L,A + GETPORT WINSP.CPU1 + LD E,A + GETPORT WINSP.CPU2 + LD C,A + EXX + LD A,(PagesList) + SETPORT WINSP.CPU0,,0 + LD A,(PagesList+1) + SETPORT WINSP.CPU1,,0 + LD A,(PagesList+2) + SETPORT WINSP.CPU2,,0 + LD A,B + OR A + JR Z,.MovUp1 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.MovUp0 DEC H + DEC D + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF + DEC B + JR NZ,.MovUp0 +.MovUp1 LD A,C + OR A + JR Z,MoveUpE + LD (.LenUp),A + SBC HL,BC + EX DE,HL + SBC HL,BC + EX DE,HL + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.LenUp EQU $-1 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF +MoveUpE EXX + LD A,C + SETPORT WINSP.CPU2,,0 + LD A,E + SETPORT WINSP.CPU1,,0 + LD A,L + SETPORT WINSP.CPU0,,0 + EXX + EI + RET + +MinusBytes LD C,A + LD B,0x00 + LD HL,(LineShift) + PUSH HL + ADD HL,BC + PUSH HL + EX DE,HL + LD HL,(FEFileLenght) + OR A + SBC HL,BC + LD (FEFileLenght),HL + LD BC,(LineShift) + OR A + SBC HL,BC + LD C,L + LD B,H + POP HL + POP DE + DI + EXX + GETPORT WINSP.CPU0 + LD L,A + GETPORT WINSP.CPU1 + LD E,A + GETPORT WINSP.CPU2 + LD C,A + EXX + LD A,(PagesList) + SETPORT WINSP.CPU0,,0 + LD A,(PagesList+1) + SETPORT WINSP.CPU1,,0 + LD A,(PagesList+2) + SETPORT WINSP.CPU2,,0 + LD A,B + OR A + JR Z,MovFl1 + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +MovFl0 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF + INC H + INC D + DEC B + JR NZ,MovFl0 +MovFl1 LD A,C + OR A + JR Z,MoveFlE + LD (.LenFl),A + ACCEL ACCELCMD.SET_BUFFER + LD A,0x00 +.LenFl EQU $-1 + ACCEL ACCELCMD.COPY + LD A,(HL) + LD (DE),A + ACCEL ACCELCMD.OFF +MoveFlE EXX + LD A,C + SETPORT WINSP.CPU2,,0 + LD A,E + SETPORT WINSP.CPU1,,0 + LD A,L + SETPORT WINSP.CPU0,,0 + EXX + EI + RET + +NoMemSpace CALL GetString + CALL PrnASCIIstring + CALL PrnASCIIinfo + INC SP + INC SP + RET + +;[]==========================================================[] +PrnASCIIinfo LD HL,LineT + LD DE,ColT + LD BC,FreeT + LD A,0x01 + REPT 0x04 + LD (HL),A + INC HL + LD (DE),A + INC DE + LD (BC),A + INC BC + ENDM + LD (HL),A + LD (DE),A + LD (BC),A + LD HL,(CurLine) + LD DE,LineT + INC HL + CALL JUMPS.ConvNumTxt16 + LD DE,ColT + LD A,(IY+CursorX) + ADD A,(IY+CursAddX) + INC A + CALL JUMPS.ConvNumTxt8 + LD HL,0xC000 + LD DE,FreeT + LD BC,(FEFileLenght) + OR A + SBC HL,BC + CALL JUMPS.ConvNumTxt16 + LD HL,ReadyNo + LD A,(IY+ReadyFile) + OR A + JR Z,.L1 + LD HL,ReadyYes +.L1 LD DE,0x017E + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnIFF + LD HL,LineT + LD DE,0x01AE + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnIFF + LD HL,ColT + LD DE,0x01F8 + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnIFF + LD HL,FreeT + LD DE,0x0248 + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnIFF + LD IX,EditVBar + LD HL,(ELines) + LD DE,(EquipLines) + OR A + SBC HL,DE + JR Z,TstLine + LD (ELines),DE + CALL JUMPS.InitScrBar + LD HL,(CurLine) + LD (CLine),HL + CALL JUMPS.PrnVScrBar + JR TstAddX + +TstLine LD HL,(CLine) + LD DE,(CurLine) + OR A + SBC HL,DE + JR Z,TstAddX + LD (CLine),DE + CALL JUMPS.PrnVScrBar +TstAddX LD A,(CAddX) + SUB (IY+CursorX) + CP (IY+CursAddX) + RET Z + LD A,(IY+CursorX) + ADD A,(IY+CursAddX) + LD (CAddX),A + LD IX,EditHBar + CALL JUMPS.PrnHScrBar + RET + +ReadyNo DEFB 0x01,0 +ReadyYes DEFB "*",0 +LineT DUPL 6,0 +ColT DUPL 6,0 +FreeT DUPL 6,0 + +;[]==========================================================[] +TInsertSymbol CP 0x20 + JR NC,InsSymbol + CP 0x08 + JP Z,BackSpace + CP 0x0D + JP Z,Enter + CP 0x09 + RET NZ +InsSymbol: push af + call Insert + call TCursorRight + pop bc + call AutoBracket + LD A,0x01 + LD (IY+ReadyStr),A + LD (IY+ReadyFile),A + jp PrnASCIIstring + +AutoBracket: ld a,1 +AutoBrackets EQU $-1 + and a + ret z + call CanInsertBrackets + ret c + ld a,b + call Subst + db 4 + db "(){}[]<>" + cp b + jr nz,Insert + cp '\"' ; #22 + ret nz + jp Insert + +CanInsertBrackets: + LD A,(IY+LenString) ;InpytSymb + CP 240 ;Max len + RET Z + LD H,HIGH (LineBuffer) + LD L,(IY+StringX) + ld a,(hl) + and a + ret z + cp 32 + ret z + cp 9 + ret z + scf + ret + +Insert EX AF,AF' + LD A,(IY+LenString) ;InpytSymb + CP 240 ;Max len + RET Z + SUB (IY+StringX) + JR C,.NotInsert + JR Z,.NotInsert +;Ввод в середину текста + LD C,A + LD B,0x00 + LD L,(IY+LenString) + LD H,HIGH (LineBuffer) + LD E,L + LD D,H + DEC HL + LDDR +.NotInsert LD H,HIGH (LineBuffer) + LD L,(IY+StringX) + EX AF,AF' + LD (HL),A + ld a,(IY+LenString) + inc a + cp l + jr nc,.set + ld a,l + inc a +.set: ld (IY+LenString),a + ret + +;[]----------------------------------------------------------[] +;Подстановка a по списку за call. +;первый байт списка содержит число +;следующих далее пар образец-заменитель. +;Вход: a. Выход: a +; BXOД: A,List +; BЫXOД: A +Subst: ex (sp),hl + push bc + ld b,(hl) + inc hl + ld c,a +Subst1: cp (hl) + inc hl + jr nz,Subst2 + ld c,(hl) +Subst2: inc hl + djnz Subst1 + ld a,c + pop bc + ex (sp),hl + ret + +;[]----------------------------------------------------------[] +;DoubleString +TDoubleString: ld l,(iy+LenString) + ld a,l + and a + adc a,a ;будет превышен буфер в 256 символов + ret c + adc a,2 + ret c + ld h,0x00 + push hl + push hl + pop bc + ld de,LineBuffer + add hl,de + ld (hl),0x0D + inc hl + ld (hl),0x0A + inc hl + ex hl,de + ld a,c + or a + jr z,.skip + ldir +.skip: pop hl + add hl,hl + inc hl + inc hl + ld (iy+LenString),l + ld a,0x01 + ld (iy+ReadyStr),a + ld (iy+ReadyFile),a + call PutString + ld hl,(EquipLines) + inc hl + ld (EquipLines),hl + call FEPrnASCIIpage + jp TCursorDown + +;[]----------------------------------------------------------[] +;Enter +Enter LD A,(IY+LenString) + SUB (IY+StringX) + jr nc,.less + xor a +.less: LD C,A + call CalcStartTabs + ld a,l + ld (.tabs),a + push af + inc a + LD L,(IY+LenString) + add a,l + ld e,a + ld d,h + xor a + cp c + jr z,.endLine + LD B,0x00 + LD H,HIGH (LineBuffer) + dec l + LDDR +.endLine: pop af + and a + jr z,.skip + ld c,a + ld b,0x00 + ld h,HIGH (LineBuffer) + ld l,a + dec l + lddr +.skip: ex hl,de + ld (hl),0x0A + dec hl + ld (hl),0x0D + add a,(IY+LenString) + add a,2 + ld (IY+LenString),a + LD A,0x01 + LD (IY+ReadyStr),A + LD (IY+ReadyFile),A + CALL PutString + LD HL,(EquipLines) + INC HL + LD (EquipLines),HL + CALL FEPrnASCIIpage + ld a,0 +.tabs EQU $-1 + LD (IY+StringX),A + and a + call nz,StringXToCursorX + LD (IY+CursorX),a + JP TCursorDown + +StringXToCursorX: + ld b,a + ld c,0x00 + ld hl,LineBuffer +.loop: ld A,(HL) + INC HL + CP 0x09 + JR NZ,.skip + LD A,C + AND 0xF8 + ADD A,0x08 + LD C,A + DEC C +.skip: INC C + DJNZ .loop + ld a,c + ret + +CalcStartTabs: ld hl,LineBuffer + ld a,1 +.param EQU $-1 + and a + ret z + ld b,(iy+StringX) +.loop: ld a,(hl) + cp 0x20 + jr z,.next + cp 0x09 + ret nz +.next: inc l + djnz .loop + ret + +;[]----------------------------------------------------------[] +Undo: xor a + LD (IY+ReadyStr),A + LD (IY+ReadyFile),A + call GetString + CALL PrnASCIIstring + jp PrnASCIIinfo + +;[]----------------------------------------------------------[] +;BackSpace +BackSpace LD A,(IY+StringX) + OR A + RET Z + LD L,A + LD H,HIGH (LineBuffer) + LD E,L + LD D,H + DEC DE + LD A,(IY+LenString) + SUB (IY+StringX) + JR Z,BackSp1 + LD C,A + LD B,0x00 + LDIR + SUB A +BackSp1 LD (DE),A + INC A + LD (IY+ReadyStr),A + LD (IY+ReadyFile),A + DEC (IY+LenString) + CALL PrnASCIIstring + JP TCursorLeft + +;[]----------------------------------------------------------[] +TDeleteString: sub a + ld (IY+LenString),a + ld (IY+StringX),a + ld l,a + ld h,HIGH (LineBuffer) + ld (hl),a + inc a + ld (IY+ReadyStr),A + ld (IY+ReadyFile),A + call PutString + jr AddString + +;[]----------------------------------------------------------[] +TDeleteSymbol LD A,(IY+LenString) + SUB (IY+StringX) + JR Z,AddString + LD C,A + LD B,0x00 + LD L,(IY+StringX) + LD H,HIGH (LineBuffer) + INC HL + LD E,L + LD D,H + DEC DE + LDIR + SUB A + LD (DE),A + INC A + LD (IY+ReadyStr),A + LD (IY+ReadyFile),A + DEC (IY+LenString) + CALL PrnASCIIstring + CALL PrnASCIIinfo + RET + +AddString CALL PutStr2 + LD A,(IY+StringX) + CP 0xF0 + RET Z + LD HL,(LineShift) + CALL FESearchDown + LD DE,(FEFileLenght) + OR A + SBC HL,DE + RET Z + ADD HL,DE + GETPORT WINSP.CPU1 + PUSH AF + LD A,H ;Выделяем номер страницы + AND 0xC0 + RLCA + RLCA + LD E,A + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H + DEC HL + BIT 6,H + JR NZ,AddStr0 + DEC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + SET 6,H +AddStr0 LD A,(HL) + CP 0x0D + LD B,0x01 + JR Z,AddStr2 + CP 0x0A + LD B,0x00 + JR NZ,AddStr2 + DEC HL + BIT 6,H + JR NZ,AddStr1 + DEC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + SET 6,H +AddStr1 LD A,(HL) + CP 0x0D + LD B,0x01 + JR NZ,AddStr2 + LD B,0x02 +AddStr2 POP AF + SETPORT WINSP.CPU1,,0 + LD A,B + OR A + RET Z + CALL MinusBytes + CALL PutStrN + LD HL,(EquipLines) + DEC HL + LD (EquipLines),HL + CALL FEPrnASCIIpage + RET + +;[]----------------------------------------------------------[] +;Delete word +TDeleteWord LD A,(IY+StringX) + OR A + RET Z + LD C,A + LD B,A + LD L,A + LD H,HIGH (LineBuffer) + LD A,(IY+LenString) + SUB C + LD E,A + PUSH HL + DEC L + DEC C + LD A,(HL) + CP 0x09 + JR Z,.next + CP 0x20 + JR Z,.next + CP ',' + JR Z,.next + CP '.' + JR Z,.next + DEC B + JR Z,.skip +.DWord0 DEC L + DEC C + LD A,(HL) + CP 0x09 + JR Z,.DWord2 + CP 0x20 + JR Z,.DWord2 + CP ',' + JR Z,.DWord2 + CP '.' + JR Z,.DWord2 + DJNZ .DWord0 + JR .skip + +.DWord1 LD A,(HL) + CP 0x09 + JR Z,.next + CP 0x20 + JR Z,.next + CP ',' + JR Z,.next + CP '.' + JR NZ,.DWord2 +.next DEC L + DEC C + DJNZ .DWord1 +.DWord2 INC L + INC C +.skip LD A,(IY+StringX) + LD (IY+StringX),C + SUB C + LD C,A + EX AF,AF' + LD A,(IY+LenString) + SUB C + LD (IY+LenString),A + LD C,E + LD B,0x00 + EX DE,HL + POP HL + LD A,C + OR A + JR Z,.L1 + LDIR +.L1 EX DE,HL + EX AF,AF' + LD B,A + SUB A +.L2 LD (HL),A + INC L + DJNZ .L2 + INC A + LD (IY+ReadyStr),A + LD (IY+ReadyFile),A + CALL PrnASCIIstring + INC (IY+StringX) + JP TCursorLeft + +;[]----------------------------------------------------------[] +;Курсор влево на одно место +TCursorLeft LD A,(IY+StringX) + OR A + RET Z + DEC A + LD (IY+StringX),A + LD C,0x00 + JR Z,CursLf3 + LD HL,LineBuffer + LD B,A +CursLf1 LD A,(HL) + INC HL + CP 0x09 + JR NZ,CursLf2 + LD A,C + AND 0xF8 + ADD A,0x08 + LD C,A + DEC C +CursLf2 INC C + DJNZ CursLf1 +CursLf3 LD B,(IY+CursAddX) +CursLf4 LD A,C + SUB (IY+CursAddX) + JR NC,CursLf5 + LD A,(IY+CursAddX) + SUB Step + LD (IY+CursAddX),A + JR CursLf4 + +CursLf5 LD (IY+CursorX),A + LD A,B + CP (IY+CursAddX) + CALL NZ,RefrASCIIpage + CALL FEResCursor + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + CALL PrnASCIIinfo + LD A,(IY+LenString) + SUB (IY+StringX) + RET Z + LD B,A + LD L,(IY+LenString) + LD H,HIGH (LineBuffer) + LD D,0x00 + LD A,0x20 +CursLf6 DEC HL + CP (HL) + RET NZ + LD (HL),D + DEC (IY+LenString) + DJNZ CursLf6 + RET +;[]----------------------------------------------------------[] +;Курсор вправо на одно место +TCursorRight LD A,(IY+CursorX) + ADD A,(IY+CursAddX) + CP 240 + RET Z + LD A,(IY+StringX) + CP 240 + RET Z + INC A + LD (IY+StringX),A + LD C,0x00 + LD HL,LineBuffer + OR A + JR Z,.CursRg3 + LD B,A +.CursRg1 LD A,(HL) + INC HL + CP 0x09 + JR NZ,.CursRg2 + LD A,C + AND 0xF8 + ADD A,0x08 + LD C,A + DEC C +.CursRg2 INC C + DJNZ .CursRg1 +.CursRg3 LD B,(IY+CursAddX) +.CursRg4 LD A,C + SUB (IY+CursAddX) + CP 0x4E + JR C,CursRg5 + LD A,(IY+CursAddX) + ADD A,Step + LD (IY+CursAddX),A + JR .CursRg4 + +CursRg5 LD (IY+CursorX),A + LD A,B + CP (IY+CursAddX) + CALL NZ,RefrASCIIpage + LD A,(IY+LenString) + SUB (IY+StringX) + JR NC,CursRg6 + LD L,(IY+LenString) + LD H,HIGH (LineBuffer) + LD (HL),0x20 + INC (IY+LenString) +CursRg6 CALL FEResCursor + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + CALL PrnASCIIinfo + RET + +;[]----------------------------------------------------------[] +;Word left +TWordLeft LD A,(IY+StringX) + OR A + RET Z + LD C,A + LD B,A + LD L,A + LD H,HIGH (LineBuffer) +.WordLf0 DEC L + DEC C + LD A,(HL) + CP 0x09 + JR Z,.next + CP 0x20 + JR Z,.next + CP ',' + JR Z,.next + CP '.' + JR Z,.next + DJNZ .WordLf0 + JR .skip + +.WordLf1 LD A,(HL) + CP 0x09 + JR Z,.next + CP 0x20 + JR Z,.next + CP ',' + JR Z,.next + CP '.' + JR NZ,.WordLf2 +.next DEC L + DEC C + DJNZ .WordLf1 +.WordLf2 INC C +.skip LD (IY+StringX),C + INC (IY+StringX) + JP TCursorLeft +;[]----------------------------------------------------------[] +;Word right +TWordRight LD A,(IY+LenString) + SUB (IY+StringX) + RET Z + LD B,A + LD L,(IY+StringX) + LD H,HIGH (LineBuffer) + LD C,L +.WordRg0 LD A,(HL) + CP 0x09 + JR Z,.next + CP 0x20 + JR Z,.next + CP ',' + JR Z,.next + CP '.' + JR Z,.next + INC L + INC C + DJNZ .WordRg0 + JR .WordRg2 + +.WordRg1 LD A,(HL) + CP 0x09 + JR Z,.next + CP 0x20 + JR Z,.next + CP ',' + JR Z,.next + CP '.' + JR NZ,.WordRg2 +.next INC L + INC C + DJNZ .WordRg1 +.WordRg2 LD (IY+StringX),C + LD A,C + OR A + JP Z,THomeString + DEC (IY+StringX) + JP TCursorRight + +;[]----------------------------------------------------------[] +THomeString ld a,1 +.param EQU $-1 + and a + jr z,.toZero + LD A,(IY+StringX) + ld e,a + ld l,0 + ld d,l + ld c,0x09 + ld b,(iy+LenString) + ld h,HIGH (LineBuffer) +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.loop: ld a,(hl) + or a + jr z,.toFirst + cp 0x20 + jr z,.next + cp c + jr nz,.firstSym + ld a,7 + add a,d + ld d,a +.next: inc l + inc d + djnz .loop + jr .toZero +;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.firstSym: ld a,l + cp e + jr c,.skipTabs + jr nz,.skipTabs +.toFirst: and a + jr z,.skipTabs +.toZero: sub a + ld l,a + ld d,a +.skipTabs: LD B,(IY+CursAddX) + ld a,l + LD (IY+StringX),A + LD (IY+CursorX),d + and a + jr nz,.notZero + LD (IY+CursAddX),A + jr .skip + +.notZero: cp b + jr nc,.skip + SUB A + LD (IY+CursAddX),A +.skip: LD A,B + CP (IY+CursAddX) + CALL NZ,RefrASCIIpage + CALL FEResCursor + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + CALL PrnASCIIinfo + LD A,(IY+LenString) + SUB (IY+StringX) + RET Z + LD B,A + LD L,(IY+LenString) + LD H,HIGH (LineBuffer) + LD D,0x00 + LD A,0x20 +HomeStr DEC HL + CP (HL) + RET NZ + LD (HL),D + DEC (IY+LenString) + DJNZ HomeStr + RET + +;[]----------------------------------------------------------[] +TEndString LD A,(IY+LenString) + OR A + RET Z + LD B,A + LD L,A + LD H,HIGH (LineBuffer) + LD D,0x00 + LD A,0x20 +EndStr1 LD (HL),D + DEC HL + CP (HL) + JR NZ,EndStr2 + DJNZ EndStr1 +EndStr2 LD (IY+LenString),B + LD A,B + CP (IY+StringX) + RET Z + OR A + JP Z,THomeString.toZero + DEC A + LD (IY+StringX),A + JP TCursorRight + +;[]----------------------------------------------------------[] +TCursorUp CALL PutString + LD HL,(LineShift) + LD A,H + OR L + RET Z + LD A,(IY+CursorY) + OR A + JP Z,TScrollUp + CALL FESearchUp + LD (LineShift),HL + DEC (IY+CursorY) + LD HL,(CurLine) + DEC HL + LD (CurLine),HL + JP CursorExit + +TCursorDown CALL PutString + LD HL,(LineShift) + LD DE,(FEFileLenght) + OR A + SBC HL,DE + RET Z + ADD HL,DE + CALL FESearchDown + LD A,(IY+CursorY) + CP 0x18 + JP Z,TScrollDown + LD (LineShift),HL + INC (IY+CursorY) + LD HL,(CurLine) + INC HL + LD (CurLine),HL + JP CursorExit + +TScrollUp CALL PutString + LD HL,(FEPageShift) + LD A,H + OR L + JP Z,TCursorUp + CALL FESearchUp + LD (FEPageShift),HL + LD (FETempShift),HL + LD HL,(LineShift) + CALL FESearchUp + LD (LineShift),HL + LD HL,(CurLine) + DEC HL + LD (CurLine),HL + CALL FEResCursor + CALL FEScrollSCRdown + LD B,0x1C + CALL PrnASCIIline + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + JP CursorExit + +TScrollDown CALL PutString + LD HL,(FEPageShift) + LD B,0x19 +.ScrlDn1 PUSH BC + CALL FESearchDown + POP BC + JP C,TCursorDown + DJNZ .ScrlDn1 + LD (FETempShift),HL + LD HL,(FEPageShift) + CALL FESearchDown + LD (FEPageShift),HL + LD HL,(LineShift) + CALL FESearchDown + LD (LineShift),HL + LD HL,(CurLine) + INC HL + LD (CurLine),HL + CALL FEResCursor + CALL FEScrollSCRup + LD B,0xDC + CALL PrnASCIIline + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor +CursorExit CALL GetString + LD HL,LineBuffer + LD C,0x00 + LD A,(IY+CursorX) + add a,(iy+CursAddX) + OR A + JR Z,CursEx3 + LD B,A +CursEx1 LD A,(HL) + INC HL + CP 0x09 + JR NZ,CursEx2 + LD A,C + AND 0xF8 + ADD A,0x08 + LD C,A + DEC C +CursEx2 INC C + LD a,c + cp b + jr nc,CursEx3 + jr CursEx1 + +CursEx3: ld (iy+StringX),l + LD B,(IY+CursAddX) + LD (IY+CursAddX),0x00 +CursEx4: LD A,C + SUB (IY+CursAddX) + CP 0x4E + JR C,CursEx5 + LD A,(IY+CursAddX) + ADD A,Step + LD (IY+CursAddX),A + JR CursEx4 + +CursEx5 LD (IY+CursorX),A + LD A,B + CP (IY+CursAddX) + CALL NZ,RefrASCIIpage + CALL FEResCursor + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + CALL PrnASCIIinfo + RET + +;[]----------------------------------------------------------[] +FETPageUp CALL PutString + LD HL,(FEPageShift) + LD A,H + OR L + JP Z,FETBegFile + LD DE,(CurLine) + LD B,0x19 +PageUp1 PUSH DE + PUSH BC + CALL FESearchUp + POP BC + POP DE + JR C,.L1 + DEC DE + DJNZ PageUp1 +.L1 LD (FEPageShift),HL + LD (CurLine),DE + JR PageExit + +TPageDown CALL PutString + LD HL,(FEPageShift) + LD DE,(CurLine) + LD B,0x19 +PageDn1 PUSH DE + PUSH BC + CALL FESearchDown + POP BC + POP DE + JP C,FETEndFile + INC DE + DJNZ PageDn1 + LD BC,(FEFileLenght) + OR A + SBC HL,BC + JP Z,FETEndFile + ADD HL,BC + LD (FEPageShift),HL + LD (CurLine),DE +PageExit LD A,(IY+CursorY) + OR A + JR Z,PageEx3 + LD B,A +PageEx1 PUSH HL + PUSH BC + CALL FESearchDown + POP BC + POP DE + JR C,PageEx2 + LD E,L + LD D,H + DJNZ PageEx1 + DEC B +PageEx2 INC B + LD A,(IY+CursorY) + SUB B + LD (IY+CursorY),A + LD HL,(CurLine) + LD A,L + SUB B + LD L,A + LD A,H + SBC A,0x00 + LD H,A + LD (CurLine),HL + EX DE,HL +PageEx3 LD (LineShift),HL +NewPage CALL GetString + LD HL,LineBuffer + LD C,0x00 + LD A,(IY+StringX) + OR A + JR Z,PagePr3 + LD B,A +PagePr1 LD A,(HL) + INC HL + CP 0x09 + JR NZ,PagePr2 + LD A,C + AND 0xF8 + ADD A,0x08 + LD C,A + DEC C +PagePr2 INC C + DJNZ PagePr1 +PagePr3 LD (IY+CursAddX),0x00 +PagePr4 LD A,C + SUB (IY+CursAddX) + CP 0x4E + JR C,PagePr5 + LD A,(IY+CursAddX) + ADD A,Step + LD (IY+CursAddX),A + JR PagePr4 + +PagePr5 LD (IY+CursorX),A + CALL FEPrnASCIIpage + RET +;[]----------------------------------------------------------[] +FETBegFile CALL PutString + LD HL,(LineShift) + LD A,H + OR L + RET Z + LD HL,0x0000 + LD (FEPageShift),HL + LD (LineShift),HL + LD (CurLine),HL + LD (IY+CursorY),L + JP NewPage + +FETEndFile CALL PutString + LD HL,(FEPageShift) + LD B,0x19 +EndFl1 PUSH BC + CALL FESearchDown + POP BC + JR C,EndFile1 + DJNZ EndFl1 + LD HL,(FEFileLenght) + LD B,0x19 +EndFl2 PUSH BC + CALL FESearchUp + POP BC + DJNZ EndFl2 + LD (FEPageShift),HL + LD (IY+CursorY),0x18 +EndFlEx LD HL,(FEFileLenght) + CALL FESearchUp + LD (LineShift),HL + LD HL,(EquipLines) + DEC HL + LD (CurLine),HL + JP NewPage + +EndFile1 LD A,0x18 + SUB B + CP (IY+CursorY) + RET Z + LD (IY+CursorY),A + LD HL,(FEFileLenght) + CALL FESearchUp + LD (LineShift),HL + LD HL,(EquipLines) + DEC HL + LD (CurLine),HL + JP NewPage + +;[]----------------------------------------------------------[] +TNewCrPos PUSH HL + PUSH DE + CALL PutString + POP DE + POP HL + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD A,E + SUB 0x1C + SRL A + SRL A + SRL A + LD D,A + LD E,L + LD HL,(FEPageShift) + OR A + JR Z,NewPos2 + LD B,A +NewPos1 PUSH DE + PUSH BC + CALL FESearchDown + POP BC + POP DE + JP C,FETEndFile + DJNZ NewPos1 +NewPos2 LD (LineShift),HL + LD HL,(CurLine) + LD A,D + SUB (IY+CursorY) + LD (IY+CursorY),D + LD C,A + LD B,0x00 + JR NC,.L1 + DEC B +.L1 ADD HL,BC + LD (CurLine),HL + SUB A + LD (IY+StringX),A + PUSH DE + CALL GetString + POP DE + LD C,0x00 + LD A,E + ADD A,(IY+CursAddX) + JR Z,NewPos6 + LD E,A + LD A,(IY+LenString) + OR A + JR Z,NewPos6 + LD B,A + LD HL,LineBuffer +NewPos3 LD A,(HL) + INC L + CP 0x09 + JR NZ,NewPos4 + LD A,C + AND 0xF8 + ADD A,0x08 + LD C,A + DEC C +NewPos4 INC C + LD A,C + CP E + JR NC,NewPos5 + DJNZ NewPos3 +NewPos5 LD (IY+StringX),L + LD A,(IY+LenString) + SUB L + JR NC,NewPos6 + NEG + LD B,A + LD A,0x20 +.L2 LD (HL),A + INC L + DJNZ .L2 + LD (IY+LenString),L +NewPos6 LD A,C + SUB (IY+CursAddX) + LD (IY+CursorX),A + CALL FEResCursor + LD E,(IY+CursorX) + LD D,(IY+CursorY) + CALL FESetCursor + CALL PrnASCIIinfo + CALL JUMPS.ResFire + RET diff --git a/plugins/fnviewer/build.bat b/plugins/fnviewer/build.bat new file mode 100644 index 0000000..2e8035e --- /dev/null +++ b/plugins/fnviewer/build.bat @@ -0,0 +1,21 @@ + +@echo off + +if not exist tmp md tmp +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\sprinter_src\tools\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\sprinter_src\;d:\yad\sprinter_src\flexnav\src\ + +asl -U -L -C -x -olist tmp\fviewer.lst -i %includes% fvmain.a80 || goto error +p2bin fvmain.p ..\fnviewer.flx -r $-$ -k + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit diff --git a/plugins/fnviewer/fvhex.a80 b/plugins/fnviewer/fvhex.a80 new file mode 100644 index 0000000..f6ed6a8 --- /dev/null +++ b/plugins/fnviewer/fvhex.a80 @@ -0,0 +1,724 @@ + +; LAST UPDATE: 20.03.2025 savelij + +;-------------------------------------------------------------- +;Процедура печати страницы дампа с тек.смещ. от начала файла +;На вход: +; None +;На выход: +; None +PrnHEXpage LD HL,PrintVProc + PUSH HL + LD HL,(FileShift) + LD A,L + AND 0xF0 + LD L,A + LD (FileShift),HL + LD (TempShift),HL ;Запоминаем тек.смещение + LD HL,(FileShift+2) + LD (TempShift+2),HL + LD HL,LineBuffer + LD BC,0x5020 +.L1 LD (HL),C + INC L + DJNZ .L1 + LD B,0x1C ;Изнач.позиция печати +PrnHEXl PUSH BC + CALL PutHLine ;Выводим строку в буфер и на экран + POP BC + JR C,FillDwnHex ;CY-Закончились байты для печати + LD HL,(TempShift) + LD DE,0x0010 ;Адрес дампа+16 + ADD HL,DE + LD (TempShift),HL + LD HL,(TempShift+2) + LD E,D + ADC HL,DE + LD (TempShift+2),HL + LD A,B + ADD A,0x08 + LD B,A + CP 0xE4 + JR NZ,PrnHEXl + RET + +;Процедура отчистки нижней области экрана +FillDwnHex LD A,B + CP 0xE4 + RET Z ;Z-нет отчистки + LD (FPosHex),A + LD A,0xE4 + SUB B + LD (FLenHex),A + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 0,0,640,0,COLORI.PANEL +FPosHex EQU $ - 7 +FLenHex EQU $ - 3 + W_END + RET + +;Процедура печати тек.строки в буфер и на экран +PutHLine LD IXL,0x00 + LD IXH,B + LD HL,(FileLenght) + LD BC,(TempShift) + OR A + SBC HL,BC + EX DE,HL + LD HL,(FileLenght+2) + LD BC,(TempShift+2) + SBC HL,BC + RET C + LD B,0x10 + JR NZ,PutHLn + LD A,D + OR A + JR NZ,PutHLn + OR E + SCF + RET Z + LD A,E + CP B + JR NC,PutHLn + LD B,E +PutHLn + GETPORT WINSP.CPU1 + PUSH AF + CALL InitFPages + LD HL,LineBuffer+1 ;буфер строки + EXX + LD HL,LineBuffer+0x3F ;место для ASCII кодов + EXX + LD A,(TempShift+3) ;Кладем смещение + CALL PutHexNumb ;от начала фаила + LD A,(TempShift+2) + CALL PutHexNumb + LD A,(TempShift+1) + CALL PutHexNumb + LD A,(TempShift) + CALL PutHexNumb + LD (HL),":" + INC L + INC L +PutHLoop CALL TestFPages + LD A,(DE) + INC DE + EXX + LD (HL),A + INC L + EXX + CALL PutHexNumb ;Процедура конверта + INC L + INC IXL ;Увелич.кол-во введенных байтов + LD A,IXL + CP 0x04 + JR Z,.PtHNx1 + CP 0x08 + JR Z,.PtHNx1 + CP 0x0C + JR NZ,.L1 +.PtHNx1 INC L +.L1 DJNZ PutHLoop + POP AF + SETPORT WINSP.CPU1,,0 +;Процедура очистки закончившихся байтов +FillHex LD A,0x10 ;Макс.байтов + SUB IXL ;Тек.кол-во байтов + JR Z,.FillE2 + LD B,A + LD C,0x20 +.FillE1 LD (HL),C + INC L + LD (HL),C + INC L + INC L + EXX + LD (HL),0x20 + INC L + EXX + INC IXL + LD A,IXL ;В центре 2 пробела + CP 0x04 + JR Z,.FlHNx1 + CP 0x08 + JR Z,.FlHNx1 + CP 0x0C + JR NZ,.L2 +.FlHNx1 INC L +.L2 DJNZ .FillE1 +.FillE2 LD HL,LineBuffer + LD DE,0x0000 + LD B,0x50 + LD C,IXH + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + OR A + RET ;CY-была последняя строка + +;Процедура преобразования 8битовых чисел в шестнадц. текст +;На вход: +; HL - адрес буфера +; А - байт +;На выход: +; буфер с текст.числом +PutHexNumb PUSH AF + RRCA + RRCA + RRCA + RRCA + AND 0x0F + ADD A,0x90 + DAA + ADC A,0x40 + DAA + LD (HL),A + INC L + POP AF + AND 0x0F + ADD A,0x90 + DAA + ADC A,0x40 + DAA + LD (HL),A + INC L + RET + +;-------------------------------------------------------------- +;Процедуры обработки View +;На строку вверх +HLineUpMs CALL FVHLineUp + RET C + LD B,0x0A +HUpMs1 PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ HUpMs1 +HUpMs2 CALL FVHLineUp + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR HUpMs2 + +FVHLineUp LD HL,(FileShift) + LD DE,(FileShift+2) + LD A,H ;Проверяем на начало файла + OR D + OR L + OR E + SCF + RET Z ;Z-начало файла + LD BC,0x0010 + OR A + SBC HL,BC + LD (FileShift),HL ;FileShift-16байт(предид.строка) + LD (TempShift),HL ;Запоминаем тек.смещение + LD C,B + EX DE,HL + SBC HL,BC + LD (FileShift+2),HL + LD (TempShift+2),HL + CALL ScrollSCRdown + LD B,0x1C + CALL PutHLine ;Создаем и печатаем строку + CALL PrintVProc + OR A + RET + +;На строку вниз +HLineDwnMs CALL HLineDwn + RET C + LD B,0x0A +HDnMs1 PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ HDnMs1 +HDnMs2 CALL HLineDwn + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR HDnMs2 + +HLineDwn LD HL,(FileShift) + LD BC,(FileShift+2) + LD DE,0x0190 + ADD HL,DE + LD (TempShift),HL ;Запоминаем тек.смещение + JR NC,.L1 ;Прибавляем к смещению страницу + INC BC ;байтов (480б) +.L1 LD (TempShift+2),BC + EX DE,HL + LD HL,(FileLenght) + OR A + SBC HL,DE ;Проверяем на конец файла + EX DE,HL + LD HL,(FileLenght+2) + SBC HL,BC + RET C + JR NZ,.L2 + LD A,D + OR E + SCF + RET Z ;Z - конец +.L2 LD HL,(FileShift) + LD DE,(FileShift+2) + LD BC,0x0010 + ADD HL,BC + JR NC,.L3 + INC DE +.L3 LD (FileShift),HL + LD (FileShift+2),DE + CALL ScrollSCRup + LD B,0xDC + CALL PutHLine ;Создаем и печатаем строку + CALL PrintVProc + OR A + RET + +;На страницу вверх +HPageUpMs CALL FVHPageUp + RET C + LD B,0x0A +HUpMs1p PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ HUpMs1p +HUpMs2p CALL FVHPageUp + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR HUpMs2p + +FVHPageUp LD HL,(FileShift) + LD BC,(FileShift+2) + LD A,H ;Проверяем на начало файла + OR B + OR L + OR C + SCF + RET Z + LD DE,0x0190 ;Отнимаем от тек.смещ. страницу байтов + OR A + SBC HL,DE + JR NC,.HPgUp1 + LD A,B + OR C + DEC BC ;Проверяем,что не вывалились за + JR NZ,.HPgUp1 ;начало файла Z - вывалились + INC BC + LD L,C ;Тогда смещение = 0 + LD H,B +.HPgUp1 LD (FileShift),HL + LD (FileShift+2),BC + CALL PrnHEXpage ;Печатаем страницу + OR A + RET + +;На страницу вниз +HPageDwnMs CALL HPageDwn + RET C + LD B,0x0A +HDnMs1p PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ HDnMs1p +HDnMs2p CALL HPageDwn + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR HDnMs2p + +HPageDwn LD HL,(FileShift) + LD BC,(FileShift+2) + LD DE,0x0190 ;Плюсуем к тек.смещ. + ADD HL,DE ;страницу байтов + PUSH HL + JR NC,.L1 + INC BC +.L1 PUSH BC + EX DE,HL + LD HL,(FileLenght) ;Проверяем,что страница + OR A ;последняя + SBC HL,DE + EX DE,HL + LD HL,(FileLenght+2) + SBC HL,BC + POP BC + POP HL + RET C ;С - нет + JR NZ,.L2 + LD A,D + OR E + SCF + RET Z ;Z - нет +.L2 LD (FileShift),HL + LD (FileShift+2),BC + CALL PrnHEXpage ;Печатаем страницу + OR A + RET + +;В начало файла +HBegFile LD HL,JUMPS.ResFire + PUSH HL + LD HL,(FileShift) + LD BC,(FileShift+2) + LD A,H ;Проверяем на начало файла + OR B + OR L + OR C + RET Z ;Z - Начало + LD HL,0x0000 ;Смещение = 0000 + LD (FileShift),HL + LD (FileShift+2),HL + CALL PrnHEXpage ;Печатаем страницу + RET + +;В конец файла +HEndFile LD HL,JUMPS.ResFire + PUSH HL + LD HL,(FileShift) + LD BC,(FileShift+2) + LD DE,0x0190 + ADD HL,DE + JR NC,.L1 + INC BC +.L1 EX DE,HL + LD HL,(FileLenght) ;Проверяем,что мы на последней + PUSH HL ;странице + OR A + SBC HL,DE + EX DE,HL + LD HL,(FileLenght+2) + PUSH HL + SBC HL,BC + POP BC + POP HL + RET C ;С - в конце + JR NZ,.L2 + LD A,D + OR E + RET Z ;Z - в конце +.L2 LD DE,0x0190 + OR A + SBC HL,DE ;Просчитываем смещение последней страницы + JR NC,.L3 + DEC BC +.L3 LD A,L ;Смещение кратно 16 + AND 0x0F + JR Z,.HEnd1 + LD A,L + AND 0xF0 + LD L,A + LD DE,0x0010 + ADD HL,DE + JR NC,.HEnd1 + INC BC +.HEnd1 LD (FileShift),HL + LD (FileShift+2),BC + CALL PrnHEXpage ;Печатаем страницу + RET + +;-------------------------------------------------------------- +;Процедура ввода нового указателя смещения в файле +HGoTo LD HL,(FileLenght) + LD DE,(FileLenght+2) + LD A,H ;Проверяем,что длина + OR D ;файла больше 16 байт + OR E + JR NZ,HGoToOk + LD A,L + CP 0x11 + RET C ;меньше 16байт +HGoToOk LD HL,NewShift ;Буфер для ввода нового указ. + SUB A + LD (CursPos+1),A ;Позиция ввода в буфере + INC A + LD (BuffFlg),A + LD A,(FileShift+3) + CALL PutHexNumb ;Заносим в буфер текущее смещ. + LD A,(FileShift+2) ;в текстовом виде + CALL PutHexNumb + LD A,(FileShift+1) + CALL PutHexNumb + LD A,(FileShift) + CALL PutHexNumb +;Выводим на экран буфер и +HGoToRet CALL PrintHGT ;печатаем курсор +HGoToLp HALT ;Ожидаем прерывание + CALL ChangeCurs ;проверям на смену курсора + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + JP NZ,HGTescape + SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиши + JR Z,HGoToLp ;Z - не нажата + LD A,B + AND 0x3F + JR NZ,HGoToLp + LD A,E + OR A + JR Z,HGoToSys ;A=0 сист.клавиша + CP 0x0D + JP Z,HGTenter ;нажат Enter + CP 0x08 + JR Z,HGTdelete ;нажат BackSpace + CP 0x1B + JP Z,HGTescape ;нажат Esc + CP 0x20 + JR C,HGoToLp ;код<0x20 нам не подходит + LD C,A ;сохр. ASCII код + LD A,0x00 +BuffFlg EQU $-1 + OR A + CALL NZ,ClearBuff +CursPos LD A,0x00 ;тек.позиция печати в буфере + LD B,A ;сохр.тек.поз. + LD HL,NewShift ;Смещ.от начала буфера + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD (HL),C ;Заносим код в буфер + LD A,B ;тек.поз. + CP 0x07 ;Позиция в буфере (7-последняя) + JR Z,HGoToRet ;печатаем строку и курсор + INC A ;след.позиция + LD (CursPos+1),A + JR HGoToRet ;печатаем строку и курсор + +ClearBuff LD HL,NewShift + LD B,0x08 + LD A,0x20 +.L1 LD (HL),A + INC HL + DJNZ .L1 + SUB A + LD (BuffFlg),A + RET + +;Забой +HGTdelete SUB A + LD (BuffFlg),A + LD A,(CursPos+1) ;Тек.позиция в буфере + OR A + JR Z,HGoToLp ;0 - выходим + DEC A + LD (CursPos+1),A ;предид.позиция + LD HL,NewShift + ADD A,L ;смещ.в буфере + LD L,A + JR NC,.L1 + INC H +.L1 LD (HL)," " ;Забиваем пробелом + JR HGoToRet + +;системная клавиша +HGoToSys LD A,D + CP 0x54 ;<- + JR Z,HGTleft + CP 0x56 ;-> + JR Z,HGTright + JR HGoToLp + +;Курсор влево +HGTleft SUB A + LD (BuffFlg),A + LD A,(CursPos+1) ;Тек.позиция в буфере + OR A + JP Z,HGoToLp ;0 - выходим + DEC A + LD (CursPos+1),A ;Уменьш.поз. + JP HGoToRet + +HGTright SUB A + LD (BuffFlg),A + LD A,(CursPos+1) ;Тек.позиция в буфере + CP 0x07 + JP Z,HGoToLp ;7 - последняя + INC A + LD (CursPos+1),A ;Увелич.поз. + JP HGoToRet + +;Процедура вывода строки и курсора +PrintHGT LD HL,NewShift + LD DE,0x0008 + LD BC,0x081C + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + LD A,(CursPos+1) ;Позиция вывода курсора + INC A + LD L,A + LD H,0x00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,TCursor + LD (HL),0xAB;"<" + LD BC,0x011C + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + LD A,0x01 ;Номер выведенного курсора + LD (CurCurs),A + LD A,0x06 ;Ожидание для смены курсора + LD (CurWait),A + RET + +;Процедура смены курсора +ChangeCurs LD A,0x00 ;Задержка между сменой курсора +CurWait EQU $-1 + DEC A + LD (CurWait),A + RET NZ ;еще не время + LD A,(CursPos+1) + INC A + LD L,A + LD H,0x00 ;Тек.знакоместо + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,NewShift ;Смещ.в буфере + LD A,(CursPos+1) + ADD A,L + LD L,A + JR NC,.L2 + INC H +.L2 LD A,0x00 ;Номер текущего курсора +CurCurs EQU $-1 + XOR 0x01 ;Меняем курсор + LD (CurCurs),A + LD A,(HL) + JR Z,.L1 ;Печатаем + LD A,0xAB;"<" +.L1 LD HL,TCursor + LD (HL),A + LD BC,0x011C + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + LD A,0x0C ;Ожидание для смены курсора + LD (CurWait),A + RET + +TCursor DEFB " " + +;Клавиша ENTER +HGTenter SUB A ;При ошибке вернемся с курсором + LD (CursPos+1),A ;в нулевой позиции + LD BC,NewShift ;Буфер строки + CALL GetHexNum32 ;Переводим текст в 32бит число + JP C,HGoToRet ;CY - синтакс.ошибка + LD C,E + LD B,D + LD A,L ;Адрес кратный 16 + AND 0xF0 + LD L,A + EX DE,HL ;Смещ.в BC+DE + LD HL,(FileLenght) ;Проверяем,что смещение в + OR A ;пределах файла + SBC HL,DE + LD HL,(FileLenght+2) + SBC HL,BC + JR C,HGTent ;CY-за пределами + JR NZ,HGTent1 ;NZ-в пределах + LD A,D + OR E + JR NZ,HGTent1 ;NZ-в пределах +HGTent LD HL,(FileLenght) + LD BC,0x0010 + OR A + SBC HL,BC ;смещ.=последняя строка файла 16 байт + EX DE,HL + LD HL,(FileLenght+2) + JR NC,.L1 + DEC HL +.L1 LD C,L + LD B,H +HGTent1 LD (FileShift),DE + LD (FileShift+2),BC + CALL PrnHEXpage ;Печатаем страницу + RET + +;Нажат Escape +HGTescape LD HL,NewShift ;Буфер строки + PUSH HL + LD A,(FileShift+3) ;Заносим тек.смещение + CALL PutHexNumb + LD A,(FileShift+2) + CALL PutHexNumb + LD A,(FileShift+1) + CALL PutHexNumb + LD A,(FileShift) + CALL PutHexNumb + POP HL + LD DE,0x0008 + LD BC,0x081C + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + CALL JUMPS.ResFire + RET ;Выходим + +NewShift DEFB " ",0 + +;Процедура конвертирования 32битового шестн.текстового числа +;На вход: +; BC - Адрес буфера с текстом (0-конец буфера) +;На выход: +; DE+HL - Число 32бит +; CY - синтаксическая ошибка +GetHexNum32 LD HL,0x0000 + LD E,L + LD D,H +GetHNlp LD A,(BC) + INC BC + OR A + RET Z + CP " " + JR Z,GetHNlp + CP 0x61 + JR C,.L1 + SUB 0x20 +.L1 CP 0x30 + RET C + CP 0x47 + CCF + RET C + SUB 0x30 + CP 0x0A + JR C,GetHNum + SUB 0x07 + CP 0x0A + RET C +GetHNum ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + OR L + LD L,A + JR GetHNlp diff --git a/plugins/fnviewer/fviewer.a80 b/plugins/fnviewer/fviewer.a80 new file mode 100644 index 0000000..5697bb8 --- /dev/null +++ b/plugins/fnviewer/fviewer.a80 @@ -0,0 +1,1081 @@ + +; LAST UPDATE: 27.05.2025 savelij + +LineBuffer := WorkBuffer+0x300 + +;[]==========================================================[] + JP FileViewer + + DZ FLEX_VERS.VIEWER + +FileViewer CALL LoadFile + RET C + LD IX,ViewingFile + SUB A + LD (ViewMode),A + LD (ASCIIaddX),A + LD HL,0x0000 + LD (FileShift),HL + LD (FileShift+2),HL + LD L,(IX+28) + LD H,(IX+29) + LD (FileLenght),HL + LD L,(IX+30) + LD H,(IX+31) + LD (FileLenght+2),HL + CALL InitViewScr +ViewerBegin CALL InitStatusLine + CALL InitVProc + CALL PrintVPage +ViewerLoop LD A,(ViewMode) + OR A + JR NZ,HViewLoop +TViewLoop LD IX,ASCIItab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиш + JR Z,TViewLoop + LD A,E ;Е-ASCII код + CP 0x1B ;Esc + JP Z,ViewerExit + OR A + JR NZ,TViewLoop ;Ждем функцион.клавиши + LD A,D + CP 0x44 + JP Z,ViewerExit + LD HL,TViewLoop + PUSH HL + CP 0x3B + JP Z,About + CP 0x3C + JP Z,ChASCIImode + CP 0x3E + JP Z,ChViewer ;Просмотр в HEX + CP 0x42 + JP Z,ChCodePage ;Смена кодовой страницы WIN/DOS/KOI + CP 0x41 + JP Z,FVPrintFile + CP 0x54 + JP Z,ScrollLeft + CP 0x56 + JP Z,ScrollRght + CP 87 ;Home + JP Z,THome + CP 81 ;End + JP Z,TEnd + CP 88 ;Стрелка вверх + JP Z,TLineUp + CP 82 ;Стрелка вниз + JP Z,TLineDwn + CP 89 ;PageUp + JP Z,TPageUp + CP 83 ;PageDown + JP Z,TPageDwn + LD A,B + AND 0x30 + CP 0x30 + RET Z + BIT 5,B + RET Z + LD A,D + AND 0x7F + CP 0x57 ;Ctrl+PageUp + JP Z,TBegFile ;в начало файла + CP 0x51 ;Ctrl+PageDown + JP Z,TEndFile ;в конец файла + CP 0x19 ;Ctrl+P + JP Z,FVPrintFile + RET + +;-------------------------------------------------------------- +HViewLoop LD IX,HEXtab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиш + JR Z,HViewLoop + LD A,E ;Е-ASCII код + CP 0x1B ;Esc + JP Z,ViewerExit + OR A + JR NZ,HViewLoop ;Ждем функцион.клавиши + LD A,D ; + CP 0x44 ;F10 + JP Z,ViewerExit + LD HL,HViewLoop + PUSH HL + CP 0x3B + JP Z,About + CP 0x3E ;F4 + JP Z,ChViewer ;Просмотр в тексте + CP 0x3F ;F5 + JP Z,HGoTo ;Переход на адрес пользователя + CP 0x41 + JP Z,FVPrintFile + CP 88 ;Стрелка вверх + JP Z,FVHLineUp + CP 82 ;Стрелка вниз + JP Z,HLineDwn + CP 89 ;PageUp + JP Z,FVHPageUp + CP 83 ;PageDown + JP Z,HPageDwn + LD A,B + AND 0x30 + CP 0x30 + RET Z + BIT 5,B + RET Z + LD A,D + AND 0x7F + CP 0x57 ;Ctrl+PageUp + JP Z,HBegFile ;в начало файла + CP 0x51 ;Ctrl+PageDown + JP Z,HEndFile ;в конец файла + CP 0x19 ;Ctrl+P + JP Z,FVPrintFile + RET + +;[]----------------------------------------------------------[] +ChViewer LD HL,ViewerBegin + EX (SP),HL + SUB A + LD (ASCIIaddX),A + LD A,(ViewMode) + XOR 0x01 + LD (ViewMode),A + RET NZ + LD HL,(FileShift) + LD DE,(FileShift+2) + INC HL + LD A,H + OR L + JR NZ,.L1 + INC DE +.L1 CALL SearchUp + LD (FileShift),HL + LD (FileShift+2),DE + RET + +;[]==========================================================[] +PrintVPage LD A,(ViewMode) + OR A + JP NZ,PrnHEXpage + JP PrnASCIIpage + +;[]==========================================================[] +ViewingFile DUPL 0x30,0 +ViewMode DEFB 0x00 +ASCIImode DEFB 0x01 +ASCIIaddX DEFB 0x00 +EmptyLines DEFB 0x00 +FileLenght DUPL 4,0 ; Длина файла (32бит) +FileShift DUPL 4,0 ; Смещение от начала файла (32бит) +TempShift DUPL 4,0 ; Временная ячейка смещения (32бит) +FVNextShift DUPL 4,0 ; Следующая страница для ASCII (32бит) +FVMemIndef DEFB 0x00 +FHandle DEFB 0x00 +FVReadLen DUPL 4,0 + +;[]==========================================================[] +ViewerExit LD A,(FVMemIndef) + SPDSS DSSF.FREEMEM + OR A + RET + +;[]==========================================================[] +LoadFile CALL JUMPS.SetClock + LD DE,ViewingFile +; SPDSS DSSF.F_FIRST,1,0x37 + SPDSS DSSF.F_FIRST,1, DIR.M_Archive + \ + DIR.M_Dir + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly + PUSH AF + CALL C,JUMPS.DOSError + POP AF + JP C,LoadExit +; LD HL,ViewingFile+33 +; LD A,(HL) +;LoadFl0 CALL FVCorrBigChar +; LD (HL),A +; INC HL +; LD A,(HL) +; OR A +; JR NZ,LoadFl0 + LD IX,ViewingFile + LD H,(IX+28) + LD A,(IX+29) + LD E,(IX+30) + LD D,(IX+31) + LD L,0x00 + SLA A + RL E + RL D + RL L + SLA A + RL E + RL D + RL L + OR H + LD H,0x00 + EX DE,HL + JR Z,.L1 + INC HL +.L1 LD A,H + OR L + JR NZ,LoadFl1 + INC HL +LoadFl1 LD A,D + OR E + LD A,0x1E + PUSH AF + CALL NZ,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти + POP AF + SCF + JP NZ,LoadExit + PUSH HL + SPDSS DSSF.INFOMEM + POP DE + LD L,C + LD H,B + OR A + SBC HL,DE + LD A,0x1E + PUSH DE + PUSH AF + CALL C,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти + POP AF + POP DE + JP C,LoadExit + LD IX,ProcessView + LD (IX+PROC.MAXL1),E + LD (IX+PROC.MAXH1),D + SUB A + LD (IX+PROC.MAXL2),A + LD (IX+PROC.MAXH2),A + PUSH DE + CALL JUMPS.InitProcess + POP DE + LD B,E + SPDSS DSSF.GETMEM + LD (FVMemIndef),A + LD HL,PagesList + SPBIOS BIOSF.GETMEMBLKPAGES + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 160,88,320,48 + W_FILL 4,2,312,10,COLORI.BLACK + W_TEXT 112,3,COLORI.WHITE,"FN File Viewer v\{FLEX_VERS.VIEWER}" + W_TEXT 8,16,COLORP.HIGHGRAY,"Reading:" + W_BORDER 16,28,288,12 + W_FILL 18,29,284,10,COLORI.WHITE + W_END + SPDSS DSSF.CURDISK + LD HL,WorkBuffer + ADD A,"A" + LD (HL),A + INC HL + LD (HL),":" + INC HL + PUSH HL + SPDSS DSSF.CURDIR + POP HL + SUB A +.L2 INC HL + CP (HL) + JR NZ,.L2 + DEC HL + LD A,0x5C + CP (HL) + INC HL + JR Z,.L3 + LD (HL),A + INC HL +.L3 EX DE,HL + LD HL,ViewingFile+33 + SUB A +.L4 LDI + CP (HL) + JR NZ,.L4 + LD (DE),A + LD IX,0x0100 + LD HL,WorkBuffer + LD DE,0x00D8 + LD BC,0x0068 + LD A,0x80 + CALL JUMPS.PrnRangPathL + LD HL,ViewingFile+33 + SPDSS DSSF.OPEN,,1 + PUSH AF + CALL C,JUMPS.DOSError + POP AF + JP C,NoRead + LD (FHandle),A + LD IX,ViewingFile + LD L,(IX+28) + LD H,(IX+29) + LD (FVReadLen),HL + LD L,(IX+30) + LD H,(IX+31) + LD (FVReadLen+2),HL + SETPORT WINSP.Y_PORT,0xC0 + GETPORT WINSP.CPU1 + PUSH AF + LD HL,PagesList + LD A,(HL) +.ReadLp1 INC HL + PUSH HL + SETPORT WINSP.CPU1,,0 + SPDSS DSSF.SCANKEY + LD HL,0x011B + OR A + SBC HL,DE + JP Z,ReadAbort + LD HL,(FVReadLen) + LD DE,(FVReadLen+2) + LD BC,0x4000 + OR A + SBC HL,BC + LD B,0x00 + EX DE,HL + SBC HL,BC + EX DE,HL + JR C,.ReadEnd + LD (FVReadLen),HL + LD (FVReadLen+2),DE + LD HL,0x4000 + LD DE,0x4000 + LD A,(FHandle) + SPDSS DSSF.READ + CALL FVNextProcess + POP HL + LD A,(HL) + CP 0xFF + JR NZ,.ReadLp1 + POP AF + SETPORT WINSP.CPU1,,0 + JR ReadExit + +.ReadEnd LD HL,0x4000 + LD DE,(FVReadLen) + LD A,D + OR E + JR Z,ReadEn1 + LD A,(FHandle) + SPDSS DSSF.READ + CALL FVNextProcess +ReadEn1 POP HL + POP AF + SETPORT WINSP.CPU1,,0 +ReadExit LD A,(FHandle) + SPDSS DSSF.CLOSE + OR A +LoadExit HALT + HALT + WINDOWCLOSE + PUSH AF + CALL JUMPS.SetMouse + POP AF + RET + +ReadAbort POP HL + POP AF + SETPORT WINSP.CPU1,,0 +NoRead LD A,(FVMemIndef) + SPDSS DSSF.FREEMEM + SCF + JR LoadExit + +FVNextProcess LD IX,ProcessView + LD L,(IX+PROC.CURL1) + LD H,(IX+PROC.CURH1) + INC HL + LD (IX+PROC.CURL1),L + LD (IX+PROC.CURH1),H + LD A,H + OR L + JR NZ,.NextPr1 + LD L,(IX+PROC.CURL2) + LD H,(IX+PROC.CURH2) + INC HL + LD (IX+PROC.CURL2),L + LD (IX+PROC.CURH2),H +.NextPr1 CALL JUMPS.PrnProcess + RET + +;[]----------------------------------------------------------[] +ProcessView DEFW 0x00B2 + DEFW 0x0075 + DEFW 0x011C + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFB 0x4F + +;FVCorrBigChar CP 0x41 +; RET C +; CP 0x5B +; JR NC,.CorrCh1 +; SET 5,A +; RET + +;.CorrCh1 CP 0x80 +; RET C +; CP 0xA0 +; RET NC +; SET 5,A +; CP 0x90 +; RET C +; SET 6,A +; RES 4,A +; RET + +;[]==========================================================[] +InitViewScr LD HL,FVFLen + LD B,0x10 + LD A,0x20 +.L1 LD (HL),A + INC HL + DJNZ .L1 + LD HL,FVFClast + LD B,0x05 +.L2 LD (HL),A + INC HL + DJNZ .L2 + LD DE,FVFLen + LD IX,ViewingFile + LD L,(IX+28) + LD H,(IX+29) + LD C,(IX+30) + LD B,(IX+31) + CALL JUMPS.ConvNumTxt32 + LD A,0x20 + LD (DE),A + INC DE + LD HL,FVBytes + LD BC,0x0005 + LDIR + LD DE,FVFData + CALL FVGetData + LD DE,FVFTime + CALL FVGetTime + LD L,(IX+26) + LD H,(IX+27) + LD DE,FVFClast + CALL JUMPS.ConvNumTxt16 + LD HL,FVFAtributs + LD DE,FVFAttrib + LD C,(IX+32) + LD B,0x08 +InitVS0 RL C + LD A,"-" + JR NC,.L3 + LD A,(HL) +.L3 LD (DE),A + INC HL + INC DE + DJNZ InitVS0 + MAKEWINDOW WINSUBOBJ.NOSTORE + W_MAIN 0,0,640,256 + W_FILL 4,2,632,10,COLORI.BLACK + W_TEXT 8,3,COLORI.WHITE," FN File Viewer v\{FLEX_VERS.VIEWER}" + W_HORIZLINE 0,13,640 + W_TEXT 8,17,COLORP.HIGHGRAY,"Viewing:" + W_VERTICLINE 574,16,10 + W_HORIZLINE 0,27,640 + W_HORIZLINE 0,227,640 + W_FILL 0,28,640,200,COLORI.PANEL + W_TEXT 8,231,COLORP.HIGHGRAY,"Len: " +FVFLen EQU $ - STRLEN(" ") - 1 + W_VERTICLINE 160,230,10 + W_TEXT 172,231,COLORP.HIGHGRAY,"Create data: " +FVFData EQU $ - STRLEN(" ") - 1 +FVFTime EQU $ - STRLEN(" ") - 1 + W_VERTICLINE 336,230,10 + W_TEXT 348,231,COLORP.HIGHGRAY,"First claster: " +FVFClast EQU $ - STRLEN(" ") - 1 + W_VERTICLINE 480,230,10 + W_TEXT 492,231,COLORP.HIGHGRAY,"File attribut: " +FVFAttrib EQU $ - STRLEN(" ") - 1 + W_END + SPDSS DSSF.CURDISK + LD HL,WorkBuffer + ADD A,"A" + LD (HL),A + INC HL + LD (HL),":" + INC HL + PUSH HL + SPDSS DSSF.CURDIR + POP HL + SUB A +.L4 INC HL + CP (HL) + JR NZ,.L4 + DEC HL + LD A,0x5C + CP (HL) + INC HL + JR Z,.L5 + LD (HL),A + INC HL +.L5 EX DE,HL + LD HL,ViewingFile+33 + SUB A +.L6 LDI + CP (HL) + JR NZ,.L6 + LD (DE),A + LD IX,0x0200 + LD HL,WorkBuffer + LD DE,0x0034 + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnRangPathL + LD HL,0x01FC + LD DE,0x0003 + LD B,0x08 + EXX + LD HL,0x022E + LD DE,0x0003 + LD B,0x08 + EXX + LD A,0x02 + CALL JUMPS.SetCMOSPrint + RET + +FVFAtributs DEFB "--ad-shr" + +;Дата +FVGetData EX DE,HL + LD A,(IX+24) + AND 0x1F + CALL FVGet8Bit + LD (HL),"." + INC HL + LD A,(IX+24) + LD C,(IX+25) + LD B,5 +.L1 SRL C + RRA + DJNZ .L1 + AND 0x0F + CALL FVGet8Bit + LD (HL),"." + INC HL + LD A,(IX+25) ;Год + SRL A + ADD A,80 +.L2 SUB 100 + JR NC,.L2 + ADD A,100 ;Год + CALL FVGet8Bit + EX DE,HL + RET + +;Время +FVGetTime EX DE,HL + LD A,(IX+23) ;Часы + AND 0xF8 + RRA + RRA + RRA + CALL FVGet8Bit + LD (HL),":" + INC HL + LD A,(IX+22) + LD C,(IX+23) + LD B,5 +.L1 SRL C + RRA + DJNZ .L1 + AND 0x3F + CALL FVGet8Bit + EX DE,HL + RET + +FVGet8Bit LD B,0x2F +.L1 INC B + SUB 10 + JR NC,.L1 + ADD A,10 + LD (HL),B + INC HL + ADD A,"0" + LD (HL),A + INC HL + RET + +FVBytes DEFB "bytes" + +;[]==========================================================[] +InitStatusLine LD A,(ViewMode) + OR A + JP NZ,HEXstatus +ASCIIstatus LD HL,UnWrapT + LD DE,0x005E + LD A,(ASCIImode) + OR A + JR Z,.L1 + LD HL,WrapT + LD DE,0x0064 +.L1 LD (ASCIIx),DE + LD DE,ASCIIm + LD BC,0x0009 + LDIR + CALL InitCodePage + MAKEWINDOW WINSUBOBJ.WOBIND + W_HORIZLINE 0,241,640 + W_FILL 2,243,636,12,COLORI.HIGHGRAY + W_HORIZLINE 2,255,638 + W_BUTTON 0,242,80,14 + W_TEXT 18,245,COLORP.HIGHGRAY,"F1 About" + W_BUTTON 80,242,80,14 + W_TEXT 94,245,COLORP.HIGHGRAY,"F2 UnWrap" +ASCIIx: EQU $ - STRLEN("F2 UnWrap") - 6 +ASCIIm: EQU $ - STRLEN("F2 UnWrap") - 1 + W_BUTTON 160,242,80,14 + W_TEXT 184,245,COLORP.HIGHGRAY,"F4 Hex" + W_BUTTON 400,242,80,14 + W_TEXT 422,245,COLORP.HIGHGRAY,"F7 Print" + W_BUTTON 480,242,80,14 + W_TEXT 504,245,COLORP.HIGHGRAY,"F8 DOS" +ASCIIenc: EQU $ - STRLEN("DOS") - 1 + W_BUTTON 560,242,80,14 + W_TEXT 580,245,COLORP.HIGHGRAY,"F10 Quit" + W_END + RET + +UnWrapT DEFB "F2 UnWrap" +WrapT DEFB "F2 Wrap " +EncDos: DEFB "DOS" +EncWin: DEFB "WIN" +EncKoi: DEFB "KOI" + +HEXstatus + MAKEWINDOW WINSUBOBJ.WOBIND + W_HORIZLINE 0,241,640 + W_FILL 2,243,636,12,COLORI.HIGHGRAY + W_HORIZLINE 2,255,638 + W_BUTTON 0,242,80,14 + W_TEXT 18,245,COLORP.HIGHGRAY,"F1 About" + W_BUTTON 160,242,80,14 + W_TEXT 182,245,COLORP.HIGHGRAY,"F4 ASCII" + W_BUTTON 240,242,80,14 + W_TEXT 258,245,COLORP.HIGHGRAY,"F5 Go to" + W_BUTTON 400,242,80,14 + W_TEXT 422,245,COLORP.HIGHGRAY,"F7 Print" + W_BUTTON 560,242,80,14 + W_TEXT 580,245,COLORP.HIGHGRAY,"F10 Quit" + W_END + RET + +;[]==========================================================[] +About + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 160,72,320,85 + W_FILL 4,2,312,10,COLORP.BLACK + W_TEXT 144,3,COLORI.WHITE,"About" + W_TEXT 96,18,COLORP.HIGHGRAY,"Flex Navigator File Viewer" + W_TEXT 144,28,COLORP.HIGHGRAY,"v\{FLEX_VERS.VIEWER}" + W_TEXT 18,40,COLORP.HIGHGRAY,"Programming: (C)2000 Enin Anton" + W_TEXT 92,50,COLORP.HIGHGRAY,"(C)2021 Mikhaltchenkov Dmitry" + W_BUTTON 124,66,72,14 + W_TEXT 154,69,COLORP.HIGHGRAY,"Ok" + W_END +AboutLoop LD IX,FVAboutTab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY + JR Z,AboutLoop + LD A,B + OR A + JR NZ,AboutLoop + LD A,E + CP 0x1B + JR Z,AboutExt + CP 0x0D + JR Z,AboutExt + RES 5,A + CP "O" + JR NZ,AboutLoop +AboutExt + WINDOWCLOSE + RET + +;[]==========================================================[] +ScrollSCRup LD DE,0x241C + JR ScrlSCRDnUp + +ScrollSCRdown LD DE,0x1C24 +;На вход: +; D - Y откуда +; Е - Y куда +ScrlSCRDnUp DI + PUSH DE + SPMOUSE MOUSEF.REFRESH + POP DE + GETPORT WINSP.CPU1 + PUSH AF + SETPORT WINSP.CPU1,0x50 + LD HL,0x4000 + LD BC,320 + ACCEL ACCELCMD.SET_BUFFER + LD A,0xC0 + ACCEL ACCELCMD.OFF +ScSCRN1 LD A,D + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD A,(HL) + ACCEL ACCELCMD.OFF + LD A,E + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD (HL),A + ACCEL ACCELCMD.OFF + INC HL + DEC BC + LD A,B + OR C + JR NZ,ScSCRN1 + POP AF + SETPORT WINSP.CPU1,,0 + EI + RET + +;[]==========================================================[] +InitFPages PUSH HL + LD DE,(TempShift) + LD HL,(TempShift+2) + LD A,D ;Выделяем номер страницы + RLA + RL L + RLA + RL L + LD A,L + EXX + LD E,A ;DE - Адрес страницы в списке + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX + RES 7,D ;Вкл.с 0x4000 + SET 6,D + POP HL + RET + +TestFPages BIT 7,D + RET Z + RES 7,D + SET 6,D + EXX + INC E ;DE - Адрес страницы в списке + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + EXX + RET + +GetFPages PUSH HL + RES 6,D + EXX + LD A,E + EXX + BIT 7,D + RES 7,D + JR Z,.L1 + INC A +.L1 LD L,A + SUB A + LD H,A + SRL L + RRA + SRL L + RRA + OR D + LD D,A + LD (TempShift),DE + LD (TempShift+2),HL + POP HL + RET + +;[]==========================================================[] +;Процедура инициализация таблицы процентов +InitVProc LD A,0x01 + LD (ProcFlag),A ;Флаг вывода процентов + LD A,(ViewMode) + OR A + JR NZ,InProcHex +;Проценты для TextWrap +InProcASCII LD HL,(FileLenght) + LD DE,(FileLenght+2) + LD B,0x19 +InProcA PUSH BC + CALL SearchUp + POP BC + RET C + DJNZ InProcA + JR InitProc + +;Проценты для Hex +InProcHex LD HL,(FileLenght) + LD DE,(FileLenght+2) + LD BC,0x0190 + OR A + SBC HL,BC + LD BC,0x0000 + EX DE,HL + SBC HL,BC + EX DE,HL + RET C + LD A,H + OR L + OR D + OR E + RET Z +;Процедура инициализации таблицы процентов +;На вход: +; DE+HL - Длина файла-1страница +InitProc PUSH HL + PUSH DE + EX DE,HL + LD BC,100 ;Длина файла/100 (%) + CALL JUMPS.Divis32 + LD (Coeff1+1),DE ;Получаем кол-во байт на + LD (Coeff2+1),HL ;один процент + LD IX,ProcentTab + LD HL,0x0000 + LD E,L + LD D,H + LD BC,0x6300 ;Генерим таблицу + LD (IX+0x00),L + INC IX + LD (IX+0x00),H + INC IX + LD (IX+0x00),E + INC IX + LD (IX+0x00),D + INC IX + LD (IX+0x00),C + INC IX + INC C +;для каждого процента +CoeffLoop PUSH BC +Coeff1 LD BC,0x0000 + ADD HL,BC + LD (IX+0x00),L + INC IX + LD (IX+0x00),H + INC IX + EX DE,HL +Coeff2 LD BC,0x0000 + ADC HL,BC + EX DE,HL + POP BC + LD (IX+0x00),E + INC IX + LD (IX+0x00),D + INC IX + LD (IX+0x00),C + INC IX + INC C + DJNZ CoeffLoop + POP DE + POP HL + LD (IX+0x00),L ;Макс.процент + INC IX + LD (IX+0x00),H + INC IX + LD (IX+0x00),E + INC IX + LD (IX+0x00),D + INC IX + LD (IX+0x00),C + SUB A + LD (ProcFlag),A + RET + +;[]----------------------------------------------------------[] +;Процедура просчета и печати проценто +PrintVProc LD HL,PutProcent + PUSH HL ;Выходим на печать + LD A,(ProcFlag) + OR A + LD A,100 + RET NZ ;Уже все 100% + LD IX,ProcentTab+250 ;Серидина таблицы проц.50% + LD HL,(FileShift) ;Текущее смещение + LD DE,(FileShift+2) + CALL TestProcent ;В какой половине наход.? + JR C,LowTest ;<50% + LD A,(IX+0x04) + RET Z ;=50% + LD IX,ProcentTab+375 ;Таблица с 75% + CALL TestProcent ;В какой половине наход.? + JR C,Test2 ;50%% + OR A + RET Z + LD BC,-0x0005 ;Ищем вниз по таблице + ADD IX,BC ;Нужный процент + CALL TestProcent + JR Test2 + +;X<50% +LowTest LD IX,ProcentTab+125 ;Таблица с 25% + CALL TestProcent ;В какой половине наход.? + JR C,Test2 ;01%процент +TestProcent PUSH HL + PUSH DE + PUSH BC + LD C,(IX+0x00) + LD B,(IX+0x01) + OR A + SBC HL,BC + EX DE,HL + LD C,(IX+0x02) + LD B,(IX+0x03) + SBC HL,BC + JR NZ,.L1 + LD A,D + OR E +.L1 POP BC + POP DE + POP HL + RET + +;Процедура вывода процентов +PutProcent LD HL,ProcText + PUSH HL + LD BC,0x2F00 +.L1 INC B + SUB 100 + JR NC,.L1 + ADD A,100 + EX AF,AF' + LD A,B + CP "0" + JR Z,.L2 + SET 0,C +.L2 BIT 0,C + JR NZ,.L3 + LD A,0x20 +.L3 LD (HL),A + INC HL + EX AF,AF' + LD B,0x2F +.L4 INC B + SUB 10 + JR NC,.L4 + ADD A,10 + EX AF,AF' + LD A,B + CP "0" + JR Z,.L5 + SET 0,C +.L5 BIT 0,C + JR NZ,.L6 + LD A,0x20 +.L6 LD (HL),A + INC HL + EX AF,AF' + ADD A,"0" + LD (HL),A + POP HL + LD DE,0x0250 + LD BC,0x0011 + LD A,0x80 + CALL JUMPS.PrnTxtLnNorm + RET + +InitCodePage: LD A,0 +CodePage EQU $-1 + LD L,A + LD H,0 + ADD HL,HL + ADD A,L + LD L,A + LD DE,EncDos + ADD HL,DE + LD DE,ASCIIenc + LD BC,3 + LDIR + LD A, (CodePage) + AND A + JR NZ,.next + LD HL,0 +.call: LD (PutLine2),A + LD (PutLine2 + 1),HL + RET + +.next: DEC A + LD HL,Table866 + JR Z,.next1 + LD HL,TableKoi +.next1: LD (DecodeSymbol.table),HL + LD HL,DecodeSymbol + LD A, 0xCD + JR .call + +ProcText DEFB " %",0 +ProcFlag DEFB 0x00 +ProcentTab DUPL 505,0 + +;[]==========================================================[] + include fvtext.a80 + include fvhex.a80 + include fvprn.a80 + +;[]==========================================================[] +ASCIItab: DEFW 0x0050,0x0230,0x001C,0x007F,0x00,0x0000,TLineUpMs,TBegFile + DEFW 0x0050,0x0230,0x0080,0x00E4,0x00,0x0000,TLineDwnMs,TEndFile + DEFW 0x0000,0x0050,0x001C,0x00E4,0x00,0x0000,TPageUpMs,ScrollLeft + DEFW 0x0230,0x0280,0x001C,0x00E4,0x00,0x0000,TPageDwnMs,ScrollRght + DEFW 0x0000,0x0050,0x00F2,0x0100,0x01,0x0000,About,0x0000 + DEFW 0x0050,0x00A0,0x00F2,0x0100,0x01,0x0000,ChASCIImode,0x0000 + DEFW 0x00A0,0x00F0,0x00F2,0x0100,0x01,0x0000,ChViewer,0x0000 + DEFW 0x0190,0x01E0,0x00F2,0x0100,0x01,0x0000,ChCodePage,0x0000 + DEFW 0x01E0,0x0230,0x00F2,0x0100,0x01,0x0000,FVPrintFile,0x0000 + DEFW 0x0230,0x0280,0x00F2,0x0100,0x21,0x0000,ViewerExit,0x0000 + DEFW 0x8000 + +HEXtab: DEFW 0x0050,0x0230,0x001C,0x007F,0x00,0x0000,HLineUpMs,HBegFile + DEFW 0x0050,0x0230,0x0080,0x00E4,0x00,0x0000,HLineDwnMs,HEndFile + DEFW 0x0000,0x0050,0x001C,0x00E4,0x00,0x0000,HPageUpMs,0x0000 + DEFW 0x0230,0x0280,0x001C,0x00E4,0x00,0x0000,HPageDwnMs,0x0000 + DEFW 0x0000,0x0050,0x00F2,0x0100,0x01,0x0000,About,0x0000 + DEFW 0x00A0,0x00F0,0x00F2,0x0100,0x01,0x0000,ChViewer,0x0000 + DEFW 0x00F0,0x0140,0x00F2,0x0100,0x01,0x0000,HGoTo,0x0000 + DEFW 0x01E0,0x0230,0x00F2,0x0100,0x01,0x0000,FVPrintFile,0x0000 + DEFW 0x0230,0x0280,0x00F2,0x0100,0x21,0x0000,ViewerExit,0x0000 + DEFW 0x8000 + +FVAboutTab: DEFW 0x011C,0x0164,0x008A,0x0098,0x21,0x0000,AboutExt,0x0000 + DEFW 0x0000,0x00A0,0x0000,0x0100,0x20,0x0000,AboutExt,0x0000 + DEFW 0x01E0,0x0280,0x0000,0x0100,0x20,0x0000,AboutExt,0x0000 + DEFW 0x0000,0x0280,0x0000,0x0048,0x20,0x0000,AboutExt,0x0000 + DEFW 0x0000,0x0280,0x009D,0x0100,0x20,0x0000,AboutExt,0x0000 + DEFW 0x8000 +;[]==========================================================[] diff --git a/plugins/fnviewer/fvmain.a80 b/plugins/fnviewer/fvmain.a80 new file mode 100644 index 0000000..5a6f260 --- /dev/null +++ b/plugins/fnviewer/fvmain.a80 @@ -0,0 +1,24 @@ + +; LAST UPDATE: 20.03.2025 savelij + + include macros.a80 + include fn_const.a80 + include fn_macros.a80 + include fn_version.a80 + include accel_sp.a80 + include ports_sp.a80 + include define_sp.a80 + include macros_sp.a80 + include dss_sp.a80 + include bios_sp.a80 + include mouse_sp.a80 + + org PluginOrg ; #C000 - Header lenght +; Flex Navigator plugin header +PluginStart: db "FLX-PLUG" ; Id + dw 0x0000 ; LoadOffset + dw 0x0000 ; EntryOffset + db 0x00 ; PluginMode + db 0x00,0x00,0x00 ; Reserved + +PluginEntry: include fviewer.a80 diff --git a/plugins/fnviewer/fvprn.a80 b/plugins/fnviewer/fvprn.a80 new file mode 100644 index 0000000..f3c397a --- /dev/null +++ b/plugins/fnviewer/fvprn.a80 @@ -0,0 +1,334 @@ + +; LAST UPDATE: 24.03.2025 savelij + +;[]==========================================================[] +FVPrintFile + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 168,96,304,50 + W_FILL 4,2,296,10,COLORI.BLACK + W_TEXT 132,3,COLORI.WHITE,"Print file" + W_BORDER 16,16,272,12 + W_FILL 18,17,268,10,COLORI.WHITE + W_BUTTON 116,32,72,14 + W_TEXT 140,35,COLORP.HIGHGRAY,"Stop" + W_END + LD IX,PrintTab + CALL JUMPS.TestCoords + LD IX,ProcessPrn + LD HL,(FileLenght) + LD DE,(FileLenght+2) + LD A,L + LD L,H + LD H,E + LD E,D + OR A + JR Z,.InitPrn + INC HL + LD A,H + OR L + JR NZ,.InitPrn + INC E +.InitPrn LD (IX+PROC.MAXL1),L + LD (IX+PROC.MAXH1),H + LD (IX+PROC.MAXL2),E + LD (IX+PROC.MAXH2),0x00 + CALL JUMPS.InitProcess + LD A,(ViewMode) + OR A + JP NZ,PrintHEX +PrintASCII LD HL,0x0000 + LD (TempShift),HL + LD (TempShift+2),HL + LD HL,(FileLenght) + LD BC,(FileLenght+2) + GETPORT WINSP.CPU1 + PUSH AF + CALL InitFPages +PrnASCII CALL TestFPages + LD A,(DE) + INC DE + CALL FVPrintCHAR + JR C,PrnASCIIext + CALL FVNxtPrnProc + LD A,H + OR L + JR NZ,.L1 + DEC BC +.L1 DEC HL + LD A,H + OR L + OR B + OR C + JR NZ,PrnASCII + CALL EndJob + jr c,PrnASCIIext + LD DE,0x0000 + CALL FVNxtPrnProc + HALT + HALT +PrnASCIIext POP AF + SETPORT WINSP.CPU1,,0 + WINDOWCLOSE + RET + +PrintHEX LD HL,0x0000 + LD (TempShift),HL + LD (TempShift+2),HL + LD HL,LineBuffer + LD BC,0x5020 +.L1 LD (HL),C + INC L + DJNZ .L1 +PrintHEXlp CALL PrnHEXline + JR C,PrintHEXext + LD HL,(TempShift) + LD DE,0x0010 ;Адрес дампа+16 + ADD HL,DE + LD (TempShift),HL + LD HL,(TempShift+2) + LD E,D + ADC HL,DE + LD (TempShift+2),HL + JR PrintHEXlp + +PrintHEXext CALL EndJob + OR A + JR NZ,PrnHEXe + LD DE,0x0000 + CALL FVNxtPrnProc + HALT + HALT +PrnHEXe + WINDOWCLOSE + RET + +PrnHEXline LD IXL,0x00 + LD HL,(FileLenght) + LD BC,(TempShift) + OR A + SBC HL,BC + EX DE,HL + LD HL,(FileLenght+2) + LD BC,(TempShift+2) + SBC HL,BC + LD A,0x00 + RET C + LD B,0x10 + JR NZ,PrnHLn + LD A,D + OR A + JR NZ,PrnHLn + OR E + LD A,0x00 + SCF + RET Z + LD A,E + CP B + JR NC,PrnHLn + LD B,E +PrnHLn + GETPORT WINSP.CPU1 + PUSH AF + CALL InitFPages + LD HL,LineBuffer+1 ;буфер строки + EXX + LD HL,LineBuffer+0x3F ;место для ASCII кодов + EXX + LD A,(TempShift+3) ;Кладем смещение + CALL PutHexNumb ;от начала фаила + LD A,(TempShift+2) + CALL PutHexNumb + LD A,(TempShift+1) + CALL PutHexNumb + LD A,(TempShift) + CALL PutHexNumb + LD (HL),":" + INC L + INC L +PrnHLoop CALL TestFPages + LD A,(DE) + INC DE + PUSH AF + CALL PutHexNumb + POP AF + INC L + EXX + CP 0x20 + JR NC,.L1 + LD A,"." +.L1 LD (HL),A + INC L + EXX + INC IXL + LD A,IXL + CP 0x04 + JR Z,.PrHNx1 + CP 0x08 + JR Z,.PrHNx1 + CP 0x0C + JR NZ,.L2 +.PrHNx1 INC L +.L2 DJNZ PrnHLoop + POP AF + SETPORT WINSP.CPU1,,0 + LD A,0x10 + SUB IXL + JR Z,.FillP2 + LD B,A + LD C,0x20 +.FillP1 LD (HL),C + INC L + LD (HL),C + INC L + INC L + EXX + LD (HL),0x20 + INC L + EXX + INC IXL + LD A,IXL ;В центре 2 пробела + CP 0x04 + JR Z,.FlPNx1 + CP 0x08 + JR Z,.FlPNx1 + CP 0x0C + JR NZ,.L3 +.FlPNx1 INC L +.L3 DJNZ .FillP1 +.FillP2 LD HL,LineBuffer + LD B,0x50 +PrnHEX LD A,(HL) + INC HL + CALL FVPrintCHAR + LD A,0x01 + RET C + DJNZ PrnHEX + LD A,0x0D + CALL FVPrintCHAR + RET C + LD A,0x0A + CALL FVPrintCHAR + RET + +FVPrintCHAR LD IXL,A + PUSH IX + PUSH HL + PUSH DE + PUSH BC + EXX + PUSH DE + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + JR Z,.PrnCH1 + LD IX,PrintTab + CALL JUMPS.TestCoords + JR C,.PrnCH2 +.PrnCH1 + SPDSS DSSF.SCANKEY + LD A,E +.PrnCH2 POP DE + EXX + POP BC + POP DE + POP HL + POP IX + RET C + JR Z,FVPrnCHAR + CP 0x1B + SCF + RET Z + RES 5,A + CP "S" + JR NZ,FVPrnCHAR +FVStopPrint SCF + RET + +FVPrnCHAR PUSH HL + PUSH DE + PUSH BC + EXX + PUSH DE + LD A,IXL + SPDSS DSSF.PRINT + POP DE + LD A,B + EXX + POP BC + POP DE + POP HL + RET NC + HALT + JR FVPrintCHAR + +PrintTab DEFW 0x011C,0x0164,0x0080,0x008E,0x01,0x0000,FVStopPrint,0x0000 + DEFW 0x8000 + +FVNxtPrnProc LD A,E + OR A + RET NZ + PUSH HL + PUSH DE + PUSH BC + EXX + PUSH DE + LD IX,ProcessPrn + LD L,(IX+PROC.CURL1) + LD H,(IX+PROC.CURH1) + INC HL + LD (IX+PROC.CURL1),L + LD (IX+PROC.CURH1),H + LD A,H + OR L + JR NZ,.NxtProc + LD L,(IX+PROC.CURL2) + LD H,(IX+PROC.CURH2) + INC HL + LD (IX+PROC.CURL2),L + LD (IX+PROC.CURH2),H +.NxtProc CALL JUMPS.PrnProcess + POP DE + EXX + POP BC + POP DE + POP HL + RET + +EndJob: PUSH AF + PUSH HL + PUSH BC + EXX + PUSH DE + ld a,0x0C + CALL FVPrintCHAR + jr c,.print_cancel + ld a,0x1B + CALL FVPrintCHAR + jr c,.print_cancel + ld a,0x40 + CALL FVPrintCHAR + jr c,.print_cancel + POP DE + EXX + POP BC + POP HL + POP AF + ret + +.print_cancel: POP DE + EXX + POP BC + POP HL + POP AF + SCF + RET + +ProcessPrn DEFW 0x00BA + DEFW 0x0071 + DEFW 0x010C + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFB 0x4F diff --git a/plugins/fnviewer/fvtext.a80 b/plugins/fnviewer/fvtext.a80 new file mode 100644 index 0000000..154c095 --- /dev/null +++ b/plugins/fnviewer/fvtext.a80 @@ -0,0 +1,780 @@ + +; LAST UPDATE: 25.03.2025 savelij + +;[]---------------------------------------------------------[] +PrnASCIIpage LD HL,PrintVProc + PUSH HL + LD HL,(FileShift) + LD (TempShift),HL + LD HL,(FileShift+2) + LD (TempShift+2),HL + LD B,0x1C +PrnASCIIlp PUSH BC + CALL PutASCIIline ;Выводим строку в буф и на экран + POP BC + JR C,FillASCIIdn ;CY-Закончились байты для печати + LD A,B + ADD A,0x08 + LD B,A + CP 0xE4 + JR NZ,PrnASCIIlp + LD HL,(TempShift) + LD (FVNextShift),HL + LD HL,(TempShift+2) + LD (FVNextShift+2),HL + SUB A + LD (EmptyLines),A + RET + +;Процедура отчистки нижней области экрана +FillASCIIdn LD A,0xE4 + SUB B + LD (FLenASC),A + JR Z,FASCIIe ;Z-нет отчистки + LD A,B + LD (FPosASC),A + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 0,0,640,0,COLORI.PANEL + W_END +FLenASC EQU $-4 +FPosASC EQU $-8 + +FASCIIe LD HL,(TempShift) + LD (FVNextShift),HL + LD HL,(TempShift+2) + LD (FVNextShift+2),HL + LD A,(FLenASC) + SRL A + SRL A + SRL A + LD (EmptyLines),A + RET + +;Процедура печати тек.строки в буфер и на экран +PutASCIIline LD IXH,B + LD A,(ASCIImode) + OR A + LD C,0x50 + JR Z,.L1 + LD C,0xF0 +.L1 PUSH BC + LD HL,(FileLenght) + LD BC,(TempShift) + SBC HL,BC + EX DE,HL + LD HL,(FileLenght+2) + LD BC,(TempShift+2) + SBC HL,BC + POP BC + RET C + LD B,0xF0 + JR NZ,PutLine + LD A,D + OR A + JR NZ,PutLine + OR E + SCF + RET Z + LD B,E +PutLine LD HL,LineBuffer + GETPORT WINSP.CPU1 + PUSH AF + CALL InitFPages +PutLnLoop CALL TestFPages + LD A,(DE) + INC DE + CP 0x0D + JR NZ,PutLine1 + CALL TestFPages + LD A,(DE) + CP 0x0A + JR NZ,PutLnExit + INC DE + JR PutLnExit + +PutLine1 CP 0x0A + JR Z,PutLnExit + CP 0x09 + JR NZ,PutLine2 +PutTab LD (HL),0x20 + INC L + LD A,L + CP C + JR Z,PutLineWrap;PutLine3 + AND 0x07 + JR NZ,PutTab + JR PutLine3 + +PutLine2 CALL DecodeSymbol ; заменяется на NOP, если не нужна перекодировка + LD (HL),A + LD A,L + CP C + JR Z,PutLineWrap;PutLine3 + INC L +PutLine3 DJNZ PutLnLoop + INC DE +PutLineWrap: dec de + CALL TestFPages + LD A,(DE) + CP 0x0D + JR NZ,PutLnExit + INC DE + CALL TestFPages + LD A,(DE) + CP 0x0A + JR NZ,PutLnExit + INC DE +PutLnExit POP AF + SETPORT WINSP.CPU1,,0 + CALL GetFPages + LD A,(ASCIImode) + OR A + JR NZ,PutLineUWR + LD A,0x50 + SUB L + JR Z,PutLine4 + LD B,A + LD A,0x20 +.L1 LD (HL),A + INC L + DJNZ .L1 +PutLine4 LD HL,LineBuffer + LD DE,0x0000 + LD B,0x50 + LD C,IXH + LD A,COLORP.PANEL + COLORI.FILES + CALL JUMPS.PrnTxtLnNormC + OR A + RET + +DecodeSymbol: CP 0x80 + RET C + PUSH HL + SUB 0x80 + LD HL,Table866 +.table EQU $-2 + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD A,(HL) + POP HL + RET + +PutLineUWR LD C,IXH + LD A,L + LD (SaveUW),A + LD A,(ASCIIaddX) + ADD A,0x50 + SUB L + JR Z,PutLnUW1 + JR C,PutLnUW1 + LD B,A + LD A,0x20 +.L1 LD (HL),A + INC L + DJNZ .L1 +PutLnUW1 LD E,0x00 + LD B,0x50 + LD H,HIGH (LineBuffer) + LD A,(ASCIIaddX) + LD L,A ;смещение от начала строки + OR A + JR Z,PutLnUW2 + PUSH HL + PUSH BC + LD HL,SpaceLeft + LD D,0x00 + LD B,0x01 + LD A,COLORP.PANEL + COLORI.YELLOW ;(Yellow) + CALL JUMPS.PrnTxtLnNormC + POP BC + POP HL + INC L + DEC B + LD A,(ASCIIaddX) + LD E,0x08 +PutLnUW2 LD D,A + LD A,0x00 +SaveUW EQU $-1 + SUB D + JR C,PutLnUW3 + CP 0x51 + JR C,PutLnUW3 + PUSH HL + PUSH DE + PUSH BC + LD HL,SpaceRight + LD DE,0x0278 + LD B,0x01 + LD A,COLORP.PANEL + COLORI.YELLOW ;(Yellow) + CALL JUMPS.PrnTxtLnNormC + POP BC + POP DE + POP HL + DEC B +PutLnUW3 LD D,0x00 + LD A,COLORP.PANEL + COLORI.FILES ;(Yellow) + CALL JUMPS.PrnTxtLnNormC + OR A + RET + +SpaceLeft DEFB 0x1B +SpaceRight DEFB 0x1A + +;[]==========================================================[] +ChCodePage: LD HL,ViewerBegin + EX (SP),HL + LD A,(CodePage) + INC A + CP 3 + JR C,.L1 + XOR A +.L1 LD (CodePage), A + RET + +;[]==========================================================[] +ChASCIImode LD HL,ViewerBegin + EX (SP),HL + LD A,(ASCIImode) + XOR 0x01 + LD (ASCIImode),A + RET Z + SUB A + LD (ASCIIaddX),A + RET + +;[]----------------------------------------------------------[] +ScrollLeft LD A,(ASCIImode) + OR A + RET Z + LD A,(ASCIIaddX) + OR A + RET Z + DEC A + LD (ASCIIaddX),A + CALL PrnASCIIpage + RET + +;[]----------------------------------------------------------[] +ScrollRght LD A,(ASCIImode) + OR A + RET Z + LD A,(ASCIIaddX) + CP 0xA0 + RET Z + INC A + LD (ASCIIaddX),A + CALL PrnASCIIpage + RET + +;[]----------------------------------------------------------[] +THome LD A,(ASCIImode) + OR A + RET Z + LD A,(ASCIIaddX) + OR A + RET Z + SUB A + LD (ASCIIaddX),A + CALL PrnASCIIpage + RET + +;[]----------------------------------------------------------[] +TEnd LD A,(ASCIImode) + OR A + RET Z + LD A,(ASCIIaddX) + CP 0xA0 + RET Z + LD A,0xA0 + LD (ASCIIaddX),A + CALL PrnASCIIpage + RET + +;[]----------------------------------------------------------[] +TLineUpMs CALL TLineUp + RET C + LD B,0x0A +TUpMs1 PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ TUpMs1 +TUpMs2 CALL TLineUp + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR TUpMs2 +TLineUp LD HL,(FileShift) + LD DE,(FileShift+2) + LD A,H + OR L + OR D + OR E + SCF + RET Z + CALL SearchUp + LD (FileShift),HL + LD (FileShift+2),DE + LD (TempShift),HL + LD (TempShift+2),DE + LD HL,EmptyLines + LD A,(HL) + DEC (HL) + OR A + JR NZ,TLineU1 + INC (HL) + LD HL,(FVNextShift) + LD DE,(FVNextShift+2) + CALL SearchUp + LD (FVNextShift),HL + LD (FVNextShift+2),DE +TLineU1 CALL ScrollSCRdown + LD B,0x1C + CALL PutASCIIline ;Создаем и печатаем строку + CALL PrintVProc + OR A + RET + +;[]----------------------------------------------------------[] +TLineDwnMs CALL TLineDwn + RET C + LD B,0x0A +TDnMs1 PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ TDnMs1 +TDnMs2 CALL TLineDwn + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR TDnMs2 + +TLineDwn LD HL,(FVNextShift) + LD DE,(FVNextShift+2) + LD BC,(FileLenght) + OR A + SBC HL,BC + LD BC,(FileLenght+2) + EX DE,HL + SBC HL,BC + CCF + RET C + LD HL,(FileShift) + LD DE,(FileShift+2) + CALL SearchDown + LD (FileShift),HL + LD (FileShift+2),DE + LD HL,(FVNextShift) + LD DE,(FVNextShift+2) + LD (TempShift),HL + LD (TempShift+2),DE + CALL ScrollSCRup + LD B,0xDC + CALL PutASCIIline ;Создаем и печатаем строку + LD HL,(TempShift) + LD DE,(TempShift+2) + LD (FVNextShift),HL + LD (FVNextShift+2),DE + CALL PrintVProc + OR A + RET + +;[]----------------------------------------------------------[] +TPageUpMs CALL TPageUp + RET C + LD B,0x0A +TUpMs1p PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ TUpMs1p +TUpMs2p CALL TPageUp + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR TUpMs2p + +TPageUp LD HL,(FileShift) + LD DE,(FileShift+2) + LD A,H + OR L + OR D + OR E + SCF + RET Z + LD B,0x19 +TPageU1 PUSH BC + CALL SearchUp + POP BC + JR C,TPageU2 + DJNZ TPageU1 +TPageU2 LD (FileShift),HL + LD (FileShift+2),DE + CALL PrnASCIIpage + OR A + RET + +;[]----------------------------------------------------------[] +TPageDwnMs CALL TPageDwn + RET C + LD B,0x0A +TDnMs1p PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ TDnMs1p +TDnMs2p CALL TPageDwn + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR TDnMs2p + +TPageDwn LD HL,(FVNextShift) + LD DE,(FVNextShift+2) + LD BC,(FileLenght) + OR A + SBC HL,BC + LD BC,(FileLenght+2) + EX DE,HL + SBC HL,BC + CCF + RET C + LD HL,(FVNextShift) + LD (FileShift),HL + LD HL,(FVNextShift+2) + LD (FileShift+2),HL + CALL PrnASCIIpage + OR A + RET + +;[]----------------------------------------------------------[] +TBegFile LD HL,JUMPS.ResFire + PUSH HL + LD HL,(FileShift) + LD DE,(FileShift+2) + LD A,H + OR D + OR L + OR E + RET Z + LD HL,0x0000 + LD (FileShift),HL + LD (FileShift+2),HL + CALL PrnASCIIpage + RET + +;[]----------------------------------------------------------[] +TEndFile LD HL,JUMPS.ResFire + PUSH HL + LD HL,(FVNextShift) + LD DE,(FVNextShift+2) + LD BC,(FileLenght) + OR A + SBC HL,BC + LD BC,(FileLenght+2) + EX DE,HL + SBC HL,BC + RET NC + LD HL,(FileLenght) + LD DE,(FileLenght+2) + LD B,0x19 +TEndFl1 PUSH BC + CALL SearchUp + POP BC + RET C + DJNZ TEndFl1 + LD (FileShift),HL + LD (FileShift+2),DE + CALL PrnASCIIpage + RET + +;[]==========================================================[] +SearchUp LD B,0xF0 + LD A,D + OR E + JR NZ,.SearchUpBeg + LD A,H + OR A + JR NZ,.SearchUpBeg + OR L + SCF + RET Z + LD B,L +.SearchUpBeg + GETPORT WINSP.CPU1 + PUSH AF + PUSH HL + PUSH DE + LD A,H ;Выделяем номер страницы + RLA + RL E + RLA + RL E + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H + LD C,0x00 + LD IXL,C + INC C + DEC B + DEC HL + BIT 6,H + JR NZ,.SrchUp0 + DEC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + SET 6,H +.SrchUp0 LD A,(HL) + CP 0x0A + JR NZ,.L3 + LD A,B + OR A + JR Z,.SrchUpEx + INC C + DEC B + DEC HL + BIT 6,H + JR NZ,.SrchUp1 + DEC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + SET 6,H +.SrchUp1 LD A,(HL) +.L3 CP 0x0D + JR Z,.SearchUpLp + DEC C + INC B + INC HL + BIT 7,H + JR Z,.SearchUpLp1 + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H + JR .SearchUpLp1 + +.SearchUpLp LD A,B + OR A + JR Z,.SrchUpEx +.SearchUpLp1 DEC HL + BIT 6,H + JR NZ,.SrchUp2 + DEC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + SET 6,H +.SrchUp2 LD A,(HL) + CP 0x0A + JR Z,.SrchUpEx + CP 0x0D + JR Z,.SrchUpEx + CP 0x09 + JR NZ,.L1 + ld a,7 + add a,c + ld c,a + ld a,7 + add a,IXL + ld IXL,a + ld a,b + sub 7 + jr z,.SrchUpEx + jr c,.SrchUpEx +.L1 INC IXL + INC C + DJNZ .SearchUpLp1 +.SrchUpEx POP DE + POP HL + LD B,0x00 + OR A + SBC HL,BC + LD C,B + EX DE,HL + SBC HL,BC + EX DE,HL + POP AF + SETPORT WINSP.CPU1,,0 + LD A,(ASCIImode) + OR A + RET NZ + LD A,IXL + CP 0x51 + CCF + RET NC + LD C,0x50 +.SrchUpEx0 ADD HL,BC + JR NC,.L2 + INC DE +.L2 SUB 0x50 + CP 0x51 + JR NC,.SrchUpEx0 + OR A + RET + +;[]----------------------------------------------------------[] +SearchDown LD (SrchHL),HL + LD (SrchDE),DE + LD A,(ASCIImode) + OR A + LD B,0x50 + JR Z,.L1 + LD B,0xF0 +.L1 PUSH BC + LD C,L + LD B,H + LD HL,(FileLenght) + OR A + SBC HL,BC + LD C,E + LD B,D + EX DE,HL + LD HL,(FileLenght+2) + SBC HL,BC + POP BC + RET C + JR NZ,.SearchDnBeg + LD A,D + OR A + JR NZ,.SearchDnBeg + OR E + SCF + RET Z + LD B,E +.SearchDnBeg + LD HL,0x0000 +SrchHL EQU $-2 + LD DE,0x0000 +SrchDE EQU $-2 + GETPORT WINSP.CPU1 + PUSH AF + PUSH HL + PUSH DE + LD A,H ;Выделяем номер страницы + RLA + RL E + RLA + RL E + LD D,HIGH (PagesList) + LD A,(DE) ;Тек.страница + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H + LD C,0x00 + DEC HL +SearchDnLp INC C + INC HL + BIT 7,H + JR Z,SrchDn0 + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H +SrchDn0 LD A,(HL) + CP 0x0D + JR NZ,SrchE1 + INC HL + BIT 7,H + JR Z,SrchDn1 + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H +SrchDn1 LD A,(HL) + CP 0x0A + JR NZ,SrchEEx + INC C + JR SrchEEx + +SrchE1 CP 0x0A + JR Z,SrchEEx + DJNZ SearchDnLp + INC HL + BIT 7,H + JR Z,SrchDnE + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H +SrchDnE LD A,(HL) + CP 0x0D + JR NZ,SrchEEx + INC C + INC HL + BIT 7,H + JR Z,SrchDE1 + INC E + LD A,(DE) + SETPORT WINSP.CPU1,,0 + RES 7,H + SET 6,H +SrchDE1 LD A,(HL) + CP 0x0A + JR NZ,SrchEEx + INC C +SrchEEx POP DE + POP HL + LD B,0x00 + ADD HL,BC + LD C,B + EX DE,HL + ADC HL,BC + EX DE,HL + POP AF + SETPORT WINSP.CPU1,,0 + OR A + RET + +Table866: db 0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8 + db 0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F + db 0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D + db 0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F + db 0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15 + db 0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4 + db 0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA + db 0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5 + db 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87 + db 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F + db 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97 + db 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F + db 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7 + db 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF + db 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7 + db 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF +; koi8-r +TableKoi: db 0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4 + db 0xC2,0xC1,0xC5,0xDF,0xDC,0xDB,0xDD,0xDE + db 0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7 + db 0xF3,0xF2,0xFF,0xF5,0xF8,0xFD,0xFA,0xF6 + db 0xCD,0xBA,0xD5,0xF1,0xD6,0xC9,0xB8,0xB7 + db 0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6 + db 0xC7,0xCC,0xB5,0xF0,0xB6,0xB9,0xD1,0xD2 + db 0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0xFC + db 0xEE,0xA0,0xA1,0xE6,0xA4,0xA5,0xE4,0xA3 + db 0xE5,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE + db 0xAF,0xEF,0xE0,0xE1,0xE2,0xE3,0xA6,0xA2 + db 0xEC,0xEB,0xA7,0xE8,0xED,0xE9,0xE7,0xEA + db 0x9E,0x80,0x81,0x96,0x84,0x85,0x94,0x83 + db 0x95,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E + db 0x8F,0x9F,0x90,0x91,0x92,0x93,0x86,0x82 + db 0x9C,0x9B,0x87,0x98,0x9D,0x99,0x97,0x9A diff --git a/plugins/help/build.bat b/plugins/help/build.bat new file mode 100644 index 0000000..7d0c35c --- /dev/null +++ b/plugins/help/build.bat @@ -0,0 +1,21 @@ + +@echo off + +if not exist tmp md tmp +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\sprinter_src\tools\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\sprinter_src\;d:\yad\sprinter_src\flexnav\src\ + +asl -U -L -C -x -olist tmp\header.lst -i %includes% header.a80 || goto error +p2bin header.p ..\help.flx -r $-$ -k + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit diff --git a/plugins/help/header.a80 b/plugins/help/header.a80 new file mode 100644 index 0000000..929ab4b --- /dev/null +++ b/plugins/help/header.a80 @@ -0,0 +1,30 @@ + +; LAST UPDATE: 26.03.2025 savelij + + include macros.a80 + include fn_const.a80 + include fn_macros.a80 + include fn_version.a80 + include accel_sp.a80 + include ports_sp.a80 + include define_sp.a80 + include macros_sp.a80 + include dss_sp.a80 + include bios_sp.a80 + include mouse_sp.a80 + +WINSP_CPU EQU WINSP.CPU1 +WINSP_ADR EQU 0x4000 + + org PluginOrg ; #C000 - Header lenght +; Flex Navigator plugin header +PluginStart: db "FLX-PLUG" ; Id + dw 0x0000 ; LoadOffset + dw 0x0000 ; EntryOffset + db 0x00 ; PluginMode + db 0x00,0x00,0x00 ; Reserved + +PluginEntry: include help.a80 + +HelpText: include help_t.a80 +HelpTextEnd: diff --git a/plugins/help/help.a80 b/plugins/help/help.a80 new file mode 100644 index 0000000..a4f39af --- /dev/null +++ b/plugins/help/help.a80 @@ -0,0 +1,401 @@ + +; LAST UPDATE: 23.04.2025 savelij + +;[]==========================================================[] +HelpR LD A,0x01 + LD (JUMPS.CMOSPrint),A + SETPORT WINSP.Y_PORT,0xC0 + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 64,16,512,224 + W_FILL 4,2,504,10,COLORI.BLACK + W_TEXT 248,3,COLORI.WHITE,"Help" + W_BUTTON 220,206,72,14 + W_TEXT 250,209,COLORP.HIGHGRAY,"Ok" + W_BORDER 8,16,496,187 + W_FILL 10,17,476,185,COLORI.WHITE + W_ICONUPARROW 486,17 + W_ICONDOWNARROW 486,194 + W_END + CALL InitHelpTxt + CALL PrnHelpPg + CALL JUMPS.ResFire +HelpLoop LD IX,HelpTab + CALL JUMPS.TestCoords + SPDSS DSSF.SCANKEY + JR Z,HelpLoop + LD A,B + OR A + JR NZ,HelpLoop + LD A,E ; Е-ASCII код + CP 0x1B ; Esc + JP Z,HelpExit + CP 0x0D ; Enter + JP Z,HelpExit + RES 5,A + CP 'O' + JP Z,HelpExit + OR A + JR NZ,HelpLoop ; Ждем функцион.клавиши + LD HL,HelpLoop + PUSH HL + LD A,D + CP SC.X8 ; Стрелка вверх + JP Z,HLineUp + CP SC.X2 ; Стрелка вниз + JP Z,HLineDown + CP SC.X9 ; PageUp + JP Z,HPageUp + CP SC.X3 ; PageDown + JP Z,HPageDown + CP SC.X7 ; Home + JP Z,HHome + CP SC.X1 ; End + JP Z,HEnd + RET + +HelpExit + WINDOWCLOSE + SUB A + LD (JUMPS.CMOSPrint),A + RET + +;[]----------------------------------------------------------[] +InitHelpTxt LD HL,HelpText + LD (PageShift),HL + LD HL,0x0000 + LD (CHLine),HL + LD HL,HelpText + LD DE,0x0000 +InHelp1 LD BC,0x1000 + SUB A + CPIR + INC DE + LD A,(HL) + INC A + JR NZ,InHelp1 + DEC DE + LD (EHLines),DE + LD IX,HelpVBar + JP JUMPS.InitScrollBar + +PageShift DW 0 +NextShift DW 0 +HelpVBar DW 550 ; X позиция скролбара + DW 41 ; Y позиция скролбара + DW 169 ; Max длина скролбара + DW 0 ; тек.длина скролбара + DW HBarUp ; Адрес ячейки BarLeft + DW HBarDn ; Адрес ячейки BarRight + DW 23 ; Кол-во строк на странице +EHLines DW 0 ; Общее кол-во строк +CHLine DW 0 ; Первая строка на странице + +;[]----------------------------------------------------------[] +PrnHelpPg LD HL,(PageShift) + LD B,34 +PrnHPg1 PUSH BC + CALL ClearHRect + LD DE,80 + LD C,B + LD B,D + LD A,(HL) + INC A + LD A,240 + CALL NZ,JUMPS.PrnTxtLnIFF + POP BC + LD A,B + ADD A,8 + LD B,A + CP 218 + JR NZ,PrnHPg1 + LD (NextShift),HL + LD IX,HelpVBar + JP JUMPS.PrnVScrBar + +ClearHRect PUSH HL + PUSH BC + GETPORT WINSP_CPU + PUSH AF + DI + SETPORT WINSP_CPU,0x50 + LD HL,WINSP_ADR + 40 + LD IXL,B + LD D,COLORP.WHITE + COLORI.WHITE + ACCEL ACCELCMD.SET_BUFFER + LD A,0xE8 + ACCEL ACCELCMD.OFF + LD B,0x08 +ClHRect LD A,IXL + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.FILL + LD (HL),D + ACCEL ACCELCMD.OFF + INC IXL + DJNZ ClHRect + POP AF + SETPORT WINSP_CPU,,0 + SETPORT WINSP.Y_PORT,0xC0 + EI + POP BC + POP HL + RET + +;[]----------------------------------------------------------[] +HHome LD HL,(PageShift) + LD DE,HelpText + OR A + SBC HL,DE + RET Z + LD (PageShift),DE + LD HL,0x0000 + LD (CHLine),HL + JP PrnHelpPg + +HEnd LD HL,(NextShift) + LD A,(HL) + INC A + RET Z + LD HL,HelpTextEnd + DEC HL + DEC HL + PUSH HL + LD DE,HelpText + OR A + SBC HL,DE + LD C,L + LD B,H + POP HL + LD DE,(EHLines) + DEC HL + LD A,0x17 +.L1 EX AF,AF' + SUB A + DEC DE + CPDR + JP PO,.L2 + EX AF,AF' + DEC A + JR NZ,.L1 + INC HL +.L2 INC HL + LD (PageShift),HL + INC DE + LD (CHLine),DE + JP PrnHelpPg + +HLineUp LD HL,(PageShift) + LD DE,HelpText + OR A + SBC HL,DE + RET Z + LD C,L + LD B,H + ADD HL,DE + DEC HL + SUB A + CPD + JP PO,HLnUp0 + CPDR + INC HL +HLnUp0 INC HL + LD (PageShift),HL + LD DE,HelpTextEnd + DEC DE + EX DE,HL + OR A + SBC HL,DE + EX DE,HL + LD C,E + LD B,D + LD A,0x17 +HLnUp1 EX AF,AF' + SUB A + CPIR + JP PO,HLnUp2 + EX AF,AF' + DEC A + JR NZ,HLnUp1 +HLnUp2 LD (NextShift),HL + LD HL,(CHLine) + DEC HL + LD (CHLine),HL + LD DE,0x222A + CALL ScrHELPDnUp + LD B,34 + CALL ClearHRect + LD HL,(PageShift) + LD DE,80 + LD C,B + LD B,D + LD A,(HL) + INC A + LD A,240 + CALL NZ,JUMPS.PrnTxtLnIFF + LD IX,HelpVBar + JP JUMPS.PrnVScrBar + +HLineDown LD HL,(NextShift) + LD A,(HL) + INC A + RET Z + PUSH HL + LD DE,HelpTextEnd + EX DE,HL + OR A + SBC HL,DE + EX DE,HL + LD C,E + LD B,D + SUB A + CPIR + LD (NextShift),HL + LD HL,(PageShift) + LD DE,HelpTextEnd + EX DE,HL + OR A + SBC HL,DE + EX DE,HL + LD C,E + LD B,D + SUB A + CPIR + LD (PageShift),HL + LD HL,(CHLine) + INC HL + LD (CHLine),HL + LD DE,0x2A22 + CALL ScrHELPDnUp + POP HL + LD B,210 + CALL ClearHRect + LD DE,80 + LD C,B + LD B,D + LD A,(HL) + INC A + LD A,240 + CALL NZ,JUMPS.PrnTxtLnIFF + LD IX,HelpVBar + JP JUMPS.PrnVScrBar + +;На вход: +; D - Y откуда +; Е - Y куда +ScrHELPDnUp + GETPORT WINSP_CPU + PUSH AF + DI + SETPORT WINSP_CPU,0x50 + LD HL,WINSP_ADR + 40 + LD B,0xE8 + ACCEL ACCELCMD.SET_BUFFER + LD A,0xB0 + ACCEL ACCELCMD.OFF +ScHelp1 LD A,D + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD A,(HL) + ACCEL ACCELCMD.OFF + LD A,E + SETPORT WINSP.Y_PORT,,0 + ACCEL ACCELCMD.COPY_VERT + LD (HL),A + ACCEL ACCELCMD.OFF + INC HL + DJNZ ScHelp1 + POP AF + SETPORT WINSP_CPU,,0 + SETPORT WINSP.Y_PORT,0xC0 + EI + RET + +HPageUpM CALL HPageUp + RET C + LD B,0x0A +HUpM1 PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ HUpM1 +HUpM2 CALL HPageUp + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR HUpM2 + +HPageUp LD HL,(PageShift) + LD DE,HelpText + OR A + SBC HL,DE + SCF + RET Z + LD C,L + LD B,H + ADD HL,DE + LD DE,(CHLine) + DEC HL + LD A,0x18 +.L1 EX AF,AF' + SUB A + DEC DE + CPDR + JP PO,.L2 + EX AF,AF' + DEC A + JR NZ,.L1 + INC DE + INC HL +.L2 INC HL + LD (PageShift),HL + LD (CHLine),DE + CALL PrnHelpPg + OR A + RET + +HPageDownM CALL HPageDown + RET C + LD B,0x0A +HDnM1 PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 0,A + RET Z + HALT + DJNZ HDnM1 +HDnM2 CALL HPageDown + RET C + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + RET Z + JR HDnM2 + +HPageDown LD HL,(NextShift) + LD A,(HL) + INC A + SCF + RET Z + LD (PageShift),HL + LD HL,(CHLine) + LD DE,0x0017 + ADD HL,DE + LD (CHLine),HL + CALL PrnHelpPg + OR A + RET + +;[]==========================================================[] +HelpTab DW 550,566, 33, 41,%0000000000000011,0,HLineUp,0 + DW 550,566,210,218,%0000000000000011,0,HLineDown,0 + DW 550,566, 41, 0,%0000000000000000,0,HPageUpM,0 +HBarUp EQU $ - 10 + DW 550,566, 0,210,%0000000000000000,0,HPageDownM,0 +HBarDn EQU $ - 12 + DW 284,356,222,236,%0000000000100001,0,HelpExit,0 + DW 0, 64, 0,256,%0000000000100000,0,HelpExit,0 + DW 576,640, 0,256,%0000000000100000,0,HelpExit,0 + DW 0,640, 0, 16,%0000000000100000,0,HelpExit,0 + DW 0,640,240,256,%0000000000100000,0,HelpExit,0 + DW 0x8000 diff --git a/plugins/help/help_t.a80 b/plugins/help/help_t.a80 new file mode 100644 index 0000000..cac53e7 --- /dev/null +++ b/plugins/help/help_t.a80 @@ -0,0 +1,137 @@ + +; LAST UPDATE: 26.03.2025 savelij + + DB 0,0 + DB " Flex Navigator",0,0 + DB " version \{FLEX_VERS.NAVIGATOR}",0,0,0 + DB " Copyright (C) 2000, Enin Anton, St.-Petersburg, Russia",0 + DB " Copyright (C) 2023, Sprinter Team",0 + DB 0 + DB " All right reserved.",0,0,0,0 + DB " Руководство пользователя.",0,0,0,0 + DB " ОГЛАВЛЕНИЕ",0 + DB " ────────────────────",0,0," ",9 + DB " ВВЕДЕНИЕ",0," ",9 + DB " НАЧАЛО РАБОТЫ",0," ",9 + DB " ФАЙЛОВАЯ ПАНЕЛЬ",0," ",9 + DB " СТРОКА DOS",0," ",9 + DB " МЕНЮ -File-",0," ",9 + DB " МЕНЮ -Select-",0," ",9 + DB " МЕНЮ -Option-",0," ",9 + DB " МЕНЮ -View-",0," ",9 + DB " МЕНЮ -Config-",0," ",9 + DB " МЕНЮ -About-",0," ",9 + DB " ФАЙЛЫ РАСШИРЕНИЙ",0,0 + DB " ────────────────────",0,0,0," ",9 + DB " ВВЕДЕНИЕ",0,0 + DB " Добро пожаловать в Flex Navigator - программное обеспечение, которое облегчит",0 + DB "Вашу работу с данными в формате MS-DOS.",0,0,0," ",9 + DB " НАЧАЛО РАБОТЫ",0,0 + DB " Flex Navigator представляет собой привычную файловую оболочку типа Norton",0 + DB "Commander (на PC) или Commander DOS (на Sprinter'е), только выполнен в",0 + DB "графическом интерфейсе. Реализованы практически все функции файловой",0 + DB "оболочки для работы в DOS.",0 + DB " Если Вы хотите, чтобы Flex Navigator начинал свою работу после включения",0 + DB "компьютера, то в файле SYSTEM.BAT необходимо прописать полный путь с его",0 + DB "именем.",0,0,0," ",9 + DB " ФАЙЛОВАЯ ПАНЕЛЬ",0,0 + DB " Файловая панель представляет собой углубление со списком файлов текущей",0 + DB "директории с полосой прокрутки. Переход от одной панели к другой осуществляется",0 + DB "при помощи клавиши Tab. Поменять панели местами можно клавишей Ctrl+U.",0,0 + DB " Курсорные клавиши - движение по файлам",0 + DB " PageUp - на страницу файлов назад",0 + DB " PageDown - на страницу файлов вперед",0 + DB " Home - в начало списка файлов",0 + DB " End - в конец списка файлов",0 + DB " Alt+F1 - сменить носитель для левой панели",0 + DB " Alt+F2 - сменить носитель для правой панели",0 + DB " Alt+F3 - просмотр файла встроенным просмотрщиком файлов",0 + DB " Alt+F4 - редактирование файла встроенным редактором файлов",0 + DB " Shift+F3 - ввести имя файла для просмотра",0 + DB " Shift+F4 - ввести имя файла для редактирования",0 + DB " Ctrl+\\ - перечитать корневой каталог",0 + DB " F1 - помощь",0 + DB " F3 - просмотреть файл",0 + DB " F4 - редактировать файл",0 + DB " F5 - копировать файл(ы)",0 + DB " F6 - переименовать файл",0 + DB " F8 - удалить файл(ы)",0 + DB " F9 - строка меню",0 + DB " F10 - выход в DOS",0 + DB " Alt+Enter - информация о файле",0 + DB " Ctrl+F9 - распечатать файл на принтере",0 + DB " + - маркировать группу файлов",0 + DB " - - ремаркировать группу файлов",0 + DB " * - обратить маркировку",0 + DB " Ctrl+ - маркировать все файлы",0 + DB " Ctrl- - ремаркировать все файлы",0 + DB " Alt+F10 - обновить дерево каталогов",0 + DB " Ctrl+L - информация о текущем носителе",0 + DB " Ctrl+F1 - краткий список файлов",0 + DB " Ctrl+F2 - полный список файлов",0 + DB " Ctrl+F3 - сортировка по имени",0 + DB " Ctrl+F4 - сортировка по расширению",0 + DB " Ctrl+F5 - сортировка по датам",0 + DB " Ctrl+F6 - сортировка по размеру",0 + DB " Ctrl+F7 - без сортировки",0 + DB " Ctrl+F8 - дерево каталогов",0 + DB " Ctrl+F10 - список всех файлов",0 + DB " Ctrl+F11 - список запускаемых файлов",0 + DB " Ctrl+F12 - фильтр для списка файлов",0 + DB " Alt+A..Z - быстрый поиск файла",0,0,0," ",9 + DB " СТРОКА DOS",0,0 + DB " Строка DOS служит в основном для запуска файлов с параметрами. Для",0 + DB "активизации строки необходимо попасть в нее курсором мыши или нажать клавишу",0 + DB "не относящуюся к функциональным.",0,0 + DB " Ctrl+E - предистория строки",0 + DB " Ctrl+Enter - поместить в строку текущее имя файла",0 + DB " Ctrl+[ - поместить в строку полный путь левой панели",0 + DB " Ctrl+] - поместить в строку полный путь правой панели",0,0,0," ",9 + DB " МЕНЮ - File -",0,0 + DB " File info... - информация о текущем файле (имя, длина, дата создания,",0 + DB " атрибут, первый кластер файла)",0 + DB " Print - распечатать файл на принтере",0 + DB " Exit - выход в DOS",0,0,0," ",9 + DB " МЕНЮ - Select -",0,0 + DB " Mark group... - маркировать группу файлов",0 + DB " Unmark group... - ремаркировать группу файлов",0 + DB " Mark all - маркировать все файлы",0 + DB " Unmark all - ремаркировать все файлы",0 + DB " Invert selection - обратить выделение",0,0,0," ",9 + DB " МЕНЮ - Option -",0,0 + DB " Refresh tree - обновить дерево каталогов",0 + DB " Disk info... - информация о текущем носителе",0 + DB " System information... - информация о системе",0,0,0," ",9 + DB " МЕНЮ - View -",0,0 + DB " Brief - краткий список файлов",0 + DB " Full - подробный список файлов",0 + DB " Tree - дерево каталогов",0 + DB " All files - список всех файлов",0 + DB " Execute files - список запускаемых файлов",0 + DB " *.* - установить фильтр для списка файлов",0 + DB " Filtr... - фильтр для списка файлов",0 + DB " Name - сортировать по имени",0 + DB " Extention - сортировать по расширению",0 + DB " Data - сортировать по дате",0 + DB " Size - сортировать по размеру",0 + DB " Unsorted - без сортировки",0,0,0," ",9 + DB " МЕНЮ - Config -",0,0 + DB " Setup... - установки для Flex Navigator",0,0,0," ",9 + DB " МЕНЮ - About -",0,0 + DB " Version... - информация о версии Flex Navigator",0,0,0," ",9 + DB " ФАЙЛЫ РАСШИРЕНИЙ",0,0 + DB " Для подключения внешних программ для работы с файлами существуют файлы",0 + DB "расширений. Flex Navigator использует три файла расширений:",0,0 + DB " fn.ext - главный файл расширений",0 + DB " fnview.ext - файл расширений прострмотра",0 + DB " fnedit.ext - файл расширений редактора",0,0 + DB " Формат файлов расширений:",0,0 + DB " ext: [drive]:\\[path]\\filename.ext parametr",0,0 + DB " где: ext - расширение файла",0 + DB " [drive]:\\[path]\\filename.ext - внешняя подключаемая программа",0 + DB " parametr - !.! текущее имя файла",0 + DB " !: текущее устройство",0 + DB " !\\ текущий путь",0,0,0 + DB " ────────────────────",0 + DB " Россия, г. Хабаровск, tolik.trek@gmail.com",0 + DB 0xFF diff --git a/plugins/test/Q_START.ENG b/plugins/test/Q_START.ENG new file mode 100644 index 0000000..e7237ab --- /dev/null +++ b/plugins/test/Q_START.ENG @@ -0,0 +1,2 @@ +1. Copy TEST.FLX file to the Sprinter +2. Execute TEST.FLX in Flex Navigator. \ No newline at end of file diff --git a/plugins/test/build.bat b/plugins/test/build.bat new file mode 100644 index 0000000..e6e9708 --- /dev/null +++ b/plugins/test/build.bat @@ -0,0 +1,21 @@ + +@echo off + +if not exist tmp md tmp +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\sprinter_src\tools\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\sprinter_src\;d:\yad\sprinter_src\flexnav\src\ + +asl -U -L -C -x -olist tmp\test.lst -i %includes% test.a80 || goto error +p2bin test.p ..\test.flx -r $-$ -k + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit diff --git a/plugins/test/test.a80 b/plugins/test/test.a80 new file mode 100644 index 0000000..e02a9d7 --- /dev/null +++ b/plugins/test/test.a80 @@ -0,0 +1,75 @@ + +; LAST UPDATE: 24.03.2025 savelij + +;// DEVICE ZXSPECTRUM128 +;[]=======================================================================[] +; +; test.z80 -- test plugin for Flex Navigator v1.xx +; +; Created by Anton Enin 08-June-2002 +; +; Last update 08-June-2002 +; +; Copyright (C) 2002 R-lab +; +; This program should be compiled using z80asm +; http://www.zxasm.narod.ru/ +; +;[]=======================================================================[] + +;// include '../fplugin.inc' + include macros.a80 + include fn_const.a80 + include fn_macros.a80 + include macros_sp.a80 + include dss_sp.a80 + + org PluginOrg ; #C000 - Header lenght +PluginStart: ; Flex Navigator plugin header + db "FLX-PLUG" ; Id + dw 0x0000 ; LoadOffset + dw PluginEntry ; EntryOffset + db 0x00 ; PluginMode + db 0x00, 0x00, 0x00 ; Reserved + +PluginEntry: + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,80,192,96 + W_FILL 4,2,184,10,COLORI.BLACK + W_TEXT 82,3,COLORI.WHITE,"Plugin" + W_TEXT 16,20,COLORI.BLUE + COLORP.HIGHGRAY,"Flex Navigator v1.xx Plugin Test" + W_TEXT 46,38,COLORP.HIGHGRAY,"Written by Enin Anton" + W_TEXT 64,48,COLORP.HIGHGRAY,"June, 8 2002" + W_TEXT 52,58,COLORP.HIGHGRAY,"Copyright (c) 2002" + W_BUTTON 60,74,72,14 + W_TEXT 88,77,COLORP.HIGHGRAY,"Ok" + W_END + call JUMPS.ResFire +.plugin_loop: + ld ix, PluginMouseTab + call JUMPS.TestCoords + SPDSS DSSF.SCANKEY + jr z, .plugin_loop + ld a, b + or a + jr nz, .plugin_loop + ld a, e + cp 0x1B + jr z, PluginExit + cp 0x0D + jr nz, .plugin_loop +PluginExit: + WINDOWCLOSE + or a ; cf = 0 + ret + +;[]=======================================================================[] +PluginMouseTab: + dw 0x011C, 0x0164, 0x009A, 0x00A8, 0x0021, 0x0000, PluginExit, 0x0000 + dw 0x0000, 0x00E0, 0x0000, 0x0100, 0x0020, 0x0000, PluginExit, 0x0000 + dw 0x01A0, 0x0280, 0x0000, 0x0100, 0x0020, 0x0000, PluginExit, 0x0000 + dw 0x0000, 0x0280, 0x0000, 0x0050, 0x0020, 0x0000, PluginExit, 0x0000 + dw 0x0000, 0x0280, 0x00B0, 0x0100, 0x0020, 0x0000, PluginExit, 0x0000 + dw 0x8000 +PluginEnd: +;// savebin 'Build/FN/Plugins/test.flx',PluginStart,PluginEnd-PluginStart diff --git a/rez2_fnconfig.a80 b/rez2_fnconfig.a80 new file mode 100644 index 0000000..26eb9e8 --- /dev/null +++ b/rez2_fnconfig.a80 @@ -0,0 +1,712 @@ + +; LAST UPDATE: 24.03.2025 savelij + +PALITRA.RESERV EQU PALETTE + 0x34 + +;[]==========================================================[] +SetupR + SETPORT WINSP.Y_PORT,0xC0 + LD HL,SetInvert + PUSH HL + LD HL,PALETTE + LD DE,TempPALETTE + LD BC,0x0040 + LDIR + LD A,(SavePanels) + LD (SaveSav+1),A + OR A + LD A,0xFE + JR Z,.L1 + INC A +.L1 LD (SaveFlg),A + SUB A + LD (SaveFlag),A + LD A,(AutoActivatePanel) + LD (AutoActivatePanelFlag),A + OR A + LD A,0xFF + JR Z,.L2 + DEC A +.L2: LD (ActivateFlg),A + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 96,64,448,142 +; W_MAIN 32,32,448,142 + W_FILL 4,2,440,10,COLORI.BLACK + W_TEXT 208,3,COLORI.WHITE,"Setup" + W_BORDER 8,18,144,53 + W_FILL 10,19,140,51,COLORI.WHITE + W_TEXT 14,21,COLORP.WHITE,"Panel" + W_TEXT 14,29,COLORP.WHITE,"Files" + W_TEXT 14,37,COLORP.WHITE,"Selected files" + W_TEXT 14,45,COLORP.WHITE,"Invert background" + W_TEXT 14,53,COLORP.WHITE,"Invert foreground" + W_TEXT 14,61,COLORP.WHITE,"Invert foreground (select)" + W_TEXT 164,24,COLORP.HIGHGRAY,"R:" + W_BORDER 176,22,164,10 + W_ICONLEFTARROW 178,23 + W_ICONRIGHTARROW 322,23 + W_TEXT 164,40,COLORP.HIGHGRAY,"G:" + W_BORDER 176,38,164,10 + W_ICONLEFTARROW 178,39 + W_ICONRIGHTARROW 322,39 + W_TEXT 164,56,COLORP.HIGHGRAY,"B:" + W_BORDER 176,54,164,10 + W_ICONLEFTARROW 178,55 + W_ICONRIGHTARROW 322,55 + W_BORDER 372,23,64,40 + W_HORIZLINE 4,75,440 + W_BORDER 16,81,20,11 + W_FILL 18,82,16,9,COLORI.WHITE + W_TEXT 20,83,COLORP.WHITE,"\0" +ActivateFlg EQU $-2 + W_TEXT 40,84,COLORP.HIGHGRAY,"activate panel in which changed drive" + W_BORDER 16,99,20,11 + W_FILL 18,100,16,9,COLORI.WHITE + W_TEXT 20,101,COLORP.WHITE,"\0" +SaveFlg EQU $-2 + W_TEXT 40,102,COLORP.HIGHGRAY,"save Information about panels" + W_BUTTON 360,98,72,14 + W_TEXT 384,101,COLORP.HIGHGRAY,"Save" + W_HORIZLINE 4,115,440 + W_BUTTON 272,120,72,14 + W_TEXT 292,123,COLORP.HIGHGRAY,"Cancel" + W_BUTTON 360,120,72,14 + W_TEXT 390,123,COLORP.HIGHGRAY,"Ok" + W_END + + SUB A + LD (CurElement),A + CALL SetSetupInv + LD IX,BarRed + CALL InitScrollBar + LD IX,BarGreen + CALL InitScrollBar + LD IX,BarBlue + CALL InitScrollBar + CALL InitElement +SetupLoop LD IX,SetupTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,SetupLoop + LD A,B + AND 0x3F + JR Z,SetupLoop0 + BIT 4,B + JR NZ,SetupLoop + BIT 5,B + JR Z,SetupLoop + LD HL,SetupLoop + PUSH HL + LD A,D + AND 0x7F + CP SC.R + JP Z,InputRED + CP SC.G + JP Z,InputGREEN + CP SC.B + JP Z,InputBLUE + RET + +SetupLoop0 LD A,B + AND 0xC0 + JR Z,SetupLoop1 + LD HL,SetupLoop + PUSH HL + LD A,E + AND 0x5F + CP 'R' + JP Z,DecRED + CP 'G' + JP Z,DecGREEN + CP 'B' + JP Z,DecBLUE + RET + +SetupLoop1 LD A,E + RES 5,A + CP 0x1B + JP Z,SetupCancel + CP 0x0D + JP Z,SetupOkey + CP 'C' + JP Z,SetupCancel + CP 'O' + JP Z,SetupOkey + LD HL,SetupLoop + PUSH HL + CP 'S' + JP Z,SaveSetup + CP 'R' + JP Z,IncRED + CP 'G' + JP Z,IncGREEN + CP 'B' + JP Z,IncBLUE + CP 'I' + JP Z,ChSavePan + CP 'A' + JP Z,ChActivatePan + OR A + RET NZ + LD A,D + CP SC.X8 + JP Z,BoxUp + CP SC.X2 + JP Z,BoxDown + CP SC.X7 + JP Z,BoxHome + CP SC.X1 + JP Z,BoxEnd + CP SC.X9 + JP Z,BoxHome + CP SC.X3 + JP Z,BoxEnd + RET + +;[]----------------------------------------------------------[] +SaveSetup CALL SetClock + PUSH IY + SPDSS DSSF.CURDISK + POP IY + LD HL,WorkBuffer + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + PUSH IY + SPDSS DSSF.CURDIR + POP IY + LD HL,FlexDIRECTORY + PUSH IY + SPDSS DSSF.CHDIR + POP IY + PUSH AF + CALL C,DOSError + POP AF + JP C,SetupSaveEx + LD HL,SetupName + PUSH IY + SPDSS DSSF.CREATE,,0 + POP IY + PUSH AF + CALL C,DOSError + POP AF + JR C,SetupSaveEx + EX AF,AF' + LD HL,SetupHead + LD DE,WorkBuffer+0x100 + LD BC,11 + LDIR + LD HL,TempPALETTE + LD BC,0x0040 + LDIR + LD A,(SavePanels) + LD (DE),A + INC DE + OR A + JR Z,SvSetup + LD A,(MouseFlag) + LD (DE),A + INC DE + LD HL,LeftPanel + PUSH HL + LDI + LDI + LDI + POP HL + LD BC,PANEL.FILEMASK + ADD HL,BC + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + INC DE + LD HL,RightPanel + PUSH HL + LDI + LDI + LDI + POP HL + LD BC,PANEL.FILEMASK + ADD HL,BC + SUB A +.L2 LDI + CP (HL) + JR NZ,.L2 + LD (DE),A + INC DE +SvSetup ld a,(AutoActivatePanelFlag) + ld (de),a + inc de + LD HL,WorkBuffer+0x100 + OR A + EX DE,HL + SBC HL,DE + EX DE,HL + EX AF,AF' + PUSH IY + PUSH AF + SPDSS DSSF.WRITE + POP AF + SPDSS DSSF.CLOSE + POP IY + LD A,0x01 + LD (SaveFlag),A +SetupSaveEx LD HL,WorkBuffer + PUSH IY + SPDSS DSSF.CHDIR + POP IY + JP SetMouse + +SetupHead DEFB 0xAE,"FlexSetup",0 +SetupName DZ FILENAME.FN_INI + +;-------------------------------------------------------------- +SetupCancel + WINDOWCLOSE +SaveSav LD A,0x00 + LD (SavePanels),A + JR SetupExit + +SetupOkey + WINDOWCLOSE + LD HL,TempPALETTE + LD DE,PALETTE + LD BC,0x0040 + PUSH DE + LDIR + POP HL + LD DE,0x1000 + SPBIOS BIOSF.PIC_GET_PAL,0xFF,0 + LD A,(AutoActivatePanelFlag) + LD (AutoActivatePanel),A +SetupExit LD A,(SaveFlag) + OR A + RET Z + LD IX,LeftPanel + LD HL,LeftPanel + PANEL.CURRPATH + LD DE,FlexDIRECTORY + LD A,(DE) +SetRef1 CP (HL) + JR NZ,SetRef2 + INC HL + INC DE + LD A,(DE) + OR A + JR NZ,SetRef1 + CP (HL) + CALL Z,RefreshSetup +SetRef2 LD IX,RightPanel + LD HL,RightPanel + PANEL.CURRPATH + LD DE,FlexDIRECTORY + LD A,(DE) +SetRef3 CP (HL) + JR NZ,SetRef4 + INC HL + INC DE + LD A,(DE) + OR A + JR NZ,SetRef3 + CP (HL) + CALL Z,RefreshSetup +SetRef4 PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + PUSH IY + SPDSS DSSF.CHDIR + POP IY + RET + +RefreshSetup BIT VIEWFLAG.B_TREE,(IX+PANEL.VIEWFLAG) + RET NZ + PUSH IY + PUSH IX + POP IY + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + PUSH IY + SPDSS DSSF.CHDIR + POP IY + JR C,RefrErr + CALL ReadDIR + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar +RefrErr POP IY + RET + +SaveFlag DEFB 0x00 + +;-------------------------------------------------------------- +BoxUp LD A,(CurElement) + DEC A + RET M + JR BoxKeyExt + +BoxDown LD A,(CurElement) + INC A + CP 0x06 + RET Z + JR BoxKeyExt + +BoxHome LD A,(CurElement) + OR A + RET Z + SUB A + JR BoxKeyExt + +BoxEnd LD A,(CurElement) + CP 0x05 + RET Z + LD A,0x05 + JR BoxKeyExt + +NewElement LD A,(CurElement) + LD C,A + LD A,E + SUB 0x55 + SRL A + SRL A + SRL A + CP C + RET Z +BoxKeyExt PUSH AF + CALL ResSetupInv + POP AF + LD (CurElement),A + CALL SetSetupInv + JP InitElement + +;-------------------------------------------------------------- +ChSavePan LD HL,SavePanTxt + LD A,(SavePanels) + XOR 0x01 + LD (SavePanels),A + XOR 0x01 + INC A + NEG + LD (HL),A + LD DE,0x0074 + LD BC,0x00A5 + LD A,0xF0 + CALL PrnTxtLnIFF + JP ResFire + +SavePanTxt DEFB 0x00,0x00 + +;-------------------------------------------------------------- +ChActivatePan: LD HL,SavePanTxt + LD A,0 +AutoActivatePanelFlag EQU $-1 + XOR 0x01 + LD (AutoActivatePanelFlag),A + INC A + NEG + LD (HL),A + LD DE,0x0074 + LD BC,0x0093 + LD A,0xF0 + CALL PrnTxtLnIFF + JP ResFire + +;-------------------------------------------------------------- +DecRED LD HL,PALITRA.RESERV + 2 + LD DE,PrintRED + JR DecCOLOR + +IncRED LD HL,PALITRA.RESERV + 2 + LD DE,PrintRED + JR IncCOLOR + +DecGREEN LD HL,PALITRA.RESERV + 1 + LD DE,PrintGREEN + JR DecCOLOR + +IncGREEN LD HL,PALITRA.RESERV + 1 + LD DE,PrintGREEN + JR IncCOLOR + +DecBLUE LD HL,PALITRA.RESERV + LD DE,PrintBLUE + JR DecCOLOR + +IncBLUE LD HL,PALITRA.RESERV + LD DE,PrintBLUE + JR IncCOLOR + +DecCOLOR LD A,(HL) + OR A + RET Z + DEC A + LD (HL),A + JR DecIncCOLOR + +IncCOLOR LD A,(HL) + INC A + RET Z + LD (HL),A +DecIncCOLOR LD HL,PrnPALETTE + PUSH HL + PUSH DE + LD HL,ElementColor + LD A,(CurElement) + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD A,(HL) + ADD A,A + ADD A,A + LD DE,TempPALETTE + ADD A,E + LD E,A + JR NC,.L2 + INC D +.L2 LD HL,PALITRA.RESERV + LDI + LDI + LDI + RET + +;-------------------------------------------------------------- +InputRED LD HL,PALITRA.RESERV + 2 + LD DE,PrintRED + LD BC,0x0058 + JR InputColor + +InputGREEN LD HL,PALITRA.RESERV + 1 + LD DE,PrintGREEN + LD BC,0x0068 + JR InputColor + +InputBLUE LD HL,PALITRA.RESERV + LD DE,PrintBLUE + LD BC,0x0078 +InputColor LD (ColorY),BC + LD BC,DecIncCOLOR + PUSH BC + PUSH HL + PUSH DE + LD DE,ColText + LD A,(HL) + CALL ConvNumTxt8 + SUB A + LD (DE),A + LD A,E + SUB LOW (ColText) + LD (ColLen),A +InpAg LD IX,ColorStr + LD HL,EmptyTab + CALL InputLine + POP DE + POP HL + RET C + PUSH HL + PUSH DE + LD DE,ColText + CALL ConvTxtNum16 + JR C,InpAg + LD A,H + OR A + JR NZ,InpAg + LD A,L + POP DE + POP HL + LD (HL),A + RET + +ColorStr DEFB 0x03,0x00,0x00,0x00 +ColLen DEFB 0x00 + DEFW 0x01B8 +ColorY DEFW 0x0000 + DEFW 0x001A + DEFB 0x80 +ColText DUPL 0x04,0x00 + +;-------------------------------------------------------------- +CurElement DEFB 0x00 +SavePanels DEFB 0x01 +ElementColor DB COLORI.PANEL,COLORI.FILES,COLORI.SELECTFILES + DB COLORI.INVERTPAPER,COLORI.INVERTINK,COLORI.INVSELFILES + +BarRed DEFW 0x0122 ; X позиция скролбара + DEFW 0x0057 ; Y позиция скролбара + DEFW 0x0080 ; Max длина скролбара + DEFW 0x0000 ; тек.длина скролбара + DEFW 0x0000 ; Адрес ячейки BarLeft + DEFW 0x0000 ; Адрес ячейки BarRight + DEFW 0x0198 ; Кол-во файлов на странице + DEFW 0x0FF0 ; Общее кол-во файлов +CRed DEFW 0x0000 ; Первый файл на странице + +BarGreen DEFW 0x0122 ; X позиция скролбара + DEFW 0x0067 ; Y позиция скролбара + DEFW 0x0080 ; Max длина скролбара + DEFW 0x0000 ; тек.длина скролбара + DEFW 0x0000 ; Адрес ячейки BarLeft + DEFW 0x0000 ; Адрес ячейки BarRight + DEFW 0x0198 ; Кол-во файлов на странице + DEFW 0x0FF0 ; Общее кол-во файлов +CGreen DEFW 0x0000 ; Первый файл на странице + +BarBlue DEFW 0x0122 ; X позиция скролбара + DEFW 0x0077 ; Y позиция скролбара + DEFW 0x0080 ; Max длина скролбара + DEFW 0x0000 ; тек.длина скролбара + DEFW 0x0000 ; Адрес ячейки BarLeft + DEFW 0x0000 ; Адрес ячейки BarRight + DEFW 0x0198 ; Кол-во файлов на странице + DEFW 0x0FF0 ; Общее кол-во файлов +CBlue DEFW 0x0000 ; Первый файл на странице + +TempPALETTE DUPL 0x40,0 + +;-------------------------------------------------------------- +ResSetupInv LD DE,(COLORP.BLUE + COLORI.WHITE) << 8 | (COLORP.WHITE + COLORI.BLACK) ;0x4FF0 + JR SetupInvert + +SetSetupInv LD DE,(COLORP.WHITE + COLORI.BLACK) << 8 | (COLORP.BLUE + COLORI.WHITE) ;0xF04F +SetupInvert LD HL,85 ; Y исходный +; TODO не учитывается позиция окна, сделать привязку + LD A,(CurElement) + OR A + JR Z,SetupI1 + LD B,A + PUSH DE + LD DE,8 +.L1 ADD HL,DE + DJNZ .L1 + POP DE +SetupI1 LD IX,8 << 8 | 70 ; HIGH -> высота, LOW -> ширина + LD C,L + LD B,H ; Y + LD HL,106 ; X +; TODO не учитывается позиция окна, сделать привязку + JP InvertRectan + +InitElement LD HL,ElementColor + LD A,(CurElement) + ADD A,L + LD L,A + JR NC,.L1 + INC H +.L1 LD A,(HL) + ADD A,A + ADD A,A + LD HL,PALETTE + ADD A,L + LD L,A + JR NC,.L2 + INC H +.L2 LD DE,PALITRA.RESERV + LDI + LDI + LDI + CALL PrintRED + CALL PrintGREEN + CALL PrintBLUE + JP PrnPALETTE + +PrintRED LD DE,WorkBuffer + LD A,(PALITRA.RESERV + 2) + LD L,A + LD H,0x00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD (CRed),HL + CALL ConvNumTxt8 + LD A,0x04 + SUB E + LD B,A + LD A,0x20 +.L1 LD (DE),A + INC E + DJNZ .L1 + SUB A +InitEl1 LD (DE),A + LD HL,WorkBuffer + LD DE,0x01B8 + LD BC,0x0058 + LD A,0x80 + CALL PrnTxtLnIFF + LD IX,BarRed + JP PrnHScrBar + +PrintGREEN LD DE,WorkBuffer + LD A,(PALITRA.RESERV + 1) + LD L,A + LD H,0x00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD (CGreen),HL + CALL ConvNumTxt8 + LD A,0x04 + SUB E + LD B,A + LD A,0x20 +.L1 LD (DE),A + INC E + DJNZ .L1 + SUB A +InitEl2 LD (DE),A + LD HL,WorkBuffer + LD DE,0x01B8 + LD BC,0x0068 + LD A,0x80 + CALL PrnTxtLnIFF + LD IX,BarGreen + JP PrnHScrBar + +PrintBLUE LD DE,WorkBuffer + LD A,(PALITRA.RESERV) + LD L,A + LD H,0x00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD (CBlue),HL + CALL ConvNumTxt8 + LD A,0x04 + SUB E + LD B,A + LD A,0x20 +.L1 LD (DE),A + INC E + DJNZ .L1 + SUB A +InitEl3 LD (DE),A + LD HL,WorkBuffer + LD DE,0x01B8 + LD BC,0x0078 + LD A,0x80 + CALL PrnTxtLnIFF + LD IX,BarBlue + JP PrnHScrBar + +PrnPALETTE LD HL,PALETTE + LD DE,0x1000 + SPBIOS BIOSF.PIC_GET_PAL,0xFF,0 + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 470,88,60,38,COLORI.RESERVED + W_END + RET diff --git a/rez2_fnerror.a80 b/rez2_fnerror.a80 new file mode 100644 index 0000000..4c0d37e --- /dev/null +++ b/rez2_fnerror.a80 @@ -0,0 +1,346 @@ + +; LAST UPDATE: 25.03.2025 savelij + +; !FIXIT переделать одинаковые окна с разным текстом для ошибок под автоматическую процедуру +;[]===========================================================[] +DOSErrorR ;[x] 30/07/23 -bug вылет за пределы таблицы ошибок + CP (.error - .ErrorWins)/2 + JR C,.calc_addr + LD HL,.error + JR .goto_addr + +.calc_addr: LD HL,.ErrorWins + ADD A,A + ADD A,L + LD L,A + JR NC,.goto_addr + INC H +.goto_addr: LD A,(HL) + INC HL + LD H,(HL) + LD L,A + LD A,H + OR L + RET Z + CALL SetMouse + JP (HL) + +.ErrorWins DEFW 0x0000 ; 00 + DEFW 0x0000 ; 01 + DEFW InvDrive ; 02 + DEFW FileNFound ; 03 + DEFW InvPath ; 04 + DEFW 0x0000 ; 05 + DEFW FileNFound ; 06 + DEFW FILEexists ; 07 + DEFW 0x0000 ; 08 + DEFW ROOToverflow ; 09 + DEFW NoDiskSpace ; 0A + DEFW DIRnotEmpty ; 0B + DEFW 0x0000 ; 0C + DEFW InvMedia ; 0D + DEFW 0x0000 ; 0E + DEFW DIRexists ; 0F + DEFW InvName ; 10 + DEFW InvEXEfile ; 11 + DEFW InvEXEver ; 12 + DEFW 0x0000 ; 13 + DEFW NotReady ; 14 + DEFW 0x0000 ; 15 + DEFW 0x0000 ; 16 + DEFW 0x0000 ; 17 + DEFW WriteProtect ; 18 ; [ ] 26/06/2024 + DEFW 0x0000 ; 19 + DEFW 0x0000 ; 1A + DEFW 0x0000 ; 1B + DEFW NotReady ; 1C + DEFW 0x0000 ; 1D + DEFW NoMemory ; 1E + DEFW 0x0000 ; 1F + DEFW 0x0000 ; 20 + DEFW 0x0000 ; 21 + DEFW 0x0000 ; 22 + DEFW ToManyFilesInDir ; 23 +; always last in the table: +.error: DW UnknownError ; if no ERROR in this table then will show this message + +;-------------------------------------------------------------- +WriteProtect: + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 37,18,COLORP.HIGHGRAY,"Drive is write protected" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +InvDrive + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 24,18,COLORP.HIGHGRAY,"Invalid drive letter:" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_BORDER 120,15,16,12 + W_FILL 122,16,12,10,COLORI.WHITE + W_END + JP InputDrive + +InvMedia + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 46,18,COLORP.HIGHGRAY,"Invalid media:" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_BORDER 120,15,16,12 + W_FILL 122,16,12,10,COLORI.WHITE + W_END + JR InputDrive + +NotReady + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 36,18,COLORP.HIGHGRAY,"Drive not ready:" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_BORDER 120,15,16,12 + W_FILL 122,16,12,10,COLORI.WHITE + W_END +InputDrive PUSH IY + SPDSS DSSF.CURDISK + POP IY + ADD A,"A" + LD (CurDrv),A + LD IX,DriveStr + LD HL,ErrorTab1 + CALL InputLine + WINDOWCLOSE + CALL SetClock + LD A,(CurDrv) + RES 5,A + SUB "A" + PUSH IY + SPDSS DSSF.CHDISK + POP IY + JP C,DOSErrorR + LD HL,BegDIR + PUSH IY + SPDSS DSSF.CHDIR + POP IY + JP C,DOSErrorR + CALL SetMouse + LD A,0x01 + RET + +ErrorTab1 DEFW 0x011C,0x0164,0x0076,0x0084,0x01,0x0000,InputLine.InpLnExtN,0x0000 + DEFW 0x8000 + +DriveStr DEFB 0x01,0x00,0x00,0x00 + DEFB 0x01 + DEFW 0x015C,0x006A + DEFW 0x000A + DEFB 0xF0 +CurDrv DUPL 0x02,0x00 + +;-------------------------------------------------------------- +InvPath + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 70,18,COLORP.HIGHGRAY,"Invalid path" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END +ErrorLp0 LD IX,ErrorTab2 + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,ErrorLp0 + LD A,B + OR A + JR NZ,ErrorLp0 + LD A,E + CP 0x1B + JR Z,ErrorExt0 + CP 0x0D + JR Z,ErrorExt0 + RES 5,A + CP "O" + JR NZ,ErrorLp0 +ErrorExt0 + WINDOWCLOSE + CALL SetClock + LD HL,BegDIR + PUSH IY + SPDSS DSSF.CHDIR + POP IY + JP C,DOSErrorR + CALL SetMouse + LD A,0x01 + RET + +ErrorTab2 DEFW 0x011C,0x0164,0x0076,0x0084,0x21,0x0000,ErrorExt0,0x0000 + DEFW 0x8000 + +;-------------------------------------------------------------- +FileNFound + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 60,18,COLORP.HIGHGRAY,"File not found" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +ROOToverflow + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 64,18,COLORP.HIGHGRAY,"ROOT overflow" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +NoDiskSpace + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 62,18,COLORP.HIGHGRAY,"No disk space" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +DIRnotEmpty + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 40,18,COLORP.HIGHGRAY,"Directory is not empty" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +FILEexists + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 72,18,COLORP.HIGHGRAY,"File exists" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +DIRexists + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 56,18,COLORP.HIGHGRAY,"Directory exists" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +InvName + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 66,18,COLORP.HIGHGRAY,"Invalid name" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +InvEXEfile + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 60,18,COLORP.HIGHGRAY,"Invalid EXE file" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +InvEXEver + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 40,18,COLORP.HIGHGRAY,"Unsupport EXE version" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +NoMemory + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 52,18,COLORP.HIGHGRAY,"No memory space" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +ToManyFilesInDir: + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 30,18,COLORP.HIGHGRAY,"Too many directory entries" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + JP ErrorLp + +UnknownError: ;[x] 30/07/23 -bug вылет за пределы таблицы ошибок + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,88,192,48 + W_FILL 4,2,184,10,COLORI.RED + W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" + W_TEXT 60,18,COLORP.HIGHGRAY,"Unknown Error" + W_BUTTON 60,30,72,14 + W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" + W_END + ;JP ErrorLp + +ErrorLp LD IX,ErrorTab3 + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,ErrorLp + LD A,B + OR A + JR NZ,ErrorLp + LD A,E + CP 0x1B + JR Z,ErrorExt + CP 0x0D + JR Z,ErrorExt + RES 5,A + CP 'O' + JR NZ,ErrorLp +ErrorExt + WINDOWCLOSE + SUB A + RET + +ErrorTab3 DEFW 0x011C,0x0164,0x0076,0x0084,0x21,0x0000,ErrorExt,0x0000 + DEFW 0x8000 diff --git a/rez2_fnfunct.a80 b/rez2_fnfunct.a80 new file mode 100644 index 0000000..322d5d2 --- /dev/null +++ b/rez2_fnfunct.a80 @@ -0,0 +1,2418 @@ + +; LAST UPDATE: 16.05.2025 savelij + +;[]==========================================================[] +CopyFilesR LD A,(IY + PANEL.EFL) + OR (IY + PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + RET NZ + SETPORT WINSP.Y_PORT,0xC0 + LD A,(IY + PANEL.MFL) + OR (IY + PANEL.MFH) + JR NZ,CopyMark +; копирование файла/диры под курсором + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD IX,WorkBuffer + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 + SET 6,H + SET 7,H ; | 0xC000 + LD (AdrCopyFile),HL + LD DE,WorkBuffer + LD BC,FileHDR.SIZE + LDIR + POP AF + SETPORT WINSP.CPU3,,0 + BIT DIR.B_Dir,(IX + FileHDR.Attr) + IF MARK_DIR + JP NZ,COPY_DIR + ELSE + RET NZ + ENDIF + LD HL,0 + LD (ECopyFiles),HL + LD L,(IX + FileHDR.SizeBytes) + LD H,(IX + FileHDR.SizeBytes + 1) + LD (ECopyBytes),HL + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + LD (ECopyBytes + 2),DE + CALL ConvLenToBank + JP CopyNxt + + IF MARK_DIR +; копирование диры со всем содержимым +COPY_DIR PUSH IX + PUSH IY + CALL RESIDENT.GetDirSize ; промеряем диру по размеру + LD HL,FileHDR.SizeBytes + CALL SET_DWORD ; занесли размер диры в байтах в описатель + LD HL,0 + LD (ECopyFiles),HL + EX DE,HL + LD D,B + LD E,C + CALL ConvLenToBank + + POP IY + POP IX + RET + ENDIF + +; копирование помеченных файлов +CopyMark LD L,(IY + PANEL.MFL) + LD H,(IY + PANEL.MFH) + LD (ECopyFiles),HL + LD L,(IY + PANEL.MBL1) + LD H,(IY + PANEL.MBH1) + LD (ECopyBytes),HL + LD L,(IY + PANEL.MBL2) + LD H,(IY + PANEL.MBH2) + LD (ECopyBytes + 2),HL + ; [ ] fat32 + LD A,(IY + PANEL.MBL3) + LD (ECopyBytes + 4),A + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD HL,CPU3 - FileHDR.SIZE + LD BC,FileHDR.SIZE +.L2 ADD HL,BC + BIT FileHDR.B_MARK,(HL) + JR Z,.L2 + LD (AdrCopyFile),HL + PUSH HL + POP IX + SUB A + LD L,A + LD H,A + LD E,L + LD D,H +CopyLp0 BIT FileHDR.B_MARK,(IX + FileHDR.Flag) + JR Z,CopyNx2 + PUSH BC + PUSH DE + PUSH HL + LD L,(IX + FileHDR.SizeBytes) + LD H,(IX + FileHDR.SizeBytes + 1) + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + CALL ConvLenToBank + LD C,L + LD B,H + POP HL + ADD HL,BC + LD C,E + LD B,D + POP DE + EX DE,HL + ADC HL,BC + EX DE,HL + POP BC +CopyNx2 ADD IX,BC + LD A,(IX + FileHDR.Name) + OR A + JR NZ,CopyLp0 + POP AF + SETPORT WINSP.CPU3,,0 +CopyNxt LD IX,ProcessAll + ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + LD (IX + PROC.MAXL1),L + LD (IX + PROC.MAXH1),H + LD (IX + PROC.MAXL2),E + LD (IX + PROC.MAXH2),D + CALL InitProcess + CALL ResInvert + LD HL,SetInvert + PUSH HL +; запрос пути копирования + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 96,81,448,62 + W_FILL 4,2,440,10,COLORI.BLACK + W_TEXT 210,3,COLORI.WHITE,"Copy" + W_BUTTON 144,42,72,14 + W_TEXT 172,45,COLORP.HIGHGRAY,"Ok" + W_BUTTON 232,42,72,14 + W_TEXT 252,45,COLORP.HIGHGRAY,"Cancel" + W_TEXT 22,25,COLORP.HIGHGRAY,"Copy to:" + W_BORDER 70,22,332,12 + W_FILL 72,23,328,10,COLORI.WHITE + W_END + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,LeftPanel + JR NZ,.L1 + LD HL,RightPanel +.L1 LD DE,PANEL.CURRPATH + ADD HL,DE + LD DE,CurPath + SUB A + LD C,A +.L2 LDI + CP (HL) + JR NZ,.L2 + LD (DE),A + SUB A + SUB C + LD (PathLen),A + LD IX,PathStr + LD HL,PathTab + CALL InputLine + WINDOWCLOSE + RET C + LD A,(PathLen) + OR A + RET Z + PUSH IY + SPDSS DSSF.INFOMEM + POP IY + LD (FreeBanks),BC + LD A,B + OR C + LD A,ERR_DSS.NOT_ENOUGH_MEMORY + JP Z,DOSError ;!!!!!!!!!!!! Нет памяти +; индикация процесса копирования + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 160,81,320,78 + W_FILL 4,2,312,10,COLORI.BLACK + W_TEXT 148,3,COLORI.WHITE,"Copy" + W_TEXT 8,16,COLORP.HIGHGRAY,"From:" + W_TEXT 22,26,COLORP.HIGHGRAY,"to:" + W_BORDER 16,38,288,12 + W_FILL 18,39,284,10,COLORI.WHITE + W_BORDER 16,56,288,12 + W_FILL 18,57,284,10,COLORI.WHITE + W_END + SUB A + LD (OverWriteFlg),A + LD HL,LeftPanel + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + JR Z,.L4 + LD HL,RightPanel +.L4 LD BC,PANEL.CURRPATH + ADD HL,BC + LD (CopyFrom),HL + LD HL,CurPath + LD (CopyTo),HL + CALL SetClock + PUSH IY + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L3 + LD A,(RAMPAGES.RIGHTPANEL) +.L3 + SETPORT WINSP.CPU3,,0 +CopyNextFile CALL PrnFromTo + LD IX,(AdrCopyFile) + LD L,(IX + FileHDR.SizeBytes) + LD H,(IX + FileHDR.SizeBytes + 1) + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + LD (ReadLen),HL + LD (ReadLen + 2),DE + LD (WriteLen),HL + LD (WriteLen + 2),DE + CALL ConvLenToBank + LD (.FileBnL),HL + LD (.FileBnH),DE + LD IX,ProcessOne + ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + LD (IX + PROC.MAXL1),L + LD (IX + PROC.MAXH1),H + LD (IX + PROC.MAXL2),E + LD (IX + PROC.MAXH2),D + CALL InitProcess + CALL PrnProcess + LD HL,(FreeBanks) + LD DE,0x0000 +.FileBnH EQU $-2 + LD A,D + OR E + JR NZ,.CopyLp1 + LD DE,0x0000 +.FileBnL EQU $-2 + OR A + SBC HL,DE + JR NC,.L1 + ADD HL,DE +.CopyLp1 EX DE,HL +.L1 LD B,E + SPDSS DSSF.GETMEM + LD (MemIndef),A + LD HL,PagesList + SPBIOS BIOSF.GETMEMBLKPAGES + LD HL,(CopyFrom) ;Открываем файл источник + SPDSS DSSF.CHDIR + JP C,CopyError1 + LD HL,(AdrCopyFile) + INC HL + LD DE,WorkBuffer + PUSH DE + CALL MakeDOSname + POP HL + SPDSS DSSF.OPEN,,1 + JP C,CopyError1 + LD (FHandle1),A + LD HL,(CopyTo) ;Открываем файл приемник + SPDSS DSSF.CHDIR + JP C,CopyError2 + LD IX,(AdrCopyFile) + LD HL,(AdrCopyFile) + INC HL + LD DE,WorkBuffer + PUSH DE + CALL MakeDOSname + POP HL + LD A,(OverWriteFlg) + OR A + LD C,DSSF.CREAT_N ;0x0B + JR Z,.L2 + LD C,DSSF.CREATE ;0x0A +.L2 LD A,(IX + FileHDR.Attr) + SPDSS + JR NC,CopyLp2 + CP 0x07 + JP NZ,CopyError2 + CALL OverWrite +CopyLp2 LD (FHandle2),A + LD HL,(ReadLen) + LD A,H + OR L + LD HL,(ReadLen+2) + OR H + OR L + JP Z,CloseFiles +ReadFile + GETPORT WINSP.CPU3 + PUSH AF + LD HL,PagesList + LD A,(HL) +ReadLp1 INC HL + PUSH HL + SETPORT WINSP.CPU3,,0 + SPDSS DSSF.SCANKEY + LD HL,SC.ESC << 8 | 0x1B + OR A + SBC HL,DE + JP Z,CopyBreak + LD HL,(ReadLen) + LD DE,(ReadLen + 2) + LD BC,0x4000 + OR A + SBC HL,BC + LD B,0x00 + EX DE,HL + SBC HL,BC + EX DE,HL + JR C,ReadEnd + LD (ReadLen),HL + LD (ReadLen + 2),DE + LD HL,0xC000 + LD DE,0x4000 + LD A,(FHandle1) + SPDSS DSSF.READ + CALL NextProcess + POP HL + LD A,(HL) + CP 0xFF + JR NZ,ReadLp1 + POP AF + SETPORT WINSP.CPU3,,0 + JR WriteFile + +; !FIXIT сделать так: +ReadEnd: LD HL,0xC000 + LD DE,(ReadLen) + LD A,D + OR E + JR Z,.L1 + LD A,(FHandle1) + SPDSS DSSF.READ + CALL NextProcess +.L1 POP HL + POP AF + SETPORT WINSP.CPU3,,0 +WriteFile + GETPORT WINSP.CPU3 + PUSH AF + LD HL,PagesList + LD A,(HL) +WriteL1 INC HL + PUSH HL + SETPORT WINSP.CPU3,,0 + SPDSS DSSF.SCANKEY + LD HL,SC.ESC << 8 | 0x1B + OR A + SBC HL,DE + JP Z,CopyBreak + LD HL,(WriteLen) + LD DE,(WriteLen + 2) + LD BC,0x4000 + OR A + SBC HL,BC + LD B,0x00 + EX DE,HL + SBC HL,BC + EX DE,HL + JR C,WriteEnd + LD (WriteLen),HL + LD (WriteLen + 2),DE + LD HL,0xC000 + LD DE,0x4000 + LD A,(FHandle2) + SPDSS DSSF.WRITE + JP C,CopyError3 + CALL NextProcess + POP HL + LD A,(HL) + CP 0xFF + JR NZ,WriteL1 + POP AF + SETPORT WINSP.CPU3,,0 + LD HL,(ReadLen) + LD A,H + OR L + LD HL,(ReadLen + 2) + OR H + OR L + JR Z,CloseFiles + JP ReadFile + +; !FIXIT сделать так: +WriteEnd: LD HL,0xC000 + LD DE,(WriteLen) + LD A,D + OR E + JR Z,.L1 + LD A,(FHandle2) + SPDSS DSSF.WRITE + JP C,CopyError3 + CALL NextProcess +.L1 POP HL + POP AF + SETPORT WINSP.CPU3,,0 +CloseFiles LD A,(FHandle1) + SPDSS DSSF.GET_D_T + LD A,(FHandle2) + SPDSS DSSF.PUT_D_T + LD A,(FHandle2) + SPDSS DSSF.CLOSE +CloseFile1 LD A,(FHandle1) + SPDSS DSSF.CLOSE + LD A,(MemIndef) + SPDSS DSSF.FREEMEM + LD IX,(AdrCopyFile) + RES FileHDR.B_MARK,(IX + FileHDR.Flag) + LD HL,(ECopyBytes) + LD E,(IX + FileHDR.SizeBytes) + LD D,(IX + FileHDR.SizeBytes + 1) + OR A + SBC HL,DE + LD (ECopyBytes),HL + LD HL,(ECopyBytes+2) + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + SBC HL,DE + LD (ECopyBytes+2),HL + LD HL,(ECopyFiles) + LD A,H + OR L + JR Z,CopyEnd + DEC HL + LD (ECopyFiles),HL + LD A,H + OR L + JR Z,CopyEnd + LD HL,(AdrCopyFile) + LD DE,FileHDR.SIZE +.L1 ADD HL,DE + BIT FileHDR.B_MARK,(HL) + JR Z,.L1 + LD (AdrCopyFile),HL + JP CopyNextFile + +CopyEnd POP AF + SETPORT WINSP.CPU3,,0 + POP IY + WINDOWCLOSE + LD HL,(ECopyFiles) + LD (IY + PANEL.MFL),L + LD (IY + PANEL.MFH),H + LD HL,(ECopyBytes) + LD (IY + PANEL.MBL1),L + LD (IY + PANEL.MBH1),H + LD HL,(ECopyBytes+2) + LD (IY + PANEL.MBL2),L + LD (IY + PANEL.MBH2),H + ; [ ] fat32 + LD A,(ECopyBytes+4) + LD (IY + PANEL.MBL3),A + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + PUSH IY + SPDSS DSSF.CHDIR + POP IY + PUSH AF + CALL C,DOSError + POP AF + CALL NC,RefreshDIR + POP IY + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + PUSH IY + SPDSS DSSF.CHDIR + POP IY + JP C,BegDIRECTORY + CALL PrintDIR + CALL PrnFileInfo + JP SetMouse + +CopyError3: ; Если нет места на диске для копирования ;!FIXIT оптимизировать + POP HL ; снимаем лишнее + POP DE ; тут лежит AF + PUSH AF + LD A,D + SETPORT WINSP.CPU3,,0 + LD A,(FHandle2) + SPDSS DSSF.CLOSE + CALL CopyErrorFileDelete + POP AF +CopyError2 PUSH AF + LD A,(FHandle1) + SPDSS DSSF.CLOSE + POP AF +CopyError1 PUSH AF + LD A,(MemIndef) + SPDSS DSSF.FREEMEM + POP AF + CALL DOSError + JP CopyEnd + +CopyBreak POP HL + POP AF + SETPORT WINSP.CPU3,,0 + LD A,(FHandle2) + SPDSS DSSF.CLOSE + LD A,(FHandle1) + SPDSS DSSF.CLOSE + LD A,(MemIndef) + SPDSS DSSF.FREEMEM + CALL CopyErrorFileDelete + JP CopyEnd + +CopyErrorFileDelete: + LD IX,(AdrCopyFile) + LD HL,(AdrCopyFile) + INC HL + LD DE,WorkBuffer + PUSH DE + CALL MakeDOSname + POP HL + LD A,(IX + FileHDR.Attr) + PUSH IY + SPDSS DSSF.DELETE + POP IY + RET + +;-------------------------------------------------------------- +OverWrite CALL SetMouse + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 180,88,280,56 + W_FILL 4,2,272,10,COLORI.GREEN + W_TEXT 116,3,COLORI.WHITE + COLORP.GREEN,"Message" + W_TEXT 80,16,COLORP.HIGHGRAY,"The following file EXISTS:" + W_BUTTON 16,38,56,14 + W_TEXT 22,41,COLORP.HIGHGRAY,"OverWrite" + W_BUTTON 80,38,56,14 + W_TEXT 102,41,COLORP.HIGHGRAY,"All" + W_BUTTON 144,38,56,14 + W_TEXT 162,41,COLORP.HIGHGRAY,"Skip" + W_BUTTON 208,38,56,14 + W_TEXT 220,41,COLORP.HIGHGRAY,"Cancel" + W_END + LD HL,(CopyTo) + LD DE,WorkBuffer + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L2 + LD (DE),A + INC DE +.L2 LD HL,(AdrCopyFile) + INC HL + CALL MakeDOSname + LD IX,0x00F8 + LD HL,WorkBuffer + LD DE,320 + LD BC,114 + LD A,COLORP.HIGHGRAY + COLORI.BLACK + CALL PrnRangPathC +OvWrtLp LD IX,OverWrtTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,OvWrtLp + LD A,B + OR A + JR NZ,OvWrtLp + LD A,E + CP 0x1B + LD HL,OverExit + JR Z,OvrJump + CP 0x0D + LD HL,OverWrtFile + JR Z,OvrJump + RES 5,A + CP 'O' + LD HL,OverWrtFile + JR Z,OvrJump + CP 'A' + LD HL,OverWrtAll + JR Z,OvrJump + CP 'S' + LD HL,OverSkip + JR Z,OvrJump + CP 'C' + JR NZ,OvWrtLp + LD HL,OverExit +OvrJump + WINDOWCLOSE + JP (HL) + +OverWrtAll LD A,0x01 + LD (OverWriteFlg),A +OverWrtFile CALL SetClock + LD IX,(AdrCopyFile) + LD HL,(AdrCopyFile) + INC HL + LD DE,WorkBuffer + PUSH DE + CALL MakeDOSname + POP HL + LD A,(IX + FileHDR.Attr) + SPDSS DSSF.CREATE + RET + +OverSkip CALL SetClock + LD IX,(AdrCopyFile) + LD L,(IX + FileHDR.SizeBytes) + LD H,(IX + FileHDR.SizeBytes + 1) + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + CALL ConvLenToBank + ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + LD IX,ProcessAll + LD C,(IX + PROC.CURL1) + LD B,(IX + PROC.CURH1) + ADD HL,BC + LD (IX + PROC.CURL1),L + LD (IX + PROC.CURH1),H + LD C,(IX + PROC.CURL2) + LD B,(IX + PROC.CURH2) + EX DE,HL + ADC HL,BC + LD (IX + PROC.CURL2),L + LD (IX + PROC.CURH2),H + CALL PrnProcess + LD HL,CloseFile1 + EX (SP),HL + RET + +OverExit INC SP + INC SP + LD IX,(AdrCopyFile) + BIT 0,(IX + 0x00) + JP Z,CloseFile1 + LD A,(FHandle1) + SPDSS DSSF.CLOSE + LD A,(MemIndef) + SPDSS DSSF.FREEMEM + POP IY + JP CopyEnd + +;-------------------------------------------------------------- +AdrCopyFile DW 0x0000 ; Адрес описателя текущего файла +CopyFrom DW 0x0000 ; Адрес пути откуда +CopyTo DW 0x0000 ; Адрес пути куда +ECopyFiles DW 0x0000 ; Кол-во копируемых файлов +ECopyBytes DB 5 DUP 0 ; Кол-во копируемых байтов +OverWriteFlg DB 0x00 ; Флаг перезаписи файлов +FreeBanks DW 0x0000 ; Кол-во свободных банков +ReadLen DD 0 ; Длина читаемого файла +WriteLen DD 0 ; Длина записываемого файла +FHandle1 DB 0x00 ; Файл источник +FHandle2 DB 0x00 ; Файл приемник +MemIndef DB 0x00 ; Индефик.памяти под копирование +;-------------------------------------------------------------- + +; DEHL - количество байт +; 1028975 FB36F +; 231 E7 1 +; 59232 E760 4 +; 21 15 1 +; 14119 3727 1 +; 916055 DFA57 38 +; 12652 316C 1 +; 14119 3727 1 +; 12546 3102 1 +ConvLenToBank LD A,H + LD H,L + LD L,0x00 + SLA A + RL E + RL D + RL L ; LDEA * 2 + SLA A + RL E + RL D + RL L ; LDEA * 2 + OR H + LD H,0x00 + EX DE,HL + JR Z,.L1 + INC HL +.L1 LD A,H + OR L + RET NZ + INC DE + RET + +PrnFromTo LD HL,(CopyFrom) + LD DE,WorkBuffer + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L2 + LD (DE),A + INC DE +.L2 LD HL,(AdrCopyFile) + INC HL + CALL MakeDOSname + LD HL,(CopyTo) + LD DE,WorkBuffer+0x100 + SUB A +.L3 LDI + CP (HL) + JR NZ,.L3 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L4 + LD (DE),A + INC DE +.L4 LD HL,(AdrCopyFile) + INC HL + CALL MakeDOSname + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 204,97,256,18,COLORI.HIGHGRAY + W_END + LD IX,0x0100 + LD HL,WorkBuffer + LD DE,204 + LD BC,97 + LD A,COLORP.HIGHGRAY + COLORI.BLACK + CALL PrnRangPathL + LD IX,0x0100 + LD HL,WorkBuffer+0x100 + LD DE,204 + LD BC,107 + LD A,COLORP.HIGHGRAY + COLORI.BLACK + JP PrnRangPathL + +NextProcess LD IX,ProcessAll + LD L,(IX + PROC.CURL1) + LD H,(IX + PROC.CURH1) + INC HL + LD (IX + PROC.CURL1),L + LD (IX + PROC.CURH1),H + LD A,H + OR L + JR NZ,.L1 + LD L,(IX + PROC.CURL2) + LD H,(IX + PROC.CURH2) + INC HL + LD (IX + PROC.CURL2),L + LD (IX + PROC.CURH2),H +.L1 CALL PrnProcess + LD IX,ProcessOne + LD L,(IX + PROC.CURL1) + LD H,(IX + PROC.CURH1) + INC HL + LD (IX + PROC.CURL1),L + LD (IX + PROC.CURH1),H + LD A,H + OR L + JR NZ,.L2 + LD L,(IX + PROC.CURL2) + LD H,(IX + PROC.CURH2) + INC HL + LD (IX + PROC.CURL2),L + LD (IX + PROC.CURH2),H +.L2 JP PrnProcess + +ProcessAll DW 178 ; X позиция + DW 138 ; Y позиция + DW 284 ; Длина X + DW 0 ; Коэффициент для процесса + DW 0 ; Коррекция коэфициента + DW 0 ; Максимум + DW 0 + DW 0 ; Текущее + DW 0 + DB COLORP.BLUE + COLORI.WHITE; 0x4F + +ProcessOne DW 178 ; X позиция + DW 120 ; Y позиция + DW 284 ; Длина X + DW 0 ; Коэффициент для процесса + DW 0 ; Коррекция коэфициента + DW 0 ; Максимум + DW 0 + DW 0 ; Текущее + DW 0 + DB COLORP.BLUE + COLORI.WHITE + +PathStr DB 0x80,0x00,0x00,0x00 +PathLen DB 0x00 + DW 170,106,324 + DB 0xF0 +CurPath DB 0x81 DUP 0 + +;[]==========================================================[] +ReNameR LD A,(IY + PANEL.EFL) + OR (IY + PANEL.EFH) + RET Z + SETPORT WINSP.Y_PORT,0xC0 + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR Z,ReNameNr + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H + INC HL + INC HL + LD DE,CurName + LD BC,0x000D + LDIR + LD A,DIR.M_Dir;0x10 + LD (CurAttrib),A + JR ReNameN + +ReNameNr ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *10 + ADD HL,DE ; *18 +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H ; | 0xC000 + PUSH HL + INC HL + LD DE,CurName + CALL MakeDOSname + POP HL + LD BC,FileHDR.Attr;0x000E + ADD HL,BC + LD A,(HL) + LD (CurAttrib),A +ReNameN POP AF + SETPORT WINSP.CPU3,,0 + LD HL,CurName + LD A,(HL) + CP '.' + RET Z + CP '\\' + RET Z + LD DE,Name + LD C,0 + LD A,' ' +.L1 LDI + CP (HL) + JR C,.L1 + LD A,C + NEG + LD (NameLen),A + CALL ResInvert + LD HL,SetInvert + PUSH HL + LD HL,CurName + LD DE,RNfile + LD C,0x0C + SUB A +.L2 LDI + CP (HL) + JR NZ,.L2 + OR C + JR Z,RNnxt + LD B,C + LD A,' ' +.L3 LD (DE),A + INC DE + DJNZ .L3 +RNnxt + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 208,81,224,62 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 94,3,COLORI.WHITE,"Rename" + W_BUTTON 32,42,72,14 + W_TEXT 60,45,COLORP.HIGHGRAY,"Ok" + W_BUTTON 120,42,72,14 + W_TEXT 140,45,COLORP.HIGHGRAY,"Cancel" + W_TEXT 14,17,COLORP.HIGHGRAY,"Rename: " +RNfile EQU $ - STRLEN(" ") - 2 + W_TEXT 40,29,COLORP.HIGHGRAY,"To:" + W_BORDER 60,26,134,12 + W_FILL 62,27,130,10,COLORI.WHITE + W_END + LD IX,NameStr + LD HL,ReNameTab + CALL InputLine + WINDOWCLOSE + RET C + LD A,(NameLen) + OR A + RET Z + ;[ ] -баг при переименовании файла в буфере Name в конце имени файла не всегда стоял закрывающий 0 когда надо. ILDel1 + LD HL,Name + LD E,A + LD D,0 + ADC HL,DE + LD (HL),0 + CALL SetClock + LD HL,SetMouse + EX (SP),HL + PUSH HL + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR Z,ReName0 + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + LD DE,WorkBuffer + PUSH DE + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + EX DE,HL + LD A,'\\' +.L2 DEC HL + CP (HL) + JR NZ,.L2 + INC HL + LD (HL),0x00 + POP HL + PUSH IY + SPDSS DSSF.CHDIR + POP IY + PUSH AF + CALL C,DOSError + POP AF + RET C +ReName0 LD HL,CurName + LD DE,Name + PUSH IY + SPDSS DSSF.RENAME + POP IY + PUSH AF + CALL C,DOSError + POP AF + RET C + LD A,(CurAttrib) + BIT DIR.B_Dir,A + JP NZ,ReNameDIR + LD HL,Name + LD DE,PrevFile + LD A,(NameLen) + LD B,A +.L1 LD A,(HL) + CALL CorrBigChar + LD (DE),A + INC HL + INC DE + DJNZ .L1 + SUB A + LD (DE),A + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,ReName1 + CALL ReadDIR + CALL FindPrevFile + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar +ReName1 LD HL,LeftPanel + PANEL.CURRPATH + LD DE,RightPanel + PANEL.CURRPATH +ReName2 LD A,(DE) + CP (HL) + RET NZ + INC HL + INC DE + LD A,(HL) + OR A + JR NZ,ReName2 + LD A,(DE) + OR A + RET NZ + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,ReNameE + CALL ReadDIR + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar +ReNameE POP IY + RET + +ReNameDIR LD HL,Name + LD DE,PrevDIR + LD A,(NameLen) + LD B,A +.L1 LD A,(HL) + CALL CorrSmallChar + LD (HL),A + LD (DE),A + INC HL + INC DE + DJNZ .L1 + SUB A + LD (DE),A + LD A,(TreeFlag) + OR A + JP Z,ReNameExit + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + EX AF,AF' + PUSH IY + GETPORT WINSP.CPU3 + PUSH AF + LD IY,LeftPanel + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,.L2 + LD IY,RightPanel +.L2 BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L3 + LD A,(RAMPAGES.RIGHTPANEL) +.L3 + SETPORT WINSP.CPU3,,0 + EX AF,AF' + JR Z,ReNameTree + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + ADD HL,HL ; *10 +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H + EX DE,HL + JR ReNameEx + +ReNameTree BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,LeftPanel + JR NZ,.L1 + LD HL,RightPanel +.L1 LD DE,PANEL.CURRPATH + ADD HL,DE + INC HL + INC HL + IF TREE_REZID + CALL FindTreeDIRR + ELSE + CALL FindTreeDIRR + ENDIF + JP C,ReNameT + LD HL,0xC001 - 0x10 + LD BC,0x0010 +.L2 ADD HL,BC + BIT 0,(HL) + JR Z,.L2 + ADD HL,BC + DEC HL +FRName1 PUSH HL + LD DE,CurName + INC HL + INC HL +FRName2 LD A,(DE) + OR A + JR Z,FRName4 + CP (HL) + JR NZ,FRName3 + INC HL + INC DE + JR FRName2 + +FRName3 POP HL + BIT 7,(HL) + JR NZ,ReNameT + ADD HL,BC + JR FRName1 + +FRName4 LD A,(HL) + OR A + JR NZ,FRName3 + POP DE +ReNameEx LD HL,Name + INC DE + INC DE + LD C,0x0D + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD B,C +.L2 LD (DE),A + INC DE + DJNZ .L2 + LD HL,WorkBuffer + PUSH IY + SPDSS DSSF.CURDIR + POP IY + LD HL,BegDIR + PUSH IY + SPDSS DSSF.CHDIR + POP IY + JR C,ReNameC + LD HL,TreeName + LD DE,WorkBuffer + 0x100 + LD A,(FileAtribut) + PUSH IY + SPDSS DSSF.F_FIRST,0 + POP IY + JR C,ReNameC + LD HL,TreeName + PUSH IY + SPDSS DSSF.CREATE,,0 + POP IY + JR C,ReNameC + LD L,(IY + PANEL.EFL) + LD H,(IY + PANEL.EFH) + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,0xC000 + PUSH AF + SPDSS DSSF.WRITE + POP AF + SPDSS DSSF.CLOSE +ReNameC LD HL,WorkBuffer + SPDSS DSSF.CHDIR +ReNameT POP AF + SETPORT WINSP.CPU3,,0 + POP IY + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,ReNameExt1 + CALL ReadDIR + CALL FindPrevDIR + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL PrnVScrBar + POP IY + RET + +ReNameExt1 INC SP + INC SP + CALL PrintDIR + CALL PrnFileInfo + CALL SetInvert + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL PrnVScrBar + IF TREE_REZID + CALL TestTreeR.TestTreeBeg + ELSE + CALL TestTreeR.TestTreeBeg + ENDIF + PUSH IY + IF TREE_REZID + CALL MakeTreePathR + ELSE + CALL MakeTreePathR + ENDIF + EX DE,HL + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 PUSH IY + POP HL + LD BC,PANEL.CURRPATH + ADD HL,BC + INC HL + INC HL + EX DE,HL + SUB A +.L2 LDI + CP (HL) + JR NZ,.L2 + LD (DE),A + CALL PrintPath + POP IY + RET + +ReNameExit CALL ReadDIR + CALL FindPrevDIR + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar + LD HL,LeftPanel + PANEL.CURRPATH + LD DE,RightPanel + PANEL.CURRPATH +RNameE1 LD A,(DE) + CP (HL) + RET NZ + INC HL + INC DE + LD A,(HL) + OR A + JR NZ,RNameE1 + LD A,(DE) + OR A + RET NZ + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,RNameE2 + CALL ReadDIR + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar +RNameE2 POP IY + RET + +CurAttrib DB 0x00 +CurName DB 0x0D DUP 0x00 +NameStr DB 0x0C,0x00,0x00,0x00 +NameLen DB 0x00 + DW 272,110,104 + DB COLORP.WHITE + COLORI.BLACK +Name DB 0x0D DUP 0x00 + +;[]==========================================================[] +MakeDIRR CALL ResInvert + LD HL,SetInvert + PUSH HL + SETPORT WINSP.Y_PORT,0xC0 + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 200,81,240,62 + W_FILL 4,2,232,10,COLORI.BLACK + W_TEXT 84,3,COLORI.WHITE,"Make directory" + W_BUTTON 40,42,72,14 + W_TEXT 68,45,COLORP.HIGHGRAY,"Ok" + W_BUTTON 128,42,72,14 + W_TEXT 148,45,COLORP.HIGHGRAY,"Cancel" + W_TEXT 12,25,COLORP.HIGHGRAY,"New directory:" + W_BORDER 86,22,134,12 + W_FILL 88,23,130,10,COLORI.WHITE + W_END + LD IX,MakeDIRStr + LD HL,MakeDIRTab + CALL InputLine + WINDOWCLOSE + RET C + LD A,(MDIRLen) + OR A + RET Z + LD HL,NewDIR + LD B,A +MkDIRlp LD A,(HL) + INC HL + CP ':' + RET Z + CP '\\' + RET Z + DJNZ MkDIRlp + CALL SetClock + LD HL,SetMouse + PUSH HL + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JR Z,MkDIR0 + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + PUSH IY + SPDSS DSSF.CHDIR + POP IY + PUSH AF + CALL C,DOSError + POP AF + RET C +MkDIR0 LD HL,NewDIR + PUSH IY + SPDSS DSSF.MKDIR + POP IY + PUSH AF + CALL C,DOSError + POP AF + RET C + LD HL,NewDIR + LD DE,PrevDIR + LD A,(MDIRLen) + LD B,A +.L1 LD A,(HL) + CALL CorrSmallChar + LD (HL),A + LD (DE),A + INC HL + INC DE + DJNZ .L1 + SUB A + LD (DE),A + LD A,(TreeFlag) + OR A + JP Z,MkDIRnxt1 + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + EX AF,AF' + PUSH IY + LD IY,LeftPanel + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,.L2 + LD IY,RightPanel +.L2 LD A,(IY + PANEL.EFH) + BIT 2,A + JP NZ,MkDIRn0 + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L3 + LD A,(RAMPAGES.RIGHTPANEL) +.L3 + SETPORT WINSP.CPU3,,0 + EX AF,AF' + JR NZ,FnTree1 + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,LeftPanel + JR NZ,.L4 + LD HL,RightPanel +.L4 LD DE,PANEL.CURRPATH + ADD HL,DE + INC HL + INC HL + IF TREE_REZID + CALL FindTreeDIRR + ELSE + CALL FindTreeDIRR + ENDIF + JP C,MkDIRn + LD HL,0xC001 - 0x10 + LD BC,0x0010 +.L5 ADD HL,BC + BIT 0,(HL) + JR Z,.L5 + DEC HL + JR FnTree2 +FnTree1 LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H +FnTree2 LD E,(HL) + LD BC,0x000F + ADD HL,BC + LD D,(HL) + LD (HL),B + INC HL + INC E + LD A,D + INC A + JR Z,MkDIRend + LD A,E + AND 0x7F + LD IXL,A + LD A,(HL) + AND 0x7F + CP IXL + JR NZ,MkDIRend +MkDIR10 LD A,(HL) + AND 0x7F + CP IXL + JR Z,MkDIR11 + ADD HL,BC + INC HL + JR MkDIR10 + +MkDIR11 LD A,(HL) + RES 7,(HL) + ADD HL,BC + LD D,(HL) + LD (HL),B + INC HL + BIT 7,A + JR Z,MkDIR10 +MkDIR12 LD A,(HL) + AND 0x7F + CP IXL + JR C,MkDIRend + ADD HL,BC + LD D,(HL) + LD (HL),B + INC HL + LD A,D + INC A + JR NZ,MkDIR12 +MkDIRend PUSH HL + PUSH DE + LD C,L + LD B,H + LD L,(IY + PANEL.EFL) + LD H,(IY + PANEL.EFH) + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H + PUSH HL + OR A + SBC HL,BC + LD C,L + LD B,H + POP HL + LD A,L + LD D,H + ADD A,0x10 + LD E,A + JR NC,.L1 + INC D +.L1 LD A,B + OR C + JR Z,.L2 + DEC HL + DEC DE + LDDR +.L2 POP BC + POP DE + LD A,B + EX AF,AF' + LD A,C + SET 7,A + LD (DE),A + INC DE + SUB A + LD (DE),A + INC DE + LD HL,NewDIR + LD C,0x0D +.L3 LDI + CP (HL) + JR NZ,.L3 + LD B,C +.L4 LD (DE),A + INC DE + DJNZ .L4 + EX AF,AF' + LD (DE),A + LD L,(IY + PANEL.EFL) + LD H,(IY + PANEL.EFH) + INC HL + LD (IY + PANEL.EFL),L + LD (IY + PANEL.EFH),H + LD HL,WorkBuffer + PUSH IY + SPDSS DSSF.CURDIR + POP IY + LD HL,BegDIR + PUSH IY + SPDSS DSSF.CHDIR + POP IY + JR C,MkDIR2 + LD HL,TreeName + LD DE,WorkBuffer+0x100 + LD A,(FileAtribut) + PUSH IY + SPDSS DSSF.F_FIRST,0 + POP IY + JR C,MkDIR2 + LD HL,TreeName + PUSH IY + SPDSS DSSF.CREATE,,0 + POP IY + JR C,MkDIR2 + LD L,(IY + PANEL.EFL) + LD H,(IY + PANEL.EFH) + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,0xC000 + PUSH AF + SPDSS DSSF.WRITE + POP AF + SPDSS DSSF.CLOSE +MkDIR2 LD HL,WorkBuffer + SPDSS DSSF.CHDIR +MkDIRn POP AF + SETPORT WINSP.CPU3,,0 +MkDIRn0 POP IY + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,MkDIRn1 +MkDIRnxt1 CALL ReadDIR + CALL FindPrevDIR +MkDIRn1 CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,MkDIRn2 + LD HL,LeftPanel + PANEL.CURRPATH + LD DE,RightPanel + PANEL.CURRPATH +MkDIRrf LD A,(DE) + CP (HL) + JR NZ,MkDIRex + INC HL + INC DE + LD A,(HL) + OR A + JR NZ,MkDIRrf + LD A,(DE) + OR A + JR NZ,MkDIRex + CALL ReadDIR +MkDIRn2 CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar +MkDIRex POP IY + RET + +MakeDIRStr DB 0x0C,0x00,0x00,0x00 +MDIRLen DB 0x00 + DW 290,106,104 + DB COLORP.WHITE + COLORI.BLACK +NewDIR DB 0x0D DUP 0x00 + +;[]==========================================================[] +DeleteFilesR LD A,(IY + PANEL.EFL) + OR (IY + PANEL.EFH) + RET Z + SETPORT WINSP.Y_PORT,0xC0 + LD A,(IY + PANEL.MFL) + OR (IY + PANEL.MFH) + JR NZ,DeleteMark + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR Z,DelFile + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H + LD (AdrDelFile),HL + INC HL + JR DelFil1 + +DelFile ADD HL,HL + ADD HL,HL + ADD HL,HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H + LD (AdrDelFile),HL +DelFil1 INC HL + LD E,(HL) + POP AF + SETPORT WINSP.CPU3,,0 + LD A,E + CP '.' + RET Z + CP '\\' + RET Z + JR DelNext + +DeleteMark + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD HL,0xC000 - FileHDR.SIZE + LD BC,FileHDR.SIZE +.L2 ADD HL,BC + BIT FileHDR.B_MARK,(HL) + JR Z,.L2 + LD (AdrDelFile),HL + POP AF + SETPORT WINSP.CPU3,,0 +DelNext CALL ResInvert + LD HL,SetInvert + PUSH HL + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + SUB A + LD (DeleteFlag),A +DeleteMain + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 180,80,280,56 + W_FILL 4,2,272,10,COLORI.BLACK + W_TEXT 116,3,COLORI.WHITE,"Delete file" + W_TEXT 56,16,COLORP.HIGHGRAY,"The following file will be DELETED:" + W_BUTTON 16,38,56,14 + W_TEXT 28,41,COLORP.HIGHGRAY,"Delete" + W_BUTTON 80,38,56,14 + W_TEXT 102,41,COLORP.HIGHGRAY,"All" + W_BUTTON 144,38,56,14 + W_TEXT 162,41,COLORP.HIGHGRAY,"Skip" + W_BUTTON 208,38,56,14 + W_TEXT 220,41,COLORP.HIGHGRAY,"Cancel" + W_END + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + LD DE,WorkBuffer + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,DelLp0 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L2 + LD (DE),A + INC DE +.L2 CALL MakeDELname +DelLp0 LD IX,0x00F8 + LD HL,WorkBuffer + LD DE,320 + LD BC,106 + LD A,COLORP.HIGHGRAY + COLORI.BLACK + CALL PrnRangPathC +DelLoop LD IX,DeleteTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,DelLoop + LD A,B + OR A + JR NZ,DelLoop + LD A,E + CP 0x1B + LD HL,DelExit + JR Z,DelJump + CP 0x0D + LD HL,DelDelete + JR Z,DelJump + RES 5,A + CP 'D' + LD HL,DelDelete + JR Z,DelJump + CP 'A' + LD HL,DelAll + JR Z,DelJump + CP 'S' + LD HL,DelSkip + JR Z,DelJump + CP 'C' + JR NZ,DelLoop + LD HL,DelExit +DelJump + WINDOWCLOSE + JP (HL) + +AdrDelFile DEFW 0x0000 +DeleteFlag DEFB 0x00 + +MakeDELname LD HL,(AdrDelFile) + INC HL + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) +; JR NZ,MakeDELn1 + JP Z,MakeDOSname +;MakeDELn1 + INC HL + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + LD (DE),A + RET + +;-------------------------------------------------------------- +DelSkip LD C,(IY + PANEL.MFL) + LD B,(IY + PANEL.MFH) + LD A,B + OR C + JP Z,DelExit + LD IX,(AdrDelFile) + RES 0,(IX + 0x00) + LD L,(IY + PANEL.MBL1) + LD H,(IY + PANEL.MBH1) + LD E,(IX + FileHDR.SizeBytes) + LD D,(IX + FileHDR.SizeBytes + 1) + OR A + SBC HL,DE + LD (IY + PANEL.MBL1),L + LD (IY + PANEL.MBH1),H + LD L,(IY + PANEL.MBL2) + LD H,(IY + PANEL.MBH2) + ; [ ] FAT32 + LD A,(IY + PANEL.MBL3) + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + SBC HL,DE + ; [ ] fat32 + SBC A,0 + LD (IY + PANEL.MBL3),A + LD (IY + PANEL.MBL2),L + LD (IY + PANEL.MBH2),H + DEC BC + LD (IY + PANEL.MFL),C + LD (IY + PANEL.MFH),B + LD A,B + OR C + JP Z,DelExit + LD HL,(AdrDelFile) + LD DE,FileHDR.SIZE +.L1 ADD HL,DE + BIT FileHDR.B_MARK,(HL) + JR Z,.L1 + LD (AdrDelFile),HL + CALL PrintDIR + JP DeleteMain + +DelDelete CALL SetClock + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR Z,DelDel0 + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + LD DE,WorkBuffer + PUSH DE + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + EX DE,HL + LD A,'\\' +.L2 DEC HL + CP (HL) + JR NZ,.L2 + INC HL + LD (HL),0x00 + POP HL + PUSH IY + SPDSS DSSF.CHDIR + POP IY + PUSH AF + CALL C,DOSError + POP AF + JP C,DelExit +DelDel0 LD IX,(AdrDelFile) + LD DE,WorkBuffer + PUSH DE + CALL MakeDELname + POP HL + LD C,DSSF.RMDIR ;0x1C ;RMDIR + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JR NZ,DelDel1 + LD A,(IX + FileHDR.Attr) + BIT DIR.B_Dir,A + JR NZ,DelDel1 + LD C,DSSF.DELETE ;0x0E ;DELETE +DelDel1 PUSH IY + SPDSS + POP IY + JR NC,DelDel2 + CALL DOSError + OR A + CALL NZ,BegDIRECTORY + JP DelExit +DelDel2 LD A,0x01 + LD (DeleteFlag),A + CALL SetMouse + JP DelSkip + +DelAll BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JR NZ,DelDelete + LD A,0x01 + LD (DeleteFlag),A + CALL SetClock + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 160,88,320,48 + W_FILL 4,2,312,10,COLORI.BLACK + W_TEXT 132,3,COLORI.WHITE,"Delete files" + W_TEXT 8,16,COLORP.HIGHGRAY,"Delete:" + W_BORDER 16,28,288,12 + W_FILL 18,29,284,10,COLORI.WHITE + W_END + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + LD (DelFrom),HL + LD IX,ProcessDel + LD L,(IY + PANEL.MFL) + LD H,(IY + PANEL.MFH) + LD A,H + OR L + JR NZ,.L1 + INC HL +.L1 LD (IX + PROC.MAXL1),L + LD (IX + PROC.MAXH1),H + SUB A + LD (IX + PROC.MAXL2),A + LD (IX + PROC.MAXH2),A + CALL InitProcess +DeleteAllLp LD HL,0x0000 +DelFrom EQU $-2 + LD DE,WorkBuffer + SUB A +.L1 LDI + CP (HL) + JR NZ,.L1 + DEC HL + LD A,'\\' + CP (HL) + JR Z,.L2 + LD (DE),A + INC DE +.L2 CALL MakeDELname + MAKEWINDOW WINSUBOBJ.WOBIND + W_FILL 208,104,256,8,COLORI.HIGHGRAY + W_END + LD IX,0x0100 + LD HL,WorkBuffer + LD DE,208 + LD BC,104 + LD A,COLORP.HIGHGRAY + COLORI.BLACK + CALL PrnRangPathL + SPDSS DSSF.SCANKEY + LD HL,SC.ESC << 8 | 0x1B + OR A + SBC HL,DE + JP Z,DelAllExit + LD IX,(AdrDelFile) + LD DE,WorkBuffer + PUSH DE + CALL MakeDELname + POP HL + LD A,(IX + FileHDR.Attr) + BIT DIR.B_Dir,A + LD C,DSSF.DELETE ;0x0E ;DELETE + JR Z,.L3 + LD C,DSSF.RMDIR ;0x1C ;RMDIR +.L3 PUSH IY + SPDSS + POP IY + JR NC,DelA1 + CALL DOSError + OR A + CALL NZ,BegDIRECTORY + JP DelAllExit + +DelA1 LD IX,ProcessDel + LD L,(IX + PROC.CURL1) + LD H,(IX + PROC.CURH1) + INC HL + LD (IX + PROC.CURL1),L + LD (IX + PROC.CURH1),H + CALL PrnProcess + LD C,(IY + PANEL.MFL) + LD B,(IY + PANEL.MFH) + LD A,B + OR C + JP Z,DelAllExit + LD IX,(AdrDelFile) + RES FileHDR.B_MARK,(IX + FileHDR.Flag) + LD L,(IY + PANEL.MBL1) + LD H,(IY + PANEL.MBH1) + LD E,(IX + FileHDR.SizeBytes) + LD D,(IX + FileHDR.SizeBytes + 1) + OR A + SBC HL,DE + LD (IY + PANEL.MBL1),L + LD (IY + PANEL.MBH1),H + LD L,(IY + PANEL.MBL2) + LD H,(IY + PANEL.MBH2) + ; [ ] FAT32 + LD A,(IY + PANEL.MBL3) + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + SBC HL,DE + ; [ ] fat32 + SBC A,0 + LD (IY + PANEL.MBL3),A + LD (IY + PANEL.MBL2),L + LD (IY + PANEL.MBH2),H + DEC BC + LD (IY + PANEL.MFL),C + LD (IY + PANEL.MFH),B + LD A,B + OR C + JP Z,DelAllExit + LD HL,(AdrDelFile) + LD DE,FileHDR.SIZE +.L1 ADD HL,DE + BIT FileHDR.B_MARK,(HL) + JR Z,.L1 + LD (AdrDelFile),HL + JP DeleteAllLp + +ProcessDel DW 178 + DW 117 + DW 284 + DW 0 + DW 0 + DW 0 + DW 0 + DW 0 + DW 0 + DB COLORP.BLUE + COLORI.WHITE + +DelAllExit HALT + WINDOWCLOSE +DelExit BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,DelTreeDIR1 + LD IX,(AdrDelFile) + BIT DIR.B_Dir,(IX + FileHDR.Attr) + JR NZ,DelTreeDIR +DelExt1 POP AF + SETPORT WINSP.CPU3,,0 + LD HL,SetMouse + PUSH HL + LD A,(DeleteFlag) + OR A + JP NZ,RefreshDIR + CALL PrintDIR + JP PrnFileInfo + +DelTreeDIR LD A,(TreeFlag) + OR A + JR Z,DelExt1 +DelTreeDIR1 LD A,(DeleteFlag) + OR A + JR Z,DelExt1 + LD DE,DelName + CALL MakeDELname + POP AF + SETPORT WINSP.CPU3,,0 + CALL SetClock + LD HL,SetMouse + EX (SP),HL + PUSH HL + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + EX AF,AF' + PUSH IY + GETPORT WINSP.CPU3 + PUSH AF + LD IY,LeftPanel + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,.L1 + LD IY,RightPanel +.L1 BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L2 + LD A,(RAMPAGES.RIGHTPANEL) +.L2 + SETPORT WINSP.CPU3,,0 + EX AF,AF' + JR NZ,DelTree1 + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,LeftPanel + JR NZ,.L3 + LD HL,RightPanel +.L3 LD DE,PANEL.CURRPATH + ADD HL,DE + INC HL + INC HL + IF TREE_REZID + CALL FindTreeDIRR + ELSE + CALL FindTreeDIRR + ENDIF + JP C,DelDIRn + LD HL,0xC001-0x10 + LD BC,0x0010 +.L4 ADD HL,BC + BIT 0,(HL) + JR Z,.L4 + DEC HL + LD A,(HL) + AND 0x7F + INC A + LD IXL,A + ADD HL,BC +DlTree1 LD A,(HL) + AND 0x7F + CP IXL + JR NZ,DlTr31 + PUSH HL + LD DE,DelName + INC HL + INC HL +DlTree2 LD A,(DE) + OR A + JR Z,DlTree4 + CP (HL) + JR NZ,DlTree3 + INC HL + INC DE + JR DlTree2 +DlTree3 POP HL + BIT 7,(HL) + JP NZ,DelDIRn +DlTr31 ADD HL,BC + JR DlTree1 + +DlTree4 LD A,(HL) + OR A + JR NZ,DlTree3 + POP HL + JR DelTree2 + +DelTree1 LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H +DelTree2 LD E,(HL) + INC HL + LD A,(HL) + LD BC,FileHDR.Attr;0x000E + ADD HL,BC + LD D,(HL) + INC HL + EX AF,AF' + PUSH DE + PUSH HL + LD C,L + LD B,H + LD L,(IY + PANEL.EFL) + LD H,(IY + PANEL.EFH) + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL +; LD A,H +; OR 0xC0 +; LD H,A + SET 6,H + SET 7,H + OR A + SBC HL,BC + LD C,L + LD B,H + POP HL + LD D,H + LD A,L + SUB 0x10 + LD E,A + JR NC,.L1 + DEC D +.L1 PUSH DE + LD A,B + OR C + JR Z,.L2 + LDIR +.L2 POP HL + POP DE + DEC HL + LD (HL),D + LD A,L + SUB 0x0E + LD L,A + JR NC,.L3 + DEC H +.L3 EX AF,AF' + OR A + JR Z,.L4 + LD (HL),A +.L4 DEC HL + BIT 7,E + JR Z,DelTree3 + RES 7,E + LD BC,0x0010 + ADD HL,BC +DelTr1 SBC HL,BC + LD A,(HL) + AND 0x7F + CP E + JR C,DelTree3 + JR NZ,DelTr1 +.L1 SET 7,(HL) +DelTree3 LD L,(IY + PANEL.EFL) + LD H,(IY + PANEL.EFH) + DEC HL + LD (IY + PANEL.EFL),L + LD (IY + PANEL.EFH),H + LD L,(IY + PANEL.FFL) + LD H,(IY + PANEL.FFH) + LD E,(IY + PANEL.CFL) + LD D,(IY + PANEL.CFH) + LD A,H + OR L + JR Z,DelTree4 + DEC HL + LD (IY + PANEL.FFL),L + LD (IY + PANEL.FFH),H + ADD HL,DE + LD C,(IY + PANEL.EFL) + LD B,(IY + PANEL.EFH) + INC HL + SBC HL,BC + JR NC,DelTree4 + INC DE +DelTree4 LD (IY + PANEL.CFL),E + LD (IY + PANEL.CFH),D + LD HL,WorkBuffer + PUSH IY + SPDSS DSSF.CURDIR + POP IY + LD HL,BegDIR + PUSH IY + SPDSS DSSF.CHDIR + POP IY + JR C,DelDIR2 + LD HL,TreeName + LD DE,WorkBuffer + 0x100 + LD A,(FileAtribut) + PUSH IY + SPDSS DSSF.F_FIRST,0 + POP IY + JR C,DelDIR2 + LD HL,TreeName + PUSH IY + SPDSS DSSF.CREATE,,0 + POP IY + JR C,DelDIR2 + LD L,(IY + PANEL.EFL) + LD H,(IY + PANEL.EFH) + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,0xC000 + PUSH AF + SPDSS DSSF.WRITE + POP AF + SPDSS DSSF.CLOSE +DelDIR2 LD HL,WorkBuffer + SPDSS DSSF.CHDIR +DelDIRn POP AF + SETPORT WINSP.CPU3,,0 + POP IY + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) + JR NZ,DeleteExt1 + CALL ReadDIR + CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + LD A,(IY + PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + CALL NZ,PrnVScrBar + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 CALL PrintDIR + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL PrnVScrBar + POP IY + RET + +DeleteExt1 INC SP + INC SP + CALL PrintDIR + CALL PrnFileInfo + CALL SetInvert + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + CALL InitScrollBar + CALL PrnVScrBar + IF TREE_REZID + CALL MakeTreePathR + ELSE + CALL MakeTreePathR + ENDIF + PUSH IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD IY,RightPanel + JR Z,.L1 + LD IY,LeftPanel +.L1 CALL NewDIRECTORY + POP IY + RET + +DelName DB 13 DUP 0 + +;[]==========================================================[] +QuitConfirmWin + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 208,88,224,50 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 104,3,COLORI.WHITE,"Quit" + W_TEXT 28,19,COLORP.HIGHGRAY,"Do you want quit Flex Navigator ?" + W_BUTTON 32,32,72,14 + W_TEXT 58,35,COLORP.HIGHGRAY,"Yes" + W_BUTTON 120,32,72,14 + W_TEXT 150,35,COLORP.HIGHGRAY,"No" + W_END +.Loop LD IX,QuitTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,.Loop + LD A,B + OR A + JR NZ,.Loop + LD A,E + CP 0x1B + JR Z,.Abort + CP 0x0D + JR Z,.OK + RES 5,A + CP 'Y' + JR Z,.OK + CP 'N' + JR NZ,.Loop +.Abort + WINDOWCLOSE + SCF + RET + +.OK + WINDOWCLOSE + OR A + RET diff --git a/rez2_fnmisc.a80 b/rez2_fnmisc.a80 new file mode 100644 index 0000000..ceeca1f --- /dev/null +++ b/rez2_fnmisc.a80 @@ -0,0 +1,965 @@ + +; LAST UPDATE: 28.05.2025 savelij + +;[]==========================================================[] +FileInfoR LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + SETPORT WINSP.Y_PORT,0xC0 + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + LD A,H + OR 0xC0 + LD H,A + LD DE,WorkBuffer + LD BC,0x0018 + LDIR + POP AF + SETPORT WINSP.CPU3,,0 + LD IX,WorkBuffer + LD HL,WorkBuffer+1 + LD DE,WorkBuffer+0x20 + LD A,(HL) + CP '.' + RET Z + CALL SetClock + PUSH DE + CALL MakeDOSname + POP HL + LD DE,FName + LD C,12 + SUB A +.L2 LDI + CP (HL) + JR NZ,.L2 + LD A,C + OR A + JR Z,.L5 + LD B,A + LD A,0x20 +.L3 LD (DE),A + INC DE + DJNZ .L3 +.L5 LD HL,FAtributs + LD DE,FAttrib + LD C,(IX + FileHDR.Attr) + LD B,0x08 +.L6 RL C + LD A,'-' + JR NC,.L4 + LD A,(HL) +.L4 LD (DE),A + INC HL + INC DE + DJNZ .L6 + LD HL,FLen + LD B,0x10 + LD A,0x20 +.L10 LD (HL),A + INC HL + DJNZ .L10 + LD DE,FLen + BIT DIR.B_Dir,(IX + FileHDR.Attr) + JR Z,.L7 + LD HL,DirText + LD BC,0x000A + LDIR + JR .L8 + +.L7 LD L,(IX+0x0F) + LD H,(IX+0x10) + LD C,(IX+0x11) + LD B,(IX+0x12) + CALL ConvNumTxt32 + LD A,0x20 + LD (DE),A + INC DE + LD HL,Bytes + LD BC,0x0005 + LDIR +.L8 LD DE,FData + CALL GetData + LD DE,FTime + CALL GetTime + LD HL,WorkBuffer+0x20 + LD DE,WorkBuffer+0x30 + LD A,(FileAtribut) + PUSH IY + SPDSS DSSF.F_FIRST,0 + POP IY + JP C,SetMouse + LD HL,FClast + LD B,0x05 + LD A,0x20 +.L9 LD (HL),A + INC HL + DJNZ .L9 + LD HL,WorkBuffer+0x30+26 + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + LD DE,FClast + CALL ConvNumTxt16 + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 240,80,160,98 + W_FILL 4,2,152,10,COLORI.BLACK + W_TEXT 56,3,COLORI.WHITE,"File info" + W_TEXT 10,20,COLORP.HIGHGRAY,"Name: " +FName EQU $ - STRLEN(" ") - 1 + W_TEXT 10,32,COLORP.HIGHGRAY,"Attributes: " +FAttrib EQU $ - STRLEN(" ") - 1 + W_TEXT 10,44,COLORP.HIGHGRAY,"Len: " +FLen EQU $ - STRLEN(" ") - 1 + W_TEXT 10,56,COLORP.HIGHGRAY,"Data: " +FData EQU $ - STRLEN(" ") - 1 +FTime EQU $ - STRLEN(" ") - 1 + W_TEXT 10,68,COLORP.HIGHGRAY,"First Claster: " +FClast EQU $ - STRLEN(" ") - 1 + W_BUTTON 44,80,72,14 + W_TEXT 72,83,COLORP.HIGHGRAY,"Ok" + W_END + CALL SetMouse +FileInfoLoop: LD IX,FileInfoTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,FileInfoLoop + LD A,B + OR A + JR NZ,FileInfoLoop + LD A,E + CP 0x1B + JR Z,FileInfoExt + CP 0x0D + JR Z,FileInfoExt + RES 5,A + CP 'O' + JR NZ,FileInfoLoop +FileInfoExt: + WINDOWCLOSE + RET + +FAtributs: DEFB "--ad-shr" + +;[]==========================================================[] +PrintFileR LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + SETPORT WINSP.Y_PORT,0xC0 + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + LD A,H + OR 0xC0 + LD H,A + LD DE,WorkBuffer + LD BC,0x0018 + LDIR + POP AF + SETPORT WINSP.CPU3,,0 + LD IX,WorkBuffer + BIT DIR.B_Dir,(IX + FileHDR.Attr) + RET NZ + LD HL,WorkBuffer+1 + LD DE,PrnFileName + CALL MakeDOSname + LD L,(IX + FileHDR.SizeBytes) + LD H,(IX + FileHDR.SizeBytes + 1) + LD (PrnFileLen),HL + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + LD (PrnFileLen+2),DE + LD A,H + OR L + OR D + OR E + RET Z + PUSH IY + SPDSS DSSF.GETMEM,1 + POP IY + PUSH AF + CALL C,DOSError + POP AF + RET C + LD (PrnMIndef),A + PUSH IY + LD HL,PagesList + SPBIOS BIOSF.GETMEMBLKPAGES + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 168,84,304,62 + W_FILL 4,2,296,10,COLORI.BLACK + W_TEXT 142,3,COLORI.WHITE,"Print" + W_TEXT 16,16,COLORP.HIGHGRAY,"Printing file:" + W_BORDER 16,28,272,12 + W_FILL 18,29,268,10,COLORI.WHITE + W_BUTTON 116,44,72,14 + W_TEXT 140,47,COLORP.HIGHGRAY,"Stop" + W_END + PUSH IY + POP HL + LD DE,PANEL.CURRPATH + ADD HL,DE + LD DE,WorkBuffer + SUB A +.L2 LDI + CP (HL) + JR NZ,.L2 + DEC HL + LD A,0x5C + CP (HL) + JR Z,.L3 + LD (DE),A + INC DE +.L3 LD HL,PrnFileName + SUB A +.L4 LDI + CP (HL) + JR NZ,.L4 + LD (DE),A + LD IX,0x00D0 + LD HL,WorkBuffer + LD DE,0x00F8 + LD BC,0x0064 + LD A,0x80 + CALL PrnRangPathL + LD IX,PrintFTab + CALL TestCoords + LD IX,ProcessFPrn + LD HL,(PrnFileLen) + LD DE,(PrnFileLen+2) + LD A,L + LD L,H + LD H,E + LD E,D + OR A + JR Z,InitPrn + INC HL + LD A,H + OR L + JR NZ,InitPrn + INC E +InitPrn LD (IX+PROC.MAXL1),L + LD (IX+PROC.MAXH1),H + LD (IX+PROC.MAXL2),E + LD (IX+PROC.MAXH2),0x00 + CALL InitProcess + LD HL,PrnFileName + SPDSS DSSF.OPEN,,1 + PUSH AF + CALL C,DOSError + POP AF + JP C,PrnError + LD (PrnFHandle),A + GETPORT WINSP.CPU3 + PUSH AF + LD HL,PagesList + LD A,(HL) +ReadPr1 INC HL + PUSH HL + SETPORT WINSP.CPU3,,0 + LD HL,(PrnFileLen) + LD DE,(PrnFileLen+2) + LD BC,0x4000 + OR A + SBC HL,BC + LD B,0x00 + EX DE,HL + SBC HL,BC + EX DE,HL + JR C,ReadPrnEnd + LD (PrnFileLen),HL + LD (PrnFileLen+2),DE + CALL SetClock + LD HL,0xC000 + LD DE,0x4000 + LD A,(PrnFHandle) + SPDSS DSSF.READ + CALL SetMouse + LD BC,0x4000 + CALL PrintBlock + POP HL + JR C,PrnEsc + LD A,(HL) + CP 0xFF + JR NZ,ReadPr1 +PrnEsc POP AF + SETPORT WINSP.CPU3,,0 + JR PrnFileExit + +ReadPrnEnd: LD HL,0xC000 + LD DE,(PrnFileLen) + LD A,D + OR E + JR Z,.L1 + CALL SetClock + LD A,(PrnFHandle) + PUSH DE + SPDSS DSSF.READ + POP BC + CALL SetMouse + CALL PrintBlock + JR C,.L2 +.L1 CALL NxtPrnProc +.L2 POP HL + POP AF + SETPORT WINSP.CPU3,,0 +PrnFileExit LD A,(PrnFHandle) + SPDSS DSSF.CLOSE +PrnError LD A,(PrnMIndef) + SPDSS DSSF.FREEMEM + POP IY + HALT + HALT + WINDOWCLOSE + RET + +;[]----------------------------------------------------------[] +PrintBlock: LD DE,0xC000 +PrnBlockLp LD A,(DE) + INC DE + CALL PrintCHAR + RET C + CALL NxtPrnProc + DEC BC + LD A,B + OR C + JR NZ,PrnBlockLp + RET + +PrintCHAR: LD L,A + PUSH HL + PUSH DE + PUSH BC + SPMOUSE MOUSEF.READ_STATE + BIT 0,A + JR Z,PrnCH1 + LD IX,PrintFTab + CALL TestCoords + JR C,PrnCH2 +PrnCH1 + SPDSS DSSF.SCANKEY + LD A,E +PrnCH2 POP BC + POP DE + POP HL + RET C + JR Z,PrnCHAR + CP 0x1B + SCF + RET Z + RES 5,A + CP 'S' + JR NZ,PrnCHAR +StopPrint SCF + RET + +PrnCHAR PUSH DE + PUSH BC + LD A,L + SPDSS DSSF.PRINT + LD A,B + POP BC + POP DE + RET NC + HALT + JR PrintCHAR + +;[]----------------------------------------------------------[] +NxtPrnProc LD A,E + OR A + RET NZ + PUSH DE + PUSH BC + LD IX,ProcessFPrn + LD L,(IX+PROC.CURL1) + LD H,(IX+PROC.CURH1) + INC HL + LD (IX+PROC.CURL1),L + LD (IX+PROC.CURH1),H + LD A,H + OR L + JR NZ,.L1 + LD L,(IX+PROC.CURL2) + LD H,(IX+PROC.CURH2) + INC HL + LD (IX+PROC.CURL2),L + LD (IX+PROC.CURH2),H +.L1 CALL PrnProcess + POP BC + POP DE + RET + +ProcessFPrn: DEFW 0x00BA + DEFW 0x0071 + DEFW 0x010C + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFW 0x0000 + DEFB 0x4F +PrnFileName: DUPL 13,0 +PrnFileLen: DUPL 4,0 +PrnMIndef: DEFB 0x00 +PrnFHandle: DEFB 0x00 + +;[]==========================================================[] +SystemInfoR + SETPORT WINSP.Y_PORT,0xC0 + LD HL,SetInvert + PUSH HL + LD HL,DOSvers + LD DE,BIOSver + LD B,0x05 + LD A,0x20 +.L1 LD (HL),A + INC HL + LD (DE),A + INC DE + DJNZ .L1 + PUSH IY + SPDSS DSSF.VERSION + POP IY + EX DE,HL + LD DE,DOSvers + LD A,H + CALL ConvNumTxt8 + LD A,'.' + LD (DE),A + INC DE + LD A,L + CALL ConvNumTxt8 + LD HL,WorkBuffer + SPBIOS BIOSF.FN_VERSION + SUB A +.L2 INC HL + CP (HL) + JR NZ,.L2 + LD A,0x20 +.L3 DEC HL + CP (HL) + JR NZ,.L3 + INC HL + LD DE,BIOSver + SUB A +.L4 LDI + CP (HL) + JR NZ,.L4 + LD HL,Present + LD A,(CMOSFlag) + OR A + JR NZ,.L5 + LD HL,NotPresent +.L5 LD DE,CMOS + LD BC,0x000B + LDIR + LD HL,TotMem + LD DE,FreeMem + LD B,0x0F + LD A,0x20 +.L6 LD (HL),A + INC HL + LD (DE),A + INC DE + DJNZ .L6 + PUSH IY + SPDSS DSSF.INFOMEM + POP IY + PUSH BC + LD B,H + LD C,L + LD HL,0x0000 + LD DE,WorkBuffer + SRL B + RR C + RR H + RR L + SRL B + RR C + RR H + RR L + PUSH DE + CALL ConvNumTxt32 + SUB A + LD (DE),A + POP HL + LD DE,TotMem + CALL CorrBigNum + INC DE + LD HL,Bytes + LD BC,0x0005 + LDIR + POP HL + LD B,H + LD C,L + LD HL,0x0000 + LD DE,WorkBuffer + SRL B + RR C + RR H + RR L + SRL B + RR C + RR H + RR L + PUSH DE + CALL ConvNumTxt32 + SUB A + LD (DE),A + POP HL + LD DE,FreeMem + CALL CorrBigNum + INC DE + LD HL,Bytes + LD BC,0x0005 + LDIR + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 224,64,192,114 + W_FILL 4,2,184,10,COLORI.BLACK + W_TEXT 48,3,COLORI.WHITE,"System information" + W_TEXT 10,20,COLORP.HIGHGRAY,"FN version: \{FLEX_VERS.NAVIGATOR}" + W_TEXT 10,32,COLORP.HIGHGRAY,"BIOS version: " +BIOSver EQU $ - STRLEN(" ") - 1 + W_TEXT 10,44,COLORP.HIGHGRAY,"DOS version: " +DOSvers EQU $ - STRLEN(" ") - 1 + W_TEXT 10,56,COLORP.HIGHGRAY,"CMOS: " +CMOS EQU $ - STRLEN(" ") - 1 + W_TEXT 10,70,COLORP.HIGHGRAY,"Total memory: " +TotMem EQU $ - STRLEN(" ") - 1 + W_TEXT 10,82,COLORP.HIGHGRAY,"Free memory: " +FreeMem EQU $ - STRLEN(" ") - 1 + W_BUTTON 60,96,72,14 + W_TEXT 88,99,COLORP.HIGHGRAY,"Ok",0 + W_END +SysInfoLoop: LD IX,SysInfoTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,SysInfoLoop + LD A,B + OR A + JR NZ,SysInfoLoop + LD A,E + CP 0x1B + JR Z,SysInfoExt + CP 0x0D + JR Z,SysInfoExt + RES 5,A + CP 'O' + JR NZ,SysInfoLoop +SysInfoExt + WINDOWCLOSE + RET + +Bytes: DEFB "bytes" +Present: DEFB "Present " +NotPresent: DEFB "Not present" + +;[]==========================================================[] +DiskInfoR: LD HL,SetInvert + ;!FIXIT проверить для это оно или нет SAFE_PORTY + PUSH HL + SETPORT WINSP.Y_PORT,0xC0 + CALL SetClock + PUSH IY + SPDSS DSSF.CURDISK + POP IY + ADD A,'A' + LD (.CrDrive),A + ;!TEST + ;LD IX,0x0000 + ;LD HL,0x0000 + ;LD DE,WorkBuffer + ;LD BC,0x0105 + ;SUB 'A' + ;PUSH IY + ;RST ToDSS.DRV ;!FIXIT rst 0x18 + ;POP IY + ;JP C,SetMouse + LD B,0 + CALL .get_info + EX AF,AF' + LD A,D + AND E + EXX + AND D + AND E + INC A + EXX + JR Z,.no_full_info +; все данные есть + PUSH DE ; свободных кластеров, младшая часть + PUSH HL ; общее кол-во кластеров, младшая часть + PUSH BC ; размер сектора в байтах + EXX + PUSH DE ; свободных кластеров, старшая часть + PUSH HL ; общее кол-во кластеров, старшая часть + EX AF,AF' + PUSH AF ; размер кластера в секторах + EX AF,AF' +.no_full_info: PUSH AF +; parsing + LD D,0 + LD HL,WorkBuffer +; тут в HL длина поля "Файловая система" + LD E,(HL) + ADD HL,DE + INC HL +; длина поля "Серийный номер диска" + LD A,(HL) + PUSH HL + INC HL + LD (.serial_1),HL + INC HL + LD (.serial_2),HL + INC HL + LD (.serial_3),HL + INC HL + LD (.serial_4),HL + POP HL + LD E,A + ADD HL,DE + INC HL ; указатель на длину поля "Метка диска" + INC HL +; метка + LD (.buf_label),HL + LD DE,.NoLabel + LD B,11 +.loop1: SUB A + CP (HL) + JR Z,.DiskI2 + LD A,(DE) + CP (HL) + JR NZ,.DiskI1 + INC HL + INC DE + DJNZ .loop1 +.DiskI1: LD HL,WorkBuffer+0x2B +.buf_label EQU $-2 + JR NZ,.DiskI21F +.DiskI2: LD HL,.NoLabelT +.DiskI21F: LD DE,.Dlabel + LD BC,.Dlabel.Size + LDIR +; серийник + LD DE,.SerialN + LD A,(WorkBuffer+0x2A) +.serial_4 EQU $-2 + CALL ConvHexTxt + LD A,(WorkBuffer+0x29) +.serial_3 EQU $-2 + CALL ConvHexTxt + INC DE + LD A,(WorkBuffer+0x28) +.serial_2 EQU $-2 + CALL ConvHexTxt + LD A,(WorkBuffer+0x27) +.serial_1 EQU $-2 + CALL ConvHexTxt + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 192,80,256,98 + W_FILL 4,2,248,10,COLORI.BLACK + W_TEXT 106,3,COLORI.WHITE,"Disk info" + W_TEXT 10,20,COLORP.HIGHGRAY,"Current drive: " +.CrDrive: EQU $ - 2 + W_TEXT 10,32,COLORP.HIGHGRAY,"Total disk space:" + W_TEXT 10,44,COLORP.HIGHGRAY,"Avaliable disk space:" + W_TEXT 10,56,COLORP.HIGHGRAY,"Disk label: " +.Dlabel: EQU $ - STRLEN(" ") - 1 +.Dlabel.Size EQU $ - .Dlabel - 1 + W_TEXT 10,68,COLORP.HIGHGRAY,"Serial volume number: - " +.SerialN: EQU $ - STRLEN(" - ") - 1 + W_BUTTON 92,80,72,14 + W_TEXT 120,83,COLORP.HIGHGRAY,"Ok" + W_END + POP AF + JR NZ,.calc_size + LD B,1 + CALL .get_info + PUSH DE ; свободных кластеров, младшая часть + PUSH HL ; общее кол-во кластеров, младшая часть + PUSH BC ; размер сектора в байтах + EXX + PUSH DE ; свободных кластеров, старшая часть + PUSH HL ; общее кол-во кластеров, старшая часть + PUSH AF ; размер кластера в секторах +.calc_size: POP AF ; размер кластера в секторах + POP HL + POP DE + EXX + POP BC + POP HL + POP DE +; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE + EXX + LD BC,0 + EXX + SRL B + RR C + RRCA + JR C,.loop_2 +.loop_1: SLA L + RL H + EXX + RL L + RL H + RL B + EXX + SLA E + RL D + EXX + RL E + RL D + RL C + EXX + RRCA + JP NC,.loop_1 +.loop_2: SLA L + RL H + EXX + RL L + RL H + RL B + EXX + SLA E + RL D + EXX + RL E + RL D + RL C + EXX + SRL B + RR C + JP NC,.loop_2 +; <-- B':HL'HL, C':DE':DE + EXX + LD A,C + LD (.freeSpace_h),A + LD (.freeSpace_m),DE + LD A,B + PUSH HL + EXX + LD (.freeSpace_l),DE + POP BC +; вычисляем общий размер в байтах + ; A:BC:HL - число для перевода + LD DE,WorkBuffer + CALL ConvNumTxt40 + SUB A + LD (DE),A + LD HL,WorkBuffer + LD DE,WorkBuffer+0x100 + CALL CorrBigNum + LD A,' ' + LD (DE),A + INC DE + LD HL,Bytes + LD BC,5;Bytes.Size + LDIR + SUB A + LD (DE),A +; вычисляем свободное место в байтах + LD A,0 +.freeSpace_h EQU $-1 + LD BC,0 +.freeSpace_m EQU $-2 + LD HL,0 +.freeSpace_l EQU $-2 + LD DE,WorkBuffer+0x80 +; A:BC:HL - число для перевода + CALL ConvNumTxt40 + SUB A + LD (DE),A + LD HL,WorkBuffer+0x80 + LD DE,WorkBuffer+0x180 + CALL CorrBigNum + LD A,' ' + LD (DE),A + INC DE + LD HL,Bytes + LD BC,5;Bytes.Size + LDIR + SUB A + LD (DE),A +; вывод размеров + LD HL,WorkBuffer+0x100 + LD DE,0x0128 + LD BC,0x0070 + LD A,0x80 + CALL PrnTxtLnIFF + LD HL,WorkBuffer+0x180 + LD DE,0x0013A + LD BC,0x007C + LD A,0x80 + CALL PrnTxtLnIFF + CALL SetMouse +.DiskInfoLoop: LD IX,DiskInfoTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,.DiskInfoLoop + LD A,B + OR A + JR NZ,.DiskInfoLoop + LD A,E + CP 0x1B + JR Z,.Ext + CP 0x0D + JR Z,.Ext + RES 5,A + CP 'O' + JR NZ,.DiskInfoLoop +.Ext: + WINDOWCLOSE + RET + +.get_info: LD A,(.CrDrive) + SUB 'A' + OR 0x80 + LD HL,WorkBuffer + PUSH IY + SPDSS DSSF.DSKINFO + POP IY + RET NC +; если ошибка, то обнуляем размер свободного места и полный размер + XOR A + LD H,A + LD L,A + LD D,A + LD E,A + EXX + LD H,A + LD L,A + LD D,A + LD E,A + LD B,A + LD C,A + RET + +.NoLabel DEFB "NO NAME " +.NoLabelT DEFB "no label " + +ConvHexTxt PUSH AF + RRCA + RRCA + RRCA + RRCA + CALL ConvHexT1 + POP AF +ConvHexT1 AND 0x0F + ADD A,0x90 + DAA + ADC A,0x40 + DAA + LD (DE),A + INC DE + RET + +CorrBigNum PUSH HL + SUB A + LD C,A +.L1 INC C + INC HL + CP (HL) + JR NZ,.L1 + POP HL + LD A,C +.L2 SUB 0x03 + JR Z,.L5 + JR NC,.L2 + ADD A,0x03 + LD B,A +.L3 LD A,(HL) + LD (DE),A + INC HL + INC DE + DJNZ .L3 +.L4 LD A,(HL) + OR A + RET Z + LD A,' ' + LD (DE),A + INC DE +.L5 LDI + LDI + LDI + JR .L4 + +;[]==========================================================[] +VersionR + SETPORT WINSP.Y_PORT,0xC0 + LD HL,SetInvert + PUSH HL + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 192,64,256,152 + W_FILL 4,2,248,10,COLORI.BLACK + W_TEXT 110,3,COLORI.WHITE,"Version" + W_TEXT 93,20,COLORP.HIGHGRAY,"Flex Navigator" + W_TEXT 76,38,COLORP.HIGHGRAY,"Component versions:" + W_TEXT 70,48,COLORP.HIGHGRAY,"Manager:" + W_TEXT 128,48,COLORP.HIGHGRAY,"\{FLEX_VERS.NAVIGATOR}" + W_TEXT 65,58,COLORP.HIGHGRAY,"File Editor:" + W_TEXT 128,58,COLORP.HIGHGRAY,"\{FLEX_VERS.EDITOR}" + W_TEXT 61,68,COLORP.HIGHGRAY,"File Viewer:" + W_TEXT 128,68,COLORP.HIGHGRAY,"\{FLEX_VERS.VIEWER}" + W_TEXT 50,86,COLORP.HIGHGRAY,"2000, Enin Anton" + W_TEXT 50,96,COLORP.HIGHGRAY,"2021, Mikhaltchenkov Dmitry" + W_TEXT 50,106,COLORP.HIGHGRAY,"2022, Belyanskiy Anatoliy" + W_TEXT 50,116,COLORP.HIGHGRAY,"(C) Sprinter Team. 13.12.2024" + W_BUTTON 92,133,72,14 + W_TEXT 120,136,COLORP.HIGHGRAY,"OK" + W_END + CALL ResFire +VersionLoop LD IX,VersionTab + CALL TestCoords + SPDSS DSSF.SCANKEY + JR Z,VersionLoop + LD A,B + OR A + JR NZ,VersionLoop + LD A,E + CP 0x1B + JR Z,VersionExt + CP 0x0D + JR NZ,VersionLoop +VersionExt + WINDOWCLOSE + RET diff --git a/rez2_fnsearch.a80 b/rez2_fnsearch.a80 new file mode 100644 index 0000000..1b13b23 --- /dev/null +++ b/rez2_fnsearch.a80 @@ -0,0 +1,368 @@ + +; LAST UPDATE: 27.03.2025 savelij + +;[]==========================================================[] +QSearchR LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + SETPORT WINSP.Y_PORT,0xC0 + LD HL,SearchN + LD B,0x0C + SUB A +.L1 LD (HL),A + INC HL + DJNZ .L1 + LD (SrchLen),A + LD L,(IY+PANEL.XL) + LD H,(IY+PANEL.XH) + LD DE,0x000A + ADD HL,DE + LD (.SrchX1),HL + LD DE,0x0034 + ADD HL,DE + LD (SrchX2),HL + LD HL,0x00E0 + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JR Z,.L2 + LD HL,0x00D0 +.L2 LD (.SrchY1),HL + LD DE,0x0007 + ADD HL,DE + LD (SrchY2),HL + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 0,0,166,20 +.SrchX1 EQU $ - 8 +.SrchY1 EQU $ -6 + W_TEXT 8,7,COLORP.HIGHGRAY,"Search:" + W_BORDER 48,4,108,12 + W_FILL 50,5,104,10,COLORI.WHITE + W_END + LD IX,SearchStr + LD (InpLnData),IX + SUB A + LD (IX+0x02),A + LD (IX+0x03),A + LD (IX+0x04),A + CALL InsInpLnCol + CALL PrintInpLn+3 +.SearchInpLp HALT + CALL ChCursor + CALL TestCMOS + SPMOUSE MOUSEF.READ_STATE + OR A + JP NZ,SearchExit + SPDSS DSSF.SCANKEY + JR Z,.SearchInpLp + RES 7,D + BIT KEYBSTAT.B_CTRL,B ;Ctrl + JR NZ,.SearchInpLp + LD IX,SearchTab + BIT KEYBSTAT.B_ALT,B ;Alt + JR Z,.Search1 + LD A,D + OR A + JR Z,.SearchInpLp + CP SC.LCTRL + JR NC,.SearchInpLp + LD HL,AltTable + DEC A + ADD A,L + LD L,A + JR NC,.L3 + INC H +.L3 LD A,(HL) + BIT 0,C + CALL NZ,CorrSmallChar + LD E,A +.Search1 LD A,(IX+0x00) + INC IX + CP 0xFF + JR Z,.SearchInpLp1 + LD L,A + LD H,(IX+0x00) + INC IX + LD C,(IX+0x00) + INC IX + LD B,(IX+0x00) + INC IX + OR A + SBC HL,DE + JR NZ,.Search1 + LD IX,(InpLnData) + LD HL,.SearchInpLp + PUSH HL + PUSH BC + RET + +.SearchInpLp1 LD IX,(InpLnData) + LD HL,.SearchInpLp + PUSH HL + LD A,E + JR InsSymbolSrch + +SearchTab DW SC.ESC << 8 | 0x1B, SrchExit + DW SC.ENTER << 8 | 0x0D, SrchExit + DW SC.BKSP << 8 | 0x08, QSdelet + DB 0xFF + +InsSymbolSrch CP 0x20 + RET C + EX AF,AF' + LD A,(IX+0x04) ;InpytSymb + SUB (IX+0x00) ;Max len + RET NC + LD A,(IX+0x04) + SUB (IX+0x02) + JR Z,NotInsSrch + LD C,A + LD B,0x00 + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x04) + ADD HL,DE + LD E,L + LD D,H + DEC HL + LDDR +NotInsSrch PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x02) + ADD HL,DE + EX AF,AF' + LD (HL),A + INC (IX+0x04) + INC (IX+0x02) + CALL SearchFile + JP C,ILdelet +FoundSFile PUSH HL + CALL PrintInpLn + POP HL + EX DE,HL + LD L,(IY+PANEL.CFL) + LD H,(IY+PANEL.CFH) + LD C,(IY+PANEL.FFL) + LD B,(IY+PANEL.FFH) + ADD HL,BC + SBC HL,DE + EX DE,HL + RET Z + PUSH HL + CALL ResInvert + POP HL + LD C,(IY+PANEL.FPL) + LD B,(IY+PANEL.FPH) + LD DE,0x0000 + EX DE,HL + OR A + SBC HL,BC + EX DE,HL +.L1 EX DE,HL + ADD HL,BC + EX DE,HL + OR A + SBC HL,BC + JR NC,.L1 + ADD HL,BC + LD (IY+PANEL.CFL),L + LD (IY+PANEL.CFH),H + LD C,(IY+PANEL.FFL) + LD B,(IY+PANEL.FFH) + LD (IY+PANEL.FFL),E + LD (IY+PANEL.FFH),D + EX DE,HL + OR A + SBC HL,BC + CALL NZ,PrintDIR + CALL SetInvert + CALL PrnFileInfo + PUSH IY + POP IX + LD DE,PANEL.BARXL + ADD IX,DE + LD A,(IY+PANEL.VIEWFLAG) + AND VIEWFLAG.MASK + PUSH AF + CALL Z,PrnHScrBar + POP AF + JP NZ,PrnVScrBar + RET + +QSdelet LD A,(IX+0x02) + OR A + RET Z + PUSH IX + POP HL + LD DE,LenInpData + ADD HL,DE + LD E,(IX+0x02) + ADD HL,DE + LD E,L + LD D,H + DEC DE + LD A,(IX+0x04) + SUB (IX+0x02) + JR Z,QSDel1 + LD C,A + LD B,0x00 + LDIR + SUB A +QSDel1 LD (DE),A + DEC (IX+0x02) + DEC (IX+0x04) + CALL SearchFile + JP NC,FoundSFile + JP PrintInpLn + +SearchStr DEFB 0x0C,0x00,0x00,0x00 +SrchLen DEFB 0x03 +SrchX2 DEFW 0x0000 +SrchY2 DEFW 0x0000 + DEFW 0x0064 + DEFB 0xF0 +SearchN DUPL 13,0 + +AltTable DEFB 0x1B,"1234567890-=",0x08,0x09,"qwertyuiop[]" + DEFB 0x00,"asdfghjkl;'",0x0D,0x00,"zxcvbnm,./",0x00,0x5C + +SearchFile BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + JP NZ,SearchFileT ;Tree + PUSH IX + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD IX,0x0000 + LD HL,0xC001 + LD BC,0x0018 +.SearchFlp LD DE,SearchN + LD A,(DE) + CALL CorrBigChar + CP (HL) + JR Z,.SrchF1 + CALL CorrSmallChar + CP (HL) + JR NZ,.SearchFnxt +.SrchF1 PUSH HL + PUSH DE + LD DE,WorkBuffer + PUSH DE + CALL MakeDOSname + POP HL + POP DE +.SrchF2 INC DE + LD A,(DE) + OR A + JR Z,.SearchFexit + INC HL + LD A,(HL) + OR A + JR Z,.SearchFnx0 + LD A,(DE) + CALL CorrBigChar + CP (HL) + JR Z,.SrchF2 + CALL CorrSmallChar + CP (HL) + JR Z,.SrchF2 +.SearchFnx0 POP HL + LD BC,0x0018 +.SearchFnxt ADD HL,BC + INC IX + LD A,(HL) + OR A + JR NZ,.SearchFlp + POP AF + SETPORT WINSP.CPU3,,0 + POP IX + SCF + RET + +.SearchFexit INC SP + INC SP + POP AF + SETPORT WINSP.CPU3,,0 + PUSH IX + POP HL + POP IX + OR A + RET + +SearchFileT PUSH IX + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD IX,0x0000 + LD HL,0xC002 + LD BC,0x000D +.SearchTlp LD DE,SearchN + LD A,(DE) + CALL CorrBigChar + CP (HL) + JR Z,.SrchT1 + CALL CorrSmallChar + CP (HL) + JR NZ,.SearchTnxt +.SrchT1 PUSH HL +.SrchT2 INC DE + LD A,(DE) + OR A + JR Z,.SearchTexit + INC HL + LD A,(HL) + OR A + JR Z,.SearchTnx0 + LD A,(DE) + CALL CorrBigChar + CP (HL) + JR Z,.SrchT2 + CALL CorrSmallChar + CP (HL) + JR Z,.SrchT2 +.SearchTnx0 POP HL +.SearchTnxt ADD HL,BC + INC IX + LD A,(HL) + INC HL + INC HL + INC HL + INC A + JR NZ,.SearchTlp + POP AF + SETPORT WINSP.CPU3,,0 + POP IX + SCF + RET + +.SearchTexit INC SP + INC SP + POP AF + SETPORT WINSP.CPU3,,0 + PUSH IX + POP HL + POP IX + OR A + RET + +SrchExit POP HL +SearchExit + WINDOWCLOSE + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + IF TREE_REZID + CALL NZ,TestTreeR.TestTreeBeg + ELSE + CALL NZ,TestTreeR.TestTreeBeg + ENDIF + RET diff --git a/rez2_fntab1.a80 b/rez2_fntab1.a80 new file mode 100644 index 0000000..511269e --- /dev/null +++ b/rez2_fntab1.a80 @@ -0,0 +1,151 @@ + +; LAST UPDATE: 16.04.2025 savelij + +;[]==========================================================[] +; Формат таблицы +; +00 2 Xmin +; +02 2 Xmax +; +04 2 Ymin +; +06 2 Ymax +; +08 2 0 - простой об'ект +; бит 0 - кнопка +; бит 1 - рабочая кнопка +; бит 2 - инверт 1 +; бит 3 - статичный инверт +; бит 4 - программа запускается без адреса возвр. +; и без огня +; бит 5 - программа запускается без адреса возвр. +; по левой кнопке огня +; бит 6 - программа запускается без адреса возвр. +; по правой кнопке огня +; бит 7 - вызвать функцию закрытия окна перед +; запуском программы без огня +; бит 8 - вызвать функцию закрытия окна перед +; запуском программы по левой кнопке +; бит 9 - вызвать функцию закрытия окна перед +; запуском программы по правой кнопке +; бит15 - это переключатель (инверт при огне не +; убирать) +; +0A 2 Адрес обработчика при не нажатом огне +; +0C 2 Адрес обработчика при нажатом огне (лев) +; +0E 2 Адрес обработчика при нажатом огне (прав) + +;[]==========================================================[] +SetupTab: DW 106,246, 85,133,%0000000000000000,0,NewElement,0 + DW 114,130,146,155,%0000000000000000,0,ChActivatePan,0 + DW 114,130,164,173,%0000000000000000,0,ChSavePan,0 + DW 274,290, 87, 95,%0000000000000011,0,DecRED,0 + DW 418,434, 87, 95,%0000000000000011,0,IncRED,0 + DW 440,464, 87, 95,%0000000000000000,0,InputRED,0 + DW 274,290,103,111,%0000000000000011,0,DecGREEN,0 + DW 418,434,103,111,%0000000000000011,0,IncGREEN,0 + DW 440,464,103,111,%0000000000000000,0,InputGREEN,0 + DW 274,290,119,127,%0000000000000011,0,DecBLUE,0 + DW 418,434,119,127,%0000000000000011,0,IncBLUE,0 + DW 440,464,119,127,%0000000000000000,0,InputBLUE,0 + DW 456,528,162,176,%0000000000000001,0,SaveSetup,0 + DW 368,440,184,198,%0000000000100001,0,SetupCancel,0 + DW 456,528,184,198,%0000000000100001,0,SetupOkey,0 + DW 0, 96, 0,256,%0000000000100000,0,SetupCancel,0 + DW 544,640, 0,256,%0000000000100000,0,SetupCancel,0 + DW 0,640, 0, 64,%0000000000100000,0,SetupCancel,0 + DW 0,640,184,256,%0000000000100000,0,SetupCancel,0 + DW 0x8000 + +;[]===============================================================[] +FileInfoTab: DW 284,356,160,174,%0000000000100001,0,FileInfoExt,0 + DW 0,240, 0,256,%0000000000100000,0,FileInfoExt,0 + DW 400,640, 0,256,%0000000000100000,0,FileInfoExt,0 + DW 0,640, 0, 80,%0000000000100000,0,FileInfoExt,0 + DW 0,640,178,256,%0000000000100000,0,FileInfoExt,0 + DW 0x8000 + +;[]===============================================================[] +PrintFTab: DW 284,356,128,142,%0000000000000001,0,StopPrint,0 + DW 0x8000 + +;[]===============================================================[] +SysInfoTab: DW 284,356,160,174,%0000000000100001,0,SysInfoExt,0 + DW 0,224, 0,256,%0000000000100000,0,SysInfoExt,0 + DW 416,640, 0,256,%0000000000100000,0,SysInfoExt,0 + DW 0,640, 0, 64,%0000000000100000,0,SysInfoExt,0 + DW 0,640,178,256,%0000000000100000,0,SysInfoExt,0 + DW 0x8000 + +;[]===============================================================[] +DiskInfoTab: DW 284,356,160,174,%0000000000100001,0,DiskInfoR.Ext,0 + DW 0,192, 0,256,%0000000000100000,0,DiskInfoR.Ext,0 + DW 448,640, 0,256,%0000000000100000,0,DiskInfoR.Ext,0 + DW 0,640, 0, 80,%0000000000100000,0,DiskInfoR.Ext,0 + DW 0,640,178,256,%0000000000100000,0,DiskInfoR.Ext,0 + DW 0x8000 + +;[]===============================================================[] +VersionTab: DW 284,356,157,171,%0000000000100001,0,VersionExt,0 + DW 0,192, 0,256,%0000000000100000,0,VersionExt,0 + DW 448,640, 0,256,%0000000000100000,0,VersionExt,0 + DW 0,640, 0, 64,%0000000000100000,0,VersionExt,0 + DW 0,640,176,256,%0000000000100000,0,VersionExt,0 + DW 0x8000 + +;[]===============================================================[] +PathTab: DW 240,312,123,137,%0000000000000001,0,InputLine.InpLnExtN,0 + DW 328,400,123,137,%0000000000000001,0,InputLine.InpLnExtC,0 + DW 0, 96, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 544,640, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640, 0, 81,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640,143,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0x8000 + +;[]===============================================================[] +OverWrtTab: DW 196,252,126,140,%0000000100100001,0,OverWrtFile,0 + DW 260,316,126,140,%0000000100100001,0,OverWrtAll,0 + DW 324,380,126,140,%0000000100100001,0,OverSkip,0 + DW 388,444,126,140,%0000000100100001,0,OverExit,0 + DW 0,180, 0,256,%0000000100100000,0,OverExit,0 + DW 460,640, 0,256,%0000000100100000,0,OverExit,0 + DW 0,640, 0, 88,%0000000100100000,0,OverExit,0 + DW 0,640,144,256,%0000000100100000,0,OverExit,0 + DW 0x8001 + +;[]===============================================================[] +ReNameTab: DW 240,312,123,137,%0000000000000001,0,InputLine.InpLnExtN,0 + DW 328,400,123,137,%0000000000000001,0,InputLine.InpLnExtC,0 + DW 0,208, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 432,640, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640, 0, 81,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640,143,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0x8000 + +;[]===============================================================[] +MakeDIRTab: DW 240,312,123,137,%0000000000000001,0,InputLine.InpLnExtN,0 + DW 328,400,123,137,%0000000000000001,0,InputLine.InpLnExtC,0 + DW 0,200, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 440,640, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640, 0, 81,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0,640,143,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0x8000 + +;[]===============================================================[] +DeleteTab: DW 196,252,118,132,%0000000100100001,0,DelDelete,0 + DW 260,316,118,132,%0000000100100001,0,DelAll,0 + DW 324,380,118,132,%0000000100100001,0,DelSkip,0 + DW 388,444,118,132,%0000000100100001,0,DelExit,0 + DW 0,180, 0,256,%0000000100100000,0,DelExit,0 + DW 460,640, 0,256,%0000000100100000,0,DelExit,0 + DW 0,640, 0, 80,%0000000100100000,0,DelExit,0 + DW 0,640,136,256,%0000000100100000,0,DelExit,0 + DW 0x8000 + +;[]===============================================================[] +QuitTab: + DW 240,312,120,134,%0000000000100001,0,QuitConfirmWin.OK,0 + DW 328,400,120,134,%0000000000100001,0,QuitConfirmWin.Abort,0 + DW 0,208, 0,256,%0000000000100000,0,QuitConfirmWin.Abort,0 + DW 432,640, 0,256,%0000000000100000,0,QuitConfirmWin.Abort,0 + DW 0,640, 0, 88,%0000000000100000,0,QuitConfirmWin.Abort,0 + DW 0,640,138,256,%0000000000100000,0,QuitConfirmWin.Abort,0 + DW 0x8000 + +EmptyTab: DW 0,640, 0,256,%0000000000000000,0,InputLine.InpLnExtC,0 + DW 0x8000 diff --git a/rez3_fnmark.a80 b/rez3_fnmark.a80 new file mode 100644 index 0000000..f76350b --- /dev/null +++ b/rez3_fnmark.a80 @@ -0,0 +1,870 @@ + +; LAST UPDATE: 12.05.2025 savelij + +;[]==========================================================[] +MarkFileR LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *16 + ADD HL,DE ; *18 + SET 6,H + SET 7,H ; | 0xC000 + LD E,(HL) ; FileHDR.Flag + POP AF + SETPORT WINSP.CPU3,,0 + BIT FileHDR.B_MARK,E + PUSH AF + CALL Z,SelectFile + POP AF + CALL NZ,UnSelectFile + CALL CursDown + CALL PrnFileInfo + LD B,0x07 +.L2 PUSH BC + SPMOUSE MOUSEF.READ_STATE + POP BC + BIT 1,A + RET Z + HALT + DJNZ .L2 + RET + +;[]==========================================================[] +SelectFile: LD IXL,0x01 + JR UnSelectFile.L1 + +UnSelectFile: LD IXL,0x00 +.L1 + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L2 + LD A,(RAMPAGES.RIGHTPANEL) +.L2 + SETPORT WINSP.CPU3,,0 + SETPORT WINSP.Y_PORT,0xC0 + LD L,(IY+PANEL.FFL) + LD H,(IY+PANEL.FFH) + LD E,(IY+PANEL.CFL) + LD D,(IY+PANEL.CFH) + ADD HL,DE + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + LD E,L + LD D,H + ADD HL,HL ; *16 + ADD HL,DE ; *18 - FileHDR.SIZE + SET 6,H + SET 7,H ; | 0xC000 + PUSH HL + LD DE,FileHDR.Attr + ADD HL,DE + LD C,(HL) ; FileHDR.Attr (флаги описателя FAT файла) + POP HL + BIT DIR.B_Dir,C ; это дира? + IF MARK_DIR + CALL NZ,COUNTING_DIR + ELSE + JR NZ,.MrFile1 + ENDIF +; это файл + LD B,(HL) ; старое состояние пометки файла + LD A,IXL + LD (HL),A ; новое состояние пометки файла + LD DE,WorkBuffer + PUSH BC + LD BC,FileHDR.SIZE + LDIR + IF MARK_DIR + LD HL,COUNTING_DIR.FILES_SIZE + LD DE,WorkBuffer + FileHDR.SizeBytes + LD BC,DWORD + LDIR + ENDIF + POP BC +.MrFile1 POP AF + SETPORT WINSP.CPU3,,0 + IF MARK_DIR = 0 + BIT DIR.B_Dir,C + RET NZ ; выход если дира + ENDIF + LD A,B + CP IXL + RET Z ; выход если старое и новое состояние пометки совпали + BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) + JR NZ,.MarkFull +; при кратком показе файлов + LD L,(IY+PANEL.CFL) + LD H,(IY+PANEL.CFH) + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD DE,PositTABLeft + JR Z,.L3 + LD DE,PositTABRight +.L3 ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD C,(HL) + LD B,0x00 + EX DE,HL + LD A,IXL + OR A + PUSH AF + LD DE,(COLORP.INVERTPAPER + COLORI.INVERTINK) << 8 | (COLORP.INVERTPAPER + COLORI.INVSELFILES) + JR NZ,.L4 + LD DE,(COLORP.INVERTPAPER + COLORI.INVSELFILES) << 8 | (COLORP.INVERTPAPER + COLORI.INVERTINK) +.L4 LD IX,8 << 8 + 48 + DEC HL + DEC HL + CALL InvertRectan + POP AF + JR NZ,.MarkExit1 + JR .MarkExit2 + +; при полном показе файлов +.MarkFull LD L,(IY+PANEL.CFL) + LD H,(IY+PANEL.CFH) + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,0x003F + ADD HL,BC + LD C,L + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD HL,6 + JR Z,.L5 + LD HL,326 +.L5 LD A,IXL + OR A + PUSH AF + LD DE,(COLORP.INVERTPAPER + COLORI.INVERTINK) << 8 | (COLORP.INVERTPAPER + COLORI.INVSELFILES) + JR NZ,.L6 + LD DE,(COLORP.INVERTPAPER + COLORI.INVSELFILES) << 8 | (COLORP.INVERTPAPER + COLORI.INVERTINK) +.L6 LD IX,8 << 8 + 146 + CALL InvertRectan + POP AF + JR Z,.MarkExit2 +; установка выбор файла +.MarkExit1 LD IX,WorkBuffer + LD L,(IY + PANEL.MFL) + LD H,(IY + PANEL.MFH) + INC HL + LD (IY + PANEL.MFL),L + LD (IY + PANEL.MFH),H ; обновление количества помеченных файлов + LD L,(IX + FileHDR.SizeBytes) + LD H,(IX + FileHDR.SizeBytes + 1) + LD E,(IY + PANEL.MBL1) + LD D,(IY + PANEL.MBH1) + XOR A ; [ ] fat32 + ADD HL,DE + LD (IY + PANEL.MBL1),L + LD (IY + PANEL.MBH1),H ; обновление размера помеченных файлов биты 15-0 + LD L,(IX + FileHDR.SizeBytes + 2) + LD H,(IX + FileHDR.SizeBytes + 3) + ; [ ] fat32 + LD E,(IY + PANEL.MBL2) + LD D,(IY + PANEL.MBH2) + ADC HL,DE + ; [ ] fat32 + ADC A,(IY + PANEL.MBL3) + LD (IY + PANEL.MBL3),A ; обновление размера помеченных файлов биты 32-39 + LD (IY + PANEL.MBL2),L + LD (IY + PANEL.MBH2),H ; обновление размера помеченных файлов биты 31-15 + RET + +; снятие выбора файла +.MarkExit2 LD IX,WorkBuffer + LD L,(IY + PANEL.MFL) + LD H,(IY + PANEL.MFH) + DEC HL + LD (IY + PANEL.MFL),L + LD (IY + PANEL.MFH),H + LD L,(IY + PANEL.MBL1) + LD H,(IY + PANEL.MBH1) + LD E,(IX + FileHDR.SizeBytes) + LD D,(IX + FileHDR.SizeBytes + 1) + XOR A + SBC HL,DE + LD (IY + PANEL.MBL1),L + LD (IY + PANEL.MBH1),H + LD L,(IY + PANEL.MBL2) + LD H,(IY + PANEL.MBH2) + LD E,(IX + FileHDR.SizeBytes + 2) + LD D,(IX + FileHDR.SizeBytes + 3) + SBC HL,DE + ; [ ] fat32 + ADC A,(IY + PANEL.MBL3) + LD (IY + PANEL.MBL3),A + LD (IY + PANEL.MBL2),L + LD (IY + PANEL.MBH2),H + RET + +;[]==========================================================[] +UnMarkGroupR: CALL ResInvert +UnMarkGroupRN: LD HL,SetInvert + PUSH HL + SUB A + JR SelectGroup + +MarkGroupR: CALL ResInvert +MarkGroupRN: LD HL,SetInvert + PUSH HL + LD A,0x01 +SelectGroup: LD (SelMode),A + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 208,81,224,62 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 82,3,COLORI.WHITE,"Select mask" + W_BUTTON 32,42,72,14 + W_TEXT 60,45,COLORP.HIGHGRAY,"Ok" + W_BUTTON 120,42,72,14 + W_TEXT 140,45,COLORP.HIGHGRAY,"Cancel" + W_TEXT 10,25,COLORP.HIGHGRAY,"Mark mask:" + W_BORDER 70,22,134,12 + W_FILL 72,23,130,10,COLORI.WHITE + W_END + LD IX,SMaskStr + LD HL,SMaskTab + CALL InputLine + WINDOWCLOSE + RET C + LD A,(MaskLen) + OR A + RET Z + LD B,A + LD HL,CrSMask +CorMask LD A,(HL) + CALL CorrBigChar + LD (HL),A + INC HL + DJNZ CorMask + LD HL,CrSMask + LD DE,SelMask + CALL MakeMask + JR C,MarkGNext + LD HL,NORMmask + LD DE,CrSMask + LD BC,MASK_SIZE + LDIR + LD HL,CrSMask + LD DE,SelMask + JP MakeMask + +MarkGNext + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + ;!FIXIT проверить для это оно или нет SAFE_PORTY + SETPORT WINSP.Y_PORT,0xC0 + LD IX,CPU3 + LD HL,0xC000 + LD DE,SelMask + EX AF,AF' ; [ ] fat32 + EXX + LD L,(IY+PANEL.MBL1) + LD H,(IY+PANEL.MBH1) + LD E,(IY+PANEL.MBL2) + LD D,(IY+PANEL.MBH2) + LD A,(IY+PANEL.MBL3) ; [ ] FAT32 + LD C,(IY+PANEL.MFL) + LD B,(IY+PANEL.MFH) + EXX + EX AF,AF' ; [ ] fat32 + PUSH IY + LD IYL,0x00 +SelMode EQU $-1 + LD IYH,0x00 +Select1 PUSH DE + BIT DIR.B_Dir,(IX + FileHDR.Attr) + JR NZ,Select8 + LD A,IYL + CP (HL) + JR Z,Select8 + PUSH HL + INC HL + LD B,8 +Select2 LD A,(DE) + CP '?' + JR Z,Select3 + CP (HL) + JR NZ,Select6 +Select3 INC HL + INC DE + DJNZ Select2 + INC HL + LD B,03 +Select4 LD A,(DE) + CP '?' + JR Z,Select5 + CP (HL) + JR NZ,Select6 +Select5 INC HL + INC DE + DJNZ Select4 +Select6 POP HL + JR NZ,Select8 + LD IYH,0x01 + LD A,IYL + LD (HL),A + OR A + CALL Z,SUB_SIZE + CALL NZ,ADD_SIZE +Select8: LD DE,FileHDR.SIZE + ADD HL,DE + ADD IX,DE + POP DE + LD A,(IX + FileHDR.Name) + OR A + JR NZ,Select1 + LD A,IYH + EX AF,AF' + POP IY + EXX + LD (IY+PANEL.MBL1),L + LD (IY+PANEL.MBH1),H + LD (IY+PANEL.MBL2),E + LD (IY+PANEL.MBH2),D + LD (IY+PANEL.MBL3),A ; [ ] FAT32 + LD (IY+PANEL.MFL),C + LD (IY+PANEL.MFH),B + EXX + POP AF + SETPORT WINSP.CPU3,,0 + EX AF,AF' + OR A + RET Z + CALL PrintDIR + JP PrnFileInfo + +SMaskStr: DEFB 0x0C,0x00,0x00,0x00 +MaskLen: DEFB 0x03 + DEFW 282,106 + DEFW 104 + DEFB 0xF0 +CrSMask: DEFB "*.*" + DB 10 DUP 0 +SelMask: DEFB "???????????" + +MakeMask LD BC,0x0902 +SMaskLp LD A,(HL) + CP '!' + RET C + CP '\"' + RET Z + CP '*' + JR Z,SMask1 + CP '+' + RET Z + CP ',' + RET Z + CP '.' + JR Z,SMask2 + CP '/' + RET Z + CP ':' + RET Z + CP ';' + RET Z + CP '<' + RET Z + CP '=' + RET Z + CP '>' + RET Z + CP '[' + RET Z + CP '\\' + RET Z + CP ']' + RET Z + CP '|' + RET Z + CALL CorrBigChar + LD (DE),A + INC HL + INC DE + DJNZ SMaskLp + AND A + RET + +SMask1 LD A,'?' + INC HL + DJNZ SMask11 + AND A + RET + +SMask11 LD (DE),A + INC DE + DJNZ SMask11 + INC B + JR SMaskLp + +SMask2 LD A,' ' + INC HL + DJNZ SMask21 + LD B,0x04 + DEC C + JR NZ,SMaskLp + AND A + RET + +SMask21 LD (DE),A + INC DE + DJNZ SMask21 + LD B,0x04 + DEC C + JR NZ,SMaskLp + AND A + RET + +;[]==========================================================[] +SelectAllR: CALL ResInvert +SelectAllRN: LD HL,SetInvert + PUSH HL + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + SETPORT WINSP.Y_PORT,0xC0 + LD IX,CPU3 + LD BC,FileHDR.SIZE + EX AF,AF' ; [ ] fat32 + SUB A + LD L,A + LD H,L + LD E,L + LD D,H + EXX + LD L,A + LD H,L + EXX + EX AF,AF' ; [ ] fat32 +.loop: BIT DIR.B_Dir,(IX + FileHDR.Attr) ;!HARDCODE DIRECTORY + JR NZ,.SelAll1 + SET FileHDR.B_MARK,(IX + FileHDR.Flag) + LD C,(IX + FileHDR.SizeBytes) + LD B,(IX + FileHDR.SizeBytes + 1) + EX AF,AF' ; [ ] fat32 + ADD HL,BC + LD C,(IX + FileHDR.SizeBytes + 2) + LD B,(IX + FileHDR.SizeBytes + 3) + EX DE,HL + ADC HL,BC + EX DE,HL + ADC A,0 + EX AF,AF' ; [ ] fat32 + EXX + INC HL + EXX + LD BC,FileHDR.SIZE +.SelAll1: ADD IX,BC + LD A,(IX + FileHDR.Name) + OR A + JR NZ,.loop + POP AF + SETPORT WINSP.CPU3,,0 + EXX + LD E,(IY+PANEL.MFL) + LD D,(IY+PANEL.MFH) + OR A + SBC HL,DE + RET Z + ADD HL,DE + LD (IY+PANEL.MFL),L + LD (IY+PANEL.MFH),H + EXX + LD (IY+PANEL.MBL1),L + LD (IY+PANEL.MBH1),H + LD (IY+PANEL.MBL2),E + LD (IY+PANEL.MBH2),D + ; [ ] FAT32 + EX AF,AF' + LD (IY+PANEL.MBL3),A + CALL PrintDIR + JP PrnFileInfo + +;[]==========================================================[] +UnSelectAllR: CALL ResInvert +UnSelectAllRN: LD HL,SetInvert + PUSH HL + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + LD A,(IY+PANEL.MFL) + OR (IY+PANEL.MFH) + RET Z + PUSH IY + POP HL + LD BC,PANEL.MFL + ADD HL,BC + LD B,PANEL.FILEMASK - PANEL.MFL +.L2 LD (HL),0 + INC HL + DJNZ .L2 + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + SETPORT WINSP.Y_PORT,0xC0 + LD HL,CPU3 + LD BC,FileHDR.SIZE + 1 +UnSelA1: RES 0,(HL) + ADD HL,BC + LD A,(HL) + DEC HL + OR A + JR NZ,UnSelA1 + POP AF + SETPORT WINSP.CPU3,,0 + CALL PrintDIR + JP PrnFileInfo + +;[]==========================================================[] +InvertSelectR: CALL ResInvert +InvertSelectRN: LD HL,SetInvert + PUSH HL + LD A,(IY+PANEL.EFL) + OR (IY+PANEL.EFH) + RET Z + BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + RET NZ + GETPORT WINSP.CPU3 + PUSH AF + BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.L1 + LD A,(RAMPAGES.RIGHTPANEL) +.L1 + SETPORT WINSP.CPU3,,0 + SETPORT WINSP.Y_PORT,0xC0 + LD IX,0xC000 + LD DE,FileHDR.SIZE + LD B,0x00 + EX AF,AF' ; [ ] fat32 + EXX + LD L,(IY + PANEL.MBL1) + LD H,(IY + PANEL.MBH1) + LD E,(IY + PANEL.MBL2) + LD D,(IY + PANEL.MBH2) + LD A,(IY + PANEL.MBL3) ; [ ] FAT32 + LD C,(IY + PANEL.MFL) + LD B,(IY + PANEL.MFH) + EXX + EX AF,AF' ; [ ] fat32 +.loop: BIT DIR.B_Dir,(IX + FileHDR.Attr) ;!HARDCODE Dir + JR NZ,.InvSel3 + LD B,FileHDR.M_MARK + LD A,(IX + FileHDR.Flag) + XOR B + LD (IX + FileHDR.Flag),A + CALL Z,SUB_SIZE + CALL NZ,ADD_SIZE +.InvSel3: ADD IX,DE + LD A,(IX + FileHDR.Name) + OR A + JR NZ,.loop + POP AF + SETPORT WINSP.CPU3,,0 + EX AF,AF' ; [ ] fat32 + EXX + LD (IY + PANEL.MBL1),L + LD (IY + PANEL.MBH1),H + LD (IY + PANEL.MBL2),E + LD (IY + PANEL.MBH2),D + LD (IY + PANEL.MBL3),A ; [ ] FAT32 + LD (IY + PANEL.MFL),C + LD (IY + PANEL.MFH),B + EXX + LD A,B + OR A + RET Z + CALL PrintDIR + JP PrnFileInfo + +ADD_SIZE: EX AF,AF' ; [ ] fat32 + EXX + PUSH BC + LD C,(IX + FileHDR.SizeBytes) + LD B,(IX + FileHDR.SizeBytes + 1) + ADD HL,BC + LD C,(IX + FileHDR.SizeBytes + 2) + LD B,(IX + FileHDR.SizeBytes + 3) + EX DE,HL + ADC HL,BC + EX DE,HL + ADC A,0 ; [ ] fat32 + POP BC + INC BC + EXX + EX AF,AF' ; [ ] fat32 + RET + +SUB_SIZE: EX AF,AF' ; [ ] fat32 + EXX + PUSH BC + LD C,(IX + FileHDR.SizeBytes) + LD B,(IX + FileHDR.SizeBytes + 1) + OR A + SBC HL,BC + LD C,(IX + FileHDR.SizeBytes + 2) + LD B,(IX + FileHDR.SizeBytes + 3) + EX DE,HL + SBC HL,BC + EX DE,HL + SBC A,0 ; [ ] fat32 + POP BC + DEC BC + EXX + EX AF,AF' + RET + + IF MARK_DIR +; подсчет в байтах размера отмеченной директории +COUNTING_DIR PUSH IX + PUSH IY + PUSH HL + PUSH BC + GETPORT WINSP.CPU3 + PUSH AF + PUSH HL + XOR A + LD H,A + LD L,A + LD IXH,A ; обнуление уровня вхождения в диры + LD (.FILES_SIZE),HL + LD (.FILES_SIZE + 2),HL ; обнуление размера диры + LD HL,CPU3 + LD (.CURR_DIRNAME),HL +; сохранение текущего пути для возврата + SPDSS DSSF.CURDISK + LD HL,WorkBuffer + 0x300 ; сохраненый путь для возврата + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + SPDSS DSSF.CURDIR + POP DE + JR C,.END_COUNT +; вход в директорию + LD HL,FileHDR.Name + ADD HL,DE + LD DE,.DIR_NAME + PUSH DE + LD BC,FileHDR.Name_Size + LDIR ; забрали имя диры для измерения + LD A,(RAMPAGES.FLX) + SETPORT WINSP.CPU3,,0 + CALL .ADD_2DOT ; возврат в предыдущую диру + POP HL + LD DE,(.CURR_DIRNAME) + LD BC,FileHDR.Name_Size + LDIR ; имя диры для входа + LD (.CURR_DIRNAME),DE + XOR A + LD (DE),A + CALL .SET_PATH ; установка текущего пути + INC IXH +.CONTINUE CALL .ADD_2DOT + CALL .COUNT_FILES + LD A,IXL + AND A ; диры есть + JR Z,.PREV_DIR ; диры не найдены + CALL .SET_PATH ; вход в диру из списка + INC IXH + JR .CONTINUE + +; выход в предыдущую диру +.PREV_DIR CALL .OUT_DIR + LD A,IXH + AND A + JR Z,.END_COUNT + CALL .GET_NAME + CALL .GET_NAME + LD HL,(.CURR_DIRNAME) + LD DE,-FileHDR.Name_Size + ADD HL,DE + LD A,(HL) + CP '.' + JR Z,.PREV_DIR + CALL .SET_PATH + INC IXH + JR .CONTINUE + +; возврат текущего пути +.END_COUNT POP AF + SETPORT WINSP.CPU3,,0 + LD HL,WorkBuffer + 0x300 ; сохраненый путь для возврата + SPDSS DSSF.CHDIR + POP BC + POP HL + POP IY + POP IX + RET + +.GET_NAME LD HL,(.CURR_DIRNAME) + LD (HL),0 + LD DE,-FileHDR.Name_Size + ADD HL,DE + LD (.CURR_DIRNAME),HL + RET + +.OUT_DIR DEC IXH + LD HL,.RET_DIR + JR .SP1 + +; переход в диру из списка +.SET_PATH LD HL,(.CURR_DIRNAME) + LD DE,-FileHDR.Name_Size + ADD HL,DE + LD DE,.DIR_NAME + PUSH DE + LD BC,FFIRST.Name_Size + LDIR + POP HL +.SP1 PUSH IX + SPDSS DSSF.CHDIR + SPDSS DSSF.CURDISK + LD HL,WorkBuffer + 0x200 + ADD A,'A' + LD (HL),A + INC HL + LD (HL),':' + INC HL + SPDSS DSSF.CURDIR + POP IX + RET + +; добавление имени диры для выхода в предыдущую диру +.ADD_2DOT PUSH HL + LD HL,.RET_DIR + LD DE,(.CURR_DIRNAME) + LD BC,FFIRST.Name_Size + LDIR + LD (.CURR_DIRNAME),DE + POP HL + RET + +; пересчитываем размеры файлов в текущей директории +; и выгребаем имена дир в табличку +.COUNT_FILES LD IXL,0 ; количество дир в текущей дире + CALL .F_FIRST ; ищем первый описатель + RET C +.L2 LD DE,FFIRST.Attr + ADD HL,DE + LD A,(HL) + SBC HL,DE + BIT DIR.B_Dir,A + JR Z,.L4 +; для диры копируем имя в табличку + LD DE,FFIRST.Name + ADD HL,DE + LD A,(HL) + CP '.' ; . и .. пропускаем + JR Z,.L5 + LD DE,(.CURR_DIRNAME) + LD BC,FFIRST.Name_Size + LDIR + LD (.CURR_DIRNAME),DE + INC IXL + JR .L5 + +; для файла добавляем длину +.L4 LD DE,FFIRST.FileSize + ADD HL,DE + CALL GET_DWORD ; взять размер из описателя + LD HL,.FILES_SIZE + PUSH HL + CALL BCDEHLP ; добавили к текущему размеру + POP HL + CALL SET_DWORD ; положили обратно +.L5 CALL .F_NEXT + JR NC,.L2 + RET + +; поиск первого описателя +.F_FIRST LD A, DIR.M_Archive + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly + \ + DIR.M_Dir +.FFF1 LD HL,.FILES_MASK + LD DE,WorkBuffer + 0x300 + PUSH DE + PUSH IX + SPDSS DSSF.F_FIRST,0 + POP IX + POP HL + RET + +; поиск следующего описателя +.F_NEXT LD DE,WorkBuffer + 0x300 + PUSH DE + PUSH IX + SPDSS DSSF.F_NEXT + POP IX + POP HL + RET + +.FILES_SIZE DD 0 +.FILES_MASK DZ "*.*" +.RET_DIR DZ ".. " +.DIR_NAME DZ " " +.CURR_DIRNAME DW 0 + +GetDirSizeR CALL COUNTING_DIR + LD HL,COUNTING_DIR.FILES_SIZE + JP GET_DWORD + ENDIF diff --git a/rez3_fnnext.a80 b/rez3_fnnext.a80 new file mode 100644 index 0000000..3c4c0d0 --- /dev/null +++ b/rez3_fnnext.a80 @@ -0,0 +1,219 @@ + +; LAST UPDATE: 11.03.2025 savelij + +;[]==========================================================[] +InitExtention: ;[ ] 07/10/23 + ; LD (InitExt.path),HL + ; EX HL,DE + ; + LD HL,.ExtName1 + LD DE,fn_ext + CALL InitExt + LD HL,.ExtName2 + LD DE,fnview_ext + CALL InitExt + LD HL,.ExtName3 + LD DE,fnedit_ext + CALL InitExt + RET + +.ExtName1: DZ FILENAME.FN_EXT +.ExtName2: DZ FILENAME.FNVIEW_EXT +.ExtName3: DZ FILENAME.FNEDIT_EXT +.PathEnd: DW 0 ; not used + +;[]----------------------------------------------------------[] +InitExt: LD (.EXTdata),DE +;[ ] 07/10/23 +; .path+1: LD DE,0 +; CALL CopyString +; LD HL,FlexDIRECTORY + SPDSS DSSF.OPEN,,1 + RET C + LD (ExtHandle),A + LD HL,WorkBuffer + LD DE,WorkBuffer_Size + SPDSS DSSF.READ + RET C + OR A + RET P + LD A,(ExtHandle) + PUSH DE + SPDSS DSSF.CLOSE + POP BC + LD HL,WorkBuffer + LD DE,0x0000 +.EXTdata EQU $-2 + EXX + LD BC,0x03FE + EXX +.loop: CALL InitExtLine + JR NC,.loop + RET + +ExtHandle: DEFB 0x00 + +InitExtLine: LD (.InExtSv),DE + SUB A + LD (DE),A + INC DE + EXX + DEC BC + LD A,B + OR C + SCF + EXX + RET Z + SUB A + LD (DE),A + INC DE + EXX + DEC BC + LD A,B + OR C + SCF + EXX + RET Z + DEC HL + INC BC + LD IXL,0x04 +.L1: LD A,B + OR C + SCF + RET Z + EXX + LD A,B + OR C + SCF + EXX + RET Z + INC HL + DEC BC + LD A,(HL) + CP 0x20 + JR C,.L4 + CP '`' + JR Z,.L4 + CP ':' + JR Z,.L6 + CP '*' + JR NZ,.L3 +.L2: LD A,'?' + LD (DE),A + INC DE + DEC IXL + LD A,IXL + DEC A + JR Z,.L1 + EXX + DEC BC + LD A,B + OR C + SCF + EXX + RET Z + JR .L2 + +.L3: LD (DE),A + INC DE + EXX + DEC BC + EXX + DEC IXL + JR NZ,.L1 +.L4: LD DE,(.InExtSv) +.L5: LD A,B + OR C + SCF + RET Z + LD A,(HL) + INC HL + DEC BC + CP 0x0D + JR NZ,.L5 + LD A,B + OR C + SCF + RET Z + INC HL + DEC BC + LD A,B + OR C + RET NZ + SCF + RET + +.L6: DEC IXL + JR Z,.L8 +.L7: EXX + LD A,B + OR C + SCF + EXX + RET Z + INC DE + EXX + DEC BC + EXX + DEC IXL + JR NZ,.L7 +.L8: LD A,B + OR C + SCF + RET Z + EXX + LD A,B + OR C + SCF + EXX + RET Z + INC HL + DEC BC + LD A,(HL) + CP 0x0D + JR Z,.L4 + CP 0x09 + JR Z,.L8 + CP 0x20 + JR Z,.L8 + JR C,.L4 + LD (DE),A + INC DE + EXX + DEC BC + EXX +.L9: LD A,B + OR C + SCF + RET Z + EXX + LD A,B + OR C + SCF + EXX + RET Z + INC HL + DEC BC + LD A,(HL) + CP 0x0D + JR Z,.L10 + CP 0x20 + JR C,.L4 + LD (DE),A + INC DE + EXX + DEC BC + EXX + JR .L9 + +.L10: SUB A + LD (DE),A + INC DE + PUSH HL + LD HL,0x0000 +.InExtSv: EQU $-2 + LD (HL),E + INC HL + LD (HL),D + POP HL + JR .L5