; LAST UPDATE: 16.02.2025 savelij
 
 
 
                include ../../macros.a80
 
                include ../../define.a80
 
                include ../../global_vars.a80
 
                include ../../evodos_vars.a80
 
 
 
DEPKADR         EQU 0x6000
 
 
 
                ORG 0x0000
 
                DI
 
                JP INITPAGE0
 
 
 
                DB 0x0008 - $ DUP 0xFF
 
                NOP
 
                JP DOS2RST8
 
 
 
                DB ADR_SEL_ROM - $ DUP 0xFF
 
                OUT (C),A
 
                NOP
 
                RET
 
 
 
                DB 0x0038 - $ DUP 0xFF
 
                EI
 
                RET
 
 
 
                DB 0x0066 - $ DUP 0xFF
 
                NOP
 
 
 
                DB 0x0080 - $ DUP 0xFF
 
                include ../../dec40.a80
 
 
 
                DB 0x00FF - $ DUP 0xFF
 
                DW 0x0038
 
 
 
INITPAGE0       LD SP,DEPKADR
 
                LD IY,0x5C3A
 
                LD A,0x3F
 
                LD I,A
 
                IM 1
 
                XOR A
 
                OUT (0xFE),A
 
                LD HL,PAGES_CONF
 
                LD BC,0xBC77
 
                LD A,2
 
                OUT (C),A
 
                LD DE,0x103F
 
.L1             LD BC,CONF_128
 
                OUT (C),D
 
                LD BC,LOW (WIN_A0)
 
.L2             OUTI
 
                LD A,B
 
                SUB E
 
                LD B,A
 
                JR NZ,.L2
 
                LD BC,CONF_128
 
                LD A,D
 
                XOR 0x10
 
                LD D,A
 
                JR Z,.L1
 
                LD BC,0xFF77
 
                LD A,0xAB
 
                OUT (C),A
 
        PEC_ON M_SHADOW_BF
 
                LD HL,.L3
 
                PUSH HL
 
                LD HL,0x40
 
                PUSH HL
 
                LD BC,WIN_A0
 
                LD A,ROM_RST81
 
                JP ADR_SEL_ROM
 
 
 
.L3
 
        RST8 _CMOS_RW,_INIT_CMOS
 
                LD HL,PAGES_CONF
 
                LD A,0xEF
 
                IN A,(0xFE)
 
                RRCA                            ; проверка нажатия кнопки "0" при сбросе
 
                CALL NC,RES_REZIDENT
 
                JR NC,.L5                       ; сброс в основное пзу
 
                RRCA
 
                RRCA
 
                RRCA
 
                RRCA                            ; проверка нажатия кнопки "6" при сбросе
 
                JR C,.L4
 
; вход в отладчик
 
                EXX
 
                LD BC,WIN_P2
 
                XOR A
 
                OUT (C),A
 
                LD HL,CPU2 + DEBUG_ONOFF
 
                SET 7,(HL)
 
                EXX
 
                IN A,(PEVO_CONF)
 
                OR M_NMI_BF
 
                OUT (PEVO_CONF),A
 
                AND M_NMI_BF ! 0xFF
 
                OUT (PEVO_CONF),A
 
                HALT
 
.L4             LD BC,CMOSD_SET_ADR
 
                LD A,CMOS.BYTE_00
 
                OUT (C),A
 
                LD B,HIGH (CMOSD_RD_WR)
 
                IN A,(C)
 
                AND CMOS_EC.MKOL_MODES
 
                CP CMOS_EC.KOL_MODES
 
                JR NC,.L5
 
                AND A
 
                JR Z,.L5
 
                DEC A
 
                LD HL,PAGES_CONFGLUK            ; конфигурировать для GLUK
 
                JR Z,.L5
 
                DEC A
 
                LD HL,PAGES_PROFROM             ; конфигурировать для PROFROM
 
                JR Z,.L5
 
                LD HL,PAGES_CUSTOM              ; конфигурировать для USER ROM
 
.L5             LD A,0xEF
 
                IN A,(0xFE)
 
                RRCA                            ; проверка не нажатости кнопки "0" при сбросе
 
                JR NC,.L5                       ; если нажата ждем отпускания
 
                LD BC,0xBC77
 
                LD A,2
 
                OUT (C),A
 
                LD DE,0x103F
 
