; deleted more commits

; Записать в UNDO
;

Set_sv_Undo   xor a
              ld (sv_Undo+1),a
             ret
sv_Undo       ld a,0
              or a
             ret nz
              inc a
              ld (sv_Undo+1),a
SV_UNDO       ld hl,SCREEN
             jr 1F
SV_UNDO_
              ld hl,#4000
1             ld de,UNDOSCR
             jr 3F
LOADUNDO      ld de,SCREEN       ; UNDOscreen -> Screen /DA
             jr 2F
LOADUNDO_
              ld de,#4000
2             ld hl,UNDOSCR
3             ld a,ScrPage
             jr LOADSCR.ldir


SWP_Undo   call ScrRam     ; обмен корзины и видимого экрана в сег.5
           ld hl,#4000
           ld de,UNDOSCR
          jr LD_UNDO.K_s1

SwapUnShad                ;  обмен корзины и теневого экрана /DA
           call LD_UNDO
           call SwapSCRS
; Вызвать UNDO
LD_UNDO
          call ScrRam
        LD DE,UNDOSCR
.K_s    LD HL,SCREEN
.K_s1   LD BC,6912
.K_6    jp SWP_HLDEBC


SWAP_SCR2                    ; обменять shadow scr с экраном в #4000  /DA
            call RamRam
          jr SWAP_SCR.T
SWAP_SCR                     ; обменять scr0 с экраном в #4000  /DA
           call ScrRam
.T        ld de, #4000
         jr LD_UNDO.K_s

exSCR_
            push hl,af,de,bc
            call SWAP_SCR.T
           jp SETV.pop    ; in SetWA at 'Add.asm'

SwwS    call ScrRam
SwpSRam ld hl,#5800
        ld de,SCREEN+6144
        ld bc,768
        call SWP_HLDEBC    ; LD_UNDO.K_6
        ld h,#40    ; l=0  -> hl=#4000
        ld d,#C0    ; e=0  -> de=SCREEN
        ld b,#18    ; c=0  -> bc=6144
       jr LD_UNDO.K_6



SwpSCRSl   call SwapSCRS  ; переместил сюда /-3/ байта
LOADSCR LD A,ScrPage
.load
        LD DE,#4000
.hl
        LD HL,SCREEN
.ldir   CALL RAM
.ldir_  LD BC,6912
        LDIR
        RET

LOADSCR2 LD A,RamPage     ; /DA
         jr LOADSCR.load

saveRAM    call LOADSCR
           call SwapSCRS.SvRamUndo   ; теперь при записи в теневой экран, его бывшее содержимое уходит в корзину
SAVESCR2
           LD A,RamPage
          JR SAVESCR.save

loadRAM    call LOADSCR2
           call SV_UNDO      ; теперь при извлечении из теневого экрана, содержимое основного уходит в корзину
          jr SAVESCR

SCram    call LOADSCR     ; обмен экранов с одновременным выводом
.a       call RamRam
         call SwpSRam
SAVESCR LD A,ScrPage

.save   LD HL,#4000
        LD DE,SCREEN
        JR  LOADSCR.ldir



SwapSuxSCRS   ; обмен экрана в 0-й и 1-й страницах (screen and suxscreen)
              ld bc,#1011
SwapC000      ld hl,#C000
SwapC000_     ld de,#C000
SwapPageSCR   ; обмен экранов в страницах памяти
              ; in: HL , DE - addreses of screens; B , C - pages of RAM
              ; out: set page B and swapping 6912 bytes
              ld a,c
              ex af,af'
              ld a,b
              ld bc,6912
             jp SWAP_AA



P_strt        ld bc,#1011    ; save screen at SCRPage to SuxPage memory
             jr 1F
SaveSCRS      ld bc,#1017    ; save screen to shedow screen
1             ld hl,#C000
              ld d,h
              ld e,l
CopyPageSCR  ; копирование экранов в страницах памяти
             ; in: HL , DE - addreses of screens; B , C - pages of RAM
             ; out: set page B and copy 6912 bytes at page B addr HL to page C addr DE
              ld a,c
              ex af,af'
              ld a,b
              ld bc,6912
             jp SVPG_AA


SwapSCRS     ld bc,#1017         ; обмен экранов /DA
            jr SwapC000

.SvRamUndo   ld bc,#1710
             ld hl,SCREEN
             ld de,UNDOSCR
            jr CopyPageSCR

.svSCR_        ; копируем тен.экр. в 1-ю позицию сегмента окон
             ld bc,#1711
1            ld hl,SCREEN
             ld d,h
             ld e,l
            jr CopyPageSCR
.ldSCR_       ; извлекаем тен. экран из 1-й поз. сег. окон
             ld bc,#1117
            jr 1B



