;
;----------------------------[ ??????????? ]----------------------------;
; TURBO_OFF:
; 	LD A,D_TBOFF
; 	OUT (SYS_PORT.ON),A
; 	RET
;
; TURBO_ON:
; 	LD A,D_TBON
; 	OUT (SYS_PORT.ON),A
; 	RET
;
; JP_HL:  JP (HL)
;
;PRINT_LINE:
;        LD A,(HL)
;        INC HL
;        CP 0FFh
;        RET Z
;        RST 10H
;        JR PRINT_LINE
;
;	JP RESET_128
;-----------------------------------------------------------------------;
;


;-----------------------------------------------------------------------;
;                       ******* SERVICE *******
;-----------------------------------------------------------------------;

; коэффициент смещения по номеру таски
;  MACRO	GET_ZX_TASK_DATA_OFFSET
; 	RLCA
; 	RLCA
; 	RLCA
; 	RLCA
; 	AND	#30				; новая задача 0..3
;  ENDM


;------[ ДЕШИФРАЦИЯ КОМАНДНОЙ СТРОКИ,ПЕРЕДАННОЙ ДЛЯ "EXPANSION" ]-------;
COMAND_LINE:
        LD HL,(#5C5D)   ;!HARDCODE CH_ADR
COMAND_LOOP:
        LD A,(HL)
        INC HL
        CP ":"
        JR Z,COMAND_L1
        CP ZX_Char.carriage_return
        JR NZ,COMAND_LOOP
        RET

COMAND_L1:
        LD A,(HL)
        CP ZX_Token.rem
        RET NZ
        INC HL
COMAND_OK:      ; ОБНАРУЖЕНА КОМАНДА ДЛЯ 'expansion'
        LD A,(HL)
        INC HL
        CP ':'
        JP Z,MENU_S1
        CP ZX_Char.carriage_return
        JP Z,MENU_S1
	;
	AND %1101'1111
        CP 'I'
        JR Z,COMMAND_HARDWARE_MENU
        ;CP 'T'
        ;JR Z,TASK_SWITCH
        DEC HL
        POP BC
        JP BASIC_MENU
MENU_S1:
        POP BC
        CALL SERVICE
        JP SW_ROM_1

COMMAND_HARDWARE_MENU:
        LD A,(HL)
        INC HL
	AND %1101'1111
        CP 'S'
        RET NZ
	;
        POP BC
        CALL Hardware_Menu
        JP SW_ROM_1
;-----------------------------------------------------------------------;



;-----------------------------------------------------------------------;
;                       *** UTILITES ***
;-----------------------------------------------------------------------;

; C_0030:                 ; получить раб обл
;        CALL_48X 0030h
;        RET
C_19E8:                 ; очистить раб обл
       CALL_48X #19E8   ;!HARDCODE
       RET
C_1655:                 ; получить пространство
       CALL_48X #1655   ;!HARDCODE   
       RET
CLS:
C_0D6B: CALL_48 #0D6B   ;!HARDCODE
        RET
CH_2:   LD A,2
C_1601:                 ; OPEN CHANEL
        CALL_48 #1601   ;!HARDCODE
        RET
;-----------------------------------------------------------------------;




;-----------------------------------------------------------------------;
;			MANAGE_ZX_PAGES
;-----------------------------------------------------------------------;
;-------------------------------------------------------------------------------------------------------------------;
;Выбор в Setup, что грузить в vПЗУ при старте. Варианты:
;[x]	0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04
;[x]	1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX
;[x]	2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно)
;-------------------------------------------------------------------------------------------------------------------;
; 	для входа в режим спектрума:
; 0. Проверка метки ZX
; 1. CONFIG_DE.CNF_PORT Тип тачки, как инитить память, размер ОЗУ, турба
; 2. CONFIG_DE.ZX_START страница vROM для запуска
; 3. Настройки экрана (INT, Sync)
; 4. Торможение памяти (port all mode)
; 5. Block_ID.vROM
; 6. Block_ID.vRAM

; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;


