;------------[Begin of ROM]-------------
ROM_START:
	DI 
	HALT 
;---------------------------------------

;--------------[checksum]---------------
	BLOCK 4-$,#FF
Check_Sum:
	DB #FF,#FF,#FF,#FF					; место для контрольной суммы
;---------------------------------------
	BLOCK #10-$,#FF
	RET 
;---------------------------------------

;!TODO прикрутить к ROM.BIOS
;----------------[int]------------------
	BLOCK #38-$,#FF	
; 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
; 	JR	NOINT
; YESINT: PUSH    HL
; 	LD	HL,(SYS_PAGE.INT_ADRESS)
; 	LD	A,H
; 	OR	L
; 	LD	A,(SYS_PAGE.INT_PAGE)
; 	OUT	(C),B
; 	CALL	NZ,EXTINT
;         POP     HL
; NOINT:	POP	AF
; 	POP	BC
	EI 
	RETI 
;---------------------------------------

;----------------[NMI]------------------
	_mInfoBLOCK #66-$,#FF
NMI:	RETN
;---------------------------------------

; ;!FIXIT перенести в ROM.BIOS и сделать
; ; так, чтоб могла правильно прыгать в 
; ; любые слоты и работать с DSS
; ;----------------[int]------------------
; EXTINT:	OR	A
; 	RET	Z

; 	;LD	C,SLOT1
; 	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       ; продолжаем если ненулевой слот
; ; ВОТ ТУТ МОЖНО ВЛУПИТЬ ПРОЦЕДУРУ ДЛЯ ПОДСТАНОВКИ СТРАНИЦЫ В SLOT0 И
; ;  ПЕРЕХОД ПО ПРЕРЫВАНИЮ В ОБРАБОТЧИК ПОЛЬЗОВАТЕЛЯ ЧЕРЕЗ процедуру на стэк, например


; 	IF TEST_INT
; 		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)
; 		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 32                                              	; расстояние от конца процедуры до вершины стека. 
; .switchProcedure.size EQU $-.switchProcedure
; 	ELSE

;         	SCF
;         	RET
; .JPHL:	JP	(HL)
; 	ENDIF
;---------------------------------------

/*



*/

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

;
;----------------------------[ FOR ZX-MODE ]----------------------------;
;!HARDCODE на этот адрес #С0 прыгает в vROM Basic-48 по адресу #3CF0
; можно попробовать переделать этот адрес там
	_mInfoBLOCK #C0-$,#FF ;!TEST 0
        INCLUDE 'ZX/ZX_FUNC.ASM'
        INCLUDE 'ZX/ZX_MENU.ASM'
;-----------------------------------------------------------------------;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
;




