
;
;*************************************************************
;
;       EXPANSION VER 3.00	(C) Peters Plus Ltd.
;	EXPANSION VER 3.1	(C) Sprinter Team
;
;*************************************************************

;***************************************
;*********** BEGIN EXPANSION ***********
;***************************************
; Вход по RESET
EXP_START:
        JP GLOBAL_RESET

;---------------------------------------
ROM_NUMBER:
.part1:		DW	MotherBoardID
.part2:		DB	0
;---------------------------------------

;---------------------------------------
; BoardID:
; .start:         WORD    BoardID_start                                   ; BoardID_start
; .end:           WORD    BoardID_end                                     ; BoardID_end
;---------------------------------------

;=======================================
	BLOCK 8-$,0							; first on/off EXPANSION
;программа для вызова BIOS через RST8 из RAM0
EXP_FNS_2_RET:
	PUSH AF
	LD A,ROM.BIOS
	OUT (SYS_PORT.RAM),A
	POP AF
	JR RST_18_1
;=======================================

;=======================================
	BLOCK #10-$,0
RST_10:
;        JR RST10
;=======================================

;=======================================
	BLOCK #18-$,0
;	RST18h - MAIN BIOS functions
	JP EXP_FNS_RST18
RST_18_1:
	CALL EXP_FNS_RST18
.exit:	JR EXP_FNS_2_RET

;=======================================

;=======================================
	BLOCK #20-$,0
RST_20:
;=======================================

;=======================================
	BLOCK #28-$,0
RST_28:
;=======================================

;=======================================
	BLOCK #30-$,0
RST_30:
;=======================================

;=======================================
    BLOCK #38-$,0
; INTERUPT Point
RST38:	IF TEST_INT
	 ;INT:
	 PUSH	BC
	 PUSH	AF

	 LD	C,SLOT3
	 IN	B,(C)
	 LD	A,SYS_PAGE
	 OUT	(C),A

	 LD	A,(SYS_PAGE.INT_ID)
	 CP	#AA
	 JR	Z,YESINT
	 OUT	(C),B
	 JP	NOINT
YESINT:	 PUSH	HL
	 LD	HL,(SYS_PAGE.INT_ADRESS)
	 LD	A,H
	 OR	L
	 LD	A,(SYS_PAGE.INT_PAGE)
	 OUT	(C),B
	 PUSH	DE
	 CALL	NZ,EXTINT
	 POP	DE
	 POP	HL
NOINT:	 POP	AF
	 POP	BC
	 EI	
	 RETI
	ELSE

; 	PUSH	AF
; 1:	DEC	A
; 	JR	NZ,1B
; 	POP	AF
	 EI
	 RETI
	ENDIF
;RST10:
;        CALL_48 10h
;        RET
;=======================================


;=======================================
 IFN TEST_INT
        _mInfoALIGN   #10,0
; any adress < #C0 with mask %xxxx0000
; таблица для Sprinter POST-Tester-a
TABLE_X:
.v0:	DB 00101000b	; "0"
.v1:	DB 10111101b	; "1"
.v2:	DB 00110010b	; "2"
.v3:	DB 00110100b	; "3"
.v4:	DB 10100101b	; "4"
.v5:	DB 01100100b	; "5"
.v6:	DB 01100000b	; "6"
.v7:	DB 00111101b	; "7"
.v8:	DB 00100000b	; "8"
.v9:	DB 00100100b	; "9"
.vA:	DB 00100001b	; "A"
.vB:	DB 11100000b	; "B"
.vC:	DB 01101010b	; "C"
.vD:	DB 10110000b	; "D"
.vE:	DB 01100010b	; "E"
.vF:	DB 01100011b	; "F"
 ENDIF
;=======================================
;

;
;=======================================
 IFN TEST_INT
RESTARTS EQU #FFE0
GLOBAL_RESET:
	DI
	IM 1
	LD HL,RESTARTS
	LD DE,RESTARTS_PROG
	LD B,RESTARTS_PROG.Size
.compare:
	LD A,(DE)
	CP (HL)
	JR NZ,NO_RESTART
	INC HL
	INC DE
	DJNZ .compare
	JP RESTARTS
 ENDIF
;=======================================
	_mInfoBLOCK #66-$,0
NMI_Point:
        ; резерв 3 байта для команды JP	
	;NOP
	;NOP
	;NOP
	RETN
;=======================================

;SET_BIOS_TO_RAM:	; программа работает на адресе 0C000h
;
;	LD SP,#C0C0
;	LD A,#E0
;	LD C,PAGE3
;	IN B,(C)
;	CALL SET_ROM_PAGES+#C000
;	JP NO_SUMX_EQ

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

;BEEP:
;        PUSH HL
;        PUSH DE
;        PUSH BC
;        PUSH AF
;        PUSH IX
;
;        LD HL,BEEP_RET
;        PUSH HL
;        LD HL,SW_ROM
;        PUSH HL
;        LD HL,03B5h
;        PUSH HL
;        LD HL,200
;        LD D,H
;        LD E,5
;        JP SW_ROM
;BEEP_RET:
;
;        POP IX
;        POP AF
;        POP BC
;        POP DE
;        POP HL
;        RET
;=======================================
;	BLOCK MEM_MAP.ID_Version-$,0  ;#C0-$,0

ID_Version:	DW	BIOS_ver_hex
; ID_SPRINTER_FullSize:
; 		DB	ID_SPRINTER.Size
		; запись 1
ID_SPRINTER:	DB	'Firmware v'
.BIOS_ver:	DB	BIOS_ver_string,' '
		IF BETA_BUILD > 0
		 DB	BETA_str_ver
		ELSE
		 DB	'[',BUILD_DATE,']'
		ENDIF
		DB	0
.Record1_Size	EQU	$-ID_SPRINTER
		; запись 2
		DB	'Sprinter',0
		; запись 3			; [x] 24/02/2024
.bitstream_ver:	DB	bitstream_ver_string,0
		DB	0
		;
.Size		EQU $-ID_SPRINTER
.Records_Num	EQU	3

; Check for max length of string
	ASSERT ID_SPRINTER.Record1_Size < SYS_PAGE.ID_FLAG.Size, 'ERROR! ID String is to long!'
;=======================================


;	BLOCK	#FC-$,0
BoardID:
.start:         WORD    BoardID_start                                   ; BoardID_start
.end:           WORD    BoardID_end                                     ; BoardID_end

; ;=======================================
; 	BLOCK #100-$,0


;=======================================
 IF TEST_INT
        _mInfoALIGN   #10,0