;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░;
; [ ] free zx pages!
; ????? SYS_PAGE.SHARED_BUFFER_256b
;
; [ ] Страница ОЗУ для скорпа в SLOT0 должна совпадать с нулевой страницей порта #7FFD
 MODULE	MANAGE_ZX_PAGES

;-----------------------------------------------------------------------;
; Не портить DE
;Вход:	A - TASK NUMBER
; GET_ZX_TASK_DATA:
; 		 GET_ZX_TASK_DATA_OFFSET
; 		 ADD	A,_ZX_TASK_DATA
; 		 LD	C,A
; 		 LD	B,0
; 		 LD	IX,SYS_PAGE.ZX_TASK.CURRENT
; 		 ADD	IX,BC			; данные новой задачи
; 		 RET
;-----------------------------------------------------------------------;


;-----------------------------------------------------------------------;
;ВХОД:	HL - список страниц
;	 E - 0 = 128kb, 1 = 512kb
INIT_vRAM:	XOR	A
.set_1ffd:	LD	BC,#1FFD
		OUT	(C),A
		; set 128
		LD	B,#7F
		LD	D,%0000'0000
		CALL	SET_7FFD
		;
		XOR	A
		OUT	(C),A
		BIT	0,E	; 128/512
		RET	Z
		; set 128 + 384
		LD	A,SYS_PORT.CNF_512 + SYS_PORT.CNF_0 + SYS_PORT.TURBO.ON
		OUT	(SYS_PORT.ROM),A
		;
		LD	D,%0100'0000
		CALL	SET_7FFD
		LD	D,%1000'0000
		CALL	SET_7FFD
		LD	D,%1100'0000
		CALL	SET_7FFD
		;
		XOR	A
		OUT	(C),A
		RET
;-----------------------------------------------------------------------;

;-----------------------------------------------------------------------;
;ВХОД:	HL - список страниц
;	 D - начальное значение для 7FFD
SET_7FFD:	LD	A,(HL)
		OUT	(C),D
		OUT	(SLOT3),A
		INC	HL
		INC	D
		BIT	3,D	; количество страниц
		JR	Z,SET_7FFD
		RET
;-----------------------------------------------------------------------;

;-----------------------------------------------------------------------;
;Вход:	HL - буфер страниц (SLOT1..SLOT2) на которые маппим (всегда 11 шт.)
;	Первый байт списка - RAM BLOCK ID. Далее как угодно номера
;	страниц для каждого типа страницы vROM. Если какая-то страница
;	vROM не используется, то ставится #FF
INIT_vROM:	LD	A,(HL)
		OR	A
		SCF
		RET	Z
		INC	A
		JR	NZ,.free_pages
		LD	(HL),A
		JR	.set_vROM
		;
.free_pages:	LD	A,(SYS_PAGE.Block_ID.vROM)
		CP	(HL)
		EX	DE,HL
		 LD	C,BIOS.FreeMem
		 CALL	NZ,ToBIOS_FromEXT
		EX	DE,HL
		;
		LD	A,(HL)
.set_vROM:	LD	(SYS_PAGE.Block_ID.vROM),A
		; установка портов ROM
		LD	DE,.PORTS
		LD	B,.PORTS.Size
.loop:		PUSH	BC
		INC	HL
		LD	A,(HL)
		CP	#FF
		JR	NZ,.not_Spec_Page
		LD	A,Spec_Page
.not_Spec_Page:	LD	B,A
		LD	A,(DE)
		INC	DE
		PUSH	DE
		PUSH	HL
		 LD	C,BIOS.SET_PORTS
		 CALL	ToBIOS_FromEXT
		 ;CALL	SET_PORTS
		POP	HL
		POP	DE
		POP	BC
		DJNZ	.loop
		; установка метки ZX если рамблок не 0
		LD	A,(SYS_PAGE.Block_ID.vROM)
		OR	A
		RET	Z
		;
.set_ZX_flag:	IN	A,(SLOT3)
		LD	D,A
		LD	A,Spec_Page
		OUT	(SLOT3),A
		;
		LD	HL,'XZ'
		LD	(Spec_Page.flag_Z),HL
		;
		LD	A,D
		OUT	(SLOT3),A
		RET
		;
