; Загрузчик ФМ 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 4100h db "EXE" ; exe ID db 0 ; exe версия dw 512 ; 512, мл. смещ. кода dw 0 ; ст. смещ. кода dw end_loader - entry ; end-beg, первичный загрузчик dw 0,0,0 ; резерв dw entry ; адрес загрузки кода dw start ; адрес передачи управления dw start ; адрес стека ds 490 entry: db "The File Manager, Version " db major_version + "0" db "." db (minor_version / 10) + "0" db (minor_version % 10) + "0" db " Copyright (c) 2005-2007 by Vasil Ivanov." start: ; очистить буфер клавы ld bc,3135h rst ToDSS di ; сохр. значение портов in a,(SLOT0) ld (port_82__),a in a,(SLOT3) ld (port_E2__),a in a,(89h) ld (port_89__),a ; сохр. дескриптор менеджера ld a,(ix-3) ld (hFile),a ; закрыть спек. экран ld a,0C0h out (89h),a ; выделить 10 стр. памяти ld bc,0A3Dh rst ToDSS jr nc,ok_malloc ; Ok ld a,(hFile) ; тек. дескриптор ld c,12h ; закрыть exe-файл rst ToDSS ld hl,no_space ; нет памяти abort: ei ld c,5Ch rst ToDSS ld bc,0FF41h ; выход в ДОС rst ToDSS ret ok_malloc: ld (id_block__),a ; хэндл выдел. блока памяти ; получить список страниц ld hl,page_sys_screen__ ld c,0C5h rst 08h ; узнать версию ДОС ld c,0 rst ToDSS ld hl,013Ch ; 1.60 and a sbc hl,de call nc,setup_znak ; =< 1.60 уст. знакоген. 19h/1Ah ; распаковать модуль 1 ;... ; загрузить осн. код менеджера ld a,(page_manager__) ; работает в #8000 out (SLOT3),a ld hl,0C000h ld de,len_modul1 ; размер модуля 1 ld a,(hFile) ld c,13h rst ToDSS jp c,read_error ; распаковать модуль 2 ;... ; загр. драйверы клавы/мышки, обработчики объектов и диал. окон ld a,(page_module0__) ; работает в #0000 out (SLOT3),a ld hl,0C000h ld de,len_modul2 ; размер модуля 2 ld a,(hFile) ld c,13h 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,0C000h ld de,len_modul3 ; размер модуля 3 ld a,(hFile) ld c,13h rst ToDSS jp c,read_error ; распаковать модуль 4 ;... ; загрузить спек-код ld a,(page_spec__) out (SLOT3),a ld hl,0C000h ld de,len_modul4 ; размер модуля 4 ld a,(hFile) ld c,13h rst ToDSS jp c,read_error ld a,(page_module0__) ld (0C02Ah),a ; сохр. фм-страницу (vect.asm) ; распаковать модуль 5 ;... ; загрузить вьюер ld a,(page_viewer__) out (SLOT3),a ld hl,0C000h ld de,len_modul5 ; размер вьюера ld a,(hFile) ld c,13h rst ToDSS jp c,read_error ; ; закрыть exe-файл менеджера hFile+1: ld a,0 ; сохр. дескриптор менеджера ld c,12h 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,3 ; узнать статус мышки rst 30h ld (Xcoord),hl ; координата X (0..639) ld (Ycoord),de ; координата Y (0..255) jp 8000h ; перейти на программу ; Хэндлы страниц менеджера 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 ; стоп-байт ; port_82__: db -1 ; сохр. порт 82h port_E2__: db -1 ; сохр. порт 0E2h port_89__: db -1 ; сохр. порт 89h pages_end: ; ошибка загрузки менеджера read_error: ld a,(id_block__) ld c,3Eh ; освоб. выдел. блок памяти rst ToDSS ld a,(hFile) ld c,12h ; закрыть файл rst ToDSS ld hl,load_err jp abort no_space: db "Not enough memory to run program !",0Dh,0Ah,0 load_err: db "Disk loading error !",0Dh,0Ah,0 ; Подготовить знакоген. для софт. курсора setup_znak: ld a,(page_manager__) ; врем. буфер out (SLOT2),a ; получить сист. знакоген. ld de,8000h ; буфер для 2048 байт данных push de ld c,0B8h ; получить знакоген. rst 08h ; заполнить кодом 0FFh 2 нижние линии ld hl,8000h+(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,8000h ; знакоген. ld c,0B6h ; уст. знакоген. rst 08h ret ; депакер ;... ; Конец загрузчика end_loader: ;------------------------------------------------- ; Код менеджера ;------------------------------------------------- ; incbin 'Build/fm.bin' include 'main.asm'