; Оверлей Диск сервис для BGE
; Использует оставшееся за кодом место до #C000 для временного хранения данных а также память в SUXpage

         ORG PgnAdr      ; адрес старта модуля

         ld (DiskSRV.sp),sp
    ;     ld a,(OVR_proc)
    ;     or a
    ;    jp nz, DiskSRV

    ;     INCLUDE "SpHack.asm"


DiskSRV   ;  Дисковый сервис
          ;  информация о диске
          ;  меню файлов
          ;  Уплотнение диска

          xor a
          ld (.flCLaddP_),a       ; флаг сообщения о порче страницы данных
          call .SwpADDPage

          ld a,(ExtMem)    ; блокируем/разблокируем опцию RAM-диск
          or a
          ld a,%100
         jr z,1F
          call TestExtMin
          ld a,%100
         jr c,1F
          ld a,%111
1         ld (WDiskSRV.selRDfl),a

          ld ix,WDiskSRV
          call POPUP

.n0       ld a,128+%1111
.n1       ld ix,WDiskSRV
          ld (ix+6),a
          call GuiRam
          ld sp,0
.sp  EQU $-2
          ld a,(TDriveNum.Drive)
          ld (WDiskSRV.DrNum),a
          ld hl,WDiskSRV.DskNAME
          ld d,h
          ld e,l
          ld b,11
1          ld (hl),#20  ; " "
           inc hl
          djnz 1B
          ld hl,CAT+#08F5
          ld b,11
1          ld a,(hl)
           inc hl
           cp #20
          jr c,2F
           ld (de),a
           inc de
          djnz 1B