.PORTS:		DB	ACEX.vROM.BASIC_128	; ROM-ID - BASIC 128
		DB	ACEX.vROM.BASIC_48	; ROM-ID - BASIC 48
		DB	ACEX.vROM.TR_DOS	; ROM-ID - TR-DOS
		DB	ACEX.vROM.ZX_EXPANSION	; ROM-ID - EXPANSION
		DB	ACEX.vROM.ZX_BIOS_1	; ROM-ID - BIOS-1
		DB	ACEX.vROM.ZX_BIOS_2	; ROM-ID - BIOS-2
		DB	ACEX.vROM.BASIC_128_2	; BASIC 128 - 2
		DB	ACEX.vROM.BASIC_48_2	; BASIC 48 - 2
		DB	ACEX.vROM.TR_DOS_2	; TR-DOS - 2
		DB	ACEX.vROM.ZX_EXPANSION_2; BIOS (ZX_EXP) - 2
.PORTS.Size	EQU	$-.PORTS
;-----------------------------------------------------------------------;

;!FIXIT
;-------------[Выделение/освобождение/инит страниц спектрума]-----------;
;вход:	рег B:
; FN 0x
;		    0 - зарезервировано
;		    1 - выделение памяти Pentagon  48k. 3 страницы
;		    2 - выделение памяти Pentagon 128k. 2+6 страницы
;		    3 - выделение памяти Pentagon 512k. 2+30 страницы
;		    4 - выделение памяти Scorpion 256k. 2+6+8 страницы
;		5..15 - зарезервированы
; FN 1x
;		   16 - получить рамблоки инициализированных vROM и VRAM
;	       17..31 - зарезервированы
; FN 2x ;!TODO
;		   32 - зарезервировано
;		   33 - выделение памяти Spectrum  48k и инит 1-й страниц vROM
;		   34 - выделение памяти Pentagon 128k и инит 3-х страниц vROM
;		   35 - выделение памяти Pentagon 512k и инит 3-х страниц vROM
;		   36 - выделение памяти Scorpion 256k и инит 3-х страниц vROM
;	       33..63 - зарезервированы
; FN 4x
;		   64 - освободить рамблоки vROM и vRAM
;		   65 - освободить рамблок vRAM
;		   66 - освободить рамблок vROM
;	      65..127 - зарезервированы
; FN 8x
;		  128 - инициализировать свой набор страниц vROM
;
;	рег HL:	при рег B[7]=1 адрес страниц (11 шт):
;		        byte1 - RAM block ID, byte2..11 - страницы для vROM - ZXSlot: 1,2,3(=0),расширенная
;выход:	CF = 0: HL - номера рамблоков для режимов 0..16. H=vRAM, L=vROM
;	CF = 1:  A - номер ошибки
;
;если стэк находится в третьем слоте, то вызов с выключенными прерываниями
FN_ENTRANCE:	;!TODO	A - TASK NUMBER
		AND	A
		; LD	A,BIOS.Error.NotSupported
		; SCF
		; RET	NZ
		; CCF
		;
		EXX
		 LD	C,SLOT3
		 IN	B,(C)
		 LD	A,SYS_PAGE
		 OUT	(C),A
		EXX
		;
		LD	(SYS_PAGE.SP_SAVE),SP
		LD	SP,SYS_PAGE.SYS_SP	
		LD	DE,.EXIT
		PUSH	DE
		;-----------------------------------;
		; Sub FN #8x 
.API:		BIT	7,B
		JR	NZ,INIT_vROM		; B = 128
		; Sub FN #4x 
		BIT	6,B
		JR	NZ,FREE_vMEMORY		; B = 64..127
		; Sub FN #2x			;!TODO ; [ ] free zx pages!
		;BIT	5,B
		;JR	NZ,			; B = 32..63		
		; Sub FN #1x 
		BIT	4,B
		JR	Z,.x0x_FN		; B = 16
		;
.GET_RAMBLOCK_IDs:	;Вход: A - TASK NUMBER. Выход: H - vRAM block ID, L - vROM block ID
		LD	HL,(SYS_PAGE.Block_IDs)
		RET
		;
		; Sub FN #0x 