.L6             LD BC,CONF_128
 
                OUT (C),D
 
                LD BC,LOW (WIN_A0)
 
.L7             OUTI
 
                LD A,B
 
                SUB E
 
                LD B,A
 
                JR NZ,.L7
 
                LD BC,CONF_128
 
                LD A,D
 
                XOR 0x10
 
                LD D,A
 
                JR Z,.L6
 
                LD A,(HL)
 
                LD IXH,A                        ; номер страницы завершения инита манагера 
 
                LD DE,0xAB0F                    ; ZX SCREEN MODE, TURBO ON 14MHZ
 
                LD BC,0xFD77                    ; и доступ к палитре
 
                OUT (C),D
 
                EI                              ; палитра
 
                HALT
 
                DI
 
                LD HL,TRSTPAL                   ; +15
 
                LD BC,0xBD77
 
                OUT (C),D                       ; вкл.PAL
 
.L8             LD A,E
 
                BIT 3,E
 
                OUT (0xFE),A
 
                JR Z,.L9
 
                OUT (0xF6),A
 
.L9             LD A,(HL)
 
                INC HL
 
                OR %00001100
 
                OUT (0xFF),A
 
                DEC E
 
                JP P,.L8
 
                LD A,0xAB
 
                LD BC,0xFF77
 
                OUT (C),A                       ; выкл.PAL
 
                LD A,IXH
 
                LD BC,0
 
                AND 0x3C
 
                JR Z,.L11                       ; RESET TO EVO SERVICE PAGE
 
                CP CONF4GLUK & 0x3F
 
                JR Z,.L10                       ; RESET TO GLUK SERVICE PAGE
 
                CP CONF4CUSTOM & 0x3F
 
                JR Z,.L10                       ; RESET TO CUSTOM ROM
 
                JP LDIR4PROFROM                 ; RESET TO PROFROM BASIC 128
 
 
 
.L10            PUSH BC
 
                LD BC,0xBC77
 
                LD A,2
 
                OUT (C),A
 
                LD BC,WIN_A0
 
                LD A,IXH
 
                OUT (C),A
 
        PEC_OFF M_SHADOW_BF
 
                LD BC,0xFF77
 
                LD A,0xA3
 
                JP 0x3D2D
 
 
 
.L11            LD H,CMOS.BYTE_00
 
        RST8 _CMOS_RW,_READ_CMOS
 
                AND CMOS_ED.RESET2CUSTOM ! 0xFF ; сброс для основного пзу
 
                LD L,A
 
        RST8 _CMOS_RW,_WRITE_CMOS               ; принудительно выставление в кмос сброса на EVO SERVICE
 
        IFDEF DOS_FE
 
                LD BC,WIN_A3
 
                LD A,ROM_RST82
 
                OUT (C),A
 
                LD B,HIGH (WIN_P2)
 
                LD A,RAM_EVODOS
 
                OUT (C),A
 
                CALL UNP_DOS_FE + CPU3          ; распаковка эмуля ВГшки
 
        ELSE
 
                LD BC,WIN_A3
 
                LD A,ROM_ADD_DOS
 
                OUT (C),A
 
                LD B,HIGH (WIN_P2)
 
                LD A,RAM_EVODOS
 
                OUT (C),A
 
                LD HL,CPU3
 
                LD DE,CPU2
 
                LD BC,0x4000
 
                LDIR                            ; копирование DOS
 
        ENDIF
 
                LD BC,WIN_A2
 
                LD A,0x7D
 
                OUT (C),A
 
                LD B,HIGH (WIN_A3)
 
                LD A,0xFF
 
                OUT (C),A
 
; для резидента HONEY COMANDER
 
                CALL CMP_REZIDENT               ; проверка резидента
 
                LD BC,0xFEFF
 
