        MAIN "",134

JP_HL   JP (HL)

; DE - адрес буфера
ToName  LD HL,FILE_NAME
        LD BC,8
        LDIR 
        LD A,FormExt
        CALL GUI
        RET 

NEW_XY  DW #FFFF
OLD_XY  DW #FFFF

RAM7    LD A,7
        JP RAM
RAM0    LD A,0
        JP RAM
ReOLDXY LD HL,#FFFF
        LD (OLD_XY),HL
        RET 
TAB_JP  CALL TAB_HL
        JP (HL)
Window_ LD A,Window
        JP GUI
EDIT_   LD A,EDIT
        JP GUI
Win_    LD A,Win
        JP GUI
Winn_   LD A,Winn
        JP GUI
NOKEY_  LD A,NOKEY
        JP GUI
WAITKEY_ LD A,WAITKEY
        JP GUI
ARW_SCN_ LD A,ARW_SCN
        JP GUI
DOS_FUNC_ LD A,DOS_FUNC
        JP GUI
DIRSCN_ LD A,DIRSCN
        JP GUI
BREAK   LD A,BUTTON
        JP GUI
GET_MSG_ EX AF,AF'
         LD A,GET_MSG
         JP GUI

BoxCol
RAMKA_  LD A,RAMKA
        JP GUI
STOP_ARW_ LD A,STOP_ARW
        JP GUI
SuxRam  LD A,SuxPage
        JP RAM
AddRam  LD A,AddPage
        JP RAM
ScrRam  LD A,ScrPage
        JP RAM
GET_NUM_
        EX AF,AF'
        LD A,GET_NUM
        JP GUI

; Редактор имени файла
;
; HL - адрес имени файла

FNEdit  LD (De1),HL
        LD DE,WEStr
        LD BC,8
        LDIR 
        INC DE
        LD BC,3
        LDIR 
        LD IX,WEdit
        CALL Window_
        LD HL,WEStr
        LD DE,#0101
        LD B,8
        XOR A
        LD A,1
        EX AF,AF'
        CALL EDIT_
        JR C,CLOSE_
        LD HL,WEStr+9
        LD DE,#0101
        LD B,3
        LD A,10
        EX AF,AF'
        CALL EDIT_
        JR C,CLOSE_
        CALL CLOSE

        LD HL,WEStr
        LD DE,0
De1     EQU $-2
        PUSH DE
        LD BC,8
        LDIR 
        INC HL
        LD BC,3
        LDIR 
        POP HL
        LD DE,23773
        LD BC,11
        LDIR 
        RET 

CLOSE_  PUSH AF
        CALL CLOSE
        POP AF
        RET 

WEdit   DEFB 10,10,11,3,6*8,7,%00001110
        DEFB 0
        DEFW TEdit        ; объект-текст
        DEFW #FFFF

TEdit   DB " "
WEStr   DB "        .   ",0

; Вызов файлера в соответствии с Настройками (перечитка диска)
;
; HL - адрес таблицы сортировки

FilerE  LD (TAB_SORT),HL
        LD A,(ReRead)
        AND A
        JR NZ,Filerr
        LD A,LOAD_CAT
        CALL GUI
        RET C
        XOR A
filere  EX AF,AF'
        LD A,Filer
        CALL GUI
        PUSH AF
        CALL CLOSE
        POP AF
        RET 
Filerr  SCF 
        JR filere

SET_SCR2
        LD A,#18
        JR set_scr
SET_SCR1
        LD A,#10
set_scr LD (rmask+1),A
        LD A,(N_PAGE)
RAM     LD (N_PAGE),A
rmask   OR #10
        LD (S_PAGE),A
Ram     LD BC,#7FFD
        OUT (C),A
        RET 

; Возврат текущей страницы
;
GetRAM  LD A,0
N_PAGE  EQU $-1
        RET 

; Перенос системной информации в заголовок
; HL <- адрес информации
;
FromName LD DE,FILE_PARAM
         LD BC,11
         LDIR 
         RET 

RASCH   LD A,E
        AND #18
rasch   OR #40
        LD H,A
        LD A,E
        AND #07
        RRCA 
        RRCA 
        RRCA 
        ADD A,D
        LD L,A
        RET 

RASCH_  LD A,D
        AND #18
        OR #40
        LD H,A
        LD A,D
        AND #07
        RRCA 
        RRCA 
        RRCA 
        ADD A,E
        LD L,A
        RET 

RASCHA  LD A,D
        AND #18
        RRCA 
        RRCA 
        RRCA 
        OR #58
        LD H,A
        LD A,D
        AND #07
        RRCA 
        RRCA 
        RRCA 
        ADD A,E
        LD L,A
        RET 