2         ld a,(CAT+#08E4)   ; all files
          ld c,0
          ld de,WDiskSRV.AllFiles
          call .del0B_
          ld a,(CAT+#08F4)   ; deleted files
          ld de,WDiskSRV.DelFiles
          call .del0B_
          ld hl,(CAT+#08E5)   ; free sectors
          inc c
          ld de,WDiskSRV.FreeSec
          call .del0W_


          call Win_
          cp #FF
         jp z,.exitC
          ld bc,.TDiskSRV
          ld de,.exitC        ; for close window for return
          call TAB_JP
          ld a,128+%1101
         jr .n1

.del0W_   ld b,4
         jr 1F
.del0B_   ld b,2
1         call GET_NUM_
1         ld a,(de)
          cp "0"
         ret nz
          ld a,#20  ; " "
          ld (de),a
          inc de
         djnz 1B
         ret


.exitC           call CLOSE
.SwpADDPage       ; Обмен данных страницы расширенной памяти со страницей  AddPage
                 ld a,(ovADDpages)
                 or a
                ret z
                 ld (.flCLaddP_),a
                 ld hl,#C000
                 ld d,h
                 ld e,l
                 ld bc,#4000
                 ld a,ovAddVARpg
                jp ExOnP_AddP


.TDiskSRV        DW .Files          ; Files
                 DW .RenameDisk     ; Rename disk
                 DW .Condense       ; Condense disk
                 DW Driver          ; Select disk
                 DW DROpen          ; RAM disk service

.Condense       ; уплотнение диска: удаление удалённых файлов, развязка каталога.
                 call .cond_prov
                ret c
                ret z        ; если нет нужды в уплотнении
                 ld hl,.cond_ASK
                 call AskQ          ; спросим про риск испортить
                ret c
                 call NOKEY_
                 call .cond_prov
                ret c
                ret z            ; повторяем на случай извлечения диска после меню
                 ld hl,(CAT+#0800+225) ; текущая свободная позиция
                 ld (.cond_lastps),hl
               ; теперь само уплотнение
                 ld a,%1110
                 ld hl,.tCondDop
                 call .condWinOP
                 ld a,(.cond_delf)
                 or a
                jr z,.condSvCAT    ; если нужна только коррекция каталогп
1                ; удаление удалённых файлов
                 ld hl,CAT  ; поиск 1-го удалённого файла
                 ld bc,16
1                ld a,(hl)
                 or a
                jr z,.condSvCAT
                 dec a
                jr z,2F
                 add hl,bc
                jr 1B
2                ; удаление файла до следующего
                  push hl
                  pop ix
.cond_Dd_l        call GuiRam
                  ld a,(ix+0)
                  or a
                 jr z,.condSvCAT
                  ld l,(ix+#0E)
                  ld h,(ix+#0F)     ; hl trk/sec куда будем класть след. файл
1                 call .condDelONC  ; убираем из каталога текущий файл
.cond_Dd_l0       ld a,(ix+0)
                  or a
                 jr z,.cond_Dd_free   ; ставим свободный trk/sec и пишем каталог
                  dec a
                 jr z,1B    ; ещё удалённый
                  ld c,(ix+#0D)
                  ld e,(ix+#0E)
                  ld d,(ix+#0F)
                  ld (ix+#0E),l  ; коррекция позиции файла
                  ld (ix+#0F),h

                  ld a,c    ; перемещение файла in: с-длина de(trk/sec)-откуда  hl(trk/sec)-куда
1                 ld b,27   ; перемещаем порциями по 27 секторов max
                  sub b
                 jr nc,2F
                  ld b,c
                  xor a
2                 ld c,a       ; остаток в секторах
                  ld (#5CF4),de
                  ld a,5          ; load
                  call .cont_ls_
                  ld de,(#5CF4)
                 jr c,.condSvCAT        ; при ошибке - запись каталога
                  ld (#5CF4),hl
                  ld a,6          ; save
                  call .cont_ls_
                  ld hl,(#5CF4)
                 jr c,.condSvCAT       ; при ошибке - запись каталога
                   ld a,c
                   or a
                  jr nz,1B
                   ld bc,16
                   add ix,bc          ; следующий файл
                   call GuiRam
                  jr .cond_Dd_l0
.cond_Dd_free      ld (CAT+#0800+225),hl  ; free place

                ; запись каталога
.condSvCAT       ld a,%1001110    ; перерисовка без свапинга
                 ld hl,.tCondCop
                 call .condWinOP

                 call GuiRam
.cond_lastps    EQU $+1 : ld hl,#0000
                 ld de,(CAT+#0800+225)
                 ld a,l
                 add a,a
                 add a,a
                 add a,a
                 add a,a
                 ld l,a
                 ld a,e
                 add a,a
                 add a,a
                 add a,a
                 add a,a
                 ld e,a
                 or a
                 sbc hl,de
                jr c,1F
                 ld a,l
                 srl h : rra
                 srl h : rra
                 srl h : rra
                 srl h : rra
                 ld l,a          ; hl - освобождённое место в секторах
                 ld de,(CAT+#0800+229)   ; прежнее количество свободного места
                 add hl,de
                 ld (CAT+#0800+229),hl

1                ld hl,CAT
                 ld de,#0000   ; trk/sec
                 ld bc,#0906   ; save 9 sec
                 ld a,DOS_FUNC
                 call GUI

.condExit_       call NOKEY_
                jp CLOSE


.cont_ls_          ld (.cont_ls_c),a   ; a=5 or 6 , B = кол-во секторов (number of sectors)
                   push ix,hl,de,bc
                   ld a,SuxPage|#10
                   ld hl,#8000         ; hl=buffer, de=addr, ix=sector/track
                   ld de,#C000
                   ld ix,(#5CF4)
.cont_ls_c EQU $+1 : ld c,#05
                   ex af,af'
                   ld a,SL_BANK
                   call GUI
                   pop bc,de,hl,ix
                  ret

.condDelONC       ; удаление из каталога текущего файла
                  push hl,de,bc,af
                  call GuiRam
                  push ix
                  pop de
                  ld bc,16
                  ld h,b
                  ld l,c
                  add hl,de
1                 ld b,c   ; 16
2                 ld a,(hl)
                  ld (de),a
                  inc hl
                  inc de
                 djnz 2B
                  ld a,(de)
                  or a
                 jr nz,1B
                  ld a,(CAT+#0800+244)
                  dec a
                  ld (CAT+#0800+244),a
                  ld a,(CAT+#0800+228)
                  dec a
                  ld (CAT+#0800+228),a
                  pop af,bc,de,hl
                 ret

.cond_SUB_        ld b,0    ; in c - lenght sec , de - trk/sec
                  ld a,d    ; out hl(trk/sec) = de(trk/sec)-c(sec)
                  rrca : rrca : rrca : rrca
                  ld h,a
                  and #F0
                  or e
                  ld l,a
                  ld a,h
                  and #0F
                  ld h,a
                  or a
                  sbc hl,bc
                  ld a,h
                  add a,a
                  add a,a
                  add a,a
                  add a,a
                  ld h,a
                  ld a,l
                  and #F0
                  rrca : rrca : rrca : rrca
                  or h
                  ld h,a
                  ld a,l
                  and #0F
                  ld l,a
                 ret




.cond_ASK        MSG_COND_ASK : DB 0

.cond_prov      call GuiRam
             ;   ld a,LOAD_CAT
             ;   call GUI
                call LOAD_CAT_
                call .cond_sort_1
               ret c
                call .cond_check
               ret c
.cond_fcat  EQU $+1 : ld c,0  ; флаг изменения каталога
.cond_delf  EQU $+1 : ld a,0  ; счётчик удалённых файлов
                 or c
                ret

.cond_sort_1     ; сортировка каталога
                ld a,(CAT+2048)    ; 128 files max
                or a
               jp nz,.cond_err      ; catalog error
                xor a
                ld (.cond_fcat),a   ; флаг изменения каталога
                ld (.cond_delf),a   ; счётчик удалённых файлов
                ld hl,CAT
                ld ix,CAT+16
                ld de,(CAT+#0E)         ; trk,sec

.cond_sorl1     ld a,(hl)
                or a
               ret z
                cp 1
               jr nz,.cond_sorl2
                ld a,(.cond_delf)
                inc a
                ld (.cond_delf),a
.cond_sorl2     ld a,(ix+0)
                or a
               jr z,.cond_nxtf       ; next file
                ld a,d
                cp (ix+#0F)            ; trk
               jr c,2F               ; next varify file
               jr nz,1F              ; swap files
                ld a,e
                cp (ix+#0E)            ; sec
               jr c,2F               ; next varify file
               jp z,.cond_err        ; catalog error
1            ; swap files
                call .cond_cw
                push hl
                push ix
                ld b,16
1               ld c,(ix)
                ld a,(hl)
                ld (hl),c
                ld (ix),a
                inc ix
                inc hl
               djnz 1B
                pop ix
                pop hl
2               ld bc,16
                add ix,bc
               jr .cond_sorl2

.cond_nxtf      ld bc,16
                add hl,bc
                push hl
                pop ix
                ld e,(ix+#0E)
                ld d,(ix+#0F)
                add ix,bc
               jr .cond_sorl1

.cond_check    ; проверка правильности позиций каталога
               ; out: flag C - error
               ;      flag NC - normal and:
               ;                hl - next trk/sec , A' - files num
                call .cond_check_
               ret c
                ld b,#FF
                ld a,(CAT+#0800+228)
                ld c,a
                ex af,af'
                ld (CAT+#0800+228),a
                cp c
                call nz,.cond_cw
                ld de,(CAT+#0800+225) ; next trk/sec
                ld a,d
                cp h
                call nz,.cond_cw
                ld a,e
                cp l
                call nz,.cond_cw
                ld (CAT+#0800+225),hl
                ld a,(CAT+#0800+244)
                ld c,a
                ld a,(.cond_delf)
                ld (CAT+#0800+244),a
                cp c
                call nz,.cond_cw
                or a
               ret

.cond_cw        ld a,#FF
                ld (.cond_fcat),a
               ret

.cond_check_    ld ix,CAT
                ld hl,(CAT+#0E) ; hl - first trk/sec
                xor a
                ex af,af'         ; A' - counter for files
1               ld a,(ix+0)
                or a
               ret z
                ex af,af'
                inc a
                ex af,af'
                ld e,(ix+#0E)
                ld d,(ix+#0F)
                ld c,(ix+#0D)
                ld a,d
                cp h
               jr nz,2F
                ld a,e
                cp l
               jr z,3F
2               scf         ; error
               ret
3               call .Con_Slenadd
               ; hl - next trk/sec
                ld bc,16
                add ix,bc      ; next file
               jr 1B

.Con_Slenadd    ld a,c
                rra : rra : rra : rra
                and #0F       ; /16
                add a,d
                ld h,a
                ld a,c
                and #0F
                add a,e
                cp 16
               jr c,1F
                inc h
                sub 16
1               ld l,a
               ret

.cond_err       ld ix,.WcondEr
                ld (ix+6),%1110
                call Win_
                scf
               jp CLOSE_

.WcondEr  DB 8,10,17,3,2*8+7,7,%1110,0
          DW .TxtcondErr       ; объект-текст
          DW #FFFF

.TxtcondErr    MSG_CAT_ERROR
              DB 0

.condWinOP       ld (.TadrcondOP),hl
                 ld ix,.WcondOP
                 ld (ix+6),a
                jp Window_

.WcondOP  DB 8,9,17,4,2*8+7,7,%1110,0
          DW .TxtcondOP       ; объект-текст
          DW #FFFF

.TxtcondOP       DB #0A
.TadrcondOP      DW .tCondDop
                 MSG_COND_Wait
                DB 0

.tCondDop         MSG_COND_Dop : DB 0
.tCondCop         MSG_COND_Cop : DB 0

.RenameDisk      push de            ; закрывашка по ret
                 ld ix,WDiskReName
                 call POPUP
                 ld (ix+6),%1110
                 ld hl,WDiskSRV.DskNAME
                 ld de,WDiskReName.txt
                 ld bc,11
                 ldir
                 call Window_
                 ld hl,WDiskReName.txt
                 ld de,#0101
                 ld b,11
               ;  xor a
                 call EDIT_   ; Edit_
                ret c
             ;    ld a,LOAD_CAT   ; загружаем каталог
             ;    call GUI
                 call LOAD_CAT_
                ret c
                 ld de,CAT+#08F5
                 ld hl,WDiskReName.txt
                 ld bc,11
                 ldir
                 ld b,3
1                dec de
                 ld a,(de)
                 cp #21
                jr nc,2F
                 xor a
                 ld (de),a
                djnz 1B
2                ld de,#0008
                 ld bc,#0106
                 ld hl,CAT+#0800
                jp DOS_FUNC_

;.clearADDP        ; запрос на стирание ADDPAGE fc - not , nfc - yes
;                  ld a,1
;.fladdP_   EQU $-1
;                  or a
;                 ret z
;                  call AskAddP
;                 ret c
;                  xor a
;                  ld (.fladdP_),a
;                 ret


  ; Предупреждение о порче AddPage перед меню Files


1                 call AskAddP    ; a=0 при ответе да
                 ret c
                  inc a           ; a=1
                  ld (.flCLaddP_),a
.Files
.flCLaddP_  EQU $+1 : ld a,0     ; флаг предупреждения о порче AddPage
                  or a
                 jr z,1B

                  ld a,#C9          ; ret используем замену в filere.ret
                  ld (filere.ret),a
                  ld hl,.SORT
                  call FilerE
                 push af
                  ld a,#C3   ; возвращаем 'jp'    ; #F5   ; push af возвращаем значение
                  ld (filere.ret),a
                 pop af
                  call CLOSE_
                 ret c
                  call .Files_op
                jr .Files

.Files_op        ld (.Nfile),a  ; номер файла
                 ld hl,.lb1
                 push hl          ; сохраняем переход
                 ld hl,FILE_PARAM
                 push hl
                 ld de,BUFF
                 ld bc,16
                 ldir
                 pop hl
                 ld de,.TFile
                 ld bc,8
                 ldir
                 inc de
                 push de
                 ld c,3
                 ldir
                 pop de
                 call Fext_nrm

                 ld c,%100      ; обнуление
                 ld e,c
                 ld a,(SEC_LEN)
                 cp 65        ; обнуление текста, просмотра и копирования(ранее) если длина файла больше 64 sec.
                ret nc

                 ld c,%111       ; выборка
                 ld e,c

                 cp 8         ; fnt 2048
                ret z
                 cp 3         ; fnt 768
                ret z
                 cp 27        ; scr
                ret z
                 cp 24        ; scr noatr
                ret z
                 cp 54        ; double scr
                ret z
                 push de
                 ld hl,.Ext_plc
                 call Fext_nrm.cpExt3_   ; plc ; reg C - not change
                 pop de
                ret z
                 ld c,%100
                 pop af       ; убираем ненужный переход

.lb1             ld a,c
                 ld (.Sview),a
                 ld a,e
                 ld (.Scopy),a
                 ld (.Stext),a

                 ld ix,.WFile
                 call POPUP
                 ld a,%1111
                 ld (ix+6),a
                 call Win_
                 call CLOSE_
                 cp #FF
                ret z
                 push af
                 call NOKEY_
                 pop af
                 ld bc,.TBfiles
                jp TAB_JP

.cpExt1_        push hl
                ld hl,FILE_TYPE
                cp (hl)
                pop hl
               ret

.Ext_plc    DB "plc"


.TBfiles   DW .FileView
           DW .FileText
           DW .FileCopy
           DW .FileRename
           DW .FileDelete

.clSUXscrPG_    ld hl,#C000
                ld de,#C001
                ld (hl),0
                ld bc,6911
                ldir
               ret

.ld_sux_clfl    call SuxRam
                call .clSUXscrPG_
                ld c,SuxPage|#10
.ldfl           ld a,(SEC_LEN) ; загрузка файла посекторно
                ld b,a
                EXLOAD #8000,#C000,START_SEC,C
               ret

.sv_scrM        call SuxRam
                call 1F
                ld hl,.ld_scrM
                ex (sp),hl
               jp (hl)
1               ld hl,#4000
                ld de,#C000
1               ld bc,6912
                ldir
               ret
.ld_scrM        call SuxRam
                ld hl,#C000
                ld de,#4000
               jr 1B

.FileView        ld a,(SEC_LEN)
                 cp 54        ; double scr
                jp z,.viewDbl
                 call .ld_sux_clfl
               ret c
                 call SuxRam
                 ld hl,DiskSRV.Ext_plc
                 call Fext_nrm.cpExt3_   ; plc ; reg C - not change
                jr z,.viewplc

                 ld a,(SEC_LEN)
                 cp 8         ; fnt 2048
                jr z,.viewfnt2048
                 cp 3         ; fnt 768
                jr z,.viewfnt768
                 cp 27        ; scr
                jr z,.viewSCR
                 cp 24        ; scr noatr
                jr z,.viewSCRwA

1              ret

.viewSCR        call .SuxSWAP
.vAfterSCR_     call WAITKEY_
                ld a,(LAST_KEY)
.sv_SCR_q
                cp 'L'
               jr z,1F
                cp 'l'
               jr nz,2F
.sv_SCR_qS
1               call SV_UNDO
                call SAVESCR
                call ERASE_ALLW
               jp .n0
2               call .SuxSWAP
               jp NOKEY_

.viewSCRwA      call .setColor
                call .SuxSWAP
1               call WAITKEY_
                call .seleColor
                call NOKEYa_
               jr z,1B
               jr .sv_SCR_q

.viewfnt768     ld hl,#C000
                ld de,#D100
                ld bc,768
                ldir
               jr 1F
.viewfnt2048    ld hl,#C000
                ld de,#D000
                ld bc,#0800
                ldir
1               ld hl,#D000
                ld de,#C000
                ld c,l
2              push de   ; c-количество
                ld b,8
3               ld a,(hl)
                inc hl
                ld (de),a
                inc d
               djnz 3B
               pop de
                inc e
                dec c
               jr nz,2B
               jr .viewSCRwA

.viewplc        ld hl,#C000
                call IDBLC
               jp nz,NOKEY_
                ld hl,Tunpack   ; запрос на распаковку
                call AskQ
               jp c,NOKEY_
                call SuxRam
                ld hl,(FREE)
                ld a,h         ; проверка на место после свапа окон
                cp #E5
               ret nc
                ld de,#E500
                ld hl,#C000
                ld bc,#1A00
                push de
                ldir
                call .clSUXscrPG_
                call .SuxSWAP
                pop hl
                call DECOMPR
               jp .vAfterSCR_


.viewDbl        ld hl,(FREE)
                ld a,h         ; проверка на место после свапа окон
                cp #E5
               ret nc
                call SuxRam
                ld b,27
                EXLOAD #8000,#C000,START_SEC,SuxPage|#10
               ret c
                ld b,27
                EXLOAD #8000,#E500,TEK_SEC,SuxPage|#10
               ret c
                call .swpRmS_
                call .SuxSWAP

1               xor a
                ld (LAST_KEY),a
                call mscr_f
                or a
               jr nz,2F
                ld a,(LAST_KEY)
                cp 'L'
               jr z,1F
                cp 'l'
               jr nz,1B
1
               jp .sv_SCR_qS

2               call .swpRmS_
                call .SuxSWAP
               jp NOKEY_

.swpRmS_        ld bc,#1117   ; обмен теневого экрана с частью экрана в SUX #E500
                ld hl,#E500
               jp SwapC000_


.seleColor      ld a,(LAST_KEY)
                cp 'C'
               jr z,1F
                cp 'c'
               ret nz
1               ld a,(REALRGB)
                push af
                ld a,(MASKRGB)
                push af
                ld a,(.viewCOLOR)
                ld (REALRGB),a
                call ReMixRgb
                call PRGB2
                ld a,(REALRGB)
                ld (.viewCOLOR),a
                pop af
                ld (MASKRGB),a
                pop af
                ld (REALRGB),a
             ;   call ReMixM
                ld hl,#5800
               jr 1F
.setColor       ld hl,#D800
1               ld a,7
.viewCOLOR  EQU $-1
                ld bc,#0003
1               ld (hl),a
                inc hl
               djnz 1B
                dec c
               jr nz,1B
               ret


.SuxSWAP        call SuxRam
                ld de,#4000
               jp LD_UNDO.K_s

.FileRename
              ld a,GUIPage
              call RAM
              ld a,0
.Nfile   EQU  $-1

             jp  RENAME_FL


.FileDelete       ; erase file
              call ASK
              ret c
               ld a,(.Nfile)
               ex af,af'
              ld a,ERASE_NUMFL      ; ERASEFILE
              call GUI
             ret c
              ld a,%1001111     ; перерисовать окно не трогая свап
             jp .n1     ; стек восстановится в главном окне модуля

.FileCopy
              call .FloadAdd
.ed           ld hl,.TFile
              ld de,BUFF+16
              push de
              ld bc,8
              ldir
              inc hl
              ld c,3
              ldir
              pop hl
              call FNEdit
             ret c

              ld hl,BUFF+16
              ld de,BUFF
              ld bc,11
              ld a,(BUFF+16+8)
              cp 'B'
             jr z,1F
              ld a,(BUFF+16+9)
              cp 32
             jr nz,2F
              ld a,(BUFF+16+10)
              cp 32
             jr nz,2F
1             ld c,9
2             push hl
              push de
              push bc
              call GuiRam
              ex de,hl
              ld hl,CAT

1             ld b,c
              ld a,(hl)
              or a
             jr z,4F
              push de
              push hl
2             ld a,(de)
              cp (hl)
             jr nz,3F
              inc hl
              inc de
             djnz 2B
              pop hl
              pop de
              ld a,1
              or a
             jr 5F
3             pop hl
              ld de,16
              add hl,de
              pop de
             jr 1B
4             xor a
5             pop bc
              pop de
              pop hl
             jr nz,.ed
              ldir
              call GuiRam
             jp SAVE_FL

.FloadAdd     pop hl               ; return addr
              ld (.FloadAdd_q),hl
              ld hl,.n0
              ex (sp),hl
              ld hl,.swpAddPG
              push hl  ; теперь выход по ret -> .swpAddPG : .n0
              call CLOSE_ALLW    ; очистили SUX page
              call .swpAddPG

              call AddRam
              ld hl,#C000  ; предварительная очистка
              ld de,#C001
              ld bc,#3FFF
              ld (hl),l
              ldir

              ld a,(SEC_LEN)
              ld b,a
              EXLOAD #8000,#C000,START_SEC,AddPage|#10
             ret c
            jp Ret
.FloadAdd_q  EQU $-2   ; return addr



.swpAddPG    ; обмениваем AddPage с первым экраном в SUX page, оставляем в SUX page места
             ; больше трети экрана остальное пишем в остаток данных
              ld bc,#1411
              call SwapC000
              ld bc,#1411
              ld hl,#E500
              ld de,#E500
              call SwapPageSCR
              ld hl,#DB00
              ld de,DiskOpData
              ld bc,#0A00
             jp SWP_HLDEBC  ; LD_UNDO.K_6

.FileText     ld a,(SEC_LEN)
              ld (.Ftxt_Ln),a
              call .FloadAdd
              call AddRam
              ld hl,#C000
.Ftxt_Ln  EQU $+2 : ld bc,#0000
1             ld a,(hl)
              or a
             jr z,4F
              cp 10
             jr nz,3F
              push hl
              push bc
              ld d,h
              ld e,l
              inc hl
              ldir           ; удаляем код 10
              pop bc
              pop hl
2             dec bc
              inc hl
              ld a,b
              or c
             jr nz,1B
             jr 4F
3             cp 13
             jr z,2B
              cp 32
             jr nc,2B
              ld (hl),32     ; заменяем всё что не 13 на пробел
             jr 2B
4             ld hl,ReWin    ; делаем выход на восстановление фона после просмотра
              push hl

              ld de,#C000
1             push de
              call .prPG51
              pop hl          ; hl - адрес начала напечатанной страницы
             jr nz,2F
              ld d,h          ; если текст закончился, то следующая страница эта же самая
              ld e,l
2           ; ищем предыдущую страницу
              push hl,de
              call .findPrvPG
              ld b,h
              ld c,l
              pop de,hl

            ; прикручиваем интерфейс
              push hl,de,bc
              ld ix,.WfileText
              ld (ix+6),%1000
              call Win_
              pop bc,de,hl
              cp #FF
             ret z
              or a
             jr z,1B           ; следующая страница
              ld d,b           ;  предыдущая страницы
              ld e,c
             jr 1B

.WfileText   DB 0,0,32,24,7*8,7,%1000
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DB 0
        DW Nil             ; объект-текст
        DW .WflTxtSel      ; объект-подсветка (выборка)
        DW Nil             ; горячие клавиши
        DW #FFFF

.WflTxtSel   DB 0,15,32,9,%10    ; листаем вниз
             DB 0,0,32,9,%10     ; листаем вверх
            DB #FF

.f_cpHLc000    ld a,h
               cp #C0
              jr c,1F
              ret nz
               ld a,l        ;
               or a
              ret nz
1              ld hl,#C000
               scf
              ret
  ; поиск начала предыдущей страницы  in : hl - addres of page : out : hl - addres previos page
.findPrvPG     ld c,24    ; c - количество строк в экране
               call .f_cpHLc000
              ret c
2              dec hl
               ld a,(hl)     ; пропускаем последний enter в странице если он есть
               cp 13
              jr z,.l_fndPrPG_
               inc hl
.l_fndPrPG_    ld de,#0000   ; количество строк в строке
               ld b,e
1              dec hl
               call .f_cpHLc000
              ret c
2              ld a,(hl)
               cp 13
              jr z,3F
               inc b
               ld a,b
               cp 51
              jr c,1B
               ld b,0
               inc de
              jr 1B
3              ld a,b     ; нашли начало строки
               or a
              jr z,4F
               inc de
4              ld a,d
               or a
              jr nz,7F
               or e
              jr nz,5F
               inc e      ; de=0 пустая строка
5              ld a,c
               sub e
              jr c,7F
               ld c,a
6             jr nz,.l_fndPrPG_
               inc hl
              ret
7              ; строка не влазит в экран
               ld b,0
               ex de,hl
               or a
               sbc hl,bc        ; количество строк которые нужно пропустить
               ex de,hl
               ld a,(hl)
               cp 13
              jr nz,1F
               inc hl
1              ld bc,51
2              add hl,bc
               dec de
               ld a,d
               or e
              jr nz,2B
              ret



  ; Вывод страницы in : DE - addres of text : out : DE - addres next page, nz - if not end of text
.prPG51        ld hl,#4000
               ld (.pr51_hl),hl
               push de
               call CLS
               pop de
.l_prPG        ld hl,SPACE
               ld c,0
1              ld a,d
               or e
              ret z          ; end  of text
               ld a,(de)
               or a
              ret z          ; end  of text
               inc de
               cp 13
              jr z,2F        ; next string
               ld (hl),a
               inc hl
               inc c
               ld a,c
               cp 51
              jr nz,1B
               ld a,(de)
               cp 13
              jr nz,2F
               inc de
2              call .pr51_
               ld a,(.pr51_hl+1)  ; hi byte
               cp #58
              jr c,.l_prPG
               xor a
               inc a
              ret          ; nz - if not end of text


          ; HL - adress on screen
          ; C  - length of SPACE-text
.pr51_         push hl,de,bc,af
.pr51_hl   EQU $+1 : ld hl,#4000
               push hl
               ld a,pr_51
               call GUI
               pop hl
               call INC_YY
               ld (.pr51_hl),hl
               pop af,bc,de,hl
              ret


.WFile     DB 4,4,10,9,7,7*8,%1111
           DB 5
           DW .TFile
           DW .SFile
           DW .HFile
        ;   DW 4                ; пропуск buttons, flags,radio,scroll
        ;   DW .CrFile          ; вызов при создании (call on create)
           DW #FFFF

.TFile   DB "12345678.ext",13      ; заголовок - имя файла
         MSG_FILES_View   : DB 13 ; 0
         MSG_FILES_Text   : DB 13 ; 1
         MSG_FILES_Copy   : DB 13 ; 2
         MSG_FILES_Rename : DB 13 ; 3
         MSG_FILES_Delete : DB 0  ; 4

.SFile
        DB 1,3,8,1,%111
.Sview EQU $-1          ; for blocked
        DB 1,4,8,1,%111
.Stext EQU $-1          ; for blocked
        DB 1,5,8,1,%111
.Scopy EQU $-1          ; for blocked
        DB 1,6,8,128+2,%11 ; 1,%11
       ; DB 1,5,8,1,%11
        DB #FF

.HFile
          DB #0D,0     ; view
           DW 0
          DB #FF

.SORT    DB #01,"...",#FF  ; сортировка по произвольным расширениям



WDiskSRV   DB 0,0,16,15,7,7*8,%10001111
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
           DB 5
           DW .txt             ; объект-текст
           DW .sel             ; объект-подсветка (выборка)
           DW .hot             ; горячие клавиши
           DW  8               ; пропуск
           DW .colbox          ; цвет
           DW #FFFF

.txt        MSG_DskSRV_title : DB 13
.DrNum      DB "*: "
.DskNAME    DB "12345678901",13
            DB 15,13
            MSG_DskSRV_NumFiles : DB ":",#17,10,"  "
.AllFiles   DB "000",13
            MSG_DskSRV_DelFiles : DB ":",#17,10,"  "
.DelFiles   DB "000",13
            MSG_DskSRV_FreeSec  : DB ":",#17,10
.FreeSec    DB "00000",13,15,13

            MSG_DskSRV_Files : DB 13
            MSG_DskSRV_ReNameD : DB 13
            MSG_DskSRV_MoveDisk : DB 13
            OpDrive ; дисковод
            MSG_DISK_RAMdisk_
            DB 0

.sel        DB 1,9,14,128+4,%11
            DB 1,13,14,1,%111
.selRDfl  EQU $-1
            DB #FF

.hot
            DB #FF

.colbox     DB 1,3,14,1,6,%1
            DB 1,5,10,3,5,%1
            DB #FF


WDiskReName  DB 0,0,9,3,7*8,7*8,%1110
             DB 0
             DW .txt             ; объект-текст
             DW #FFFF

.txt         DB "12345678901"
             DB 0


;----------------------------------------------------------
; Сервис RAM-диска. Отобрал у Disk1.asm /DA

DROpen   ld a,128+%1111
.n1      ld ix,.WRopen
         ld (ix+6),a
         and 2
         call nz,POPUP
         xor a
         ld (.FilledRDp),a

         ld a,(ExtMem)
         or a
        ret z
         call TestExtMin
        ret c
          inc a          ; восстанавливаем правильное число используемых банков
          ld (.alPages_),a
          ld de,.RtAllPg_
          call PDEC   ; Get_NumC0_

          call TESTRD_

          ld a,(RPAGE)
          push af
          ld c,a
          or a
          ld a,%100
         jr z,1F
          ld a,%111
1         ld (.RselDst),a  ; блокируем удаление если нечего удалять
          ld a,c
          ld de,.RtRDusPg_
          call PDEC   ; Get_NumC0_
          pop af

.FilledRDp EQU $+1 : ld c,0   ; количество заполненных страниц в RAM-диске
          sub c
          ld (.NFilledRDp),a
          ld de,.RtNFillP_
          call PDEC   ; Get_NumC0_

          call Win_
          cp #FF
        jp z,CLOSE
          ld hl,.ne_
          push hl
          or a
         jr z,.ChangeRD
          dec a
         jr z,1F
         ret

.ne_     ld a,128+%1101
        jr .n1

1           call ASK
           ret nz
            ld a,(Sys_Disk)
            cp 4
           jr nz,1F
            xor a
            ld (Sys_Disk),a
1           ld c,a
            ld a,(#5D19)
            cp 4
           jr nz,3F
            ld a,c
1           ld (Curr_Disk),a
            ex af,af'
            push bc
            ld c,1
            call DOS_FUNC_
            pop bc
           jr nc,2F
            ld a,c
            inc a
            and 3
            ld c,a
           jr 1B

2           call LOAD_CAT_

3           ld a,(ExtPage)   ; удаление RAM-диска - стираем последний банк
            dec a
            ld c,a
            call ONPAGE

            ld hl,#C000
            ld de,#C001
            ld (hl),l
            ld bc,#3FFF
            ldir

           jp TESTRD_

.ChangeRD   ld hl,.RtRDusPg_
            push hl
            ld de,#0D05
            ld b,3
            xor a
            ex af,af'
            call EDIT_
            pop hl
           ret c
            ld a,ASCII
            call GUI
           ret c
            ld a,h
            or a
           ret nz
            or l
           ret z
          ; создание нового или коррекция старого RAM-диска
.alPages_ EQU $+1 : ld a,0
            sub l
           ret c
            ld a,(RPAGE)
            or a
           jr nz,1F
            ld a,l              ; новый RAM-диск
            ld (RRAM),a
           jp ROpen
1           ld b,a   ; b=(RPAGE)      ; коррекция текущего
            sub l
           ret z
           jr c,.incRD_          ; на увеличение
            ld c,a               ; сколько страниц нужно освободить
.NFilledRDp EQU $+1 : ld a,1     ; количество незаполненных страниц в RAM-диске
            cp c
           ret c
            call .lastPAGE
            or a
            sbc hl,de
.sFreeSec  jr c,.sPG2_
            ld (#C8E5),hl    ; коррекция количества свободных секторов
.sPG2_      call TESTRD_
            ld a,(#5D19)
            cp 4
            ld a,LOAD_CAT
           jp z,GUI
           ret

.incRD_      ld a,l
             sub b
           ret z
           ret c
            ld c,a
            call .lastPAGE
            add hl,de
           jr .sFreeSec

.lastPAGE   ld a,(ExtPage)
            dec a
            call ONPAGE
            ld a,c
            call R_Mul64l    ; в 'RDrive.asm'
            ex de,hl
            ld hl,(#C8E5)    ; свободное место в секторах
           ret


.WRopen    DB  3,8,16,10,6*8,7,128+%1111
;; Bit 0 - окно с заголовком/без
;; Bit 1 - "перерисовать" окно да/нет
;; Bit 2 - тискать окно по экрану да/нет
;; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
           DB 6*8+3
           DW .Rtxt        ; объект-текст
           DW .Rsel        ; объект-подсветка (выборка)
           DW 9            ; пропуск
           DW .RpgColBx    ; раскраска
           DW #FFFF

.Rtxt       MSG_DISK_tRAMd : DB 13
            MSG_DISK_RAMpages : DB #17,12
.RtAllPg_   DB "000",13,15,13
            MSG_DISK_RAMpUsed : DB #17,12
.RtRDusPg_  DB "000",13
            MSG_DISK_RAMpNFill : DB #17,12
.RtNFillP_  DB "000",13,15,13

            MSG_DISK_RAMdDsr
            DB 0

.Rsel              DB 1,5,14,1,%111    ; edit
.RselDst EQU $+4 : DB 1,8,14,1,%111   ; destroy
                  DB #FF

.RpgColBx   DB 1,3,11,1,6*8+1,%1
            DB 1,6,11,1,6*8+1,%1
            DB #FF


;----------------------------------------------------------
            ; Открыть Рам-Диск   (отобрал у 'RDrive.asm')

ROpen   LD A,(ExtPage)
        DEC A
        CALL ONPAGE
        LD HL,#C000
        LD DE,#C001
        LD BC,16383
        LD (HL),L
        LDIR

        LD A,16
        LD (#C8E7),A
        LD HL,#0100
        LD (#C8E1),HL
        LD A,(RRAM)
        LD H,64
        LD L,0 ;HL = A*H
        LD D,L
        LD E,A
        DUP 8
        ADD HL,HL
        JR NC,$+3
        ADD HL,DE
        EDUP
        LD BC,16
        SBC HL,BC
        LD (#C8E5),HL
        LD A,22
        LD (#C8E3),A
        LD HL,Nm
        LD DE,#C8F5
        LD BC,12
        LDIR
        LD HL,#C8EA
        LD DE,#C8EB
        LD BC,7
        LD (HL)," "
        LDIR
        LD A,2
        JP ONPAGE

;-----------------------------------------------------------
DiskOpData     ; Адрес остатка места для использования в опциях



; SpHCode    EQU #C000-384    ; идентификаторы данных для проверки изменения в SpHack /DA
; SpHCode_   EQU SpHCode+2
; SpHack_id  EQU SpHCode_+2
; StepH      EQU SpHack_id+1
; ADDE       EQU StepH+1
; STCH       EQU ADDE+2

; DiskTextBuf   EQU STCH+4     ; буфер для форматирования текста

LnDiskOpData  EQU #C000-DiskOpData
              ASSERT LnDiskOpData > #0A00

        DISPLAY "LnDiskOpData ( > #0A00) :",/a, LnDiskOpData
;--------------------------------------------------------
LDiskSRV   EQU $-DiskSRV

        DISPLAY "DiskSRV len :",/a, LDiskSRV

;LADiskSRV   EQU $-PgnAdr

;        DISPLAY "DiskSRV & SpHack len :",/a, LADiskSRV

; -------------------------------------------------------


            ASSERT  $ < SpHCode






