INCLUDE 'shared_includes/constants/Sp2000.inc' INCLUDE 'shared_includes/constants/bios_equ.inc' INCLUDE 'shared_includes/constants/dss_equ.inc' INCLUDE 'version.inc' ; версия менеджера ; include 'fm.exp' ; содержит "@label" метки ORG 0 EXE_HEADER: .START: DB "EXE" ; exe ID DB 0 ; exe версия DWORD EXE_HEADER.SIZE ; смещ. кода DW end_loader-entry ; end-beg, первичный загрузчик DW 0,0,0 ; резерв DW entry ; адрес загрузки кода DW start ; адрес передачи управления DW start ; адрес стека ; BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX BYTE 'The File Manager' BYTE ' v ',str_version,' ' BYTE 'by Vasil Ivanov ' BYTE '(c) 2005-2007. ' BYTE ' Modified by ' BYTE ' Anatoliy ' BYTE ' Belyanskiy, ' BYTE ' Sprinter Team ' BYTE ' 2025. ' .END: ; .SIZE EQU .END - .START ; ORG #4100 entry: include "fview/viewer.asm" tmp_sp_buffer: BLOCK 64 ; для стека ; Загрузчик ФМ start: ; очистить буфер клавы LD BC,Dss.ScanKey*256+Dss.K_CLEAR RST ToDSS DI ; сохр. значение портов IN A,(SLOT0) LD (DSS_PAGE__),A IN A,(SLOT3) LD (port_E2__),A IN A,(PORT_Y) LD (port_89__),A ; сохр. дескриптор менеджера LD A,(ix-3) LD (hFile),A ; закрыть спек. экран LD A,#C0 OUT (PORT_Y),A ; выделить 9 стр. памяти LD BC,9*256+Dss.GetMem RST ToDSS JR NC,ok_malloc ; Ok LD A,(hFile) ; тек. дескриптор LD C,Dss.Close ; закрыть exe-файл RST ToDSS LD HL,no_space ; нет памяти LD BC,DSS_Error.sys.NOT_ENOUGH_MEMORY*256 + Dss.Exit abort: EI PUSH BC LD C,Dss.PChars RST ToDSS POP BC .loop: RST ToDSS ; выход в ДОС DI HALT ; ok_malloc: LD (id_block__),A ; хэндл выдел. блока памяти ; получить список страниц LD HL,page_sys_screen__ LD C,BIOS.GetMemBlkPages RST ToBIOS ; узнать версию ДОС LD C,Dss.Version RST ToDSS LD HL,1*256 + 71 - 1 ; 1.71 AND A SBC HL,DE LD HL,old_dss ; нет памяти LD BC,DSS_Error.sys.COMMON_ERROR*256 + Dss.Exit JR NC,abort ; =< 1.71 - ошибка ; распаковать модуль 1 ;... ; загрузить осн. код менеджера LD A,(page_manager__) ; работает в #8000 OUT (SLOT3),A LD HL,SLOT3.MEM_ADDR LD DE,FM_CORE_BLK.Size ; размер модуля 1 LD A,(hFile) LD C,Dss.Read RST ToDSS JP C,read_error ; распаковать модуль 2 ;... ; загр. драйверы клавы/мышки, обработчики объектов и диал. окон LD A,(page_module0__) ; работает в #0000 OUT (SLOT3),A LD HL,SLOT3.MEM_ADDR LD DE,FM_MOD_0_BLK.Size ; размер модуля 2 LD A,(hFile) LD C,Dss.Read RST ToDSS JP C,read_error LD A,(page_spec__) LD (0C02Ah),A ; сохр. спек-страницу (vectors.asm) ; распаковать модуль 3 ;... ; загрузить описатели панелей LD A,(page_module1__) OUT (SLOT3),A LD HL,SLOT3.MEM_ADDR LD DE,FM_MOD_1_BLK.Size ; размер модуля 3 LD A,(hFile) LD C,Dss.Read RST ToDSS JP C,read_error ; распаковать модуль 4 ;... ; загрузить спек-код LD A,(page_spec__) OUT (SLOT3),A LD HL,SLOT3.MEM_ADDR LD DE,FM_SPEC_BLK.Size ; размер модуля 4 LD A,(hFile) LD C,Dss.Read RST ToDSS JP C,read_error LD A,(page_module0__) LD (VECT.rst28.page+SLOT3.MEM_ADDR),A ; сохр. фм-страницу (vect.asm) ; распаковать модуль 5 ;... ; загрузить вьюер ; LD A,(page_viewer__) ; OUT (SLOT3),A ; LD HL,SLOT3.MEM_ADDR ; LD DE,FM_FVIEW_BLK.Size ; размер вьюера ; LD A,(hFile) ; LD C,Dss.Read ; RST ToDSS ; JP C,read_error IN A,(SLOT1) LD (page_viewer__),A ; ; закрыть exe-файл менеджера hFile+1: LD A,0 ; сохр. дескриптор менеджера LD C,Dss.Close RST ToDSS ; вкл. в #8000 осн. код ФМ LD A,(page_manager__) OUT (SLOT2),A ; перекачать хэндлы страниц LD HL,id_block__ ; откуда LD DE,id_block ; куда LD BC,pages_end - id_block__ LDIR ; LD SP,stack ; стек ФМ ; не менять полож. мышки ФМ LD C,Dss.Mouse.ReadState ; узнать статус мышки RST ToDSS.Mouse LD (Xcoord),HL ; координата X (0..639) LD (Ycoord),DE ; координата Y (0..255) JP begin ; перейти на программу ; Хэндлы страниц менеджера id_block__: DB -1 ; дескриптор выдел. блока памяти page_sys_screen__: DB -1 ; +#0000 сист.экран, +#1400 экран ФМ page_dial_screen__: DB -1 ; буфер сохр. диал. окон и верт. меню page_left_dir__: DB -1 ; список левой панели page_right_dir__: DB -1 ; список правой панели page_manager__: DB -1 ; осн. код менеджера page_module0__: DB -1 ; драйверы клавы, мышки, диал. код с обраб. page_module1__: DB -1 ; описатели панелей page_spec__: DB -1 ; страница разбора спек-функций page_viewer__: DB -1 ; страница вьюера ;DB -1 DB 0 ; стоп-байт ; DSS_PAGE__: DB -1 ; сохр. порт 82h port_E2__: DB -1 ; сохр. порт 0E2h port_89__: DB -1 ; сохр. порт 89h pages_end: ; ошибка загрузки менеджера read_error: LD (.number),A LD A,(id_block__) LD C,Dss.FreeMem ; освоб. выдел. блок памяти RST ToDSS LD A,(hFile) LD C,Dss.Close ; закрыть файл RST ToDSS LD HL,load_err .number+1: LD B,0 LD C,Dss.Exit JP abort no_space: DZ "Not enough memory to run FM!\r\n" load_err: DZ "Disk loading error!\r\n" old_dss: DZ "FM requires DSS version 1.71 or higher!\r\n" ; ; Подготовить знакоген. для софт. курсора ; setup_znak: LD A,(page_manager__) ; врем. буфер ; OUT (SLOT2),A ; ; получить сист. знакоген. ; LD DE,SLOT2.MEM_ADDR ; буфер для 2048 байт данных ; PUSH DE ; LD C,BIOS.WIN_GET_ZG ; получить знакоген. ; RST ToBIOS ; ; заполнить кодом 0FFh 2 нижние линии ; LD HL,SLOT2.MEM_ADDR+(2048-(2*256)) ; последние 512 байт ; LD BC,511 ; LD A,1Ah ; номер знакоген. ; CALL fill_data_font ; POP HL ; ; заполнить остальные 6 линий (полный блок) ; LD BC,2048-513 ; LD A,19h ; номер знакоген. ; ; Настройка знакоген. и его регистрация ; ; вход: a=номер знакоген. ; ; hl=данные ; ; bc=размер данных ; fill_data_font: LD E,L ; LD D,H ; LD (HL),-1 ; INC DE ; LDIR ; LD DE,SLOT2.MEM_ADDR ; знакоген. ; LD C,BIOS.WIN_SET_ZG ; уст. знакоген. ; RST ToBIOS ; RET ;------------------------------------------------- ; Конец загрузчика end_loader: ;------------------------------------------------- ; Код менеджера ;------------------------------------------------- ; incbin 'Build/fm.bin' INCLUDE 'main.asm'