RASCHA_ LD A,E
        AND #18
        RRCA 
        RRCA 
        RRCA 
        OR #58
        LD H,A
        LD A,E
        AND #07
        RRCA 
        RRCA 
        RRCA 
        ADD A,D
        LD L,A
        RET 

INC_YY  LD A,H
        ADD A,7
        LD H,A
INC_Y   INC H
        LD A,H
        AND 7
        RET NZ
        LD A,L
        ADD A,32
        LD L,A
        RET C
        LD A,H
        SUB 8
        LD H,A
        RET 

DEC_YY  CALL DEC_Y
        LD A,H
        SUB 7
        LD H,A
        RET 

DEC_Y   DEC H
        LD A,H
        CPL 
        AND 7
        RET NZ
        LD A,L
        SUB 32
        LD L,A
        RET C
        LD A,H
        ADD A,8
        LD H,A
        RET 

; Вываливающийся "список"
; IX <- адрес материнского окна
; HL <- адрес дочернего окна ("списка")

PupMnu  CALL pupmnu
        CALL Win_
        RET 

pupmnu  LD A,(IX+2)
        SRL A
        ADD A,(IX+0)
        PUSH HL
        POP IX
        LD B,(IX+2)
        SRL B
        SUB B
        LD (IX+0),A
        LD A,(ARW_YC)
        INC A
        LD (IX+1),A
        CALL popup
        RET 

; Вываливающиеся меню
;
popup   LD E,(IX+0)
        LD D,(IX+1)
        JR popup_

POPUP   LD DE,(ARW_XC)
popup_  LD A,(IX+2)
        ADD A,E
        CP 31+2
        JR C,pox
        LD A,32
        SUB (IX+2)
        LD E,A
pox     LD (IX+0),E
        LD A,(IX+3)
        ADD A,D
        CP 23+2
        JR C,poy
        LD A,24
        SUB (IX+3)
        LD D,A
poy     LD (IX+1),D
        RET 

;------------
; DE - адрес нового курсора
;
SV_ARW  PUSH AF
        LD HL,(ARW_ADR)
        LD (arw_adr),HL
        LD (ARW_ADR),DE
        POP AF
        RET 

LD_ARW  PUSH AF
        LD HL,0
arw_adr EQU $-2
        LD (ARW_ADR),HL
        POP AF
        RET 

; Попал ли курсор в окно
;
; HL  - координаты окна
; DE  - координаты курсора Y,X
; BC  - длина, высота окна
;
; SCF - не попал

InBox   LD A,H
        INC E
        CP E
        CCF 
        RET C
        ADD A,B
        CP E
        RET C
        LD A,L
        INC D
        CP D
        CCF 
        RET C
        ADD A,C
        CP D
        RET 

; Пересчет коорднат относительно окна
; DE - координаты в окне

RealWin LD A,(IX+0)
        ADD A,D
        LD D,A
        LD A,(IX+1)
        ADD A,E
        LD E,A 
        RET 

SetAtr  PUSH AF
        CALL RASCHA
        POP AF
        LD DE,#20
Lp12    PUSH BC
        PUSH HL
Lp13    LD (HL),A
        INC HL
        DJNZ Lp13
        POP HL
        POP BC
        ADD HL,DE
        DEC C
        JR NZ,Lp12
        RET 