;----------------------------
CLS_su  call SV_UNDO
        call CLS
       jp SAVESCR
CLS
        call cls_a.c

CLS_ATR ld a,(RGBdefault)  ; 7
.a      ld hl,#5800
        ld de,#5801
        ld (hl),a
        LD BC,767
        LDIR
        ld a,(REALRGB)
        RET

cls_a   call CLS_ATR.a
.c      ld hl,#4000
        ld de,#4001
.l      ld (hl),l
        ld bc,6143
        ldir
       ret



CLSSCRSCR
         call CLSscr_
        JP Main

CLSscr_  call SV_UNDO
CLSscr
         call ScrRam
        LD HL,SCREEN
        LD DE,SCREEN+1
         call cls_a.l
RAN     LD HL,SCREEN+6144
        LD BC,768
K_7     LD A,(HL)
        CALL MIXCOL
        LD (HL),A
        INC HL
        DEC BC
        LD A,C
        OR B
        JR NZ,K_7
       ret

CLSATR  CALL SV_UNDO
        JP RAN

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

ldb_screen   ; восстанавливаем экран из буферов 1,0 и 3 из NEWCAT
               ld hl,#EB08   ; [ ex de,hl : ex af,af' ]
              jr 1F
svb_screen   ; сохраняем экран в буферах страниц 1,0 и 3 на место NEWCAT
               ld hl,#0000     ; [ nop ]
1              ld a,h
               ld (.ldir),a
               ld (.lex),a
               call .setcom
               call ScrRam
               ld de,#F600
               ld bc,#0A00
               ld hl,#C000
.ldir          nop
               ldir
.lex           nop
               ld d,#F6
               ld b,#0A
               ld a,SuxPage
               call .svpsg
               ld h,#D4   ; #D400
               ld de,NEWCAT
               ld a,GUIPage
               ld b,#07
.svpsg         ex af,af'
               ld a,ScrPage
.svpa          nop : nop
               call SVPG_AA
.svex          nop : nop
              ret
.setcom        ld (.svpa),hl
               ld (.svex),hl
              ret
;----------------------------------------------

; Процедура сохранения/возврата на экран блока c экрана в #C000 (размер в знакоместах)

SvPrtSCRpXY  xor a          ; Save :  in E - X-pixels, D - Y-pixels , B - sY, C - sX
             ld (LdPrtSCRpXY_.de),de
             ld (LdPrtSCRpXY_.bc),bc
            jr 1F

LdPrtSCRpXY_ ld de,#0000    ; Load с параметрами последнего сохранения
.de  EQU $-2
             ld bc,#0000
.bc  EQU $-2

LdPrtSCRpXY  ld a,1         ; Load :  in E - X-pixels, D - Y-pixels , B - sY, C - sX
1            srl d : srl e
             srl d : srl e
             srl d : srl e
             rra
            jr 1F
SvPrtSCRaXY  xor a          ; Save : in E - X-col, D - Y-row , B - sY, C - sX
            jr 1F
LdPrtSCRaXY  scf            ; Load : in E - X-col, D - Y-row , B - sY, C - sX
1            push af
             ld a,32
             sub e
             cp c
            jr nc,1F
             ld c,a
1            ld a,24
             sub d
             cp b
            jr nc,1F
             ld b,a
1            call RASCH_
             pop af
            jr c,LdPrtSCR

SvPrtSCR     push hl        ; Save : in hl - scr addr , b=sY , c=sX   ; /DA v4.0m
             ld hl,#127E           ; [ ld a,(hl) : ld (de),a ]
            jr 1F
LdPrtSCR     push hl        ; Load : in hl - scr addr , b=sY , c=sX   ; /DA v4.0m
             ld hl,#771A           ; [ ld a,(de) : ld (hl),a ]
1            ld (.com1_),hl
             ld (.com2_),hl
             pop hl
1            push bc
             ld a,8
2            ex af,af'
             ld d,h
             ld e,l
             set 7,d
             ld b,c
            push hl
3
.com1_       ld a,(de) : ld (hl),a  ; [ ld a,(de):ld (hl),a ] for load  OR  [ ld a,(hl):ld (de),a ] for save
             inc l
             inc e
            djnz 3B
            pop hl
             inc h
             ex af,af'
             dec a
            jr nz,2B
             dec h
             push hl
             call ADRpixTOcol
             or #80
             ld d,a
             ld e,l
             ld b,c
4
.com2_       ld a,(de) : ld (hl),a  ; [ ld a,(de):ld (hl),a ] for load  OR  [ ld a,(hl):ld (de),a ] for save
             inc l
             inc e
            djnz 4B
             pop hl
             call INC_Y
             pop bc
             ld a,h
             cp #59
            ret nc
            djnz 1B
           ret