; any adress < #C0 with mask %xxxx0000
; таблица для Sprinter POST-Tester-a
TABLE_X:								; таблица для Sprinter POST-Tester-a
.v0:	DB %00101000	; "0"        a
.v1:	DB %10111101	; "1"       ___
.v2:	DB %00110010	; "2"    f | g | b
.v3:	DB %00110100	; "3"      |___|
.v4:	DB %10100101	; "4"    e |   | c
.v5:	DB %01100100	; "5"      |___|
.v6:	DB %01100000	; "6"        d
.v7:	DB %00111101	; "7"
.v8:	DB %00100000	; "8"      a - 7
.v9:	DB %00100100	; "9"      b - 6
.vA:	DB %00100001	; "A"      f - 4
.vB:	DB %11100000	; "B"      g - 3
.vC:	DB %01101010	; "C"      e - 2
.vD:	DB %10110000	; "D"      c - 1
.vE:	DB %01100010	; "E"      d - 0
.vF:	DB %01100011	; "F"
 ENDIF
;=======================================
;

;
;=======================================
 IF TEST_INT
RESTARTS EQU #FFE0
; полный перехват ресета сразу после проливки конфы и CAD.
; закидывается в карту портов, поэтому использовать надо хитро.
GLOBAL_RESET:
	DI
	IM 1
	LD HL,RESTARTS
	LD DE,RESTARTS_PROG
	LD B,RESTARTS_PROG.Size
.compare:
	LD A,(DE)
	CP (HL)
	JR NZ,NO_RESTART
	INC HL
	INC DE
	DJNZ .compare
	JP RESTARTS
 ENDIF
;=======================================
;

;
;-----[перехват RESET не состоялся]-----
NO_RESTART:
; стек ещё не используем!!!
	LD SP,IX							; сохранить значение переданное загрузчиком конфы (если старт после ресета)
        ; инициализация внутренних портов Z84C15 для POST-Tester-а
        LD A,5								; COM port for Printer OUT
        OUT (Z84.SIO.Ch_A.Ctrl),A
        LD A,#62
        OUT (Z84.SIO.Ch_A.Ctrl),A

	LD A,#CF							; BITS I/O
	OUT (Z84.PIO.Port_A.Command),A
	XOR A
	OUT (Z84.PIO.Port_A.Command),A
	OUT (Z84.PIO.Port_A.Data),A					; PRINTER - PORT - all zeros

	; -инициализация системных портов Z84C15-
	LD	BC,#FF*256 + Z84.SYS.Control
	XOR	A	; Z84.REG.WaitState_Ctrl 
	OUT	(C),A	; Z84.SYS.Control
	INC	C	; Z84.REG.WaitState_MemBound 
	OUT	(C),A	; Z84.SYS.Data					; set 0 Waits

	DEC	C
	LD	A,3	; Z84.REG.Misc_Ctrl
	OUT	(C),A	; Z84.SYS.Control
	INC	C
	; no boundary set!
	;XOR	A							; disable CS0, disable CS1
	LD	A,1							; enable CS0, disable CS1
	OUT	(C),A	; Z84.SYS.Data
	JP	POST_TEST.START
;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
 IF TEST_INT
;----------------[int]------------------
EXTINT:	OR	A
	RET	Z

	BIT	7,H
	JR	Z,.L2
	LD	C,SLOT2
	BIT	6,H
	JR	Z,.L1
	LD	C,SLOT3

.L1:	IN	B,(C)
	PUSH	BC
	OUT	(C),A
	CALL	.JPHL
	POP	BC
	OUT	(C),B
	RET 
        ; проверка на нулевой слот
.L2:    BIT     6,H
	LD	C,SLOT1
        JR      NZ,.L1       ; продолжаем если ненулевой слот

	PUSH	HL

	LD	HL,-.stackDepth - .switchProcedure.size + .patch-2
	ADD	HL,SP      
	PUSH	HL  

	LD	HL,-.stackDepth - .switchProcedure.size			; memory stack use!
	ADD	HL,SP							; stack
	PUSH	HL							; адрес программы .readProcedure

	LD	DE,.switchProcedure					; перенести программу на стек
	EX	DE,HL
	LD	BC,.switchProcedure.size
	LDIR     
	RET

; процедура, переносимая на стек для вызова прерывания пользователя из SLOT0
; осторожнее с PUSH, если надо много, то увеличивай .stackDepth
.switchProcedure:
	DEC	DE
	POP	HL
	LD	(HL),E
	INC	HL
	LD	(HL),D

	LD	C,SLOT0
	IN	B,(C)
	POP	HL
	PUSH	BC
	OUT	(C),A

	XOR	A
	OUT	(SYS_PORT.RAM),A

.patch	EQU	$+1-.switchProcedure
	CALL	.JPHL

	DI

	XOR	A
	OUT	(SYS_PORT.ROM),A

	POP	BC
	OUT	(C),B

	RET 
.JPHL:	JP	(HL)
.stackDepth	EQU 64                                              	; расстояние от конца процедуры до вершины стека. 
.switchProcedure.size EQU $-.switchProcedure
 ENDIF
;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==


; ==== POST PROCs =================
	MODULE POST_TEST
START:
; *********************************
; ===== Point 0 =======
; *********************************

	LD A,(TABLE_X.v0)		; высветить "0" ;rdlow-ok
	OUT (Z84.PIO.Port_A.Data),A

; ==== TEST RAM BUS ========

POST_1_RAM_BUS:
	LD BC,0
	LD HL,#C000
	LD DE,#0055
.loop:	LD (HL),E
	INC L
	LD (HL),D
	DEC L
	LD A,(HL)
	XOR E
	OR C
	LD C,A
	INC L
	LD A,(HL)
	XOR D
	OR B
	LD B,A
	DEC L

	DEC E
	INC D
	JR NZ,.loop
	LD A,E
	CPL
	LD E,A
	INC L
	INC L
	BIT 4,L
	JR Z,.loop

	LD A,B
	OR C
	JR Z,POST_1_OK                  ; no errors

; ERROR RAM BUS - CODE 'X'X'X'X...
.error:
	LD HL,TABLE_X
.ERB_2:
	BIT 0,C
	JR Z,.ERB_1

        ; высветить номер ошибочного бита
	LD A,(HL)
	AND %1101'1111                   ; с запятыми
	OUT (Z84.PIO.Port_A.Data),A

        ; пауза
	LD DE,0
.pause:
	DEC DE
	LD A,D
	OR E
	JR NZ,.pause

;	RRC BC
.ERB_1:
	LD A,C
	RRA
	RR B
	RR C

        ; бесконечный цикл
	INC L
	LD A,L
	AND #AF
	LD L,A
	JR .ERB_2

; ************************************************
; ===== Point 1 ==============
; ************************************************
POST_1_OK:

	LD A,(TABLE_X.v1)					; высветить "1" ;rdlow-ok
	OUT (Z84.PIO.Port_A.Data),A

