; part of the GUI for BGE

;30.12.1999
;(C) Predator/Delirium Tremens
;
;**.**.****  :)
;(C) Eraser/Delirium Tremens

;--------------------------------------------------
; modify for new bge version by Dart Alver (sorry)


;-- сообщения ---
Attantion_txt  DB " " : MSG_CheckT : DB #FF   ; " Внимание !"

   MACRO ATTANTION
         DB #0A : DW Attantion_txt
   ENDM





DOS_FUNC_gui
        PUSH AF
        PUSH HL
        PUSH DE
        LD HL,TAB_FUNC
      ;  LD DE,3
DOS_FUNC2
        LD A,(HL)
        inc hl
        AND A
        JR Z,DOS_F_NO
        CP C
        JR Z,DOS_FUNC1
       ; ADD HL,DE
        inc hl
        inc hl
        JR DOS_FUNC2
DOS_FUNC1
      ;  INC HL
        DEFHL
DOS_F_N1 LD (DOS_FUNC3),DE
        POP DE
        POP HL
        POP AF
        JP #0000
DOS_FUNC3 EQU $-2

DOS_F_NO
        LD A,(MODE)
        EX AF,AF'
        XOR A
        LD (MODE),A
        POP DE
        POP HL
        POP AF
        CALL FDOS_gui
        EX AF,AF'
        LD (MODE),A
        RET

TAB_FUNC                ;Можно продолжить
        DEFB #01
        DEFW SEL_DRV
        DEFB #05
        DEFW LOAD_SEC
        DEFB #06
        DEFW SAVE_SEC
        DEFB #0E
        DEFW LOAD_FILE        ;  чтение файла с перезагрузкой каталога поиск по 9 символам
        DEFB #0B
        DEFW SAVE_FILE2
        DEFB #0A
        DEFW SEARCH_FILE
        DEFB #FF
        DEFW SAVE_HEAD
        DEFB #FE
        DEFW SEARCH_FILE2
        DEFB #AE
        DEFW LOAD_FILE_CAT      ; чтение файла по загруженому каталогу поиск по 9 символам
        DB #BE
        DW onLfile            ; v4.0  чтение файла по адресу HL, по данным в #5CDD
        DB #CE
        DW Load_File_11       ; v4.0  чтение файла с перезагрузкой каталога поиск по 11 символам
        DB #DE
        DW Load_File_11_cat   ; v4.0  чтение файла по загруженому каталогу поиск по 11 символам
       DEFB #00