.L12            LD A,B
 
                IN A,(0xFE)
 
        REPT 5
 
                RRA
 
                JR C,$+3
 
                INC C
 
        ENDM
 
                RLC B
 
                JR C,.L12
 
                DEC C
 
                JP P,.L15                       ; нажато более 1 кнопки, переходим к тесту клавиатуры
 
                LD IXL,0                        ; запуск неосновной прошивки сервиса
 
                LD DE,0                         ; 1 нажата, проверяем что это
 
                LD BC,CONF_128
 
                PUSH DE                         ; адрес перехода в пзу если выбрано
 
                LD A,0xFE
 
                IN A,(0xFE)                     ; чтение нажатости кнопки "CS"
 
                RRA
 
                LD A,0
 
                JP NC,.L18              ; при нажатой "CS" переходим в бейсик 128
 
                LD A,0x7F
 
                IN A,(0xFE)                     ; чтение нажатости кнопки "SS"
 
                LD D,A
 
                RRA
 
                RRA
 
                LD A,0x30
 
                JP NC,.L18              ; при нажатой "SS" переходим в бейсик 48
 
                LD A,D
 
                RRA                             ; проверка нажатости кнопки "SPACE"
 
                JR C,.L13                       ; переходим далее если ничего не нажато
 
                LD A,0x10
 
                LD DE,0x3D2F
 
                PUSH DE
 
                JP .L18                 ; при нажатой "SPACE" переходим в TR-DOS
 
 
 
.L13            LD A,0xFD
 
                IN A,(0xFE)
 
                AND 4                           ; нажато "D" запуск демки
 
                JP Z,.L17
 
                LD IXL,1                        ; запуск основной прошивки сервиса
 
                LD HL,DEPKADR                   ; ничего не нажато, запускаем основную прошивку
 
                LD SP,HL
 
                EX DE,HL
 
                LD HL,.L14
 
                PUSH HL
 
                LD HL,0x0101
 
                PUSH HL
 
                LD BC,WIN_A0
 
                LD A,ROM_MAINMENU
 
                JP ADR_SEL_ROM
 
 
 
.L14            XOR A
 
                IN A,(0xFE)
 
                CPL
 
                AND 0x1F
 
                LD A,0x10
 
                JR NZ,.L16
 
                LD HL,0x6000
 
                PUSH HL
 
                JR .L18
 
 
 
.L15            SCF
 
                LD A,0x10
 
.L16            LD HL,BONUADR                   ; CMOS setup & HELP
 
                LD DE,0x6000                    ; распаковка и запуск CMOS SETUP
 
                PUSH DE
 
                PUSH AF
 
                CALL DEC40
 
                POP AF
 
                JR .L18
 
 
 
.L17            LD HL,0x6000-szdemoini
 
                LD SP,HL
 
                EX DE,HL
 
                PUSH DE
 
                LD HL,DEMO
 
                LD B,3
 
                LDIR
 
.L18            EX AF,AF'                       ; сохранение А и флагов
 
                LD HL,ERAM_CODE-1
 
                LD DE,0x5C80
 
                LD BC,ERAM_CODE-RAM_CODE
 
                LDDR
 
                EX DE,HL
 
                INC HL
 
                EXX
 
                LD A,IXL
 
                AND A
 
                LD D,0xA3
 
                JR NZ,.L19
 
                LD H,CMOS.BYTE_00
 
                CALL READCMOS
 
                AND CMOS_ED.M_TURBO14
 
                RRCA
 
                RRCA
 
                RRCA
 
                RRCA
 
                OR D
 
                LD D,A                          ; установка для 14МГЦ
 
.L19            LD H,CMOS.BYTE_01
 
                CALL READCMOS
 
                LD E,A                          ; установка для 7.0/3.5МГЦ и модель памяти
 
        PEC_OFF M_SHADOW_BF
 
                EXX
 
                JP (HL)
 
 
 
RAM_CODE        EXX
 
                LD BC,PENT_CONF
 
                LD A,IXL
 
                AND A
 
                LD A,0x10
 
                JR NZ,.L2
 
                LD A,E
 
                AND 3
 
                LD L,0
 
                JR Z,.L1
 
                LD L,4
 
.L1             LD A,E
 
                AND CMOS_EC.M_TURBO357
 
                RRCA
 
                RRCA
 
                RRCA
 
                OR L
 
                BIT 3,D
 
                JR Z,.L2
 
                SET 4,A
 
.L2             OUT (C),A
 
                LD BC,CONF_128
 
                XOR A
 
                OUT (C),A                       ; включили маппер 0
 
        PEC_ON M_SHADOW_BF
 
                LD BC,WIN_A0
 
                LD A,IXH
 
                OUT (C),A                       ; запрограммировали ROM для маппер 0
 
                LD BC,0xFF77
 
                OUT (C),D                       ; выставили турбо в зависимости от установок
 
        PEC_OFF M_SHADOW_BF
 
                EX AF,AF'
 
                LD BC,CONF_128
 
                OUT (C),A                       ; включили маппер 1
 
                RET
 