; ===== TEST ADRESS BUS ======
POST_2_ADRESS_BUS:
	LD HL,#C000
	LD DE,#0000
.fill_mem:								; заполнить память адресами
	LD (HL),E
	INC L
	LD (HL),D
	INC HL
	INC DE
	INC DE
	BIT 7,H
	JR NZ,.fill_mem

	DEC HL
	DEC DE
	DEC DE
.check_mem:									; проверить совпадение
	LD A,(HL)
	CP D
	JR NZ,.error
	DEC HL
	LD A,(HL)
	CP E
	JR NZ,.error
	DEC HL
	DEC DE
	DEC DE
	LD A,H
	CP #BF
	JR NZ,.check_mem
	JR POST_2_OK

;	ошибка адреса	     CODE:  'XXXX
.error:
.TSAB_4:
	LD C,D
	LD B,11011111b
	LD IX,.TSAB_3
	JR OUT_C_BYTE						; вывести старший байт с запятой
.TSAB_3:
	LD C,E
	LD B,#FF
	LD IX,.TSAB_4
	JR OUT_C_BYTE						; вывести младший без запятой

; ===== OUT BYTE PROGRAM =======

OUT_C_BYTE:
	LD A,C

	RRCA
	RRCA
	RRCA
	RRCA

	AND #0F
	OR TABLE_X
	LD L,A
	LD H,0
	LD A,(HL)
	AND B
	OUT (Z84.PIO.Port_A.Data),A

	EXX
	LD DE,0
.LOOP_WTT2:
	DEC DE
	LD A,D
	OR E
	JR NZ,.LOOP_WTT2
	LD A,#FF
	OUT (Z84.PIO.Port_A.Data),A
.LOOP_WTT21:
	DEC DE
	LD A,D
	OR E
	JR NZ,.LOOP_WTT21
	EXX

	LD A,C
	AND #0F
	OR TABLE_X
	LD L,A
	LD A,(HL)
	OUT (Z84.PIO.Port_A.Data),A

	EXX
	LD DE,0
.LOOP_WTT3:
	DEC DE
	LD A,D
	OR E
	JR NZ,.LOOP_WTT3
	LD A,#FF
	OUT (Z84.PIO.Port_A.Data),A
.LOOP_WTT31:
	DEC DE
	LD A,D
	OR E
	JR NZ,.LOOP_WTT31
	EXX

	JP (IX)

; ************************************************
; ===== Point 2 =========
; ************************************************

POST_2_OK:
	LD A,(TABLE_X.v2)					;rdlow-ok
	OUT (Z84.PIO.Port_A.Data),A						; вывести "2"

; ===== INIT DCP ========
POST_3_INIT_DCP:
	LD HL,POST_3_OK						; INIT PORTS
	JP DCP_INIT							; процедура инициализации с возвратом в (HL)
; ошибок нет

; ***********************************
; ===== Point 3 =========
; ***********************************

POST_3_OK:
	LD A,(TABLE_X.v3)					; вывести "3" ;rdlow-ok
	OUT (Z84.PIO.Port_A.Data),A

; ===== TEST RAM PAGES ==
	IN A,(SLOT3)
	EX AF,AF'							; запомнить
POST_4_PAGES:
	LD B,0
.loop:	LD A,#FF
	LD I,A
	LD A,B
	OUT (SLOT3),A
	LD A,0
	LD I,A
	IN A,(SLOT3)
	CP B
	JR NZ,.error						; если ошибка переключения Port-а
	DJNZ .loop

	EX AF,AF'
	OUT (SLOT3),A						; восстановить
	JR POST_4_OK

; ***********************************
;	ERROR Port	CODE 'XX
.error:	LD C,B
	LD IX,.error_out_ret
.error_out_ret:
	LD B,11011111b
	JP OUT_C_BYTE

; ***********************************
; ===== Point 4 =========
; ***********************************

POST_4_OK:
	LD A,(TABLE_X.v4)					;rdlow-ok
	OUT (Z84.PIO.Port_A.Data),A				; высветить "4"

;= проверка чистоты шины данных Z84C15 =
POST_5_DATA_BUS:
	LD B,0
.loop:	IN A,(0)
	CP #FF
;	JR NZ,.error						;!!!!!  посмотреть
	DJNZ .loop
	JR POST_5_OK

;	ERROR 	CODE   '_'XX
.error:
	LD C,A
.erb1:
	LD IX,.erbr1
	LD B,%1101'1111
	JP OUT_C_BYTE
.erbr1:
	LD A,%1101'1111
	OUT (Z84.PIO.Port_A.Data),A

	LD DE,0
.LOOP_WTT4:
	DEC DE
	LD A,D
	OR E
	JR NZ,.LOOP_WTT4
	JR .erb1

; **********************************
; ===== Point 5 =========
; **********************************

POST_5_OK:
	LD A,(TABLE_X.v5)					;rdlow-ok
	OUT (Z84.PIO.Port_A.Data),A						; вывести "5"

; **********************************
;	POST завершен
; **********************************
	ENDMODULE

	MODULE SET_CONFIG_ID

	IN A,(SLOT3)
	EX AF,AF'							; SAVE PAGE3

;NO_SUMX_EQ:

	LD A,SYS_PAGE
	OUT (SLOT3),A

;-------------[Save IX:IY]--------------
; Don't use IY before this point if it`s normal booting!!!
	LD	IX,0
	XOR	A
	ADD	IX,SP							; восстановить значение переданное загрузчиком конфы (если старт после ресета)
; В этом месте у нас IX:IY из Loader.asm
; Дотащили до сюда метку от лоадера, пока не используется
	;[x] 31/12/2023 подстраховка от недоутечки памяти
	 LD	D,YH
	 LD	E,YL
	 EX	DE,HL
	 LD	DE,SP2000_Loader_Flag
	 SBC	HL,DE
	 JR	NZ,.no_conf_reload
	 ;
	 LD	D,XH
	 LD	E,XL
	 EX	DE,HL
	 LD	DE,ACEX.Config_ID.Sp2000
	 SBC	HL,DE
	 JR	NZ,.no_conf_reload
	 ;
	 LD	A,#80
.no_conf_reload:
	 LD	R,A
	;

;       !TODO number from loader
        ; LD A,YL
        ; LD L,A
        ; LD A,YH
        ; LD H,A
        ; LD BC,#0107							; !!!!! сравнить с 0107h вынести референсом тут и в loader.asm
        ; AND A								; если равно - прошла перезагрузка
        ; SBC HL,BC
        ;JR Z,set_config                                                ;!TODO активация метки IX:IY из лоадера
	;LD IX,ACEX.Config_ID.Sp97_2
	LD HL,ACEX.Config_ID.Sp2000
