;
;**********************************;
;       ACEX Loading program       ;
;**********************************;
 MACRO Conf_loader altera_chip
.START:	DI
	LD BC,#FF*256 + Z84.SYS.Control
	XOR A				; Z84.REG.WaitState_Ctrl - register - waits
	OUT (C),A			; Z84.SYS.Control
	INC C 				;  LD BC,#FFEF
	LD A,4				; Memory waits set to 1
	OUT (C),A			; Z84.SYS.Data 

	DEC C				; Z84.SYS.Control
	DEC A				; LD A,3 - 3-nd register - boundaries
	OUT (C),A			; Z84.REG.Misc_Ctrl	
	INC C				; cs0 enable, cs1 enable, 32-Bit CRC disable, reset output enable, Clock Divide-by-two
	OUT (C),A			; Z84.SYS.Data 

	DEC C				; Z84.SYS.Control
	DEC A				; LD A,2 - Z84.REG..CS_Boundary 2-nd register - boundaries
	OUT (C),A			; Z84.SYS.Data
	INC C
	LD A,#FE			; boundaries	FFFF..F000 - CS1
	OUT (C),A			;		EFFF..0000 - CS0

	JR .LOOP_S1
;**************************************
	BLOCK #38-$,#FF
	JP 0
;**************************************

.LOOP_S1:
	LD HL,#FEF0							; !HARDCODE
	LD DE,.STRING
.LOOP_S:
	LD A,(DE)
	CP (HL)
	JR NZ,.NO_CNF_RAM
	INC E
	INC L
	JR NZ,.LOOP_S						; !!!!! привязка к адресу в HL

; !TODO убрать вейты для кэша?
	LD BC,#FF*256 + Z84.SYS.Control
	LD A,Z84.REG.CS_Boundary								; !HARDCODE
	OUT (C),A							; 0 register - waits
	INC C
	LD A,#F0
	OUT (C),A							; boundaries FFFF..1000 - CS1
;										  0FFF..0000 - CS0
	LD HL,#1000							; !!!!! Load bitstream from Fast-RAM

	JR .NEW_SHM

;**************************************
	BLOCK #66-$,#FF
	JP 0
;**************************************

.NO_CNF_RAM:
	LD HL,#0100							; !!!!! Load bitstream from ROM
.NEW_SHM:
;--------------[conf check]-------------
	LD      A,H							; сохраняем старший адрес начала конфы,
;									  начало конфы должно быть с младшим адресом = 0
	EXX
	 LD     L,0
	 LD     H,A
	 EX     AF,AF'

         ; в HL адрес первого байта конфы
	 LD     DE,.Conf_header
	 LD     B,.Conf_header.length
.conf_header_loop:
	 LD     A,(DE)
	 CP     (HL)
	 JR     NZ,.Conf_Packed
	 INC    DE
	 INC    L
	 DJNZ   .conf_header_loop

	 ;XOR     A
	 JR      .exit_conf_check
.Conf_Packed:
	 SCF
.exit_conf_check:
	 EX     AF,AF'
	EXX
;---------------------------------------

	LD DE,#FE00		;!HARDCODE				; !!!!! Check flag "don't erase fast-ram bitstream" - "IM"
	LD A,(#FEE0)
	CP "I"
	JR NZ,.ONES_CONFIG
	LD A,(#FEE1)
	CP "M"
	JR NZ,.ONES_CONFIG

	DEC D								; multiple config!

.ONES_CONFIG:
	LD	IY,SP2000_Loader_Flag
	;LD	IX,#FFFD
        LD	IX,ACEX.Config_ID.Sp2000

.LOOP1:
	LD A,(HL)

	ex af,AF'
	 ld b,1
	 jr nc,.no_packed_loop
	ex af,AF'

	LD B,A								; save byte to B to check later if we worked with zero
	OR A
	JR NZ,.LOOP1A
	INC HL
	LD C,(HL)							; set counter
	jr .LOOP1A
.no_packed_loop:
	ex af,AF'
.LOOP1A:
;---[Sending bits to Altera]---[v]
	DUP 7
	 LD (DE),A
	 RRCA	
	EDUP
	LD (DE),A
;------------------------------[^]
	INC E

	LD A,B								; was it zero?
	OR A
	JR NZ,.LOOP1E
; it was zero so we need to decrement counter		
	DEC C
	JR NZ,.LOOP1A
; end of the counter reached
.LOOP1E:
	INC     HL
	JR      .LOOP1

.STRING:	DB	ACEX.RELOAD_STRING

.Conf_header:           include 'src/bios/Loader/bitstream_header.inc'
.Conf_header.length     EQU $-.Conf_header

;----------------------;
        BLOCK #FE-$,#FF
; Это, скорее всего, рудимент, тот самый байт описателя конфы,
; который ищет загрузчик для Sp97 по старому адресу #C090.
; Воткнул его в конце загрузчика, может потом пригодится. 
.DEF_SYM: DW ACEX.Config_ID.Sp2000
;------------------------------[Loader end]

	DEFINE		Altera_Chip	altera_chip
        LUA
	 local file_path        =       'Build/ACEX/'
	 local file_ext         =       '.BIN'
	 local altera_ver       =       sj.get_define("Altera_Chip")
	 sj.insert_define("Altera_File", '"' .. file_path .. altera_ver .. file_ext .. '"')
        ENDLUA
	UNDEFINE	Altera_Chip

	INCBIN		Altera_File
	UNDEFINE	Altera_File
 ENDM
;