ERAM_CODE
 
 
 
; на входе:  H - адрес ячейки
 
; на выходе: L,A - прочитанное значение
 
READCMOS        PUSH BC
 
                LD BC,CMOSD_SET_ADR
 
                OUT (C),H
 
                LD B,HIGH (CMOSD_RD_WR)
 
                IN L,(C)
 
                LD A,L
 
                POP BC
 
                RET
 
 
 
; сброс включенного резидента
 
RES_REZIDENT    PUSH AF
 
                PUSH HL
 
                LD H,CMOS.BYTE_01
 
                CALL READCMOS
 
                RES CMOS_EC.B_REZIDENT,L
 
        RST8 _CMOS_RW,_WRITE_CMOS
 
                POP HL
 
                POP AF
 
                RET
 
 
 
; для резидента HONEY COMANDER
 
CMP_REZIDENT    LD H,CMOS.BYTE_01
 
                CALL READCMOS
 
                AND CMOS_EC.M_REZIDENT
 
                RET Z
 
                LD BC,WIN_A3
 
                LD A,0x1F ! 0x7F
 
                OUT (C),A
 
                LD HL,CPU3
 
                LD A,(HL)
 
                CP 0xC3
 
                JR NZ,.NOTFOUND
 
                XOR A
 
.NEXTBYTE       ADD A,(HL)
 
                ADC A,0
 
                INC HL
 
                BIT 7,H
 
                JR NZ,.NEXTBYTE
 
                DEC A
 
                JR NZ,.NOTFOUND
 
                LD A,0xAA
 
                DEC HL
 
                CP (HL)
 
                JR NZ,.NOTFOUND
 
                CPL
 
                DEC HL
 
                CP (HL)
 
                JR NZ,.NOTFOUND
 
                LD BC,0x4177
 
                LD A,6
 
                OUT (C),A
 
        PEC_OFF M_SHADOW_BF
 
                JP CPU3
 
 
 
.NOTFOUND       LD BC,WIN_A3
 
                LD A,0xFF
 
                OUT (C),A
 
                RET
 
 
 
BONUADR         binclude ../../mainmenu/cmosset_pack.rom
 
 
 
                DUPL ADR_RST8END-$,0xFF
 
EDOS2RST8       LD A,L
 
                OUT (PEVO_CONF),A
 
                POP DE
 
                POP HL
 
                POP AF
 
                JP PO,EDOS2RST01
 
                EI
 
EDOS2RST01      POP BC
 
                POP AF
 
                EX (SP),HL
 
                RET
 
 
 
DOS2RST8        EX (SP),HL                      ; HL
 
                PUSH AF                         ; AF
 
                PUSH BC                         ; BC
 
                LD A,R
 
                JP PE,.L1
 
                LD A,R
 
.L1             DI
 
                PUSH AF                         ; RF
 
                PUSH HL                         ; ADR_RET
 
                PUSH DE                         ; DE
 
                IN A,(PEVO_CONF)
 
                LD L,A
 
                OR M_SHADOW_BF
 
                OUT (PEVO_CONF),A
 
                LD BC,RD_0WINA0
 
                IN H,(C)
 
                LD B,HIGH (RD_DOS7FFD)
 
                IN E,(C)
 
                RES 4,E
 
                DEC B
 
                IN D,(C)
 
                LD BC,WIN_P0
 
                XOR A
 
                JP ADR_SEL_ROM
 
 
 
                DB 0x3D2D - $ DUP 0xFF
 
                OUT (C),A
 
                NOP
 
                RET
 
 
 
DEMO            LD BC,CONF_128
 
                LD A,0x10
 
                OUT (C),A
 
                EI
 
szdemoini       EQU $ - DEMO
 
 
 
                binclude ../../mainmenu/src/grass.bin
 
 
 
LDIR4PROFROM    LD HL,JMP2PROFROM
 
                LD DE,JMP2PROFROM + 0x8000
 
                LD BC,EJMP2PROFROM - JMP2PROFROM
 
                LDIR
 
                PUSH BC
 
                LD BC,0xBC77
 
                LD A,3
 
                OUT (C),A
 
                LD A,IXH
 
                LD BC,WIN_A0
 
                OUT (C),A
 
                LD BC,0xFF77
 
                LD A,0xA3
 
                JP JMP2PROFROM + 0x8000
 
 
 