.x0x_FN:	DEC	B
		JR	Z,GET_48k_MEM		; B = 1
		DEC	B
		JR	Z,GET_128k_MEM		; B = 2
		DEC	B
		JR	Z,GET_512k_MEM		; B = 3
		DEC	B
		JR	Z,GET_SCORP_RAM		; B = 4
		;-----------------------------------;
		LD	A,BIOS.Error.InvalidSubFunction
		SCF
		RET
		;
.EXIT:		LD	SP,(SYS_PAGE.SP_SAVE)
		EXX
		 OUT	(C),B
		EXX
		RET
;-----------------------------------------------------------------------;


;-----------------------------------------------------------------------;
FREE_vMEMORY:	LD	A,B
		AND	3
		JR	Z,FREE_ALL_vMEMORY	; 0
		DEC	A
		JR	Z,FREE_vRAM		; 1
		DEC	A
		JR	Z,FREE_vROM		; 2
		LD	A,BIOS.Error.InvalidSubFunction
		SCF
		RET
;--------------;
FREE_vRAM:	LD	A,(SYS_PAGE.Block_ID.vRAM)
		OR	A
		RET	Z
		LD	C,BIOS.FreeMem
		CALL	ToBIOS_FromEXT
		LD	A,0
		LD	(SYS_PAGE.Block_ID.vRAM),A
		RET
;--------------;
FREE_ALL_vMEMORY:
		CALL	FREE_vRAM
;--------------;
FREE_vROM:	LD	A,(SYS_PAGE.Block_ID.vROM)
		OR	A
		RET	Z
		LD	C,BIOS.FreeMem
		CALL	ToBIOS_FromEXT
		PUSH	AF
		XOR	A
		LD	(SYS_PAGE.Block_ID.vROM),A
;--------------;
RES_FLAG_ZXvROM:			; не должно портить DE
		EX	AF,AF'
		 IN	A,(SLOT3)
		EX	AF,AF'
		LD	A,Spec_Page
		OUT	(SLOT3),A
		XOR	A
		LD	(Spec_Page.flag_Z),A
		LD	(Spec_Page.flag_X),A
		EX	AF,AF'
		OUT	(SLOT3),A
		POP	AF
		RET
;-----------------------------------------------------------------------;

;-----------------------------------------------------------------------;
;Выполняется для выделения трёх страниц ОЗУ 48k
GET_48k_MEM:	LD	D,BIOS.ZX_MEMORY_MANAGER.MODE_48k
		JR	GET_XXX_MEM
;Выполняется для инита 3 страниц ОЗУ 48k и 29 страниц ОЗУ Pent512k 		
GET_512k_MEM:	LD	D,BIOS.ZX_MEMORY_MANAGER.MODE_512k
		JR	GET_XXX_MEM
;Выполняется для выделения 3 страниц ОЗУ 48k и 5 страниц ОЗУ 128k тачек
GET_128k_MEM:	LD	D,BIOS.ZX_MEMORY_MANAGER.MODE_128k
		;JR	GET_XXX_MEM
GET_XXX_MEM:	CALL	FREE_vRAM
.init:		LD	B,D
		LD	C,BIOS.GetMem
		CALL	ToBIOS_FromEXT
		RET	C
		LD	(SYS_PAGE.Block_ID.vRAM),A
		RET
;-----------------------------------------------------------------------;



;-----------------------------------------------------------------------;
;Выполняется для выделения 3 страниц ОЗУ 48k и 14 страниц ОЗУ Scorp256k
;Вход:	---
;Выход:	A - RAM block ID
GET_SCORP_RAM:	CALL	FREE_vRAM
	; выделить страницы скорпа
		XOR	A
		LD	DE,#F0D0	; для фильтра. #F0 - маска, #D0 - страницы ISA #D0..#DF
		LD	BC,256*8 + #FF	; B - количество страниц, C - Метка конца рамблока
		LD	HL,SYS_PAGE.RAM_TABLE