;-------------[#1000 SETUP]-------------
        ShowInfo 'Setup block of ROM start', 0                          ; !!!!! test

BLOCK_Setup     EQU $
;
        IF PACKED_MAIN
                BLOCK ROM_MAP.SETUP-$,#FF
 
                DISP COMPILE_ADDR.SETUP

; Depacker version
SETUP_MAIN:
                 LD	HL,DEPACKER.UnpackedEXECaddr; точка входа в распакованном коде
                 PUSH	HL
                 LD	DE,DEPACKER.WorkAddr		; адрес процедуры депакера
                 PUSH	DE

                 LD	HL,DEPACKER.Addr
                 LD	BC,DEPACKER.Length
                 LDIR 

                 LD	HL,DEPACKER.PackedMAIN		; где архив
                 LD	DE,DEPACKER.UnpackAddr		; куда распаковывать
                 RET 

.Depacker        EQU $
                ENT

;-----------------[v]
DEPACK_DATA:
                DISP   DEPACKER.WorkAddr
                MODULE UnPacker
                 INCLUDE 'src/bios/ROM/SETUP/DEHRUST.asm'                ; !TODO сделать на LUA автовыбор декомпрессора и компрессора
PackedMAIN:      INCBIN 'Build/Bin/temp/MAIN.PAK'
                ENDMODULE
                ENT
DEPACK_DATA.length      EQU $-DEPACK_DATA
;-----------------[^]


        ELSE
                DISP COMPILE_ADDR.SETUP
                 ShowInfo 'Setup block DISP start', 1            ; !!!!! test
SETUP_MAIN:      INCLUDE 'src/bios/ROM/SETUP/Main.asm'
                 ShowInfo 'Setup block DISP end', 1              ; !!!!! test
                ENT
        ENDIF


        ShowInfo 'Setup block of ROM end', 0                          ; !!!!! test
BLOCK_Setup.Length      EQU $-BLOCK_Setup
;---------------------------------------
;





;
; !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-$,#FF ;!TEST 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          ; ПРОСТОЙ ВОЗВРАТ
;*************************

	_mInfoBLOCK #3CF0-$,#FF ;!TEST 0
;JMP_48:
;        LD HL,00h
;        JR JP_HL_48
;
;        NOP
;        NOP
;        NOP

;***************************************
	_mInfoBLOCK #3CF8-$,#FF ;!TEST 0
	; no basic-48!
JP_HL_48:
       PUSH HL
SW_ROM:
       PUSH AF
       LD A,ROM.BIOS
       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
	CALL    ToBIOS_FromEXT
	JP	DOS_OFF
;***************************************

;***************************************
;       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 байтов
;
;***************************************
;



;
;---------------------------------------
;	_mInfoBLOCK #3FC6-$,#FF
;!FIXIT переделать ПЗУ трдоса и спектрумов под правильный вызов функций биоса (а не вместо функций 4x функции 0x)
; или можно добавить функции 
; TRDOS_HD_CMD:
;         ; LD      A,C
;         ; OR      #40
;         ; LD      C,A
;         POP	AF
;         SET     6,C
;         RST_to_BIOS
;         JR	RET_TO_TRDOS
;---------------------------------------
;
;--------------[GOTO BIOS]--------------
; call BIOS from EXTENSION
        _mInfoBLOCK #3FD0-$,#FF                                         ; ToBIOS_FromEXT
        PUSH	AF
	LD	A,ROM.BIOS                                              ; set BIOS to slot0
	OUT	(SYS_PORT.ROM),A
	POP	AF
	RET 
;---------------------------------------


;!FIXIT переделать ПЗУ трдоса и спектрумов под правильный вызов функций биоса (а не вместо функций 4x функции 0x)
;--------[ From TR-DOS to HDD part2]--------
	_mInfoBLOCK #3FD8-$,#FF
TRDOS_HD_CMD:
        POP	AF
        SET     6,C
        RST_to_BIOS
        JR	RET_TO_TRDOS
;---------------------------------------


;!FIXIT остатки от тестов Ивана со звуковой картой
;-------------[SND_TEST_RET]-------------
	_mInfoBLOCK #3FE0-$,#FF
; SND_TEST_RET:
;      LD       A,ROM.BIOS
;      OUT      (SYS_PORT.RAM),A
;      ;JP      SOUND_TEST
;      JP       #0000
;---------------------------------------


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


;!FIXIT Можно поправить номера функций при вызовах из TR-DOS и прыгать сразу в BIOS
;-------[ From TR-DOS to API 4x ]-------
	_mInfoBLOCK #3FF0-$,#FF
RET_TO_TRDOS:
        PUSH	AF
	DI 
	LD	A,ROM.BIOS
	OUT	(SYS_PORT.RAM),A
	JR	TRDOS_HD_CMD                                            ; тут не хватило места в 1 байт, чтоб сразу сделать JP
;---------------------------------------



;-----[???????????????????????????]-----
	_mInfoBLOCK #3FF8-$,#FF
	; PUSH	AF
	; LD	A,ROM.BIOS
	; OUT	(SYS_PORT.RAM),A
	; JP	#0000
;---------------------------------------
        _mInfoBLOCK #4000-$,#FF
;=======================================
