;///////////////////////////////////////////////////////////////////// ; Вывод данных акт. панели -> в пасс. панель (вызывается из файлера) ; <триггерная фитча> ;///////////////////////////////////////////////////////////////////// alt_info_panel: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. ; тест наличия qview-формата на акт. панели ld a,(format_mode) ; формат акт. панели and form_info jr nz,set_norm_actpanel2 ; вывести норм. активную панель ld hl,info1_ ; триггер пасс. панели ld a,(hl) or a jr nz,set_norm_noactpanel2 ; вывести норм. пассивную панель jr set_info_noactpanel ; info-панель в пасс. панели (акт. данные) ;-------------------------------------------------- ; Вывести нормальной акт. панель ;-------------------------------------------------- set_norm_actpanel2: ld hl,info_ ; триггер акт. панели ld (hl),0 ; сбр. триггер inc hl ld a,(hl) ; ячейка form_under_info ld (format_mode),a ; формат акт. панели jp A20FC ; вывести панель ;-------------------------------------------------- ; Вывести нормальной пасс. панель ;-------------------------------------------------- set_norm_noactpanel2: call change_panel call set_norm_actpanel2 jp change_panel ;---------------------------------------------------- ; Вывести info-панель в акт. панели (пасс. данные) ; (вызывается из Меню) ;---------------------------------------------------- set_info_actpanel: ; заполнить данными титл-описатель + уст. его тип call change_panel call get_info_data call change_panel set_info_actpanel1: ld de,format_mode ; формат акт. панели ld a,(de) bit 3,a ; info ret nz ; не отраб. повторно bit 4,a ; qview jr z,$+5 ld a,(form_under_qview) ; формат под qview-панелью ld hl,info_ ; триггер акт. панели ld (hl),1 ; уст. триггер inc hl ld (hl),a ; form_under_info and form_trd ; учесть 6-й бит спек-формата or form_info ld (de),a ; уст. info-формат xor a ld (qview_),a ; сбр. qview-триггер ld (enter_done3+1),a ; сбр. флаг обновления info-панели ret ;---------------------------------------------------- ; Вывести qview-панель в пасс. панели (акт. данные) ;---------------------------------------------------- set_info_noactpanel: ; заполнить данными титл-описатель + уст. его тип call get_info_data xor a ld (D48B1),a ; сбр. инверсию титла call change_panel call set_info_actpanel1 ; вывод акт. панели call draw_half_frame ; очистить панель call prn_up_path ; вывести заполн. описатель call change_panel ld a,true ld (D48B1),a ; уст. инверсию титла ret ;----------------------------------------------------------- ; Заполнить титл-описатель данными диска (акт. данные) ;----------------------------------------------------------- get_info_data: ld hl,win_info_panel ; описатель "Calculating disk space..." call WinSimple ; открыть окно ; ; настроить строку тек. даты call info_get_date ; ; Тест на наличие м/с CMOS ld c,0F5h rst 08h ld hl,cmos_yes ; "Yes" jr nc,$+5 ld hl,cmos_no ; " No" ld b,3 ; длина строки ld ix,info_cmos_string call A0E90 ; скопировать строку ; ; Версия BIOS ld hl,work_buffer ; врем. буфер ld c,0EFh ; инфа о версии Биоса и железа rst 08h push bc push de xor a ld l,d ld h,a ld ix,info_bios_version ; буфер exx ld l,a ; ст. разряд ld h,a exx ld bc,0120h ; с ведущ. пробелом ld iy,tmp1__ res 7,(iy+0) call dec2 pop hl ld a,l ld (ix+0),"." inc ix call dec8 pop hl ld h,0 ld (ix+0),"." inc ix call dec16 ; ; Board ID ld bc,01EDh rst 08h ld ix,info_board_id ; буфер push de push hl ld a,b call hex8 ; hex ld (ix+0),"-" inc ix ld a,c call hex8 ; hex ld (ix+0),"-" inc ix pop hl ; мл. разряд exx ld hl,0 ; ст. разряд exx ld bc,0130h ; с ведущ. нулями ld iy,tmp1__ res 7,(iy+0) call dec5 ; 16-bit десят. вывод (с вед. нулями) pop hl call hex16 ; hex ; ; Текущий диск ld a,(disk) add a,"A" ld (info_hdd+14),a ; ячейка буквы диска ld (info_cdrom+15),a ld (info_fdd+16),a ld (info_ram+13),a ; прочитать BPB диска ld a,(disk) ; номер диска ld c,1 ; open device rst ToDSS.DRV jr c,get_inf_data_err ld a,(disk) ld de,work_buffer ; буфер ld c,4 ; get BPB rst ToDSS.DRV push af ld a,(disk) ; номер диска ld c,2 ; close device rst ToDSS.DRV pop af jr c,get_inf_data_err ; байт формата носителя ld a,(work_buffer+21) ld (media_byte),a get_inf_data_err: ; Серийный номер лог. диска ld ix,info_serial ; xxxx-xxxx ld hl,(work_buffer+41) ; ст.часть call hex16 ld (ix+0),"-" inc ix ld hl,(work_buffer+39) ; мл.часть call hex16 ; ; Метка диска ld a,(disk) ; номер диска cp 2 ; меньше "C:" ? jr nc,get_inf_data1 ; метка в BPB ; floppy, метка - запись файла ld c,1 ; уст. диск rst ToDSS ld hl,scan_mask ; "*.*" имя поиска метки тома ld de,work_buffer+127;255 ld a,8 ; атрибут метки тома ld bc,0019h ; F_FIRST, формат "FilenameExt" rst ToDSS jr c,get_inf_data1 ; метки нет ld hl,work_buffer+127+43 ;+255+43 откуда (конец метки) jr $+5 get_inf_data1: ld hl,work_buffer+53 ; откуда (конец метки) ld de,info_volume+10 ; куда (конец строки) ld ix,info_volume call copy_volume ; скопир. метку ; ; Объем диска ld a,(disk) ; номер диска ld c,3 ; инфа о диске rst ToDSS jr nc,get_inf_data_ok xor a ld l,a ld h,a ld e,a ld d,a ld c,a ld b,a inc a get_inf_data_ok: ; a=размер кластера в секторах ; bc=размер сектора в байтах ; hl=общее кол-во кластеров ; de=своб. кластеров push de push hl ld hl,0 add hl,bc ; вычислить размер кластера dec a jr nz,$-2 ex de,hl ; de=размер кластера pop bc ; общ.кол-во кластеров call mul_bcde ; bc*de=hlbc общий объем диска push hl exx pop hl ; ст.разряд exx ld l,c ; мл.разряд ld h,b push de ld ix,info_total_bytes ; 0,000,000,000 call decimal32 ; свободное место pop de ; размер кластера pop bc ; своб. кластеров call mul_bcde ; bc*de=hlbc своб. место push hl exx pop hl ; ст.разряд exx ld l,c ; мл.разряд ld h,b ld ix,info_free_bytes ; 0,000,000,000 call decimal32 ; Всего памяти ld c,3Ch ; информация о памяти rst ToDSS push bc ld ix,info_total_memory ; 0,000,000 call conv_kbytes ; kbytes -> bytes и вывод в буфер pop hl ; Свободная память ld ix,info_free_memory ; 0,000,000 call conv_kbytes ; kbytes -> bytes и вывод в буфер ; ; вывод строки диска акт. панели db 3Eh ; ld a,.. media_byte: db 0 ; байт формата из BPB ld hl,info_hdd ; fixed disk cp 0F8h jr z,get_inf_data2 ld hl,info_fdd ; removable disk cp 0F0h ; 1.44Mb jr z,get_inf_data3 cp 0F9h ; 720kB jr z,get_inf_data3 ld hl,info_ram ; ram-disk cp 0FAh jr z,$+5 ld hl,info_cdrom ; cd-rom get_inf_data2: ld de,info_type_device ; куда ld bc,19 ; длина строки ldir ; тест на спек-формат ld a,(format_mode) and form_trd call nz,get_spec_info ; заполнить спек-описатель ; очистить буфер клавы ld a,1 rst 20h ; закрыть окно "Calculating disk space..." jp CloseWinSimple get_inf_data3: ld a,(disk) ; номер диска cp 2 ; меньше "C:" ? jr c,$+5 ld hl,info_ram ; ram-диск jr get_inf_data2 ; Скопировать в буфер имя метки диска. ; вход: hl=откуда (конец метки) ; de=куда (конец строки метки) ; ix=начало строки метки copy_volume: ld bc,11 ; длина метки ld a,(hl) cp " "+1 jr nc,$+10 dec hl dec c jr nz,$-7 ld a,11 jr $+7 ; ld a,11 sub c lddr ld b,a or a ; длина метки 11 симв. ? call nz,spaces ; дополнить вед. пробелы ret ; Перевод числа страниц в байты и вывод числа в буфер ; вход: hl=число страниц ; ix=буфер conv_kbytes: add hl,hl ; размер памяти в kB add hl,hl ; x4 add hl,hl ; x8 add hl,hl ; x16 ; переводим в байты ex de,hl ld bc,1024 ; 1 килобайт call mul_bcde ; bc*de=hlbc всего памяти push hl exx pop hl ; ст.разряд exx ld l,c ; мл.разряд ld h,b ld iy,tmp2__ res 7,(iy+0) jp decimal24 ;------------------------------------------------- ; Настроить в info-описателе строку тек. даты ;------------------------------------------------- info_get_date: ld c,21h ; сист. дата rst ToDSS push ix ; год push de ; день/месяц ld ix,info_date_string ; буфер ld bc,0120h ; с ведущ. пробелом ld iy,tmp1__ res 7,(iy+0) ld l,d ; день ld h,0 call dec2 ; 0..99 число pop hl ld c,l ; месяц ld h,0 add hl,hl ld de,info_array_months-2 add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl ld de,info_date_string+3 ; буфер ; скопир. имя месяца info_get_date_loop: ld a,(hl) ld (de),a inc hl inc de or a jr nz,info_get_date_loop dec de ld a," " ld (de),a inc de push de pop ix ; буфер pop hl ; год push bc ld b,0 ; не вставлять ведущ. символ ld iy,tmp1__ res 7,(iy+0) call dec4 ; 0..9999 число ld (ix+0),0 ; конец описателя pop bc ; c=месяц ; настроить ячейки описателя ld a,c ld c,7+8 ; полная длина строки ld b,0Ch dec a ; a=1 jr z,info_get_date1 inc c dec a ; a=2 jr z,info_get_date1 ld c,5+8 inc b ; b=0Dh dec a ; a=3 jr z,info_get_date1 dec a ; a=4 jr z,info_get_date1 inc b ; b=0Eh ld c,3+8 dec a ; a=5 jr z,info_get_date1 inc c dec a ; a=6 jr z,info_get_date1 dec a ; a=7 jr z,info_get_date1 dec b ; b=0Dh ld c,6+8 dec a ; a=8 jr z,info_get_date1 dec b dec b ; b=0Bh ld c,9+8 dec a ; a=9 jr z,info_get_date1 inc b ; b=0Ch ld c,7+8 dec a ; a=10 jr z,info_get_date1 inc c info_get_date1: ld hl,info_date_string-1 ld (hl),b ; X полож. строки ld hl,info_date ld (hl),c ; длина строки ret info_array_months: dw inf_jan dw inf_feb dw inf_mar dw inf_apr dw inf_may dw inf_jun dw inf_jul dw inf_aug dw inf_sep dw inf_oct dw inf_nov dw inf_dec inf_jan:db "January",0 inf_feb:db "February",0 inf_mar:db "March",0 inf_apr:db "April",0 inf_may:db "May",0 inf_jun:db "June",0 inf_jul:db "July",0 inf_aug:db "August",0 inf_sep:db "September",0 inf_oct:db "October",0 inf_nov:db "November",0 inf_dec:db "December",0 ;------------------------------------------------- ; Заполнить спек-описатель данными спек-имиджа ; вход: заполн. буфер данными спек-имиджа ;------------------------------------------------- get_spec_info: ; Тип образа ld a,(image_type); ; индекс типа ld c,a add a,a ;1+1=2 add a,c ;2+1=3 ld c,a ld b,0 ld hl,list_image_types ; список типов образа add hl,bc ; откуда ld de,img_type ; куда ld bc,3 ldir ; Метка диска ld hl,test_vol+10; ; откуда (конец метки) ld de,trd_vol+10 ; куда (конец строки) ld ix,trd_vol ; начало строки метки call copy_volume ; скопир. метку ; Тип диска ld a,(spec_type); ; индекс типа ld c,a add a,a ;1+1=2 add a,a ;2+2=4 add a,c ;4+1=5 ld c,a ld b,0 ld hl,list_disk_types ; список типов спек-диска add hl,bc ; откуда ld de,trd_type ; куда ld bc,5 ldir ; Защита от записи ld a,0; ; флаг защиты 0=нет, 1=есть or a ld hl,"a " ; " absent" ld a,"b" jr z,$+7 ld hl,"rp" ; "present" ld a,"e" ld (trd_protect),hl ; переписать три ld (trd_protect+2),a ; первые символы ; Всего файлов ld a,255; ; число ld ix,trd_files ; буфер call dec9 ; вывод чисел 0..999 с ведущ. пробелом ; Удаленных файлов ld a,0; ; число ld ix,trd_delfiles ; буфер call dec9 ; для SCL-имиджа дальше обнулить ld a,(image_type) ; тип имиджа or a jr nz,get_spec_inf_scl ; scl, обнулить ; Первая свободная дорожка ld de,1; ; число ld ix,ffree_trk ; буфер call dec16s ; вывод чисел 0..65535 с вед. пробелом ; Первый свободный сектор ld de,0; ; число ld ix,ffree_sec ; буфер call dec16s ; Свободных секторов ld de,2544; ; число ld ix,free_sec ; буфер jp dec16s ; обнулить 3 значения get_spec_inf_scl: ld bc,5 ld a,c ld hl,spec_null ; откуда ld de,ffree_trk ; буфер "First free trk" ldir ld hl,spec_null ld de,ffree_sec ; буфер "First free sec" ld c,a ldir ld hl,spec_null ld de,free_sec ; буфер "Number of free sectors" ld c,a ldir ret spec_null: db " 0" ; обнулялка ; Тип спек-имиджа (0=TRD, 1=SCL) image_type: db 0 ; индекс ; Тип спек-диска (0=2S/DD, 1=2S/SD, 2=1S/DD, 3=1S/SD, 4=??/??) spec_type: db 0 ; индекс ; список типов имиджей list_image_types: db "TRD" ; 0 db "SCL" ; 1 ; список типов спек-дисков list_disk_types: db "2S/DD" ; 0 db "2S/SD" ; 1 db "1S/DD" ; 2 db "1S/SD" ; 3 db "??/??" ; 4 ; тестовая строка. убрать test_vol:; db "ADVENT#10/2";