set_config:
	LD      (SYS_PAGE.CONFIG_BYTE),HL				; сохранить номер прошивки
	 ;LD (SYS_PAGE.CONFIG_BYTE),IX					; сохранить номер прошивки
	 ;LD HL,(SYS_PAGE.CONFIG_BYTE)					; взять номер прошивки в HL
        ;
        LD      A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
        LD      (SYS_PAGE.CONFIG_DE),A
        
	EX AF,AF'
	OUT (SLOT3),A						        ; Restore SLOT3

	ENDMODULE
;*********************************
;	первая инициализация страниц:
;	SLOT3=0, SLOT2=2, SLOT1=5, SLOT0=0

	XOR A
	OUT (RGADR),A
	OUT (RGMOD),A
	OUT (SLOT3),A
	OUT (SLOT0),A
	LD A,5
	OUT (SLOT1),A
	LD A,2
	OUT (SLOT2),A

;*********************************
; Don't use stack (SP) before this point if it`s normal booting!!!
	LD      SP,#BFFE						; Начало использования стека!!!
	PUSH    HL							; сохранить номер прошивки

	CALL    PORTS_INIT                                              ; инициализировать порты
        XOR     A
	OUT     (BorderColor),A
	CALL    EMM.CheckColdInit                                       ; инициализация памяти
	POP     HL							; конфигурация
	JR      Reset_Handler.start
; *************************************
; Считаем, что вход в SETUP всегда !!!
; *************************************

;	LD A,H
;	CP #FF
;	JR NZ,NO_SETUP_1
;	LD A,L


;	JR NZ,NO_SETUP_2

;[---------------------------------------------------------------------]

	MODULE Reset_Handler
start:	DI
	IN	A,(SLOT3)
	PUSH	AF