.allocate_loop:	DEC	L
		JR	Z,.error_no_mem
		CP	(HL)
		JR	NZ,.allocate_loop
		;
		CALL	.check_barred_pages
		LD	A,0
		JR	Z,.allocate_loop
		;
		LD	(HL),C
		LD	C,L
		DJNZ	.allocate_loop
	; L = указатель цепочки.
		AND	A
		LD	D,L
		; Get Pent128 mem
		LD	BC,256*BIOS.ZX_MEMORY_MANAGER.MODE_128k + BIOS.GetMem
		CALL	ToBIOS_FromEXT
		;CALL	EMM.GetMem
		; A - Pent128 mem block id
		LD	B,D	; Scorp128 mem block id
		LD	C,BIOS.MergeMemBlocks
		CALL	ToBIOS_FromEXT
		;CALL	EMM.MergeMemBlocks
		LD	(SYS_PAGE.Block_ID.vRAM),A
		RET
		;
	; фильтр для страниц скорпа
		;выход:	ZF=1 - страница не подходит
.check_barred_pages:
		; check reset page
		LD	A,L
		CP	RESET_PAGE
		RET	C
		RET	Z
		; check isa page
		AND	D
		XOR	E		; страницы ISA #D0..#DF
		RET	NZ
		LD	L,E
		RET
		;
.error_no_mem:	LD	A,C
		LD	C,BIOS.FreeMem
		CALL	ToBIOS_FromEXT
		;CALL	EMM.FreeMem
		LD	A,BIOS.Error.EMM.NoMemory
		SCF
		RET
;-----------------------------------------------------------------------;
 ENDMODULE
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░;


;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░;
; [ ] free zx pages!
; Вход:	D: 0 - BASIC 128, 1 - BASIC 48, 2 - TR-DOS 128,
; 	   3 - EXPANSION. C закрытыми 128-ми портами:
; 	   4 - TR-DOS, 5 - BASIC 48
;	E: значение для SYS_PORT/CNF_PORT
;	L: Block_ID.vROM
;	H: Block_ID.vRAM
;	B: Port All Mode
;A [1..0]: 1 - int scorp, 2 - int pent, 3 - int ZX 
;   A'[2]: 0 - set default palette, 1 - don't change palette
;   A'[7]: 0 - 320, 1 - 312 строк

