;----------------------------------------------------------------------;
; Получение адресов портов и данных для восстановления
; Вход:	 A - номер окна проецирования
; Выход: B - данные, C - адрес порта окна
EMM.GetBanksPorts:
        INC     A
        LD      B,A
        DJNZ    .slot1
	LD      C,SLOT0
	IN      B,(C)
	RET             ;45t
.slot1: DJNZ    .slot2
	LD      C,SLOT1
	IN      B,(C)
	RET             ;58t
.slot2: DJNZ    .slot3
	LD      C,SLOT2
	IN      B,(C)
	RET             ;71t
.slot3: DJNZ    .error        
	LD      C,SLOT3
	IN      B,(C)
	RET             ;84t
.error:	SCF
	RET             ;74t
;----------------------------------------------------------------------;

;----------------------------------------------------------------------;
; HL - буфер
; !FIXIT SYS_PAGE.CONFIG_BYTE уже не то показывает, и вообще всю бы переделать, поправить в доке, как минимум
FN_VERSION:
	PUSH HL
	EX DE,HL
	; LD HL,ID_SPRINTER_FullSize
	
	; LD	B,0
	; LD	C,(HL)
	; INC	HL
	LD	HL,ID_SPRINTER
	LD	BC,ID_SPRINTER.Size
	LDIR
	;
	POP HL
	LD DE,(ID_Version) ;rdlow-ok
	;
	IN A,(SLOT2)
	EX AF,AF'
	LD A,SYS_PAGE
	OUT (SLOT2),A
	LD BC,(SYS_PAGE.CONFIG_BYTE-#4000)                              ; Version PLD	; !TODO через структуру для переменных биоса
	EX AF,AF'
	OUT (SLOT2),A
	LD A,ID_SPRINTER.Records_Num					; Число полей
	AND A
	RET
;----------------------------------------------------------------------;

;----------------------------------------------------------------------;
; [ ] 28/01/24 добавлена подфункция выдачи инфы про Acex
FN_CRIPT:
	DJNZ	.Acex_ver
	;
	; BoardID_start old address     #312A
	; BoardID_end old address       #312D
.board_id:
	LD	HL,(ROM_NUMBER.part1) ;rdlow-ok
	LD	A,(ROM_NUMBER.part2)  ;rdlow-ok
	LD	BC,(BoardID.start)    ;rdlow-ok
	LD	DE,(BoardID.end)      ;rdlow-ok
	AND	A
	RET
	;
.error:	LD	A,BIOS.Error.InvalidSubFunction
	SCF
	RET
	;
.Acex_ver:
	DJNZ	.error
	PUSH	HL
	LD	A,R
        DI
	PUSH	AF
	;
	LD	HL,-.stackDepth - .readProcedure.size			; memory stack use!
	ADD	HL,SP
	PUSH	HL							; адрес программы .readProcedure
	LD	DE,.readProcedure					; перенести программу на стек
	EX	DE,HL
	LD	BC,.readProcedure.size
	LDIR								; программа на стеке
	LD	A,+(12 xor %0000'1000)					; !HARDCODE bitstream page in rom
	RET
.return:;
	POP	AF
	JP	PO,.no_EI
	EI
.no_EI: CALL	.choose_chip
	POP	DE
	LD	BC,.chip_ID_TXT.RecordSize
	LDIR
.cnf+1:	LD	DE,bitstream_ver_hex
	AND	A
	RET
	;
.choose_chip:
	XOR	A
	LD	HL, - ACEX.Chip_ID.K30
	ADC	HL,DE
	LD	HL,.chip_ID_TXT.K30
	RET	Z
	OR	A	; снять CF
	INC	A
	LD	HL, - ACEX.Chip_ID.K50
	ADC	HL,DE
	LD	HL,.chip_ID_TXT.K50
	RET	Z
	POP	HL	; баланс стека
.error_unknownChip:
	SCF
	POP	HL
	LD	A,BIOS.Error.UnknownDevice
	RET
	;
; процедура, переносимая на стек для чтения Acex ID
; осторожнее с PUSH, если надо много, то увеличивай .stackDepth
.readProcedure:
	OUT	(ROM.SLOT0),A						; ROM_PAGE
	LD	DE,(#100 + 3)						; !HARDCODE здесь читается Acex ID
	XOR	A
	OUT	(ROM.SLOT0),A
	OUT	(SYS_PORT.ROM),A
	JP	.return
.stackDepth		EQU 2						; расстояние от конца процедуры до вершины стека. 
.readProcedure.size	EQU $-.readProcedure
	;
.chip_ID_TXT:
.chip_ID_TXT.K30:	DZ "K30"
.chip_ID_TXT.RecordSize	EQU $-.chip_ID_TXT
.chip_ID_TXT.K50	DZ "K50"
;.chip_ID_TXT.K100	DZ "K100"
.chip_ID_TXT.Size	EQU $-.chip_ID_TXT
;----------------------------------------------------------------------;

;----------------------------------------------------------------------;
;EMM_FN7
EMM.CheckColdInit:
	IN	A,(SLOT2)
	EX	AF,AF'
	LD	A,SYS_PAGE
	OUT	(SLOT2),A

	LD	HL,SYS_PAGE.ID_FLAG - #4000
	; LD	DE,ID_SPRINTER_FullSize
	; LD	A,(DE)
	; DEC	A
	; INC	DE
	; LD	B,A
	LD	B,ID_SPRINTER.Record1_Size
	LD	DE,ID_SPRINTER
.loop:	LD	A,(DE)
	CP	(HL)
	JR	NZ,INIT_SYS_ALL
	INC	HL
	INC	DE
	DJNZ	.loop

	; Disable user IM address in SYS_PAGE
	 XOR	A
	 LD	(SYS_PAGE.INT_ID - #4000),A
	;

	EX	AF,AF'
	OUT	(SLOT2),A
	RET


;MSDOS_COLD_VARS:
EMM.FullInit:
	DI
	IN	A,(SLOT2)
	EX	AF,AF'
	LD	A,SYS_PAGE
	OUT	(SLOT2),A
INIT_SYS_ALL:
	DI
	; LD	HL,ID_SPRINTER_FullSize
        ; LD	DE,SYS_PAGE.ID_FLAG - #4000
	; LD	C,(HL)
	; LD	B,0
	; INC	HL
	LD	HL,ID_SPRINTER
	LD	DE,SYS_PAGE.ID_FLAG - #4000
	LD	BC,ID_SPRINTER.Record1_Size
	LDIR
        
	; Disable user IM address in SYS_PAGE
	 XOR	A
	 LD	(SYS_PAGE.INT_ID - #4000),A
	;

;!TODO что за переменные?
	LD	HL,SYS_PAGE.DISK_TYPE-#4000
	LD	(HL),0							;!HARDCODE
	INC	HL
	LD	(HL),1                                                  ;!HARDCODE
	INC	HL
	LD	(HL),#40                                                ;!HARDCODE HDD
	INC	HL
	LD	(HL),3                                                  ;!HARDCODE
	INC	HL
	LD	(HL),0							; SYS_PAGE.COPY_SLOT0
	INC	HL
	LD	(HL),5							; SYS_PAGE.COPY_SLOT1
	INC	HL
	LD	(HL),2							; SYS_PAGE.COPY_SLOT2
	INC	HL
	LD	(HL),0							; SYS_PAGE.COPY_SLOT3

	LD	A,9
	LD	(SYS_PAGE.MSD_SECS-#4000),A
	XOR	A
	LD	(SYS_PAGE.DS_1440-#4000),A

	LD	HL,SYS_PAGE.RAMD_KEYS-#4000
	LD	DE,SYS_PAGE.RAMD_KEYS+1-#4000
	LD	BC,SYS_PAGE.RAMD_KEYS.NUM-1
	LD	(HL),0
	LDIR
	; [x] 4/11/23
	 LD	HL,SYS_PAGE.Sp_RAMD_KEYS-#4000
	 LD	DE,SYS_PAGE.Sp_RAMD_KEYS+1-#4000
	 LD	BC,SYS_PAGE.Sp_RAMD_KEYS.NUM-1
	 LD	(HL),0
	 LDIR
	;
	LD	DE,ZG_ADDRESS						; адрес знакогенератора
	LD	(SYS_PAGE.WIN_ZG-#4000),DE
;
;-----------[new code start]------------; !!!!!  посмотреть-причесать
INIT_VSyncAndWaits:
	LD D,CMOS_CELL.ScreenSET
	CALL CMOS_RD
	ld d,a
	jr nc,.cmos_OK
; если нет CMOS, то стандартные настройки
	ld a,3
	ld (SYS_PAGE.VSyncAndWaits-#4000),A	
	jr z,INIT_CONFIG_ALL.setDefaultINT

.cmos_OK:
	and high CMOS_CELL.ScreenSET.Mask.Sinc
	and #40
	ld a,3                                                          ; 320 lines & no waits
	jr z,.setVSyncAndWaits
	dec a                                                           ; 312 lines & no waits

.setVSyncAndWaits:
	ld (SYS_PAGE.VSyncAndWaits-#4000),A

INIT_CONFIG_ALL:
	ld a,d
	and high CMOS_CELL.ScreenSET.Mask.Int
	jr z,.setDefaultINT                                             ; set default int

	xor high CMOS_CELL.ScreenSET.Mask.Int
	LD HL,SCREEN_TABLES.ORIGINAL                                    ; set original int
	jr z,.setINT

	and #10
	LD HL,SCREEN_TABLES.SCORPION                                    ; set scorpion int
	jr z,.setINT	

.setDefaultINT:
	LD HL,SCREEN_TABLES.PENTAGON                                    ; set pentagon int
.setINT:
	LD (SYS_PAGE.CONFIG_ALL-#4000),HL
;------------[new code end]-------------
;
	LD DE,CNF_PORT.CNF_0 + ROM.BIOS
	LD (SYS_PAGE.CONFIG_DE-#4000),DE

	LD HL,SYS_PAGE.TASK_DATA-#4000          ; убить все задачи
	LD DE,SYS_PAGE.TASK_DATA+1-#4000
	LD BC,#FF
	LD (HL),0
	LDIR

	EX AF,AF'
	OUT (SLOT2),A

	CALL EMM.InitMem
         ;**************************************************************
         ; Чтение последних 256 байтов ПЗУ в служебную страницу
         ;  зачем-то, типа, флешер мог там сохранить данные CMOS.
         ;READ_ROM_PAGE_X:
	 ;      IN A,(SLOT3)
	 ;      PUSH AF
	 ;      LD A,SYS_PAGE
	 ;      OUT (SLOT3),A
	 ;      CALL READ_ROM_PAGE_X	; READ CMOS-DATA
	 ;      POP AF
	 ;      OUT (SLOT3),A
         ;**************************************************************
	RET
;----------------------------------------------------------------------;

;----------------------------------------------------------------------;
FN_TURBO:
	CP 2
	JR Z,.TURBO_SWITCH
	CP 3
	JR Z,.TURBO_SWITCH
	CP #12
	JR Z,.SET_FDD_720
	CP #13
	JR Z,.SET_FDD_1440
	SCF
	RET

;!FIXIT меняем плотность - меняем в системной странице инфу об этом
.SET_FDD_720:
	LD A,FDD_Density.SET_720
	OUT (FDD_Density),A
	AND A
	RET
;!FIXIT меняем плотность - меняем в системной странице инфу об этом
.SET_FDD_1440:
	LD A,FDD_Density.SET_1440
	OUT (FDD_Density),A
	AND A
	RET

.TURBO_SWITCH:
	LD C,A
	IN A,(SLOT3)
	LD B,A
	LD A,SYS_PAGE
	OUT (SLOT3),A
        ;!TEST
	 ;LD DE,(SYS_PAGE.CONFIG_DE)
	 ;LD A,E
	 LD A,(SYS_PAGE.CONFIG_DE)
	;
        AND #FC                                                         ; !HARDCODE
	OR C
        ;!TEST
	 ;LD E,A
	 ;LD (SYS_PAGE.CONFIG_DE),DE
	 LD (SYS_PAGE.CONFIG_DE),A
         AND 3        
        ;
	OUT (SYS_PORT.ROM),A
	LD A,B
	OUT (SLOT3),A
	AND A
	RET
;----------------------------------------------------------------------;


;----------------------------------------------------------------------;
;!TODO
;FN_GET_SYS_VAR:
; Вход:  HL - номер системной переменной
; Выход: HL - значение системной переменной
;	RET
;----------------------------------------------------------------------;


;!TODO скомпоновать
;----------------------------------------------------------------------;
FN_SEND_BYTE:
	LD E,A								; сохранить байт
	CALL SEND_HALF_BYTE					        ; передать полубайт из Е
	RET C								; возврат по ошибке
	LD A,E								; сдвинуть байт на 4 бита
	RRCA
	RRCA
	RRCA
	RRCA
	LD E,A
SEND_HALF_BYTE:							        ; передать половину байта _E_!!
	LD A,E
	OR #F0								; установить старшие биты LPT дата
	OUT (Z84.PIO.Port_A.Data),A
	LD BC,0								; счетчик тайм-аута
WAIT_SENT_1:
	IN A,(KEMPSTON.PC_Link)				                ; проверить бит 4 на 1 при готовности PC
	BIT 4,A
	JR NZ,CONTINUE_SENT
	DEC BC
	LD A,B
	OR C
	JR NZ,WAIT_SENT_1
	XOR A
	SCF								; тайм-аут
	RET
CONTINUE_SENT:							        ; PC - готов
	LD A,E
	AND #0F								; сбросить старшие биты LPT -
	OUT (Z84.PIO.Port_A.Data),A
        ; счетчик тайм-аута
	LD BC,0								
        ;
WAIT_SENT_2:
	IN A,(KEMPSTON.PC_Link)				                ; проверить бит 4 на 0 - сообщение от PC
	BIT 4,A
	JR Z,CONTINUE_SENT2
	DEC BC
	LD A,B
	OR C
	JR NZ,WAIT_SENT_2
	LD A,E
	OR #F0								; установить старшие биты LPT дата
	OUT (Z84.PIO.Port_A.Data),A
	XOR A
	SCF								; тайм-аут
	RET
CONTINUE_SENT2:							        ; полубайт передан
	LD A,E
	OR #F0								; установить старшие биты LPT дата
	OUT (Z84.PIO.Port_A.Data),A
	XOR A
	RET
;----------------------------------------------------------------------;

;----------------------------------------------------------------------;
FN_RESEIVE_B:							        ; принять байт в A
	CALL RESEIVE_POLU_BYTE				                ; принять полубайт
	RET C								; возврат по ошибке
	RLCA
	RLCA
	RLCA
	RLCA
	AND #F0
	LD E,A
	CALL RESEIVE_POLU_BYTE				                ; второй
	RET C
	AND 0Fh
	OR E
	RET								; байт принят
RESEIVE_POLU_BYTE:						        ; принять половину байта в Е
	LD A,#F0							; установить старшие биты LPT дата
	OUT (Z84.PIO.Port_A.Data),A
	LD BC,0								; счетчик тайм-аута
WAIT_RES_1:
	IN A,(KEMPSTON.PC_Link)						; проверить бит 4 на 1 при готовности PC
	BIT 4,A
	JR NZ,CONTINUE_RES
	DEC BC
	LD A,B
	OR C
	JR NZ,WAIT_RES_1
	XOR A
	SCF								; тайм-аут
	RET
CONTINUE_RES:							        ; PC - готов, ждать 0
	XOR A								; сбросить старшие биты LPT - ждем полубайт
	OUT (Z84.PIO.Port_A.Data),A

	LD BC,0								; счетчик тайм-аута

WAIT_RES_2:
	IN A,(KEMPSTON.PC_Link)						; проверить бит 4 на 0 - сообщение от PC
	BIT 4,A
	JR Z,CONTINUE_RES2
	DEC BC
	LD A,B
	OR C
	JR NZ,WAIT_RES_2
	LD A,#F0							; установить старшие биты LPT дата
	OUT (Z84.PIO.Port_A.Data),A
	SCF
	RET								; ошибка
CONTINUE_RES2:							        ; полубайт выставлен
LOOP_EQ:								; прочитать еще раз, что бы совпало
	AND #0F
	LD B,A
	IN A,(KEMPSTON.PC_Link)
	AND #0F
	CP B
	JR NZ,LOOP_EQ

	OR #F0								; установить старшие биты LPT дата в 1 - принято
	OUT (Z84.PIO.Port_A.Data),A
	RET
;----------------------------------------------------------------------;
;

;----------------------------------------------------------------------;
;**********************************
;!!!!! глянуть
; START_DI:
;         PUSH AF
;         LD A,R
;         LD A,#80
;         JP PE,XX_DI2
;         XOR A
; XX_DI2: LD R,A
;         DI
;         POP AF
;         RET
;
; END_DI: PUSH AF
;         LD A,R
;         AND #80
;         JR Z,XX_DI3
;         EI
;         POP AF	; PE
;         RET
; XX_DI3: DI
;         POP AF	; PO
;         RET
;**********************************


;----------------------------------------------------------------------;?????
;DE - куда - страница открыта!
;BC - сколько
;HL - буфер
;
;       PUSH BC
;       LD H,D
;       LD L,E
;       ADD HL,BC
;       JR C,CUT
;       LD HL,BUFER
;       LDIR
;       POP BC
;       RET
;CUT:
;       PUSH HL
;       LD A,L
;       LD L,C
;       LD C,A
;       LD A,H
;       LD H,B
;       LD B,A
;
;       AND A
;	SBC HL,BC
;	LD B,H
;	LD C,L
;	LD HL,BUFER
;	LDIR
;	CALL NEXT_BANK
;	POP BC
;	LD A,B
;	OR C
;	JR Z,LAB
;	LDIR
;LAB:	POP BC
;	RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;

