;.PRINTX "Service."

SERVICE:
        LD      DE,SR_MENU
        LD      BC,SR_MENU.Size
        CALL    RUN_MENU	;09f3
        LD	HL,SR_TAB
        CALL    EXEC_PNT
        JR      SERVICE

SR_TAB: DW UTILIT
        DW GOTO_TRDOS.m128
        DW GOTO_TRDOS.m48
        DW TURBO_OFF
        DW TURBO_ON
	DW CLEAR_RAM
        DW RET_FROM_M

; DC - every last character of a string will have bit 7 set
SR_MENU:
        BYTE 8                          ; количество пунктов
        BYTE    'Options ',#FF          ; заголовок меню
        DC      'RUN disk.trd'
        DC      '128 TR-DOS'
        DC      '48  TR-DOS'
        DC      'TURBO OFF '
        DC      'TURBO ON '
        DC      'Clear RAM'
        DC      'RETURN'
        DC      " "                     ; маркер конца
.Size   EQU $-SR_MENU

;*****************************

;SR_48R:
GOTO_TRDOS:
.m128:  LD      A,#10
        JR      .RUN
;SR_48:
.m48:   LD      A,#30           ; Стопор на PORT_128 !!!
;SR_48A:
.RUN:   LD      BC,#7FFD
        OUT     (C),A       
        LD      BC,0            ; НА 0 !!
        PUSH    BC
        LD      BC,#3D2F        ; В DOS !
        PUSH    BC
        JP      SW_ROM

;*******************************
TURBO_OFF:
        LD      A,BIOS.FN_TURBO.OFF
        LD      C,BIOS.FN_TURBO
        JP_to_BIOS
TURBO_ON:
        LD      A,BIOS.FN_TURBO.ON
        LD      C,BIOS.FN_TURBO
        JP_to_BIOS

;*******************************

CLEAR_RAM:
	DI
	LD      C,BIOS.FullInit
	RST_to_BIOS
        ; при очистке памяти из меню спектрума возврат в DSS по CAD
        ;  будет опасным (RAM Blocks освободились),
        ;  поэтому отключаем перехват ресета.
        ;!TODO придумать как отключать перехват только на возврат в DSS
        LD      A,ACEX.RET_PORT
        LD      BC,BIOS.SET_PORTS
        CALL    ToBIOS_3D13
	EI
	RET

;SR_CL_MEM:
;        DI
;        LD A,10H
;SR_CL_R2:
;	LD BC,1FFDH
;        OUT (C),A
;        EX AF,AF'
;	XOR A
;SR_CL_R1:
;	LD BC,7FFDH
;        OUT (C),A
;        LD HL,0C000H
;        LD DE,0C001H
;        LD BC,03FFFH
;        LD (HL),L
;        LDIR
;        INC A
;        CP 48H
;        JR NZ,SR_CL_R1
;        EX AF,AF'
;        CP 0
;        JP Z,BASIC_128        ; выход на сброс BASIC 128
;        LD A,0
;        JR SR_CL_R2

;*****************************
;    ***  MENU IS-DOS  ***
;*****************************

ISDOS:
        LD      HL,IS_TAB
        LD      DE,IS_MENU
        LD      BC,IS_MENU.Size
        PUSH    HL
        CALL    RUN_MENU
        POP     HL
        CALL    EXEC_PNT
        JR      ISDOS

IS_TAB:
;        DW TR_DOS
;        DW SP_DOS
	DW SPRINTER_1X
	DW AY8910_X
	DW PENTAGON
	DW SCORPION
	DW PENTAGON512
	DW SPRINTER_reset       ;SPRINTER_2X
	DW RET_FROM_M

; DC - every last character of a string will have bit 7 set
IS_MENU:
        BYTE    8               ; количество пунктов
        BYTE    'Hardware',#FF  ; заголовок меню
        DC      'Sprinter ZX '
        DC      'ZX Spectrum'
        DC      'Pentagon 128'
        DC      'Scorpion 256'
        DC      'Pentagon 512'
        DC      'Restart '
        DC      'RETURN'
        DC      " "             ; маркер конца