GOTO_SPECTRUM:	DI
		LD	C,A
		;
		; set shared pages
		XOR	A
		OUT	(SLOT2),A	; ZERO_PAGE
		DEC	A
		OUT	(SLOT1),A	; SHARED_PAGE
		;
		LD	A,SYS_PAGE
		OUT	(SLOT3),A
		;
		LD	(SYS_PAGE.CONFIG_DE),DE
		LD	(SYS_PAGE.Block_IDs),HL		;!FIXIT освободить старые значения? ; [ ] free zx pages!
		;
		LD	A,C
		AND	%0000'0011
		LD	SP,#C000
		;!TODO сделать активацию винта для параметра из Setup
		; установка инта
		EXX
		 LD	C,BIOS.FN_SYNC
		 CALL	ToBIOS_FromEXT
		EXX
		; установка развёртки
		LD	A,C
		EXX
		 RLCA
		 AND	%0000'0001
		 OR	%1000'0110
		 LD	C,BIOS.FN_SYNC
		 CALL	ToBIOS_FromEXT
		EXX
		;
		LD	A,C
		PUSH	BC
		EXX
		AND	%0000'0100		;!TODO запомнить/восстановить кастомную палитру?
		LD	BC,BIOS.SET_PAL_INIT.ZX
		CALL	Z,ToBIOS_FromEXT
		;
		; [x] фикс неполной дешифрации порта #FFFD (пишут в #C0FD) для ZX mode
		 LD	A,#FF
		 LD	HL,%00'010'1'1110'1101
		 LD	DE,%10'111'1'1111'1111				; CNF_0, CNF_1
		 LD	BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG	
		 CALL	ToBIOS_FromEXT
		;
		LD	E,0
		LD	BC,BIOS.LP_OPEN_S.ZX_32x24_Default
		CALL	ToBIOS_FromEXT
		;
		LD	E,0
		LD	HL,#5104
		LD	BC,BIOS.LP_OPEN_S.ZX_32x24
		CALL	ToBIOS_FromEXT
		;
		LD	BC,BIOS.SWAP_RAM_DRIVES.ZX
		CALL	ToBIOS_FromEXT
		;
		LD	A,(SYS_PAGE.Block_ID.vRAM)
		LD	HL,SYS_PAGE.SHARED_BUFFER_256b + 1
		LD	C,BIOS.GetMemBlkPages
		CALL	ToBIOS_FromEXT
		;!FIXIT
		 ;RET	C
		; !FIXIT проверка размера блока, сделать, чтоб выбирался объём памяти
		 ;LD	A,B
		 ;CP	16
		;
		LD	D,B
		EXX
		 POP	BC
		EXX
		;
		XOR	A
		OUT	(RGADR),A	; регистр видео адреса
		OUT	(RGMOD),A	; регистр моды
	; подготовка страниц
		PUSH	DE
		;
		LD	HL,SYS_PAGE.SHARED_BUFFER_256b+30
		LD	DE,SYS_PAGE.SHARED_BUFFER_256b+32
		LD	BC,26
		LDDR
		;
		INC	L
		LD	(HL),ZX_PAGE.SLOT1
		LD	HL,SYS_PAGE.SHARED_BUFFER_256b+2
		LD	E,(HL)
		LD	(HL),ZX_PAGE.SLOT2
		LD	HL,SYS_PAGE.SHARED_BUFFER_256b+6
		LD	(HL),E
		LD	HL,SYS_PAGE.SHARED_BUFFER_256b
		LD	(HL),A
		;
		POP	DE
	;
		; DEC	HL
		; LD	(HL),A						; ZX_PAGE.SLOT0
		; INC	HL
		; INC	HL
		; LD	A,(HL)
		; LD	(HL),ZX_PAGE.SLOT1
		; INC	HL
		; INC	HL
		; LD	E,(HL)
		; LD	(HL),ZX_PAGE.SLOT2
		; INC	HL
		; LD	(HL),A
		; INC	HL
		; LD	(HL),E
		;
		;LD	HL,SYS_PAGE.SHARED_BUFFER_256b
		;LD	IY,.BASIC_128
		;JR	INIT_PAGES					; инициализация номеров страниц режима спектрума
	; инициализация страниц zx spectrum
	; HL - адрес блока страниц в SYS_PAGE SLOT3
	; D  - количество этих страниц
INIT_PAGES:	LD	A,SYS_PAGE
		OUT	(SLOT1),A
		; [ ] free zx pages! переделать инит. если 512, то нет 1ffd и наоборот
		LD	A,SYS_PORT.TURBO.ON + SYS_PORT.CNF_0; + SYS_PORT.CNF_512
		OUT	(SYS_PORT.ROM),A
		;
		RES	7,H
		;
		LD	A,D
		CP	BIOS.ZX_MEMORY_MANAGER.MODE_48k
		JR	Z,.set_48k
		;
		LD	E,0			; pent128
		CP	BIOS.ZX_MEMORY_MANAGER.MODE_256k
		JR	Z,.set_scorp
		;
		CP	BIOS.ZX_MEMORY_MANAGER.MODE_128k
		JR	Z,.set_pent
		INC	E
		CP	BIOS.ZX_MEMORY_MANAGER.MODE_512k
		JR	Z,.set_pent
		;!FIXIT обработка ошибки
		 DI
.error_loop:	 LD	A,R
		 AND	7
		 OUT	(BorderColor),A
		 JR	.error_loop
		;