Driver  LD A,(#5D19)
        CALL driver
        RET C
        EX AF,AF'
        LD C,1
        CALL DOS_FUNC_
        RET C
        LD A,LOAD_CAT
        CALL GUI
        RET C
        XOR A
        RET 

driver  LD HL,BCOL
        LD DE,8
        LD B,5
        PUSH HL
F1      LD (HL),7*8
        ADD HL,DE
        DJNZ F1
        POP BC
;       LD A,(#5D19)
        Amul8
        LD H,0
        LD L,A
        ADD HL,BC
        LD (HL),5*8
        LD IX,WDriver
        CALL POPUP
        LD A,%00001000
        LD (IX+6),A
        CALL GETBLK
        CALL Win_
        CALL CLOSE_
        CP #FF
        JR Z,scf
        SCF 
        CCF 
        RET 
scf     SCF 
        RET 

WDriver DEFB 0,0,2,5,7*8,7,%00001000
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DEFB 0
        DEFW Nil          ; объект-текст
        DEFW Nil          ; объект-подсветка (выборка)
        DEFW HDriver      ; горячие клавиши
        DEFW BDriver      ; объект-кнопки (выборка)
        DEFW #FFFF

HDriver DB 0
        DB "1"
         DW 0
        DB 0
        DB "2"
         DW 1
        DB 0
        DB "3"
         DW 2
        DB 0
        DB "4"
         DW 3
        DB 0
        DB "5"
         DW 4
        DB #FF

BDriver DEFB 0,0,2,1,7*8,%11
BCOL    EQU $-2
        DEFW SpDrive
        DEFB 0,1,2,1,7*8,%11
        DEFW SpDrive+16
        DEFB 0,2,2,1,7*8,%11
        DEFW SpDrive+32
        DEFB 0,3,2,1,7*8,%11
        DEFW SpDrive+48
        DEFB 0,4,2,1,7*8,%11
        DEFW SpDrive+64
        DB #FF

;---- Выборка рамочкой 8x8
; XOR A - перемещение рамки
; SCF   - выбор размера рамки

R1Sel   CALL ToIx8
        CALL NOKEY_
        LD DE,WinCur
        CALL SV_ARW
        PUSH IX
        LD HL,Ret
        CALL ARW_SCN_
        POP IX
        CALL LD_ARW
        RET C
        PUSH IX
        LD IX,Ix8
        LD HL,(ARW_X)
        LD (IX+0),L
        LD (IX+1),H
        SCF 
        CALL Ramka1
        POP IX
        RET C
        PUSH IX
        POP DE
        LD HL,Ix8
        LD BC,4
        LDIR 
        RET 

R8Sel   PUSH IX
        CALL ToIx8
        LD IX,Ix8
        LD A,1
        LD (IX+2),A
        LD (IX+3),A
        DEC A
        CALL Ramka8
        POP IX
        RET C
        PUSH IX
        LD IX,Ix8
        SCF 
        CALL Ramka8
        POP IX
        RET C
        PUSH IX
        POP DE
        LD HL,Ix8
        LD BC,4
        LDIR 
        RET 

ToIx8   PUSH IX
        POP HL
        LD DE,Ix8
        LD BC,4
        LDIR 
        RET 

Ramka1  LD DE,WinCur
        CALL SV_ARW
        LD HL,setint1
        CALL ramka8
        CALL LD_ARW
        RET 

Ramka8  LD HL,setint
ramka8  LD (setina+1),HL
RamkaS  PUSH IX
        CALL ToIx8
        LD IX,Ix8
        LD DE,WinCur
setina  CALL setint
        CALL ARW_SCN_
        PUSH AF
rramk   CALL RAMKA_
        POP AF
        JR C,nokr8
        POP DE
        PUSH DE
        LD HL,Ix8
        LD BC,4
        LDIR 
nokr8   POP IX
        RET 

Ramka8_ LD HL,Ret
        LD (majka+1),HL
        CALL Ramka8
        LD HL,NOKEY_
        LD (majka+1),HL
        RET 

setint  JR C,si
        LD HL,IntRMo
        JR si_
si      LD HL,IntRSi
si_     LD (r8mode+1),HL
        LD H,(IX+1)
        LD L,(IX+0)
        LD (reix),HL
        LD HL,(ARW_X)
        DUP 3
        SRL H
        SRL L
        EDUP 
        LD (ARW_XC),HL
        LD (IX+0),L
        LD (IX+1),H
        CALL RAMKA_
majka   CALL NOKEY_
        LD HL,(ARW_XC)
        LD (OLD_XY),HL
        LD HL,ARW_XC
        LD (moder+2),HL
        LD HL,RAMKA_
        LD (rramk+1),HL
        LD HL,IntR8
        RET 

Ramka1_ LD HL,Ret
        LD (nokr1+1),HL
        CALL Ramka1
        LD HL,NOKEY_
        LD (nokr1+1),HL
        RET 

setint1 LD HL,(ARW_X)
        LD (IX+0),L
        LD (IX+1),H
        JR C,si1
        LD HL,IntRMo1
        JR si2
si1     XOR A
        LD (IX+2),A
        LD (IX+3),A
        LD HL,IntRSi1
si2     LD (r8mode+1),HL
        CALL BoxPix
nokr1   CALL NOKEY_
        LD HL,ARW_X
        LD (moder+2),HL
        LD H,(IX+1)
        LD L,(IX+0)
        LD (reix2),HL
        LD HL,(ARW_X)
        LD (OLD_XY),HL
        LD HL,BoxPix
        LD (rramk+1),HL
        LD HL,IntR8
        RET 

IntRMo1 CALL BoxPix
        LD DE,(ARW_X)
        LD (IX+0),E
        LD (IX+1),D
        CALL BoxPix
        LD HL,(ARW_X)
        LD (OLD_XY),HL
        RET 

IntRSi1 LD A,(OLD_XY+1)
        INC A
        CALL NZ,BoxPix
        LD DE,(ARW_X)
        LD BC,0
reix2   EQU $-2
        CALL FRamka
        LD HL,(ARW_X)
        LD (OLD_XY),HL
        RET 

IntR8
;       LD A,(DIRECT)
;       AND A
;       RET Z
        LD HL,(OLD_XY)
moder   LD DE,(ARW_XC)
        AND A
        SBC HL,DE
        RET Z
r8mode  JP IntRSi

IntRMo  CALL Ramka
        LD DE,(ARW_XC)
        LD (IX+0),E
        LD (IX+1),D
        CALL Ramka
        LD HL,(ARW_XC)
        LD (OLD_XY),HL
        RET 

IntRSi  LD A,(OLD_XY+1)
        INC A
        CALL NZ,Ramka
        LD DE,(ARW_XC)
        LD BC,0
reix    EQU $-2
        CALL GET_BIGX
        CALL GET_BIGY
        LD (IX+0),E
        LD (IX+1),D
        LD A,B
        SUB D
        INC A
        LD (IX+3),A
        LD A,C
        SUB E
        INC A
        LD (IX+2),A
        CALL Ramka
        LD HL,(ARW_XC)
        LD (OLD_XY),HL
        RET 

Ramka   LD A,RAMKA
        JP GUI_

Ix8     DS 4

PixHL   LD A,D
        RRA 
        SCF 
        RRA 
        RRA 
        AND #5F
        LD H,A
        XOR E
        AND #07
        XOR E
        RRCA 
        RRCA 
        RRCA 
        LD L,A
        LD A,D
        XOR H
        AND #07
        XOR H
        LD H,A
        RET 
;----------------------------
SETV    LD DE,#5800
        LD C,(IX+2)
        LD B,(IX+3)
        LD H,0
        LD L,(IX+1)
        DUP 5
        ADD HL,HL
        EDUP 
        ADD HL,DE
        LD A,(IX+0)
        ADD A,L
        LD L,A
SETV1   PUSH BC
        PUSH HL
SETV2   LD A,(HL)
        CALL MIXCOL
        LD (HL),A
        INC HL
        LD A,H
        CP #5B
        JR NC,EX23
        LD A,#1F
        AND L
        JR Z,KAZ2
        DEC C
        JR NZ,SETV2
KAZ2    POP HL
        POP BC
        LD DE,#20
        ADD HL,DE
        DJNZ SETV1
        RET 
EX23    POP AF
        POP BC
        RET 

setv    LD (setv2+1),A
        LD DE,#5800
        LD C,(IX+2)
        LD B,(IX+3)
        LD H,0
        LD L,(IX+1)
        DUP 5
        ADD HL,HL
        EDUP 
        ADD HL,DE
        LD A,(IX+0)
        ADD A,L
        LD L,A
setv1   PUSH BC
        PUSH HL
setv2   LD A,0
        LD (HL),A
        INC HL
        LD A,H
        CP #5B
        JR NC,EX23
        LD A,#1F
        AND L
        JR Z,kaz2
        DEC C
        JR NZ,setv2
kaz2    POP HL
        POP BC
        LD DE,#20
        ADD HL,DE
        DJNZ setv1
        RET 

INV     LD A,(IX+1)
        CALL 3742
        LD A,(IX+0)
        ADD A,L
        LD L,A
        LD C,(IX+3)
        SLA C
        SLA C
        SLA C
INVV2   PUSH HL
        LD B,(IX+2)
        XOR A
INVV3   LD A,(HL)
        CPL 
        LD (HL),A
        INC HL
        DJNZ INVV3
        POP HL
        CALL INC_Y
        DEC C
        JR NZ,INVV2
        RET 

CLSVV:  LD A,(IX+1)
        CALL 3742
        LD A,(IX+0)
        ADD A,L
        LD L,A
        LD C,(IX+3)
        SLA C
        SLA C
        SLA C
CLSV2   PUSH HL
        LD B,(IX+2)
        XOR A
CLSV3   LD (HL),A
        INC HL
        DJNZ CLSV3
        POP HL
        CALL INC_Y
        DEC C
        JR NZ,CLSV2
        RET 

INC_YD  INC D
        LD A,D
        AND 7
        RET NZ
        LD A,E
        ADD A,32
        LD E,A
        RET C
        LD A,D
        SUB 8
        LD D,A
        RET 

DEC_YD  DEC D
        LD A,D
        CPL 
        AND 7
        RET NZ
        LD A,E
        SUB 32
        LD E,A
        RET C
        LD A,D
        ADD A,8
        LD D,A
        RET 
;------------------------
;...
; Запомнить окно (screen)
;...
; (IX) - X,Y,WIDTH,HIGH
; DE   - АДРЕС В ПАМЯТИ
;...
SaveWS  PUSH DE
        LD D,(IX+0)
        LD E,(IX+1)
        CALL RASCH
        POP DE
        LD A,(IX+3)
        ADD A,A
        ADD A,A
        ADD A,A
        LD B,A
dn22    PUSH BC
        LD B,(IX+2)
        PUSH HL
dn11    LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        DJNZ dn11
        POP HL
        CALL INC_Y
        POP BC
        DJNZ dn22
        RET 

; Запомнить окно (attribute)
;...
; (IX) - X,Y,WIDTH,HIGH
; DE   - АДРЕС В ПАМЯТИ
;...
SaveWA  PUSH DE
        LD D,(IX+1)
        LD E,(IX+0)
        CALL RASCHA
        POP DE

        LD B,(IX+3)
Ck4     PUSH BC
        PUSH HL
        LD B,(IX+2)
Ck3     LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        DJNZ Ck3
        POP HL
        PUSH DE
        LD DE,32
        ADD HL,DE
        POP DE
        POP BC
        DJNZ Ck4
        RET 

; Восстановить окно (screen)
;...
; (IX) - X,Y,WIDTH,HIGH
; DE   - АДРЕС В ПАМЯТИ
;...
LoadWS  PUSH DE
        LD E,(IX+1)
        LD D,(IX+0)
        CALL RASCH
        POP DE
        LD A,(IX+3)
        ADD A,A
        ADD A,A
        ADD A,A
        LD B,A
Ck6     PUSH BC
        PUSH HL
        LD B,(IX+2)
Ck5     LD A,H
        CP #58
        JP NC,Exs
        LD A,(DE)
MethodW NOP 
        LD (HL),A
        INC HL
        LD A,#1F
        AND L
        JR Z,Gran1
        INC DE
        DJNZ Ck5
This3   POP HL
        CALL INC_Y
        POP BC
        DJNZ Ck6
        RET 

; Восстановить окно (attribute)
;...
; (IX) - X,Y,WIDTH,HIGH
; DE   - АДРЕС В ПАМЯТИ
;...

LoadWA  PUSH DE
        LD D,(IX+1)
        LD E,(IX+0)
        CALL RASCHA
        POP DE
        LD B,(IX+3)
Ck2     PUSH BC
        PUSH HL
        LD B,(IX+2)
Ck1     LD A,H
        CP #5B
        JR NC,Exa
        LD A,(DE)
        LD (HL),A
        INC HL
        LD A,#1F
        AND L
        JR Z,Gran2
        INC DE
        DJNZ Ck1
This4   POP HL
        LD BC,#20
        ADD HL,BC
        POP BC
        DJNZ Ck2
        RET 

Exa:    POP AF
        POP AF
        RET 

Exs:    POP AF
        INC DE
        DJNZ $-1
        POP BC
        LD A,B
        CP 2
        RET Z
        DEC B
zb      PUSH BC
        LD B,(IX+2)
        INC DE
        DJNZ $-1
        POP BC
        DJNZ zb
        RET 

Gran1   INC DE
        DJNZ Gran1
        JR This3

Gran2   INC DE
        DJNZ Gran2
        JR This4
;-------------------------------
JHOT    LD DE,2
Jl      LD A,(HL)
        AND A
        RET Z
        INC HL
        CP B
        JR Z,JY
        ADD HL,DE
        JR Jl

JY      LD A,(HL)
        INC HL
        LD H,(HL)
        LD L,A
        POP AF
        JP (HL)
;------------------------------
; A  - номер кнопки
; HL - адрес цвета кнопки
; B  - всего кнопок
; ---
; включеная кнопка

SetBCol Amul8
        PUSH HL
        LD DE,8
sef     LD (HL),7
        ADD HL,DE
        DJNZ sef
        LD H,0
        LD L,A
        POP BC
        ADD HL,BC
        LD (HL),5
        RET 

; HL - адрес цвета кнопки
; Z  - кнопка выключилась

SwBut   LD A,(HL)
        CP 5
        JR Z,sw7
        LD A,5
swbut   LD (HL),A
        RET 
sw7     LD A,7
        JR swbut 
;---------------------------
TRAK    INC L
        LD A,L
        CP #10
        CALL Z,RESL
        DJNZ TRAK
        RET 

RESL    LD L,0
        INC H
        RET 

;---------- нужный мусор
MRmk    DS 4
TBSC    DW vstep
        DW vstep
        DW vlevel
        DW vlevel
        DW vspeed
        DW vspeed