;----[перехват soft reset #EE port]-----
Check_EE_Port:
	LD	A,ACEX.RET_PORT
	LD	B,0
	;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
	 ;LD	C,BIOS.SET_PORTS	
	 ;CALL	@ToBIOS_3D13                                             ; переустановить внутр. порт #EE
	 CALL	SET_PORTS
	;
	LD	A,B
	AND	A
	JR	Z,Check_Spec_Page
	;
	OUT	(SLOT3),A						; Set restart page
.After_Hard_Rst:
	LD	HL,(Spec_Page.RET_addr)					; prog address
	LD	A,(Spec_Page.page_0)					; PAGE0
	OUT	(SLOT0),A
	LD	A,(Spec_Page.page_1)					; PAGE1
	OUT	(SLOT1),A
	LD	A,(Spec_Page.page_2)					; PAGE2
	OUT	(SLOT2),A
	LD	A,(Spec_Page.Reload_Version)
	CP	#FF
	JR	Z,.JPHL	; olg logic
	; new logic
.ver_2:	EXX
	 LD	HL,(Spec_Page.Stack_Point)
	 LD	SP,HL
	EXX
	AND	A
	LD	A,#FF
	LD	(Spec_Page.Reload_Version),A
	LD	A,(Spec_Page.page_3)					; PAGE3
	OUT	(SLOT3),A
	JR	Z,.JPHL
	PUSH	HL
	JP	EXP_FNS_2_RET
.JPHL:	JP	(HL)
;
;--[перехват soft/hard reset #41 page]--
Check_Spec_Page:
	LD	A,Spec_Page
	OUT	(SLOT3),A
	; Check for hardreset flag
	LD	A,(Spec_Page.flag_R)
	CP	'R'
	JR	NZ,No_Reset_handlers
	LD	A,(Spec_Page.flag_S)
	CP	'S'
	JR	NZ,No_Reset_handlers
	LD	A,(Spec_Page.flag_T)
	CP	'T'
	JR	NZ,No_Reset_handlers
	;
	XOR	A
	LD	(Spec_Page.flag_R),A
	JR	Check_EE_Port.After_Hard_Rst
	;

;---------------------------------------
No_Reset_handlers:
	; Check ZX ROMS Loaded
	LD	A,(Spec_Page.flag_Z)
	CP	'Z'
	JR	NZ,.Load_ZXROMS
	LD	A,(Spec_Page.flag_X)
	CP	'X'
	JR	NZ,.Load_ZXROMS
	; [x] 31/12/23 подстраховка от недоутечки памяти
	 LD	A,R
	 AND	#80
	 JR	Z,No_Need_To_Load_ZXROMS
.Load_ZXROMS:
	 XOR	A
	 LD	R,A
	;
	; Load ZX ROM's
init_rom_address        EQU #8200                                       ;!HARDCODE
	ld	hl,init_zx_roms
	ld	de,init_rom_address
	ld	bc,init_zx_roms.length
	ldir
	;
	call	init_rom_address
	;
	LD	HL,#C000
	LD	DE,#C001
	LD	BC,#3FFF
	LD	(HL),C
	LDIR								; забить FF-ами
        ; ставим метку если прогрузили ПЗУ спектрума
	DEC	DE		; Spec_Page.flag_X
        LD	A,'X'
        LD	(DE),A
        DEC	DE		; Spec_Page.flag_Z
        LD	A,'Z'
        LD	(DE),A     

	; Заглушка для страницы #41 на всякий пожарный
	LD HL,PROG_NO_ROM
	LD DE,#C000 + Spec_Page.no_zx_rom
	LD BC,PROG_NO_ROM.size
	LDIR
	;
	LD HL,RAM_BIOS_PROG
	LD DE,#C000 + Spec_Page.to_bios
	LD BC,RAM_BIOS_PROG.Length
	LDIR
No_Need_To_Load_ZXROMS:
	POP	AF
	OUT	(SLOT3),A
	;
;-------------------------------------------------------------------------------------------------------------------;
;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты:
;	1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX
;	2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно)
;	3 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04
;	4 - Не грузить ПЗУ спектрума, инитить страницу #41 так, чтоб код в ней подгружал ПЗУ спектрума при обращении
;-------------------------------------------------------------------------------------------------------------------;
	ENDMODULE
;
;**************************************
;
	MODULE Prepare_For_Setup

Set_ALL_Mode:	LD A,#FF
		LD BC,Port_All_Mode
		OUT (C),A

Set_Default_Screen:
		CALL FN_SYNC.INT_DEF					; set default int
		ld a,128+4						; !HARDCODE 
		;ld c,BIOS.FN_SYNC
		;RST_to_BIOS_18						; set default vsync
		CALL FN_SYNC						; set default vsync
Setup_to_RAM:	LD HL,Setup_Starter.Start
		LD DE,COMPILE_ADDR.SETUP_STARTER
		LD BC,Setup_Starter.Length
		LDIR
	; на стек кладётся адрес возврата и дальше тащится всякими костылями, чтоб вернуться назад
		CALL Setup_Starter.Exec					; #C000
PrepareToZX:	; Setup HDD drives for ZX Spectrum mode
		DI
		LD	D,CMOS_CELL.TRDOSmount
		CALL	CMOS_RD
		AND	%1010'1010	; маска для 4-х HDD
		JR	Z,.start_zx
		; find first good partition
		;
		XOR	A
.loop:		CALL	FN_HDD_PART
		JR	NC,.start_zx
		POP	AF
		INC	A
		CP	#10
		JR	C,.loop
		; выход в режим zx spectrum
.start_zx:	JP ZX_SPECTRUM_MODE
	ENDMODULE
;***********************************
;	Инициализация портов
PORTS_INIT:
	; включить TURBO
		LD	A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
		OUT	(SYS_PORT.ROM),A
	; ; RESET to ISA
	; 	LD BC,PORT_ISA
	; 	LD A,#FF
	; 	OUT (C),A
	; .isa_reset:
	; 	DEC A	;!FIXIT может убрать цикл ожидания и запулить 0 в ису после инита клавы?
	; 	JR NZ,.isa_reset
	; 	OUT (C),A
	;
	; Инициализация последовательного порта клавиатуры
		; reg 0
		XOR     A       ;LD A,0
		OUT	(Z84.SIO.Ch_A.Ctrl),A
		; reg 4
		LD	A,4
		OUT	(Z84.SIO.Ch_A.Ctrl),A
		;INC A			;LD A,5
		OUT	(Z84.SIO.Ch_A.Ctrl),A
		; reg 3
		LD	A,3
		OUT	(Z84.SIO.Ch_A.Ctrl),A
		LD A,#C1
		OUT	(Z84.SIO.Ch_A.Ctrl),A
		; reg 5
		LD	A,5
		OUT	(Z84.SIO.Ch_A.Ctrl),A
		LD	A,#62        ;60, 61
		OUT	(Z84.SIO.Ch_A.Ctrl),A
		; reg 1
		LD	A,1
		OUT	(Z84.SIO.Ch_A.Ctrl),A
		DEC	A     		;LD A,0  ; #18 включение прерываний
		OUT	(Z84.SIO.Ch_A.Ctrl),A
.mouse:	; Инициализация мыши	
		; Инициализация таймера мыши
		LD	A,#55
		OUT	(Z84.CTC.Ch_0),A
		LD	A,#2D
		OUT	(Z84.CTC.Ch_0),A
		; reg 0
		XOR     A       ;LD A,0
		OUT	(Z84.SIO.Ch_B.Ctrl),A
		; reg 4
		LD	A,4
		OUT	(Z84.SIO.Ch_B.Ctrl),A
		;LD A,#45
		LD A,#40
		OUT	(Z84.SIO.Ch_B.Ctrl),A
		; reg 3
		LD	A,3
		OUT	(Z84.SIO.Ch_B.Ctrl),A
		LD	A,#41
		OUT	(Z84.SIO.Ch_B.Ctrl),A
		; reg 5
		LD	A,5
		OUT	(Z84.SIO.Ch_B.Ctrl),A
		LD	A,#E0
		OUT	(Z84.SIO.Ch_B.Ctrl),A
		; reg 1
		LD	A,1
		OUT	(Z84.SIO.Ch_B.Ctrl),A
		DEC	A			;LD A,0
		OUT	(Z84.SIO.Ch_B.Ctrl),A
	; Инициализация параллельного порта 1 (принтер)
		; для POST-Tester-а
		LD	A,#CF	; BITS I/O
		OUT	(Z84.PIO.Port_A.Command),A
		XOR	A
		OUT	(Z84.PIO.Port_A.Command),A	; ALL - out
		OUT	(Z84.PIO.Port_A.Data),A	; DATA - all zeros
		; для printer-a
		LD	A,#0F							; OUT
		OUT	(Z84.PIO.Port_A.Command),A
		OUT	(Z84.PIO.Port_A.Command),A
	; Инициализация параллельного порта 2 (INT/DMA ISA)
		LD	BC,Z84.PIO.Port_B.Command	;только через регистр BC, иначе Альтера перехватит
		LD	A,#CF							; BITS I/O
		OUT	(C),A
		LD	A,#3F
		OUT	(C),A
		LD	A,#C0
		OUT	(Z84.PIO.Port_B.Data),A
	; "Заглушение" ковокса и ресет ISA
		; ресет ISA часть 1
		LD	BC,PORT_ISA
		LD	A,#FF
		OUT	(C),A
		; глушим ковокс
		XOR	A
		OUT	(CBL.SYS_PORT),A
		LD	BC,CBL.OUT
		LD	A,#80
.CBL_MUTE:	OUT	(C),A
		DJNZ	.CBL_MUTE
		; ресет ISA часть 2 после небольшой паузы
		LD	BC,PORT_ISA
		XOR	A
		OUT	(C),A
	; Сброс контроллера дисковода
        	; Включить доступ к контроллеру диска (третья конфа)
		LD A,CNF_PORT.CNF_3 + ROM.BIOS
		OUT (SYS_PORT.ROM),A
		OUT (FDC_93.DrvCTRL),A
		push hl
		pop hl
		LD A,#3C							;!HARDCODE команда для ВГ93
		OUT (FDC_93.DrvCTRL),A
		push hl
		pop hl
		XOR A
		OUT (FDC_93.Command),A
		; Выключить доступ к контроллеру диска
		LD A,CNF_PORT.CNF_0 + ROM.BIOS
		OUT (SYS_PORT.ROM),A
		; set HDD1/not-HDD2
		LD A,IDE.Chanel.Primary
		OUT (IDE.Chanel.Set),A
		LD BC,#7FFD
		LD A,#10
		OUT (C),A							; BASIC_48 mode
		LD B,#1F
		LD A,01
		OUT (C),A							; RAM-0 mode !!!
	; очистка буферов клавиатуры и мыши в SIO
		CALL	.clean_kbd_buf
		JR	.clean_mouse_buf
.clean_kbd_buf:	; Clearing the keyboard buffer
		IN	A,(Z84.SIO.Ch_A.Ctrl)
		RRCA
		RET	NC
		IN	A,(Z84.SIO.Ch_A.Data)
		JR	.clean_kbd_buf
.clean_mouse_buf:; Clearing the mouse buffer
		IN	A,(Z84.SIO.Ch_B.Ctrl)
		RRCA
		RET	NC
		IN	A,(Z84.SIO.Ch_B.Data)
		JR	.clean_mouse_buf
;---------------------------------------

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


;-----------------------------------------------------------------------;
;	paths from project DIR

	        INCLUDE 'FUNC_4x.ASM'
	        INCLUDE 'FUNC_CMOS.ASM'
                INCLUDE 'BIOS_FUNC.ASM'
	        INCLUDE 'FUNC_SERVICE.asm'

	        INCLUDE 'FLEX.asm'
	; INCLUDE 'EXP_SCR.ASZ'
	        INCLUDE 'FUNC_PIC.ASM'
	        INCLUDE 'FUNC_RAM_ROM_DRV.ASM'
	        INCLUDE 'FUNC_SYS.ASM'
	        INCLUDE 'FUNC_FOR_TRDOS.ASM'
                INCLUDE 'FUNC_5x.asm'
                INCLUDE 'FUNC_LOW_PRINT.ASM'
;-----------------------------------------------------------------------;


;-----------------------------------------------------------------------;
;               ####################################
;               #::::::::::::::::::::::::::::::::::#\
;               #::::: Место данных для DCP :::::::#\
;               #::::::::::::::::::::::::::::::::::#\
;               ####################################\
;                \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DCP_DATA:       INCLUDE 'DCP.ASM'
;-----------------------------------------------------------------------;

;-----------------------------------------------------------------------;
;	
;               #-2kb-##############################
;               #::::::::::::::::::::::::::::::::::#\
;               #:::: Здесь место для IBM-ZG ::::::#\
;               #::::::::::::::::::::::::::::::::::#\
;               ####################################\
;                \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ZG_ADDRESS:      INCLUDE  'FONT.ASM'
;-----------------------------------------------------------------------;


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

;
;------------------------[copy zx-roms to zx-pages]---------------------;
; SLOT0 - ROM 8, sys_port - on.
; RAM SLOT0 - page 0
; для режима zx spectrum
; ВЫПОЛНЯЕТСЯ ИЗ ОЗУ
; !HARDCODE номера страниц для эмулятора ПЗУ
init_zx_roms:
	DISP Reset_Handler.init_rom_address

	IN      A,(SLOT3)
	EX	AF,AF'

	DI
	LD      A,SYS_PORT.EXTENSION
	OUT     (SYS_PORT.ROM),A 
        INC     A		;!HARDCODE LD A,2
        LD      B,3		; zx-rom number of pages
	;
.loop:	EXX
	;
	out     (ROM.SLOT0),a
	or	%0100'0000	; !HARDCODE номера страниц для эмулятора ПЗУ
	out	(SLOT3),a
	and	%1011'1111	; !HARDCODE номера страниц для эмулятора ПЗУ
		
	LD	HL,0
	LD	DE,#C000
	LD	BC,#4000
	LDIR

        INC     A
	EXX
	DJNZ    .loop

	xor     a
	out     (ROM.SLOT0),a
	OUT     (SYS_PORT.ROM),A  
	EX	AF,AF'
	out     (SLOT3),a

;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
	LD	A,ACEX.vROM.BASIC_128					; ROM-ID - BASIC 128
	LD	B,#42							;!HARDCODE page
	CALL	SET_PORTS
	;

	LD	A,ACEX.vROM.BASIC_48					; ROM-ID - BASIC 48
	LD	B,#43							;!HARDCODE page
	CALL	SET_PORTS
	;

	LD	A,ACEX.vROM.TR_DOS					; ROM-ID - TR-DOS
	LD	B,#44							;!HARDCODE page
	CALL	SET_PORTS
	;

	; эти страницы пока не используются
	 LD	A,ACEX.vROM.BIOS					; ROM-ID - BIOS
	 ;LD	B,#45							;!HARDCODE page
	 LD	B,#41
	 CALL	SET_PORTS
	 ;
	 LD	A,ACEX.vROM.BIOS_3					; ROM-ID - BIOS-1
	 ;LD	B,#46							;!HARDCODE page
	 LD	B,#41
	 CALL	SET_PORTS
	 ;
	 LD	A,ACEX.vROM.BIOS_4					; ROM-ID - BIOS-2
	 ;LD	B,#47							;!HARDCODE page
	 LD	B,#41
	 JP	SET_PORTS
	; можно задействовать ещё 4 страницы на порты #E4..#E7

	ENT
.length	EQU $-init_zx_roms
;-----------------------------------------------------------------------;
;


;-----------------------------------------------------------------------;
;!TODO задействовать
GOTO_SPEC:
	IN A,(SLOT3)
	EX AF,AF'
	LD A,SYS_PAGE
	OUT (SLOT3),A
	LD A,B
	LD (SYS_PAGE.CONFIG_DE+1),A
	EX AF,AF'
	OUT (SLOT3),A

;NO_SETUP_2:
;	CP #FC
;	JR Z,SPECTRUM_0	; Конфигурация AY

;NO_SETUP_1:
;!TODO сделать активацию винта для параметра из Setup
ZX_SPECTRUM_MODE:
	LD A,#FE							; !HARDCODE сделать через метку ACC-off Spectrum-MODE
	LD BC,Port_All_Mode
	OUT (C),A

;SND_TEST_RET:
	LD SP,#BFFF

	CALL FN_SYNC.INT_PENT
	CALL SET_PAL_ZX

	LD	E,0
	CALL	LP_SET_32
	;
	LD	E,0
	LD	HL,#5104
	CALL	LP_SET_32.X

	; ????? можно использовать когда-нибудь как-нибудь
	; LD D,#35
	; CALL CMOS_RD
	; BIT 0,A
	; PUSH AF
	; CALL Z,SPRINTER_1
	; POP AF
	; PUSH AF
	; CALL NZ,AY8910
	; POP AF

SPECTRUM_0:
	XOR A								; задача 0, режим 256 килобайт
SPECTRUM_TASK:
	LD IX,BASIC_128
	JP INIT_PAGES                                                   ; инициализация номеров страниц режима спектрума

;start_basic:
BASIC_128:
	LD SP,#C000
	LD HL,RES128_PROG
	LD DE,ZX_VARS.PRINTER_BUFFER                                    ; запуск программы на BASIC-е.
	LD BC,LEN_RES128
	LDIR
	DI
	JP ZX_VARS.PRINTER_BUFFER
;-----------------------------------------------------------------------;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
;




;
;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМЫЕ В ОЗУ ] >$< >$< >$< >$< >$< >$< ;