;ForAniLdPrtScr  ld a,SuxPage|#10   ; для модуля анимации (не влезло ) /DA v3.12
;                call Ram
;                call LdPrtSCR
;                ld a,AddPage|#10
;              jp Ram




;-------- Работа со слотами экранов --------

SlotName     DB "bgeSLOT"
.N           DB "0Cod",0


SetSLOT_1        xor a
                jr 1F
SetSLOT_2        ld a,1
                jr 1F
SetSLOT_3        ld a,2
                jr 1F
SetSLOT_4        ld a,3
                jr 1F
SetSLOT_5        ld a,4
1                call SetSlot_n
2               jp Main

SwpCurrSLOT      ld a,(Curr_slot)
                 call SWAP_SLOT
                jr 2B

SetSlot_n
                 ld hl,SlotsNUMS
                 cp (hl)
                ret nc
                 push af
                 add a,"1"
                 ld (WsetSlot.TxtA),a
                 ld (SlotName.N),a
                 ld ix,WsetSlot
                 ld (ix+6),%1010
                 call Window_
                 pop af
                jp SLOTS





WsetSlot    DB 11,10,9,3,7*8+2,7+2*8,%1010
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DB 0
        DW .Txt      ; объект-текст
        DW #FFFF
.Txt     DB #17,3
.TxtA    DB "1",0


SLOTS          ; выбор слота in: A - number of slot - select slot SLOTS.disk_
                push af
                ld a,(Curr_slot)
                push af
                call SAVE_SLOT
               jr c,.pop2aferr
                pop af
                ld b,a
                pop af
                cp b
                scf
               ret z
                 push af
                 call LOAD_SLOT
                jr c,.pop1aferr
                 pop af
                 ld (Curr_slot),a
                 or a
                ret

.pop2aferr      pop af
.pop1aferr      pop af
.error          xor a
                call EX_RAM
.error_         scf      ; flag c
               ret

.ram_            ; in: A = number , out: A = number of page or set flag c
                ld c,a
                ld (.disk_slnum),a
                ld a,(SlotsOnRAM)
                or a
               jr z,.error
                dec a
                cp c
               jr c,.error
                ld a,ovScrSLOTSpg
                add a,c
                or a
               ret