SEL_DRV PUSH AF
        LD A,(#5D19)
        LD (LDRV),A
        POP AF
sel_drv PUSH AF
        LD (#5D19),A
        LD (#5CF6),A
        OR #3C
        LD (#5D16),A
        AND #03
        PUSH AF
        LD HL,#5CC8
        ADD A,L
        LD L,A
        LD A,#83
        LD (HL),A
        POP AF
        LD HL,#5CFA
        ADD A,L
        LD L,A
        LD A,#08
        LD (HL),A
        LD A,(MODE)
        LD (mode+1),A
        XOR A
        LD (MODE),A
        POP AF
        CP 4
        JR Z,TESTRD__

        LD C,1
        CALL FDOS_gui
mode    LD A,0
        LD (MODE),A
        CALL L_DRIVE
       ; JP OK
        xor a
       ret

TESTRD__
        CALL TESTRD_gui
        JR Z,mode
        LD A,0
LDRV    EQU $-1
        JR sel_drv



Load_File_11_cat ld c,11
         jr 1F
LOAD_FILE_CAT ld c,9
1        push hl
         call ld_search_C
         pop hl
       jr nc,onLfile
;nfnd     SCF
        RET
Load_File_11 ld c,11
        jr 1F
LOAD_FILE  ld c,9
1        push hl
         call ld_rcat_search_C
         pop hl
       jr nc,onLfile
NO_LFILE
        LD IX,NoFW
        call SfsWin_
scf_gui SCF
        RET

onLfile         ;   v4.0  чтение файла по адресу HL (длина посекторно) с учетом что все его данные уже в #5CDD
          ld de,(START_SEC)
          ld a,(SEC_LEN)
          ld b,a
LOAD_SEC
        LD C,5
       jr 1F
SAVE_SEC
        LD C,6
1       CALL FDOS_gui
        xor a
       ret

ld_rcat_search_C
        push bc
        call LOAD_CAT_gui
        pop bc
       ret c
ld_search_C
        ld a,c
       jp Search_File_A



NoFW    DEFB 10,7,11,5,2*8+7,7,%00001111,0
        DEFW TxtWE        ; объект-текст
        DEFW #FFFF

TxtWE  ;   DB "  Внимание!",13
          ATTANTION : DB 13
       ; DB "Файл не найден",0
          MSG_FILE_No : DB 0

;................;
START_ADR_ DW 0  ;
;................;
SAVE_FILE2
        LD (START_ADR_),HL
        LD (BYTES_LEN),DE
        LD A,E
        AND A
        LD A,D
        JR Z,L3_
        INC A
L3_     LD (SEC_LEN),A

        CALL LOAD_CAT_gui
       ; CALL SEARCH_FILE
         ld a,11
         call Search_File
        JR C,SAabs1

        LD A,(OVERF)
        AND A
        JR NZ,YES_

        LD IX,OVERW
        CALL Win_gui
       ; PUSH AF
       ; CALL CLOSE   ; RestBack
       ; POP AF
        call CLOSE_
        CP #FF
        JP Z,scf_gui
        AND A
        JR NZ,SAabs2

YES_    LD A,14
        CALL Search_File
        JR C,SAabs2

        PUSH IX
        POP HL
      ;  LD DE,FILE_PARAM
      ;  LD BC,16
      ;  LDIR
        call ToFileParam

        LD HL,(START_ADR_)
        LD DE,(START_SEC)
        LD A,(SEC_LEN)
        LD B,A
        CALL SAVE_SEC
MAZ
        XOR A
        RET

SAabs2  CALL erase_file
SAabs1  LD HL,(START_ADR_)
        LD DE,(BYTES_LEN)
        LD A,(SEC_LEN)
        LD B,A
        JP SAVE_FILE

OVERW   DB 9,8,12,6,2*8+7,7,%00001111,0
        DEFW TxtOv        ; объект-текст
        DEFW SelOv        ; объект-подсветка (выборка)
        DEFW HotOv        ; горячие клавиши
        DEFW #FFFF

TxtOv  ; DB "Файл существует",13
        MSG_FILE_exist : DB 13
       ; DB "Записать поверх",13
        MSG_FILE_overW : DB 13
       ; DB "Перезаписать",0
        MSG_FILE_reWr
        DB 0  ; DB #FF

SelOv  ; DB 1,3,10,1,%11
       ; DB 1,4,10,1,%11
        DB 1,3,10,128+2,%11
        DB #FF

HotOv   DB "Y"
        DB 0
         DW 0
        DB "N"
        DB 0
         DW 1
        DB #FF
;....................
ToFileParam   ld de,FILE_PARAM   ; запись из HL в #5CDD
              ld bc,16
              ldir
             ret

erase_file
        PUSH IX
        jr ef   ; JP ef

ERASE_NUMFL_gui  push ix      ; удаляет файл по номеру в каталоге, каталог перечитывает
                 push af
                 call LOAD_CAT_gui
                jr c,.err
                 ld a,(CAT+#08E4)
                 ld c,a
                 pop af
                 ld (count),a
                 cp c
                jr c,ef.num_
                 push af
.err             pop af
                 scf
             ;   jr NOK
NOK
                 POP IX
NO_FILE
                 LD A,1
                RET

ERASEFILE_gui

ERASE_FILE
        PUSH IX
     ;   LD HL,CAT
     ;   LD DE,#0000
     ;   LD BC,#0905
     ;   CALL DOS_FUNC_gui
         call LOAD_CAT_gui
        jr c,NOK
ef      XOR A
        CALL SEARCH_FILE
        JR C,NOK
.num_   LD B,A
      ;  SBC HL,HL
        ld de,#0010
        ld h,d
        ld l,d  ; hl=0
        AND A
        JR Z,ERG3
      ;  LD DE,#10
ERG1    ADD HL,DE
        DJNZ ERG1
ERG3    EX DE,HL
        LD HL,CAT
        ADD HL,DE
        PUSH HL
        POP IX
        LD C,1
        LD A,(IX+#10)
        AND A
        JR NZ,ERF1
        LD C,0
ERF1
        LD (IX+0),C
        LD H,D    ; d -sector
        LD E,D
        LD D,0
        LD L,0
        LD BC,CAT
        ADD HL,BC
        LD BC,#0106
        PUSH BC
        PUSH IX
        CALL DOS_FUNC_gui
        POP IX
        LD A,(count)
        INC A
        LD B,A
        LD HL,CAT+#8E4
        LD A,(HL)
        CP B
        JR NZ,ERG4
        DEC (HL)
        JR ERG5
ERG4    LD HL,CAT+#8F4
        INC (HL)
ERG5    LD A,(IX+0)
        AND A
        JR NZ,ERF2
        LD E,(IX+#0D)
        LD D,0
        LD HL,(CAT+#8E5)
        ADD HL,DE
        LD (CAT+#8E5),HL
        LD L,(IX+#0E)
        LD H,(IX+#0F)
        LD (CAT+#8E1),HL
ERF2
        POP BC
        LD DE,#0008
        LD HL,CAT+#800
        CALL DOS_FUNC_gui
        POP IX
       ; JP OK
        xor a
       ret

count   DB #FF

;Search_File             ; типа сэкономил 6 байтов /DA
;        LD HL,CAT-#10
;        JP srch

Search_SrtFile11_gui    ; ищем в сортированном каталоге файл по 11 символам и перекидываем все данные о нём в #5CDD ; /DA
         ld a,11
      ;   ld hl,NEWCAT-#10
         call SEARCH_FILE2.srch
        jr 1F

Search_File11_gui        ; ищем в загруженном каталоге файл по 11 символам и перекидываем все данные о нём в #5CDD ; /DA
          ld a,11
Search_File_A
          call Search_File
1        ret c           ; выход если ошибка
     ;    ld l,a          ; номер файла
     ;    ld h,0
     ;    add hl,hl
     ;    add hl,hl
     ;    add hl,hl
     ;    add hl,hl       ; *16
     ;    ld bc,CAT
     ;    add hl,bc
         push ix
         pop hl
         push hl
    ;     ld de,FILE_PARAM  ; #5CDD
    ;     ld bc,16
    ;     ldir
          call ToFileParam
         pop hl            ; выход IX, hl - адрес данных файла
        jr True            ; A - номер файла


SEARCH_FILE2
         LD A,9
.srch    LD HL,NEWCAT-#10
        JP srch

SEARCH_FILE:
;        LD HL,CAT-#10
        LD A,9
Search_File
        LD HL,CAT-#10
srch    LD (lensrch+1),A
        LD A,#FF
        LD (count),A
Cikl_6  LD A,(count)
        INC A
        LD (count),A
        cp 128
        scf
       ret z
        LD BC,#0010
        ADD HL,BC
        LD A,(HL)
        OR A
      ;  JR Z,End_False
        scf
       ret z
        LD IX,#5CDD
        PUSH HL
lensrch LD B,9
Cikl_1  PUSH BC
        LD A,(HL)
        INC HL
        CP (IX+#00)
        INC IX
        JR NZ,False
        POP BC
        DJNZ Cikl_1
        POP HL
        PUSH HL
        POP IX
True    XOR A
        LD A,(count)
        RET

False   POP BC
        POP HL
        JR Cikl_6

;End_False
;        SCF
;        RET

SfsWin_    call Window_gui
           call NOKEY_gui
           call WAITKEY_gui
          jp CLOSE

; CAT_OVER
NO_SPACE
        LD IX,NO_SPACEW
      ;  CALL Window_gui
      ;  CALL NOKEY_gui
      ;  CALL WAITKEY_gui
      ;  CALL CLOSE    ; RestBack
        call SfsWin_
        JP FM_EXIT

NO_SPACEW
        DEFB 12,8,12,5,2*8+7,7,%00001111,0
        DEFW SpaceErr     ; объект-текст
        DEFW #FFFF

SpaceErr  ; DB " Внимание!",13
           ATTANTION : DB 13
          ; DB "Диск полон_",#00
           MSG_DOS_mess3 : DB 0

CAT1     DEFW #0000
CAT2     DEFW #0000
BUFILE   DS 512

;................. SAVE RULEZ FOREVER ..........................
SAVE_HEAD
        PUSH HL
        LD HL,NOSAVE
        LD (jsv+1),HL
        POP HL
        PUSH BC
        PUSH HL
        PUSH DE
        LD HL,BUFILE
        LD BC,#0105
        LD DE,#0008
        CALL DOS_FUNC_gui
        POP DE
        POP HL
        POP BC
        LD A,B
        JP L3

NOSAVE  LD HL,(BUFILE+#E1)
        LD A,(SEC_LEN)
        LD B,A
        CALL TRAK_gui
        LD (BUFILE+#E1),HL
        RET

SAVE_FILE
        PUSH HL
        LD HL,SAVEF
        LD (jsv+1),HL
        POP HL
        JP save_file

SAVEF   LD HL,(START_ADR_)
        LD DE,(START_SEC)
        LD A,(SEC_LEN)
        LD B,A
        LD C,#06
        CALL DOS_FUNC_gui
        LD HL,(#5CF4)
        LD (BUFILE+#E1),HL
        RET

save_file
        PUSH HL
        PUSH DE
        LD HL,BUFILE
        LD BC,#0105
        LD DE,#0008
        CALL DOS_FUNC_gui
        POP DE
        POP HL
        LD A,E
        AND A
        LD A,D
        JR Z,L3
        INC A
L3      LD (SEC_LEN),A
        LD (BYTES_LEN),DE
        LD (START_ADR_),HL
        LD DE,(BUFILE+#E1)
        LD (START_SEC),DE
        LD A,(BUFILE+#E4)
        CP #80
        JP NC,NO_SPACE     ; CAT_OVER
        AND #F0
        DUP 4
        RRCA
        EDUP
        LD E,A
        LD (SAVE_SCT),A
        LD D,0
        LD HL,BUFILE+#100
        LD BC,#0105
        PUSH HL
        CALL DOS_FUNC_gui
        POP HL
        LD DE,#10
.L1
        LD A,(HL)
        AND A
        JR Z,.L2
        ADD HL,DE
        JR .L1
.L2
        LD (CAT1),HL
        LD HL,(BUFILE+#E5)
        XOR A
        OR H
        LD A,(SEC_LEN)
        JR NZ,.L4
        INC L
        CP L
        jr c,1F      ;JR C,.L4-1
        JP NO_SPACE
1       DEC L
.L4
        LD E,A
        LD D,0
        AND A
        SBC HL,DE
        LD (BUFILE+#E5),HL
        LD HL,BUFILE+#E4
        INC (HL)
        LD HL,FILE_PARAM
        LD DE,(CAT1)
        LD BC,#10
        LDIR
        LD HL,BUFILE+#100
        LD D,0
        LD E,0
SAVE_SCT EQU $-1
        LD BC,#0106
        PUSH BC
        CALL DOS_FUNC_gui

jsv     CALL 0

        LD HL,BUFILE
        LD DE,#0008
        POP BC
        CALL DOS_FUNC_gui

        LD A,(SAVE_SCT)
        LD H,A
        LD L,0
        LD BC,CAT
        ADD HL,BC
        EX DE,HL
        LD HL,BUFILE+#100
        LD BC,#100
        PUSH BC
        LDIR
        LD HL,BUFILE
        LD DE,CAT+#0800
        POP BC
        LDIR

OK      XOR A
        RET

; Из байтовой системы в секторную
; In:
; HL - bytes
; Out:
; B  - sectors

CLC_SEC LD B,H
        LD A,L
        AND A
        RET Z
        INC B
        RET


TRAK_gui
        INC L
        LD A,L
        CP #10
        CALL Z,RESL_gui
        DJNZ TRAK_gui
        RET

RESL_gui
        LD L,0
        INC H
        RET

       ; Процедуры для работы с файлами /DA
       ; заменил TBUFF на BUFF

; RENAME_FL  изменено в Bge.asm  v 3.12 /DA

RENAME_FL    ld (Spp),sp      ; вход A - номер файла,    /DA
             call .n_adr
             push hl
             ld de,BUFF
             ld bc,16
             ldir
             pop hl
             ld c,11
             ldir
   ;          call FilesCOM.nrm
   ;          call FilesCOM.nrm
             ld de,BUFF+16+8
             call Fext_nrm

             ld hl,BUFF+16
             call FNEdit_
             ret c
             ld a,LOAD_CAT      ; перечитаем каталог
             call GUI_
             ld a,6
            jp c,GET_MSG_gui

             ld hl,0
.Nadr     EQU $-2
             push hl
             call .cp11
             dec hl
             dec hl
            jr nz,.err_
            call SAVE_FL.strt

.s1          pop de
             ld bc,9
             ld hl,BUFF+16
             ldir
             ld de,0
.sect      EQU $-2    ; d=0
             ld l,d
             ld h,e
             ld bc, CAT
             add hl,bc
             ld bc,#0106
             ld a,DOS_FUNC
             jp GUI_

.err_        pop de
.err_1         ld a,1
            jp GET_MSG_gui

.n_adr       ld l,a
             ld h,0
             add hl,hl
             add hl,hl
             add hl,hl
             add hl,hl    ;*16
             ld a,h
             ld (.sect),a      ; сектор
             ld bc,CAT
             add hl,bc    ; адрес имени
             ld (.Nadr),hl
            ret

.cp11        ld b,11
.cpB         ld de,BUFF
1            ld a,(de)
             cp (hl)
             ret nz
             inc hl
             inc de
            djnz 1B
             ret

SAVE_FL    ld hl,.swp_
           push hl
           ld (Spp),sp
           ld a,(BUFF+13)        ; длина файла в секциях
           call .swp_
           ld d,a
           ld b,a
           ld e,0
           ld hl,#8000
           call SAVE_FILE
          ret c            ;  jr c,.swp
           pop af    ; delete return addres
           ld (Spp),sp
           call .swp_
           ld a,[CAT+8*256+228]     ;количество файлов (наш последний)
           or a
          jp z,RENAME_FL.err_1
           dec a
           call RENAME_FL.n_adr     ; адрес имени
          push hl
           ld b,9
           call RENAME_FL.cpB
          jp nz,RENAME_FL.err_

           call .strt

           ld de,BUFF+11               ; длина в байтах
           ld a,(de)
           inc de
           ld (hl),a
           inc hl
           ld a,(de)
           inc de
           ld (hl),a

          jp RENAME_FL.s1

.swp_      push af
           call .swp
           pop af
          ret
.swp       ld a,AddPage          ; свапим страницу в #8000
           ld hl, #8000
           ld de, #C000
           ld b,#40
          jp SWAP

.strt      ld de,BUFF+16+9
           ld a,(de)
           inc de
           ld c,a
           cp #21
          jr c,1F
           ld a,(de)
           dec de
           ld b,a
           cp #21
          jr nc,2F
1          ld bc,(BUFF+9)             ; начало файла в байтах
2          ld (hl),c
           inc hl
           ld (hl),b
           inc hl
           ret