;--------[ Программа, размещаемая с #5B00 для запуска Spectrum ]--------;
RES128_PROG:
 DISP ZX_VARS.PRINTER_BUFFER                                            ;#5B00
	LD A,ROM.BIOS
	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)
	XOR A
	LD (SYS_PAGE.CONFIG_DE+1),A
	OUT (C),B

	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
	 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
LEN_RES128	EQU $-RES128_PROG
;-----------------------------------------------------------------------;

;-------------------------------[ #FFE0 ]-------------------------------;
;	программа, которая будучи размещенной в #40 странице,
;	с адреса RESTARTS, перехватывает RESET
RESTARTS_PROG:							        ; !TODO LDConf перехват ресета на любой конфе после hardreset
	LD HL,RESTARTS						        
	LD B,16								
.loop:
	LD (HL),0							
	INC HL								
	DJNZ .loop							
	NOP								
	NOP								
.Size	EQU $-RESTARTS_PROG
	; LD A,1							
	; OUT (SLOT3),A						
;-----------------------------------------------------------------------;

;----------------------------[Setup Starter]----------------------------;
	MODULE	Setup_Starter
;	программа, размещаемая по адресу 0C000h
;	для запуска Setup
Start:
  DISP	COMPILE_ADDR.SETUP_STARTER
Exec:
	LD A,CNF_PORT.CNF_0 + ROM.EXTENSION
	OUT (SYS_PORT.ROM),A

	LD HL,ROM_MAP.SETUP
	LD DE,MEM_MAP.SETUP
	LD BC,BLOCK_Setup.Length
	LDIR

	LD A,CNF_PORT.CNF_0 + ROM.BIOS
	OUT (SYS_PORT.ROM),A

;-----------[Check SPACE]
	LD A,#FE							; !HARDCODE
	LD BC,Port_All_Mode					        ; keyboard int & acc off
	OUT (C),A
	LD A,high ZXKeys.Line_7
	IN A,(ZXKeys)
	CPL
	AND 1
; в регистре A передаётся нажата ли клавиша SPACE.
; потом проверяется в main.asm [space_check]
; и если нажата, то происходит игнор параметра
; "Быстрый старт ПЗУ" во время перезагрузки
	EX AF,AF'

	LD A,#FF							; !HARDCODE
	OUT (C),A							; keyboard int & acc on, zx_screen & original waits off (for conf >= 3.05)

	EX AF,AF'
;----------------------[]
        DI 
        POP	HL                                                      ; адрес возврата в EXP из SETUP
        LD	SP,#8000                                                ;!HARDCODE 
        PUSH	HL
        PUSH	AF
        JP SETUP_MAIN
  ENT
Length		EQU $-Setup_Starter.Start
	ENDMODULE
;-----------------------------------------------------------------------;

;---------------------[ ЗАГЛУШКИ ДЛЯ #41 СТРАНИЦЫ]----------------------;
;-------------[RST 08]
RAM_BIOS_PROG:								; for CALL BIOS in #41 page
 DISP	Spec_Page.to_bios
	PUSH AF
	LD A,ROM.BIOS
	OUT (SYS_PORT.ROM),A
	POP AF
	RET
 ENT
.Length EQU $-RAM_BIOS_PROG
;-------------------[]
; 
;-------------[RST 38]
PROG_NO_ROM:
 DISP   Spec_Page.no_zx_rom
	DI
	;
	LD	A,#FF
	OUT	(SLOT3),A
	OUT	(SLOT2),A
	OUT	(SLOT1),A
	;
	LD	SP,#BF00
	;
	LD      E,0
	LD      BC,BIOS.LP_OPEN_S.TXT_80x32_Default
	RST     ToBIOS
	;
	LD      DE,0
	LD      HL,#2050
	LD      C,BIOS.LP_CLS_WIN
	RST     ToBIOS
	; set scr-2
	LD      A,1
	OUT     (SCREEN_SWITCH),A
	;
	LD      HL,MESSAGE_NR
	LD      DE,#A000
	LD      BC,MESSAGE_NR.size
	LD      A,C
	LDIR
	;
	LD      HL,#A000
	LD      D,0							; delimiter
	LD      E,COLORS.CGA.FLASH + COLORS.CGA.INC.RED
	LD      B,A
	LD      C,BIOS.LP_PRINT_LINE3
	RST     ToBIOS
	;
.loop:	DI
        HALT
        JR .loop
	;
MESSAGE_NR:     DZ " Spectrum ROM not installed.  Use spectrum.exe  Press Ctrl+Alt+Del or RESET"
.size           EQU $-MESSAGE_NR
 ENT
PROG_NO_ROM.size EQU $-PROG_NO_ROM
;-------------------[]
;-----------------------------------------------------------------------;
;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; 
;



;
; !FIXIT сделать эти фиксированные адреса отдельным файлом и с IF/ELSE и подключать их потом куда надо.
;
;?????  посмотреть
;----------------------------------------------------------------------;
;        BLOCK #3CC0-$,255
	; no-magics!
;MAGIC_1:								; ЗАГЛУШКА ДЛЯ MAGIC
;        PUSH AF
;        LD A,ROM.EXT
;        OUT (SYS_PORT.OFF),A
;        POP AF
;        JP MAGIC_1
;MAGIC_3:
;        PUSH AF
;        LD A,ROM.EXT
;        OUT (SYS_PORT.OFF),A
;        POP AF
;        RETN
;MAGIC_2:
;;       CALL MG_BEGIN
;        JR MAGIC_3

;*************************
	_mInfoBLOCK #3CE0-$,0
SW_ROM_1:
        LD      HL,#259F        ;!HARDCODE Show Main Menu in BASIC-128
        PUSH    HL
        LD      HL,#5B00        ;!HARDCODE
        LD      A,(HL)
        CP      #F5             ; #F5 - опкод 'PUSH AF'. Проверяется то ли в #5B00
        JR      Z,JP_HL_48      ; ВОЗВРАТ К МЕНЮ BASIC128
        POP     HL
        JR      SW_ROM          ; ПРОСТОЙ ВОЗВРАТ
;*************************

;        BLOCK #3CF0-$,0
;JMP_48:
;        LD HL,00h
;        JR JP_HL_48
;
;        NOP
;        NOP
;        NOP

;***************************************
	_mInfoBLOCK #3CF8-$,0
	; no basic-48!
JP_HL_48:	;!FIXIT assert with ROM
       PUSH HL
SW_ROM:		;!FIXIT assert with ROM
       PUSH AF
       LD A,ROM.BIOS            ;!FIXIT неправильное название константы
       OUT (SYS_PORT.RAM),A
       POP AF
       RET
;***************************************
;----------------------------------------------------------------------;
;

;!TODO спектрумовские утилиты
;----------------------------------------------------------------------;
        ; _mInfoBLOCK #3CFA-$,#FF
        ; LD      A,0                     ;!HARDCODE
        ; OUT     (SYS_PORT.OFF),A
        ; POP     AF
;----------------------------------------------------------------------;
;


;
;----------------------------------------------------------------------;
	_mInfoBLOCK #3D00-$,#FF
DOS_ON:	NOP
	RET
;***************************************

;***************************************
;       BLOCK #3D02-$,FF
;  !TODO можно оприходовать тут 17 байтов
;
;***************************************

;***************************************
	_mInfoBLOCK #3D13-$,#FF
	NOP
	JP      ToBIOS_18
;***************************************

;***************************************
;       BLOCK #3D17-$,FF
;  !TODO можно оприходовать тут 233 байта
;
;***************************************

;***************************************
	_mInfoBLOCK #3E00-$,#FF
DOS_OFF:
	PUSH	AF
	LD	A,R
	DI
	PUSH	AF
	PUSH	BC
	;
	LD	BC,(#5BFF)	; !HARDCODE
	LD	A,#C9		; Opcode RET
	LD	(#5BFF),A	; !HARDCODE
	CALL	#5BFF		; !HARDCODE
	LD	(#5BFF),BC	; !HARDCODE
	;
	POP	BC
	POP	AF
	JP	PO,.no_EI
	EI
.no_EI:	POP	AF
	RET
;***************************************


;***************************************
;       BLOCK #3E16-$,FF
;  !TODO можно оприходовать тут 10 байтов
;
;***************************************


////////////////////////////////////////////////////////////////////////
;------[  ;  !TODO что- то связанное с переменными LIB_TABLE  ;  ]------
;	_mInfoBLOCK #3E20-$,#FF
; [x]
FN_LIB:				
	SCF
	RET
//
//	IN A,(SLOT3)
//	LD B,A
//	LD A,SYS_PAGE
//	OUT (SLOT3),A
//	PUSH HL
//	LD L,C          ; дешефратор API изменился и теперь в C не то, что тут ожидается. Ожидается #A0..AF
//	LD H,#C1
//	LD A,(HL)
//	POP HL
//	AND A
//	SCF
//	JR Z,FN_LIB_RET
//
//	OUT (SLOT3),A
//	LD (#C0FE),SP
//	LD SP,#C0F0
//	PUSH BC
//	CALL #C100	;	!HARDCODE
//	POP BC
//	LD SP,(#C0FE)
//	; LD A,B
//	; OUT (SLOT3),A
//	; RET
//
//FN_LIB_RET:
//	LD A,B
//	OUT (SLOT3),A
//        ;SCF
//	RET
////////////////////////////////////////////////////////////////////////
;----------------------------------------------------------------------;
;



;!TODO скомпоновать и допаять
;----------------------------------------------------------------------;
; вход A - byte
; B - speed_parameter
FN_KBD_OUT:
	AND A
	LD E,A
	LD D,#FF
	JP PE,kbd_parity					        ; установка паритета PE/PO ???
	LD D,#FE
kbd_parity:
	AND A								; первый бит - start-bit - 0
	RL E
	RL D								; в DE - 11 бит для передачи
	LD C,11

kbd_loop:
	LD A,5
	OUT (Z84.SIO.Ch_A.Ctrl),A
	LD A,#60
	BIT 0,E
	JR NZ,no_inv
	XOR 2								; данные
no_inv:
	LD L,A
	OUT (Z84.SIO.Ch_A.Ctrl),A					; выставить данные

	LD A,5
	OUT (Z84.SIO.Ch_A.Ctrl),A
	LD A,L
	OR #80								; синхроимпульс
	OUT (Z84.SIO.Ch_A.Ctrl),A					; импульс синхро
	LD A,B								; speed_par
kbd_loop1:
	PUSH HL
	POP HL
	DEC A
	JR NZ,kbd_loop1
	LD A,5
	OUT (Z84.SIO.Ch_A.Ctrl),A
	LD A,L
	OUT (Z84.SIO.Ch_A.Ctrl),A					; снять импульс синхро

	LD A,B								; speed_par
kbd_loop2:
	PUSH HL
	POP HL
	DEC A
	JR NZ,kbd_loop2
	RR D
	RR E
	DEC C
	JR NZ,kbd_loop

	LD A,5
	OUT (Z84.SIO.Ch_A.Ctrl),A
	LD A,#60
	OUT (Z84.SIO.Ch_A.Ctrl),A                                       ; закончить передачу
	AND A
	RET
;----------------------------------------------------------------------;
;





;#######################################################################;
;#######################################################################;
;-----------------------------------------------------------------------;
; ROM-Disk pages                                                        ; [x] активирован ROM-DISK 
        _mInfoALIGN 256,#FF
;	BLOCK #3F00-$,#FF
ROM_DISK.Pages.Number:
	BYTE    ROM_DISK.Pages.Size                                     ; число страниц  
; у страниц выставлен bit4 для корректной подстановки
;(подробнее в sp2000.inc - Порт управления страницами ПЗУ)
ROM_DISK.Pages:                                                         ; страницы ROM-Disk
        ABYTE   #10       #05,#06,#07,#09,#0A,#0B                       ; 98304 bytes
.Size   EQU     $-ROM_DISK.Pages
;-----------------------------------------------------------------------;
;#######################################################################;
;

;---------[Return to EXTENSION]---------
        _mInfoBLOCK #3FD0-$,#FF                                         ; ToBIOS_FromEXT
; #3FD0
; Для вызова функций биоса из страницы 0 ПЗУ (Extension)
RET_to_EXTENSION:
	PUSH AF
	LD A,ROM.EXTENSION
	OUT (SYS_PORT.ROM),A
	POP AF
	RST ToBIOS_18
	JP RET_to_EXTENSION

; !TODO Free 6 bytes
;---------------------------------------
;


;---------------[ Free ]----------------
;
	_mInfoBLOCK #3FE0-$,#FF
; !TODO Free 8 bytes and entry point
;SOUND_TEST:
;	LD A,ROM.EXPANSION
;	OUT (SYS_PORT.ON),A
;	JP SND_TEST_RET
;---------------------------------------
;

; [x] new portal
;------------[HDD_5x portal]------------        
; точка входа/выхода для функций 5х из EXP
	_mInfoBLOCK #3FE8-$,#FF	
EXP_HDD:
	PUSH AF
	LD A,ROM.EXTENSION
	OUT (SYS_PORT.ROM),A
	POP AF
	RET
;---------------------------------------
;


;
;---------------[ Free ]----------------
	_mInfoBLOCK #3FF0-$,#FF
; !TODO Free 8 bytes and entry point
;---------------------------------------
;


;
;----[ From TR-DOS to API #80..#FF ]-----
	_mInfoBLOCK #3FF8-$,#FF
; Точка входа/выхода для TR-DOS
EXP_FNS_RET:
	PUSH AF
	LD A,ROM.BIOS
	OUT (SYS_PORT.RAM),A                                            ; Точка входа/выхода из/в TR-DOS при вызове функций BIOS #80..#FF
	JP EXP_FNS
;---------------------------------------
;

;
	_mInfoBLOCK #4000-$,#FF
;=======================================================================