.Size   EQU $-IS_MENU

;******************************
;SP_DOS:
;	LD B,0E2H
;	LD A,0E1H
;	JR TR_DOS1
;TR_DOS:
;	LD B,0EAH
;	LD A,0E1H
;TR_DOS1:
;	CALL DOS_ON
;	CALL SET_ROM_PAGES
;	CALL DOS_OFF
;	RET
;******************************


;**************************************************
;Sprinter ZX
SPRINTER_1X:
        CALL    _SET_CNF
        LD      C,BIOS.RST_CONF.SP97_1
	RST_to_BIOS
	CALL    CNF_PN_320
        LD      L,2             ;FN_SYNC.INT_PENT
        JR      1F              ;!FIXIT метку придумать
;
;ZX Spectrum
AY8910_X:
        CALL    _SET_CNF
        LD      C,BIOS.RST_CONF.AY8910
	RST_to_BIOS

        LD      A,#FA           ; no ACC, Original waits
        LD      (Port_All_Mode),A
      
	CALL    CNF_SC_312
        LD      L,3             ;FN_SYNC.INT_ORIG
1:	LD      DE,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
	CALL    CONFIG_SET
	CALL    CLS             ;!FIXIT нужно ли?
	RET
;

SCORPION:
        CALL    _SET_CNF
	CALL    CNF_SC_312
        LD      L,1             ;FN_SYNC.INT_SCORP
	LD      DE,CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON
	JR      CONFIG_SET

PENTAGON:
        CALL    _SET_CNF
	CALL    CNF_PN_320
        LD      L,2             ;FN_SYNC.INT_PENT
	LD      DE,CNF_PORT.CNF_2 + CNF_PORT.TURBO.ON
	JR      CONFIG_SET

PENTAGON512:
        CALL    _SET_CNF
	CALL    CNF_PN_320
        LD      L,2             ;FN_SYNC.INT_PENT
	LD      DE,CNF_PORT.CNF_2 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512
;	JR      CONFIG_SET
CONFIG_SET:
	PUSH    DE

	EI
	HALT
	DI

	IN      A,(SLOT3)
	EX      AF,AF'
	LD      A,SYS_PAGE
	OUT     (SLOT3),A
	LD      (SYS_PAGE.CONFIG_DE),DE
        ;!FIXIT есть ли смысл делать до FN_SYNC?
	 LD      A,(ZX_VARS.BORDER)
	 RRCA
	 RRCA
	 RRCA
	 AND     7
	 OUT     (BorderColor),A
        ;
	EX      AF,AF'
	OUT     (SLOT3),A

        LD      A,L
        LD      C,BIOS.FN_SYNC
	RST_to_BIOS

	LD      HL,#4104                        ;!HARDCODE
	LD      E,0
	LD      BC,256*4 + BIOS.LP_OPEN_S       ;!HARDCODE
	RST_to_BIOS

	LD      HL,#5104                        ;!HARDCODE
	LD      E,0
	LD      BC,256*4 + BIOS.LP_OPEN_S
	RST_to_BIOS

	POP     DE
	LD      A,E
	OUT     (SYS_PORT.ROM),A

	IM      1
        EI
	RET

SPRINTER_reset:
        CALL    _SET_CNF
        LD      BC,256*BIOS.REINIT.SOFT_RESET + BIOS.REINIT
	JP_to_BIOS

_SET_CNF:
        DI
	LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
	OUT (SYS_PORT.ROM),A
        RET

CNF_SC_312:
	LD A,Port_VSYNC.SET_312L
	OUT (Port_VSYNC),A
	RET

CNF_PN_320:
	LD A,Port_VSYNC.SET_320L
	OUT (Port_VSYNC),A
	RET
        