.disk_         ; in: from .ram_ , out set system disk and [#5CDD]-data of file or set flag c for error
.disk_slnum EQU $+1 : ld a,0  ; A = number from .ram_
               ld c,a
               ld a,(SlotsOnDISK)
               or a
              jr z,.error_
               ld b,a
               ld a,(SlotsOnRAM)
               ld e,a
               ld a,c
               sub e
              ret c
               ld c,a
               cp b
              jr nc,.error_
               add a,"1"
               ld (SlotName.N),a
               call SetSYSTEMDISK
               ld hl,SlotName
               call Seach11From_
              ret c
               ld a,(SEC_LEN)
               cp 54
              jr nz,.error_
              ret



SWAP_SLOT     ; A - number of slot ; swap full slot screen and undoscreen for ScrPage
               call SLOTS.ram_     ; OUT: flag c for error
              jp nc,swap_slot
               call SLOTS.disk_
              jp nc,Dswap_slot
               scf
              ret

LOAD_SLOT     ; A - number of slot ; Load full slot screen and undoscreen
                call SLOTS.ram_    ; OUT: flag c for error
               jp nc,load_slot
                call SLOTS.disk_
               jp nc,Dload_slot
                scf
               ret

SAVE_SLOT     ; A - number of slot ; Save full slot screen and undoscreen
                call SLOTS.ram_    ; OUT: flag c for error
               jp nc,save_slot
                call SLOTS.disk_
               jp nc,Dsave_slot
                scf
               ret

LDscr_SLOT       push af
                 call SV_UNDO
                 pop af
                 call LDSCR_SLOT
               jp SAVESCR

LDSCR_SLOT    ; A - number of slot ; Load screen at slot to #4000
                call SLOTS.ram_    ; OUT: flag c for error
               jp nc,lscr_slot4
                call SLOTS.disk_
               jp nc,Dlscr_slot4
                scf
               ret


SVSCR_SLOT    ; A - number of slot ; Save screen from #4000 to slot and slotscreen save to slotundoscreen
                call SLOTS.ram_    ; OUT: flag c for error
               jp nc,sscr_slot4
                call SLOTS.disk_
               jp nc,Dsscr_slot4
                scf
               ret

Dsave_slot     ld c,6
              jr 1F
Dload_slot     ld c,5
1              ld b,54
2              ld a,ScrPage
3              call DslotSLBANK
4             jp RetCURRENTDISK

Dlscr_slot4    ld bc,27*256+5
               ld hl,#4000
               ld de,(START_SEC)
               call DOS_FUNC_
              jr 4B
Dsscr_slot4    call DslotTOSux
               ld hl,SCREEN
               ld de,UNDOSCR
               ld bc,6912
               push bc
               push hl
               ldir
               pop de
               pop bc
               ld hl,#4000
               ldir
5              ld bc,54*256+6
               ld a,SuxPage
               call DslotSLBANK
              jr 4B
Dswap_slot     call DslotTOSux
               ld a,ScrPage
               ex af,af'
               ld a,SuxPage
               ld hl,#C000
               ld d,h
               ld e,l
               ld bc,6912+6912
               call SWAP_AA
              jr 5B

DslotTOSux     ld bc,54*256+5
               ld a,SuxPage
               call DslotSLBANK
               ld a,SuxPage
              jp Ram_

DslotSLBANK    ld de,#C000
               ld hl,#8000
               ld ix,(START_SEC)
               ex af,af'
               ld a,SL_BANK
              jp GUI


SlotOPERAT     call ERASE_ALLW
               ld a,0
.slot     EQU $-1
               call #0000
.jp       EQU $-2
              jp Main

SLOT_copy       ld hl,WSltSelect.Tcopy
               jr SLOT_HL_title
SLOT_extract    ld hl,WSltSelect.Textract
               jr SLOT_HL_title
SLOT_swap       ld hl,WSltSelect.Tswap
SLOT_HL_title   ld (WSltSelect.TxtTitle),hl
                call SlotOUTtxt
                ld ix,WSltSelect
                call POPUP
                ld a,%1111
1               ld (ix+6),a
                call Win_
                call check_curr_slot
               jr z,1B
1               ld (Nslot_option),a
                rlca
                rrca        ; если 255 (>127), то устанавливается флаг c
               jp CLOSENK_  ; выход номер опции : 0-4 - слоты, 5 - теневой экран, 6 - файл,
                            ; 255 - нет опции

check_curr_slot  cp 0     ; out nz - normal, z - selected current slot (A set to %1101 for window)
Curr_slot     EQU $-1           ; текущий слот
                ret nz
                 ld a,%1101
                ret

SL_extract4     ld hl,WSltSelect.Textract
SL_extract4000  call SLOT_HL_title     ; загрузка экрана из выбранного в #4000
               ret c
                cp 5
               jr nc,1F
                call LDSCR_SLOT
                xor a
               ret
1               cp 5
               jr nz,1F
                call LOADSCR2
                xor a
               ret
1               ld hl,SORTscr
                call FilerE
               ret c
                ld b,27
                ld a,(SEC_LEN)
                ld (SlFile_SEC_LEN),a
                cp b
               jr nz,1B
                ld hl,#4000
                ld c,#05
                ld de,(START_SEC)
                ld (SlFile_START_SEC),de
                call DOS_FUNC_
               ret

Nslot_option         DB 0
SlFile_SEC_LEN       DB 0
SlFile_START_SEC     DB 0,0

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

.Txt      DB #0A
.TxtTitle DW .Tcopy
          DB 13,#0A : DW .Tslots
          DB 13
          MSG_WIN_CpSh : DB 13                 ; Теневой экран
          MSG_WIN_CpFl : DB 0                  ; Файл


.Sel      DB 1,3,2,1,%11        ; 0 - 1 slot
          DB 3,3,2,1,%11        ; 1 - 2 slot
          DB 5,3,2,1,%11        ; 2 - 3 slot
          DB 7,3,2,1,%11        ; 3 - 4 slot
          DB 9,3,2,1,%11        ; 4 - 5 slot
          DB 1,5,10,128+2,%11    ; 5 - теневой экран, 6 - Файл
         DB #FF

.Tcopy        MSG_SLOT_Copy
             DB #FF
.Textract     MSG_SLOT_Extract
             DB #FF
.Tswap        MSG_SLOT_Swap
             DB #FF

.Tslots   DB " 1"          ; WSltSelect.Tslots
          DB #17,2," 2"
          DB #17,4," 3"
          DB #17,6," 4"
          DB #17,8," 5"
          DB 0

SlotOUTtxt       ld b,5                     ; обработка текста слотов
                 ld hl,WSltSelect.Tslots
                 push hl
                 ld a," "
1                ld (hl),a
                 inc hl
                 ld (hl),a
                 inc hl
                 inc hl
                 inc hl
                djnz 1B
                 pop hl
                 ld a,(SlotsNUMS)
                 or a
                ret z
                 ld b,a
                 ld a,"1"
                 push hl
                 inc hl
1                ld (hl),a
                 inc a
                 inc hl
                 inc hl
                 inc hl
                 inc hl
                djnz 1B
                 pop hl
                 ld a,(Curr_slot)
                 add a,a
                 add a,a
                 ld c,a
                 ld b,0
                 add hl,bc
                 ld a,">"
                 ld (hl),a
                ret