.set_48k:	LD	A,5	; !HARDCODE CONFIG_DE.ZX_START ВХОД В BASIC 48 с закрытыми 128-ми портами
		LD	(SYS_PAGE.CONFIG_DE.ZX_START - #8000),A
		;LD	A,(HL)						; SLOT0, SLOT3 page
		;INC	HL
		;LD	E,(HL)						; SLOT1 page
		;INC	HL
		;LD	D,(HL)						; SLOT2 page
		;JR	.set_slots
		;
		JR	.set_table
		;
.set_scorp:	CALL	MANAGE_ZX_PAGES.INIT_vRAM
		LD	A,#10
		CALL	MANAGE_ZX_PAGES.INIT_vRAM.set_1ffd
		; A = 0, BC = #7FFD
		LD	B,#1F
		OUT	(C),A
		INC	A						; reset ZF
		;
.set_pent:	CALL	Z,MANAGE_ZX_PAGES.INIT_vRAM
		; меняем порядок для процедуры .set_slots
.set_table:	LD	A,(SYS_PAGE.SHARED_BUFFER_256b+2 - #8000)	; SLOT2 page
		LD	D,A
		LD	A,(SYS_PAGE.SHARED_BUFFER_256b+5 - #8000)	; SLOT1 page
		LD	E,A
		LD	A,(SYS_PAGE.SHARED_BUFFER_256b+0 - #8000)	; SLOT0, SLOT3 page
		;
.set_slots:	OUT	(SLOT0),A
		OUT	(SLOT3),A
		LD	A,E
		OUT	(SLOT1),A
		LD	A,D
		OUT	(SLOT2),A
		;JP	(IY)
		;
;.BASIC_128:	;start_basic:
		LD	SP,#C000
		LD	HL,RES128_PROG
		LD	DE,ZX_VARS.PRINTER_BUFFER			; запуск программы на BASIC-е.
		LD	BC,RES128_PROG.Size
		LDIR
		JP	ZX_VARS.PRINTER_BUFFER
;----------------------------------------------------------------------;
;  0 1 2 3 4     5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
;  x 0 x 1 2 x 3 4
;  x 0 1 2 3 4 
;p 0 1 2 3 4 5 6 7
;  0 x 2 x x 5 x x 
;-----------------------------------------------------------------------;
;*****************************************
;
;	Инициализация страниц для
;	спектрумовского режима и
;	восстановление спектрумовского
;	экрана
;
;	Возврат по IY
;
;	!!! NO USE STACK !!!
;
;*****************************************

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

;
;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМАЯ В ОЗУ ] >$< >$< >$< >$< >$< >$< ;
;--------[ Программа, размещаемая с #5B00 для запуска Spectrum ]--------;
RES128_PROG:
 DISP ZX_VARS.PRINTER_BUFFER						;#5B00
		XOR	A
		OUT	(SYS_PORT.RAM),A				; Возврат в 128k ROM
		LD	C,SLOT3
		IN	B,(C)
		LD	A,SYS_PAGE
		OUT	(SLOT3),A
		LD	DE,(SYS_PAGE.CONFIG_DE)
		OUT	(C),B
		;
		EXX
		 LD	A,B
		EXX
		LD	BC,Port_All_Mode
		OUT	(C),A
		;
		XOR	A
		LD	BC,#1FFD
		OUT	(C),A						; Scorp порт
		LD	B,#7F
		OUT	(C),A						; 128 порт
		;
		LD	A,E						; установка конфигурации и режима TURBO
		OUT	(SYS_PORT.RAM),A				; CONFIG_SET
		;
		INC	D
		DEC	D
		; 0 ВХОД В BASIC-128
		JP	Z,0
		; 1 ВХОД В BASIC-48
		LD	A,#10
		OUT	(C),A
		DEC	D
		JP	Z,0
		; 2 ВХОД В TR-DOS
		LD	HL,0
		PUSH	HL
		DEC	D
		JP	Z,#3D29
		; 3 ВХОД В EXPANSION
		;!TODO пока не работает. Page #45, BIOS (ZX_EXP) #E0
		XOR	A
		OUT	(C),A	; 7FFD
		LD	A,#02
		LD	B,#1F
		OUT	(C),A
		DEC	D
		JP	Z,0
		;
		XOR	A
		OUT	(C),A
		LD	A,#30
		LD	B,#7F
		OUT	(C),A
		;!TEST
		LD	A,CNF_PORT.PENT_RESET + CNF_PORT.SCORP_RESET
		OUT	(CNF_PORT.OFF),A
		;
		DEC	D
		; 4 ВХОД В TR-DOS с закрытыми 128-ми портами
		JP	Z,#3D29
		; 5 ВХОД В BASIC-48 с закрытыми 128-ми портами					
		JP	0
 ENT
.Size		EQU	$-RES128_PROG
;-----------------------------------------------------------------------;
;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; 
;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;




/*
;!TODO переделать под переключение на разные спектрумы с запущенными задачами

TASK_SWITCH:
;	*** Сохранить задачу ***
	PUSH IY
	PUSH IX
	PUSH AF
	PUSH BC
	PUSH DE
	PUSH HL

	EXX
	EX AF,AF'

	PUSH AF
	PUSH BC
	PUSH DE
	PUSH HL

	LD A,R
	PUSH AF
	LD A,I
	PUSH AF

	LD A,(HL)
	GET_ZX_TASK_DATA_OFFSET
	LD C,A

	IN A,(SLOT3)
	LD B,A					; 3-я страница текущей задачи
	LD A,SYS_PAGE
	OUT (SLOT3),A

	LD	IX,SYS_PAGE.ZX_TASK.CURRENT	; данные задач
	LD	A,_ZX_TASK_DATA		; смещение данных в таблице задач
	ADD	A,(IX)				; смещение данных текущей задачи
	LD	E,A
	LD	D,0
	ADD	IX,DE				; данные текущей задачи

	LD (IX + _ZX_TASK_DATA.SLOT3_PAGE),B	; сохранить страницу 3
	LD HL,0
	ADD HL,SP
	LD (IX + _ZX_TASK_DATA.SP),L		; сохранить стек задачи
	LD (IX + _ZX_TASK_DATA.SP + 1),H
	SET 0,(IX + _ZX_TASK_DATA.STATE)	; установить флаг сохраненности текущей задачи
	RES 1,(IX + _ZX_TASK_DATA.STATE)	; установить флаг, что задача покинута

	LD	IX,SYS_PAGE.ZX_TASK.CURRENT
	LD	A,_ZX_TASK_DATA		; смещение данных в таблице задач
	ADD	A,C				; смещение данных новой задачи
	LD	E,A
	LD	D,0
	ADD	IX,DE				; данные новой задачи

;	BIT 1,(IX + _ZX_TASK_DATA.STATE)
;	JR NZ,TASK_IN_WORK			; задача в работе ??? неверное завершение
;						; сбрасывать или просто возвращаться

	BIT 0,(IX + _ZX_TASK_DATA.STATE)	; была сохранена/нет
	JR NZ,TASK_SET				; задача существует

;	задачи не было!
	LD IX,SYS_PAGE.ZX_TASK.CURRENT
	LD A,C					; задача
	LD (IX),A				; установить новую задачу текущей

	JP GOTO_SPEC.START_TASK			; запустить новую задачу!
;                          			; и пока пофиг распределение памяти!

TASK_SET:
	IF	FREE_ZX_PAGES
	 LD IY,TASK_RESTORE
	ELSE
	 LD IX,TASK_RESTORE
	ENDIF
	LD A,C
	EXX
	JP INIT_PAGES				; переключить все страницы!

TASK_RESTORE:
	EXX
	LD A,SYS_PAGE
	OUT (SLOT3),A
	LD A,C
	LD IX,SYS_PAGE.ZX_TASK.CURRENT
	LD (IX),A				; установить новую задачу текущей

	; !TEST
	 ;LD	E,A
	 ;LD	D,0
	 ;ADD	IX,DE				; новая задача
	 ;LD	E,16
	 ADD	A,_ZX_TASK_DATA		; смещение данных в таблице задач
	 LD	E,A
	 LD	D,0
	;
	ADD	IX,DE

	LD	L,(IX + _ZX_TASK_DATA.SP)	; вспомнить стек
	LD	H,(IX + _ZX_TASK_DATA.SP + 1)
	LD	SP,HL
	LD	A,(IX + _ZX_TASK_DATA.SLOT3_PAGE); вспомнить третью страницу
	OUT	(SLOT3),A


	POP AF	; восстановить
	LD I,A
	POP AF
	LD R,A
	POP HL
	POP DE
	POP BC
	POP AF
	EX AF,AF'
	EXX
	POP HL
	POP DE
	POP BC
	POP AF
	POP IX
	POP IY
	; вернуться в задачу

NO_TASK:
        POP BC
        JP SW_ROM_1
*/
; 259F - ADRESS BASIC128 - MAIN_MENU