;	LD A,CNF_0
;	OUT (SYS_PORT.ROM),A
;	CALL DOS_OFF
;	JP 0

;*****************************
;    *** MENU UTILITES ***
;*****************************
;!FIXIT это запуск c:\disk.trd - не думаю, что это нужно, можно заменить
UTILIT:
        LD HL,C_DISK_C
        CALL CALL_DOS1

        ;!TEST
	 ;CALL DOS_ON
	 ;LD A,0		; DETECT_HDD
	 ;CALL EXP_HDD
         LD     C,BIOS.HDD_INIT
         RST_to_BIOS
	 ;CALL DOS_OFF
        ;

	JR C,DISK_UTILIT

	LD HL,C_DISK_C3
        CALL CALL_DOS1

UTIL_DISK:
        XOR     A
        ;!TEST
         LD     C,BIOS.FreeMemRMD
         RST_to_BIOS
	 ;CALL EMM_FN3            ;!!!!! через RST_to_BIOS EMM.FreeMemRMD
        ;

        LD HL,C_DEMO6
        CALL CALL_DOS1

        XOR     A
        ;!TEST
         LD     C,BIOS.GET_RAMD_ST
         RST_to_BIOS
	 ;CALL GET_RAMD_ST
        ;

	JR C,UTIL_DISK_L1
	JR Z,UTIL_DISK_L1

        LD HL,C_DISK_C1
        CALL CALL_DOS1
        LD HL,C_DISK_C2
        CALL CALL_DOS1
        RET

UTIL_DISK_L1:
	LD A,(ZX_VARS.OPER_DISK)
	INC A
	CP 2
	JR Z,DISK_UTIL_RET
        LD HL,C_DISK_C5
        CALL CALL_DOS1
	JR UTIL_DISK

DISK_UTIL_RET:
        LD HL,C_DISK_C6
        CALL CALL_DOS1
	RET

DISK_UTILIT:
	LD HL,C_DISK_C4
        CALL CALL_DOS1
	JR UTIL_DISK

C_DEMO6:        DB .Size, ZX_Token.rem, ':/disk.trd', 13,80
.Size           EQU $-C_DEMO6-1

;***************************************

;VERSION: DEFB 22,21,0
;        DEFB 16,2,"Expansion 3.02    1997 ELSY Co.",16,1,0FFh

;**********************************************

DOS_RUN:
        LD HL,C_DISK_C1
        CALL CALL_DOS1

        LD HL,C_DISK_C2
        CALL CALL_DOS1
	RET

START_TRD:
        LD HL,C_DISK_C
        CALL CALL_DOS1
        LD HL,C_DISK_C0
        CALL CALL_DOS1
	LD HL,C_DISK_C3
        CALL CALL_DOS1
	RET

C_DISK_C:       DB .Size, ZX_Token.rem, ':', 13,80
.Size           EQU $-C_DISK_C-1

C_DISK_C0:      DB .Size, ZX_Token.rem, ':/CLEAR E', 13,80
.Size           EQU $-C_DISK_C0-1

C_DISK_C1:      DB .Size, ZX_Token.rem, ':/RMD E', 13,80
.Size           EQU $-C_DISK_C1-1

C_DISK_C2:      DB .Size, ZX_Token.rem, ':RUN', 13,80
.Size           EQU $-C_DISK_C2-1

C_DISK_C3:      DB .Size, ZX_Token.rem, ':/HDD', 13,80
.Size           EQU $-C_DISK_C3-1

C_DISK_C4:      DB .Size, ZX_Token.rem, ':/FDD', 13,80
.Size           EQU $-C_DISK_C4-1

C_DISK_C5:      DB .Size, ZX_Token.rem, ':/B:', 13,80
.Size           EQU $-C_DISK_C5-1

C_DISK_C6:      DB .Size, ZX_Token.rem, ':/A:', 13,80
.Size           EQU $-C_DISK_C6-1
;