JMP2PROFROM     OUT (C),A
 
                RET
 
EJMP2PROFROM    
 
 
 
; 1000 0001 81 0 BASIC 128      | EVO
 
; 1000 0011 83 0 BASIC 48       | SERVICE
 
 
 
; 1000 0101 85 1 BASIC 128      | ADDONS
 
; 1000 0111 87 1 BASIC 48       | RST8 SERVICE
 
 
 
; 1000 1001 89 2 BASIC 128      | RESERVED
 
; 1000 1110 8B 2 BASIC 48       | EVODOS EMUL 3D2F
 
                                          
 
; 1000 1101 8D 3 BASIC 128      | PROFROM 1
 
; 1000 1111 8F 3 BASIC 48       | PROFROM 1
 
                                          
 
; 1001 0001 91 4 BASIC 128      | PROFROM 0
 
; 1001 0011 93 4 BASIC 48       | PROFROM 0
 
 
 
; 1001 0101 95 5 BASIC 128      | GLUK
 
; 1001 0111 97 5 BASIC 48       | GLUK
 
 
 
; 1001 1001 99 6 BASIC 128      | FREE
 
; 1001 1011 9B 6 BASIC 48       | FREE
 
 
 
; 1001 1101 9D 7 BASIC 128      | CUSTOM
 
; 1001 1111 9F 7 BASIC 48       | CUSTOM
 
 
 
; основная конфигурация по сбросу, изменять категорически не рекомендуется
 
PAGES_CONF      DB 0xFF,0x7D,0x7A,0x83
 
                DB 0xFF,0x7D,0x7A,0x00,0x81
 
 
 
; конфигурация для GLUK
 
PAGES_CONFGLUK  DB 0xFF,0x7D,0x7A,CONF4GLUK+3
 
                DB 0xFF,0x7D,0x7A,0x00,CONF4GLUK+1
 
 
 
; конфигурация для EVO PROFROM
 
PAGES_PROFROM   DB 0xFF,0x7D,0x7A,CONF4PROF+3
 
                DB 0xFF,0x7D,0x7A,0x00,CONF4PROF+1
 
 
 
; конфигурация для отдельно прошиваемой 64к прошивки (USER ROM)
 
PAGES_CUSTOM    DB 0xFF,0x7D,0x7A,CONF4CUSTOM+3
 
                DB 0xFF,0x7D,0x7A,0x00,CONF4CUSTOM+1
 
 
 
; палитра для spectrum режима
 
TRSTPAL
 
                DB (M_R_H | M_R_L | M_G_H | M_G_L | M_B_H | M_B_L) ! 0xF3       ; 00
 
                DB (M_R_H | M_R_L | M_G_H | M_G_L                ) ! 0xF3       ; 21
 
                DB (                M_G_H | M_G_L | M_B_H | M_B_L) ! 0xF3       ; 42
 
                DB (                M_G_H | M_G_L                ) ! 0xF3       ; 63
 
                DB (M_R_H | M_R_L |                 M_B_H | M_B_L) ! 0xF3       ; 90
 
                DB (M_R_H | M_R_L                                ) ! 0xF3       ; B1
 
                DB (                                M_B_H | M_B_L) ! 0xF3       ; D2
 
                DB BLACK                                           ! 0xF3       ; F3
 
                DB (M_R_H |         M_G_H |         M_B_H        ) ! 0xF3       ; E0
 
                DB (M_R_H |         M_G_H                        ) ! 0xF3       ; E1
 
                DB (                M_G_H |         M_B_H        ) ! 0xF3       ; E2
 
                DB (                M_G_H                        ) ! 0xF3       ; E3
 
                DB (M_R_H |                         M_B_H        ) ! 0xF3       ; F0
 
                DB (M_R_H)                                         ! 0xF3       ; F1
 
                DB (                                M_B_H        ) ! 0xF3       ; F2
 
                DB BLACK                                           ! 0xF3       ; F3
 
 
 
                DUPL 0x3FF8 - $,0xFF
 
                DB "HEGLUK"
 
                DW DATA_VERS