/*
;------------[ПЕРЕДЕЛАТЬ!!!]------------
оптимизировать выделяемые блоки памяти
проверка на ошибки при вызове DSS и BIOS
;---------------------------------------
*/


;
;---------------------------[Defines section]---------------------------
;  IFNDEF HARDWARE : IFNDEF ZXMAK2 : IFNDEF MAME : DEFINE HARDWARE 1 : ENDIF : ENDIF : ENDIF

;  IFDEF HARDWARE
; 	DEFINE NORM_ACC			1
; 	DEFINE NORM_FastRAM		1
;  ENDIF
;  IFDEF ZXMAK2
; 	DEFINE NORM_ACC			0
; 	DEFINE NORM_FastRAM		0
;  ENDIF
;  IFDEF MAME
; 	DEFINE NORM_ACC			1
; 	DEFINE NORM_FastRAM		1
;  ENDIF

 IFNDEF YesSound : DEFINE YesSound 1 : ENDIF

 DEFINE EXE_HEADER 1
; DEFINE NEED_LOADER 1
	
;  IFDEF HARDWARE
;  	DISPLAY "[]------[ Compilation target: Sprinter 2000 ]------[]"
;  ENDIF
;  IFDEF ZXMAK2
;  	DISPLAY "[]------[ Compilation target: emulator ZXMAK2 ]------[]"
;  ENDIF
;  IFDEF MAME
;  	DISPLAY "[]------[ Compilation target: emulator MAME ]------[]"
;  ENDIF

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


;
;-----------------------[Compilation parameters]------------------------
	DEVICE ZXSPECTRUM4096												; модель с 4 метрами памяти
	MMU 2 e, 0															; нулевая страница в банку 2 и проверка на границы
	OUTPUT './Build/DOOM2/doom2.exe'				
;-----------------------------------------------------------------------
;

;
;-------------------------------[Includes]------------------------------
	include 'Shared_includes/constants/SP2000.inc'
	include 'Shared_includes/constants/dss_equ.inc'
	include 'Shared_includes/constants/BIOS_equ.inc'	
	include 'Shared_includes/macroses/accelerator.z80'
	include 'Shared_includes/macroses/macros.z80'
;-----------------------------------------------------------------------
;

;
;-------------------------[Standart EQU section]------------------------
org_addr                        EQU     #8000+CLP_Buffer
code_addr                       EQU     BEGIN
stack_point                     EQU     #BFFF
program_start		        EQU     BEGIN
;-----------------------------------------------------------------------
;


TABLE_X				EQU #A000			; таблица коэфициентов высоты
TABLE_X_SIZE                    EQU #0800			; её размер???
MONSTR_TABLE                    EQU #A800			; таблица монстров
MONSTR_TABLE_SIZE               EQU #1800			; её размер???
TABLE_W				EQU #2000			; текущие карты для TRACE


; Code start section
;[]-------------------------------------------------------------------[]

 IF EXE_HEADER
	 include 'Shared_Includes/constants/EXE_Header.z80'
	 ORG org_addr
 ELSE
	 ORG org_addr - CLP_Buffer
 ENDIF

BEGIN:	DI

	LD (CMD_Line),IX					; сохранить указатель на параметры запуска
CMD_Line+1:
	LD HL,#8080
/*
; Доделать???!!!!
	LD C,(HL)
	LD B,0
	INC BC
	INC BC
	INC BC	
	ADD	HL,BC							; указатель на полный путь до файла запуска
	ld c,Dss.ChDir						; переход в каталог DOOM2 на всякий случай
	rst ToDSS
	DI
*/
	; IN A,(SLOT3)
	; LD C,BIOS.SPRINTER_ALL
	; RST ToBIOS


;--------[загрузка ресурсов игры]-------
;  выполнено в виде костыльной заглушки
	call Load_Resources

 IFDEF NEED_LOADER
Loader_length EQU $-BEGIN
 ELSE
Loader_length EQU 0
 ENDIF
;---------------------------------------


;-----[Инициализация Covox-Blaster]-----
; IF YesSound
	ld bc,CBL.SYS_PORT
	ld a,CBL.Blaster + CBL.Mono + CBL.is8bit + CBL.Int_off + CBL.KHz_16old
	out (c),a
;
;-----------[заглушить звук]------------
	LD A,#FF			; !FIXIT разве так надо глушить? Не рудименты Sp97?
1:	CALL CLEAR_COVOX_X
	DEC A
	CP #80
	JR NZ,1B
;---------------------------------------
;
; ENDIF
;---------------------------------------


	IN A,(SLOT3)
	PUSH AF

	ld a,(RAMBlkIDs)
	ld bc,BIOS.GetMemPage
	rst ToBIOS
	;di
	ld (PalitrePage),a

	ld a,(RAMBlkIDs+3)
	ld bc,BIOS.GetMemPage
	rst ToBIOS
	;di
	ld (D2_FRAM_page),a
	;DI

	CALL CLEAR_GRAF_SCR

	; IN A,(SLOT3)
	; PUSH AF
	; LD A,3
	; OUT (SLOT3),A
	; LD HL,PALITRE
	; LD DE,#C000
	; LD BC,#0400
	; LDIR
	; POP AF
	; OUT (SLOT3),A

	CALL SET_PAL

;----[открыть порты масштабирования]----
; один внутренний порт масштабирования маппится на диаппазон #XX00
; внешних портов. Write, Dos off, CNF 0.
	LD	A,1
	LD	HL, %0000'0100'0000'0000	; значение
	LD	DE, %1111'1110'0110'1111	; маска
	LD	BC,ACEX.SCALE*256 + BIOS.DCP_CONFIG
	RST	ToBIOS

	; IN A,(SLOT3)
	; EX AF,AF'
	; LD A,DCP_PAGE
	; OUT (SLOT3),A
	; LD A,ACEX.SCALE
	; LD (#C400),A						; порт #XX00 Dos off
	; LD (#C410),A						; порт #XX00 Dos off
	; LD (#C480),A						; порт #XX00 Dos off
	; LD (#C490),A						; порт #XX00 Dos off
	; LD (#C500),A						; порт #XX00 Dos off
	; LD (#C510),A						; порт #XX00 Dos off
	; LD (#C580),A						; порт #XX00 Dos off
	; LD (#C590),A						; порт #XX00 Dos off
	; EX AF,AF'
	; OUT (SLOT3),A
	; Активация Акселя масштабирования, обратно только через ресет
        LD BC,#100						; C - масштаб 1:1
        OUT (C),C
;-----------------------------------------------------------------------


;-----------------------------------------------------------------------
	CALL MAIN
;-----------------------------------------------------------------------



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

; 				E)eeeeee  X)    xx   I)iiii  T)tttttt
; 				E)         X)  xx      I)       T)
; 				E)eeeee     X)xx       I)       T)
; 				E)          X)xx       I)       T)
; 				E)         X)  xx      I)       T)
; 				E)eeeeee  X)    xx   I)iiii     T)


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

;----[LP_OPEN_S]------------------------
; Открытие стандартных окон
	LD HL,#5104
	LD E,0								; win_flag - флаги окна:
;											bit 0 определяет страницу режима, которая будет
;											открыта после исполнения функции
	LD B,4								; 4 - спектрумовское окно, HL - положение окна
	LD C,BIOS.LP_OPEN_S
	RST ToBIOS
;---------------------------------------

SP_SAVE1:
	LD SP,0
	EXX
	POP HL
	EXX
	POP IX
	POP IY
	EI
	RET
;=======================================
;

;
;-----------[EXIT Procedure]------------;  Сделать!!!
RETURN_POINT:							; точка возврата - полный сброс
	DI
	LD A,#10
	LD BC,#1FFD
	OUT (C),A
	LD A,RESET_PAGE
	OUT (SLOT3),A
	LD (#C000),HL
HALT_L:
	;DI
	HALT
	JR HALT_L
;---------------------------------------


SET_PAL_x:
	IN A,(FastRAM.OFF)
	CALL SET_PAL
	IN A,(FastRAM.ON)
	RET

SET_PAL:
;----[PIC_SET_PAL Установка палитры]----
; Значение регистров на входе:
; C=0A4h
; HL - данные палитры:
;  список цветов по четыре байта B,G,R,Y
; E - номер начального цвета
; D - количество устанавливаемых цветов
; B - маска при установке палитры.
;	Для нормального режима должнa
;	быть 0FFh
; A - номер палитры 0..15;
;	 от 8 до 15 - резервные

	IN A,(SLOT3)
	PUSH AF
PalitrePage+1:
	LD A,#FF
	OUT (SLOT3),A

	LD HL,#C000
	LD DE,0
	LD A,0
	LD B,#FF
	LD C,BIOS.PIC_SET_PAL				; установка палитры
	RST ToBIOS
	;DI

	LD HL,#C000
	LD DE,0
	LD A,1
	LD B,#FF
	LD C,BIOS.PIC_SET_PAL				; установка палитры
	RST ToBIOS
	;DI

	POP AF
	OUT (SLOT3),A
	RET

;	
;---[очистка экрана стеком и акселем]---
CLEAR_GRAF_SCR:
	IN A,(SLOT3)
	PUSH AF

	LD (SPSave2),SP

	LD A,#50
	OUT (SLOT3),A

	XOR A
	OUT (PORT_Y),A

	LD SP,#C040 + 640
	LD B,640/4

;!!!!!!!!!!![оптимизировать]!!!!!!!!!!!!
LOOP_CLS:
	ACC_SetBlockSize
		LD E,0
	LD D,E
	ACC_FillScreenOneByte
		PUSH DE
		PUSH DE
	ACC_Off

	DJNZ LOOP_CLS
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SPSave2+1:
	LD SP,0
	POP AF
	OUT (SLOT3),A
	RET


;----------------------------------------------------------------------;
;		FOR ZX-ROM in SLOT0
; _2L_PRIKOL:
; 	LD A,7
; 	OUT (BorderColor),A
; 	XOR A
; 	OUT (PORT_Y),A

; 	LD A,2
; 	LD HL,#4000
; 	LD B,27
; 	CALL	.pause_loop

; 	LD A,0
; 	LD HL#4000
; 	LD B,27
; 	CALL	.pause_loop

; 	CALL #0D6B	; CLS
; 	LD HL,.TXT_SP
; 	CALL PRINT_LOOP
; 	RET

; .pause_loop:
; 	LD (HL),A
; 	INC L
; 	PUSH DE
; 	POP DE
; 	JR NZ,.pause_loop
; 	INC H
; 	DJNZ .pause_loop
; 	;
; 	LD HL,#8000
; .loop:	PUSH HL
; 	POP HL
; 	DEC HL
; 	LD A,H
; 	OR L
; 	JR NZ,.loop
; 	RET

; .PRINT_LOOP:
; 	LD A,(HL)
; 	INC HL
; 	CP #FF
; 	RET Z
; 	RST #10
; 	JR .PRINT_LOOP

; .TXT_SP: DB #7F," 1982 Sinclair Research Ltd.",#FF
;----------------------------------------------------------------------;
;

FLAG:			DB 0
;SAVE_PORT_Y:		DB 0
;
;
CLEAR_COVOX:
	LD A,#80

CLEAR_COVOX_X:
	LD BC,CBL.COVOX_OUT

; IF YesSound
CLEAR_CBL:
	OUT (C),A
	DJNZ CLEAR_CBL
; ENDIF
	RET
;
;

CLEAR_SP_PAL:
	IN A,(SLOT3)
	PUSH AF

	LD A,#50
	OUT (SLOT3),A

	LD B,61

LOOP_PAL_ALL:
	PUSH BC

	LD BC,PORT_Y

LOOP_PAL_C:
	OUT (C),B
;
PAL_RESES_ADR+1:
	LD HL,#C3F0
;
	LD D,16

LOOP_PAL_D:
	LD A,(HL)
	RRA
	RRA
	RRA
	RRA
	RRA
	AND 7
	INC A
	LD E,A
	LD A,(HL)
	SUB E
	JR NC,NO_Z
	XOR A
NO_Z:	LD (HL),A
	INC L
	DEC D
	JR NZ,LOOP_PAL_D

	CALL SOUND1
	DJNZ LOOP_PAL_C

	CALL PAUSE_INT

	POP BC
	LD A,(LAST_KEY)
	AND A
	JR NZ,NO_PAL_EXE
	DJNZ LOOP_PAL_ALL

NO_PAL_EXE:
	POP AF
	OUT (SLOT3),A
	RET
;
;
;
MAIN:	CALL INIT_TABLE
	RET C

	;IN A,(PORT_Y)
	;LD (SAVE_PORT_Y),A
	LD A,#C0
	OUT (PORT_Y),A
	CALL RECALC_MAP

;----!!!!!!!!!!!!!!!!!!!!!!!!!----------

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


	;LD A,(SAVE_PORT_Y)
	;OUT (PORT_Y),A

	RET C								; нужно ли???!!!

	XOR A
	LD (LAST_KEY),A
	OUT (BorderColor),A

	CALL CLEAR_SP_PAL

; !FIXIT переделать логику под новый биос?
;---[установка синхры, очистка экрана]--
	LD A,2								; режим Pentagon - 320 строк в экране
	LD C,BIOS.FN_SYNC
	RST ToBIOS
;---------------------------------------

;------[Открытие стандартных окон]------
; регистр E - флаги окна
; бит 0 - какую страницу режима включать
; после исполнения функции
; бит 4 - на какой странице режима
; открывать окно
; HL - место на экране по знакоместам
; (копия в IX+2,3), в новых версиях
; биоса значение HL не существенно
	LD HL,#4000
	LD E,1
	LD B,8								; графическое окно 0, HL - положение окна
	LD C,BIOS.LP_OPEN_S
	RST ToBIOS

	LD HL,#5000
	LD E,1
	LD B,9								; графическое окно 1, HL - положение окна
	LD C,BIOS.LP_OPEN_S
	RST ToBIOS
/*
	LD	A,Dss.SetVMod.grf320x256
	LD	BC,Dss.SetVMod.Screen_0
	RST	ToDSS
	LD	A,Dss.SetVMod.grf320x256
	LD	BC,Dss.SetVMod.Screen_1
	RST	ToDSS
;графическое окно 0
PIC_320X256_1:
	DB 40,32,0,0,32,0,08,0
	DB 40,32,0,0,96,0,48,0

	DB 40,32,0,0,32,0,00,0		;4
	DB 40,32,0,0,96,0,40,0		;6

;графическое окно 1
PIC_320X256_2:

; 320x256. графическое, 0-й экран
TAB_320x256_0

; 320x256. графическое, 1-й экран
TAB_320x256_1
*/
;---------------------------------------

	LD A,1
	OUT (SCREEN_SWITCH),A

;----[переброс части кода в FastRAM]----
	IN A,(SLOT3)
	PUSH AF
D2_FRAM_page+1:
	LD A,#FF
	OUT (SLOT3),A

 IF YesSound
;----[]
; Запрашиваем страницы для музла и
;  каталога, сохраняем их № в коде
;	0 страница блока - CatPage
;	1 страница блока - SndPage
;	
;			ДОДЕЛАТЬ!!!
; надо потом нормально выделять и
;  освобождать память, а не вот это всё
;
	 ld b,2
	 ld c,Dss.GetMem
	 rst ToDSS
	 ;
	 LD (CatPage),a
	 ld b,1
	 ld c,BIOS.GetMemPage
	 rst ToBIOS
	 ;
	 ld (DOOM2_SndPage),a
	 ld (D2_FRAM_SndPage+#B000),a
	 ;di
;----[]
 ENDIF
	IN A,(FastRAM.ON)
	
	LD HL,#C000
	LD DE,#1000
	LD BC,D2_fram_END-TRACE
	LDIR

;  IFN NORM_syncPORT
; 	IM 2								; вот теперь можно включать
;  ENDIF	

	POP AF
	OUT (SLOT3),A
;---------------------------------------
;
	LD HL,#C3E0
	LD (PAL_RESES_ADR),HL
;	
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; Странное место. Можно же сразу в коде
;  было это сделать и не перекидывать
	LD HL,PAUSE_SNDC
	LD DE,PAUSE_SND
	LD BC,3
	LDIR
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

	CALL CLEAR_COVOX

	IN A,(FastRAM.OFF)
	CALL INIT_HDD_WORK

	IN A,(FastRAM.ON)
SOUND_SWITCH:
 IF YesSound
	 LD HL,NAMES+1
	 LD A,(HL)
	 INC A
	 LD (HL),A
	 DEC HL
	 CP (HL)
	 JR NZ,SOUND_S1
	 LD A,0
	 INC HL
	 LD (HL),A
SOUND_S1:
	 RLCA
	 RLCA
	 RLCA
	 RLCA
	 ;
	 ADD	A,low (NAMES+2)
	 LD	E,A
	 LD	A,0
	 RLA
	 ADD	A,high (NAMES+2)
	 LD	D,A
	 ;ADD A,#80
	 ;LD E,A
	 ;LD D,#80
	 CALL SET_SND_FILE
	 CALL INIT_SOUND
 ENDIF

MORE_PIC:
	LD HL,#0100
	LD (X_SPEED),HL
	LD HL,#0102
	LD (Y_SPEED),HL
	LD HL,#0200
	LD (A_SPEED),HL
HELP_2:
	CALL CLEAR_SP_PAL
	LD A,6
	CALL SET_PICTURE
	CALL SCR_SWITCH
	LD A,6
	CALL PIC_ALL_MD

	LD A,11
	CALL PIC_ALL_MD

	LD A,16
	CALL PIC_ALL_MD

MORE_PIC_LK:
	LD A,21
	CALL SET_PICTURE
	CALL SCR_SWITCH
	CALL SET_PAL_x

	LD B,240

PAUS_START:
	DEC B
	JR Z,DM_LOOP
	CALL PAUSE_INT
	LD A,(LAST_KEY)
	AND A
	JR Z,PAUS_START

	LD B,0
	LD C,A
	XOR A
	LD (LAST_KEY),A
	LD A,C
	CP 118
	JR Z,MORE_PIC
	CP 22
	JR Z,DM_LOOP
	CP 38
	JR Z,SOUND_SWITCH

	CP 9
	JP Z,RETURN_POINT
	CP 5
	JP Z,HELP_

	JR PAUS_START
HELP_:
	CALL FIRE_X
	LD HL,#0300
	LD (X_SPEED),HL
	LD HL,#0382
	LD (Y_SPEED),HL
	LD HL,#0500
	LD (A_SPEED),HL
	JR DM_LOOP

;SWITCH_XX_W:
;	LD HL,XX_W1
;	LD DE,XX_W2
;	LD B,3
;SWITCH_XX_W1:
;	LD A,(DE)
;	LD C,(HL)
;	LD (HL),A
;	LD A,C
;	LD (DE),A
;	DJNZ SWITCH_XX_W1
;	RET

PIC_ALL_MD:
	CALL SET_PICTURE
	CALL SCR_SWITCH
	CALL SET_PAL_x
	CALL CLEAR_SP_PAL
	RET

DM_LOOP:
	LD A,(LAST_KEY)
	CP 118
	JP Z,MORE_PIC_LK
;	CP 37
;	CALL Z,SWITCH_XX_W
;	CALL CRAZY_WALL

	DI
;	CALL SET_PAL_x
;	CALL FIRE_S

 IF YesSound
	 CALL SOUND
	 ; ELSE
	 ; CALL YesSoundZero
 ENDIF

	CALL CALC_NEW_PLACE
	CALL MAP_PLACE
	CALL MAKE_MAP						; соорудить относительную карту

 IF YesSound
	 CALL SOUND
	 ; ELSE
	 ; CALL YesSoundZero
 ENDIF
 
	CALL PRECALC_PLACE

 IF YesSound
	 CALL SOUND
	 ; ELSE
	 ; CALL YesSoundZero
 ENDIF

	CALL TRACE							; прорисовка!

 IF YesSound
	 CALL SOUND
	 ; ELSE
	 ; CALL YesSoundZero
 ENDIF
 
;	CALL MONSTR_OUT
	CALL MONSTR_ALL

 IF YesSound
	 CALL SOUND
	 ; ELSE
	 ; CALL YesSoundZero
 ENDIF

	CALL WEAPON_OUT

 IF YesSound
	 CALL SOUND
	 ; ELSE
	 ; CALL YesSoundZero
 ENDIF

	CALL MAP_OUT
	CALL CLEAR_Z_BUFER

LOOP_SCR:
; IF NORM_syncPORT
	 IN A,(SCR_SyncPort)
	 BIT 5,A
	 JR NZ,CONT_WORK

		IF YesSound
		 CALL SOUND
		 ; ELSE
		 ; CALL YesSoundZero
		ENDIF

	 JR LOOP_SCR

;  ELSE
; 	 EI
; 	 HALT
;  ENDIF	

CONT_WORK:
	CALL SCR_SWITCH

 IF YesSound
	 CALL SOUND
	 ; ELSE
	 ; CALL YesSoundZero
 ENDIF

	JP DM_LOOP

SCR_SWITCH:
	IN A,(SCREEN_SWITCH)
	AND 1
	XOR 1
	OUT (SCREEN_SWITCH),A

	LD DE,#C040
	JR Z,SET_1
	LD DE,#C180
SET_1:
	LD (SCREEN_1),DE
	RET

PAUSE_INT:
	CALL SOUND1

; IF NORM_syncPORT
	 IN A,(SCR_SyncPort)
	 BIT 5,A
	 JR NZ,PAUSE_INT

PAUSE_INT1:
	 CALL SOUND1
	 IN A,(SCR_SyncPort)
	 BIT 5,A
	 RET NZ
	 JR PAUSE_INT1
;  ELSE
; 	 EI
; 	 HALT
; 	 ret
;  ENDIF
PAUSE_SNDC:
	JP SOUND

PAUSE_SND:
SOUND1:
	RET
	NOP
	NOP
	RET
	
;
MONSTR_DAT:
M_PAGE			EQU $-MONSTR_DAT
				DB 0					; страница с общими данными монстра (картинки)
;										  признак конца таблицы монстров
M_ADR			EQU $-MONSTR_DAT
				DW #4000				; адрес в странице
;			
M_HIGH			EQU $-MONSTR_DAT
				DB #40					; вертикальное положение
;			
M_HOR			EQU $-MONSTR_DAT
				DW 160					; горизонтальное положение
;			
M_VAR2			EQU $-MONSTR_DAT
				DW 0008					; счетчик переключений
;			
M_XADD			EQU $-MONSTR_DAT
				DW #0100					; x-add параметры
				DB #40,#40				; ширина-высота ???
;
M_X				EQU $-MONSTR_DAT
				DW #0700				; координата X
;			
M_Y				EQU $-MONSTR_DAT
				DW #0700				; координата Y
;			
M_VX			EQU $-MONSTR_DAT
				DW 0000					; скорость движения по X
;			
M_VY			EQU $-MONSTR_DAT
				DW 0000					; скорость движения по Y
;			
M_TYPE			EQU $-MONSTR_DAT
				DW 0000					; тип монстра уничтожаемый, неуничтожаемый
;										  исчезающий при ударе о стенку, не исчезающий
;										  исчезающий при соприкосновении с игроком,
;										  не исчезающий....

M_VAR			EQU $-MONSTR_DAT
				DB 0					; Переменные конкретного монстра
;			
M_VAR3			EQU $-MONSTR_DAT
				DB 0
; Переменная монстра бит 0,1 - деление по ширине
; bit 2 - переключать по старшему
; bit 3 -
; bit 4
; bit 5
; bit 6 - показывать один цикл
; bit 7 - не выводить
;			
M_VAR4		EQU $-MONSTR_DAT
				DB 0					; Переключение монстра ADD параметр

MONSTR_D_LEN	EQU $-MONSTR_DAT		;следующий монстр
				DB 0					; - отсутствует
;
;****************************************
;	IX+0	- страница стенки
;	IX+1,2	- адрес стенки в странице
;	IX+3	- положение по вертикали - задает масштаб
;	IX+4,5	- положение по горизонтали

;	IX+6,7 - reserved
;	IX+8,9 - X-add-parameter (коэфициент масштабирования по Y)
;	IX+10 - реальная ширина стенки ???
;	IX+11 - реальная высота стенки ???

WALL_DATS:
				DB 0
				DW #4000
				DB #40
				DW #00A0				; 160
				DB 0,0

MONSTR_DATS:
				DB 0,0,0,0,0,0,0,0
;
; **************************************
;
;CAT_PAGE		EQU  15

EFF_PAGE:		DB #FF
PAGE_M_PLACE:		DB #FF
FIRE_PAGE:		DB #FF
BAR_PAGE:		DB #FF
BFGF_PAGE:		DB #FF

MONSTR_END_T:	DW MONSTR_TABLE

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

			INCLUDE 'Music_4x.asm'

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


SKY_1:			DB #FF
SKY_2:  		DB #FF
PAGE_WEAPON:		DB #FF

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

MADE_FFING:
	LD C,SLOT3
	IN B,(C)
	OUT (C),A
	LD HL,#C000

NEXT_BYTE_:
	LD A,(HL)
	CP 0F7H
	JR NZ,NO_FFING
	LD (HL),0FFH
NO_FFING:
	INC HL
	BIT 7,H								;!!!!!проверка на конец страницы #C000-FFFF!!!!!
	JR NZ,NEXT_BYTE_

	OUT (C),B
	RET

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

INIT_TABLE:
;----[GET_RAMD_ST]----------------------
; получение идентификатора блока,
; назначенного на RAM-Disk
;

;----[Читаем первый блок таблиц E:]-----; Tables disk Doom.trd

;--------------------------------------- !!!!! Заменить к чертям на свою подгрузку блоками!
	LD A,(RAMBlkIDs)
	LD HL,TABLE_MAIN
	ld c,BIOS.GetMemBlkPages			; получить список страниц блока A
	rst ToBIOS
	RET C

;	LD HL,TABLE_MAIN
	INC HL
	INC HL
	INC HL
	LD A,(HL)
	LD (PAGE_WEAPON),A
	INC HL
	LD A,(HL)
	LD (SKY_1),A
	INC HL
	LD A,(HL)
	LD (SKY_2),A

	LD HL,TABLE_MAIN
	LD A,26
	ADD A,L
	LD L,A
	LD A,(HL)
	LD (WALL_DATS),A

	LD DE,MONSTR_DATS
	LD B,7
NEXT_HL_FFING:
	LD A,(HL)
	LD (DE),A
	PUSH HL
	PUSH DE
	PUSH BC

	CALL MADE_FFING						; замена FF-ами прозрачных цветов

	POP BC
	POP DE
	POP HL
	INC HL
	INC DE
	DJNZ NEXT_HL_FFING

	LD A,(MONSTR_DATS)
	LD (MONSTR_DAT+M_PAGE),A
	LD A,(MONSTR_DATS+5)
	LD (FIRE_PAGE),A
	LD A,(MONSTR_DATS+6)
	LD (BAR_PAGE),A

	LD HL,TABLE_MAIN
	LD A,35
	ADD A,L
	LD L,A
	LD A,(HL)
	LD (BFGF_PAGE),A

	CALL MADE_FFING

	LD A,(PAGE_WEAPON)
	CALL MADE_FFING

	LD HL,TABLE_MAIN
	LD A,33
	ADD A,L
	LD L,A
	LD A,(HL)
	LD (EFF_PAGE),A						; звук выстрела

	LD HL,TABLE_MAIN
	LD A,34
	ADD A,L
	LD L,A
	LD A,(HL)
	LD (PAGE_M_PLACE),A					; таблица с углами для монстров

;--_[Читаем четвёртый блок таблиц H:]---; Tables disk my_tab*.*
/*
	LD A,3	;2							;	походу, карта уровня и ещё что-то
	LD C,0CEH							; получить идентификатор блока от рамдиска
	RST ToBIOS
	ret c
;---------------------------------------
*/
	ld a,(RAMBlkIDs+2)
	LD HL,TABLE_TRACE
	ld c,BIOS.GetMemBlkPages			; получить список страниц блока A
	rst ToBIOS
	RET C
	LD A,B
	CP 32
	SCF
	RET NZ
;
;----[Читаем третий блок таблиц G:]-----; Tables disk mapw*.d2
/*
	LD A,2	;1							; рамдиск стенок
	LD C,0CEH							; получить идентификатор блока от рамдиска
	RST ToBIOS
	ret c
;---------------------------------------
*/
	ld a,(RAMBlkIDs+1)
	LD HL,TABLE_WALL
	ld c,BIOS.GetMemBlkPages			; получить список страниц блока A
	rst ToBIOS
	RET C
	LD A,B
	CP 33
	CCF
	RET C								; B - размер рамдиска

	DEC A
	LD (MAP_ELS),A						; число стенок

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*
	XOR A
	LD (TABLE_PIC),A
	RET
*/


;----[Читаем первый блок таблиц F:]-----; Tables disk *.XXX - файл скриншота 81920 байт
/*
	LD A,4
	LD C,BIOS.GET_RAMD_ST
	RST ToBIOS
	JR NC,1F
*/
	XOR A
	LD (TABLE_PIC),A
	AND A
	RET
/*
1:
	LD HL,TABLE_PIC
	LD C,BIOS.GetMemBlkPages			; получить список страниц блока
	RST ToBIOS
	AND A
	RET
;										;!!!!!!!сделать сохранение скриншотов
;	LD A,4
;	LD C,BIOS.GET_RAMD_ST				; получить идентификатор блока от рамдиска
;	RST ToBIOS
;	AND A
;	JR NZ,PIC_FOR_SAVE
;	XOR A
;	LD (TABLE_PIC),A
;	AND A
;	RET
;
;PIC_FOR_SAVE:
;	LD HL,TABLE_PIC
;	LD C,BIOS.GetMemBlkPages			; получить список страниц блока A
;	RST ToBIOS
;	XOR A
;	RET
*/

;***************************************
	BLOCK #8700-$,0							;ВЫРАВНИВАНИЕ
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;	тут выравнивание на 0 в младшем
;	 бите адреса
TABLE_MAIN:		DS 37					; буфер под страницы файла resurses.res +1
TABLE_PIC:		DS 6
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

;-------[загрузка ресурсов игры]--------
Load_Resources:
	in a,(SLOT3)
	ld (.SavePage),a

	LD B,FilesTBL.END
	LD DE,FilesTBL
	LD HL,RAMBlkIDs

.LR_loop:
	PUSH BC								;++счётчик
	PUSH HL								;++буфер под BlockID

	ex de,hl
	ld b,(hl)							; FilesTBL
	inc hl
	ld (.FileName),hl

; B - размер блока в страницах
	ld c,Dss.GetMem
	rst ToDSS
; A - идентификатор блока памяти
	
	pop hl								;--буфер под BlockID
	ld (hl),a
	inc hl
	push hl								;++буфер под BlockID

; A - идентификатор блока
	ld hl,Temp_Buffer
	ld c,BIOS.GetMemBlkPages
	rst ToBIOS
; B - число страниц в блоке
; HL - адрес буфера, в буфере список
;	физических страниц по порядку,
;	заканчивающийся байтом 0FFh

	push hl								;++буфер со списком страниц
	push bc								;++сколько страниц грузим

.FileName+1:
	ld hl,0
	ld a,1
	ld c,Dss.Open
	rst ToDSS
	ld (.TempFileID),a
	pop bc								;--сколько страниц грузим
	pop hl								;--буфер со списком страниц

;---[читаем]
.readloop:
	ld a,(hl)
	out (SLOT3),a
	inc hl
	push hl								;++буфер со списком страниц
	push bc								;++сколько страниц грузим

.TempFileID+1:
	ld a,#FF		; файловый манипулятор
	LD HL,#C000						; адрес в памяти
	LD DE,#4000						; количество читаемых байт
	LD C,Dss.Read
	RST ToDSS
	;DI

	pop bc							;--сколько страниц грузим
	pop hl							;--буфер со списком страниц
	DJNZ .readloop
;---[]

;---[закрываем]
	ld a,(.TempFileID)
	ld c,Dss.Close
	rst ToDSS
;---[]

	ld de,(.FileName)
	ld hl,13
	add hl,de
	ex de,hl

	POP HL							;--буфер под BlockID
	POP BC							;--счётчик
	DJNZ .LR_loop 

;-[разобраться с таблицами!!!]-
	ld hl,TABLE_X_file
	ld a,1
	ld c,Dss.Open
	rst ToDSS
	push af

	LD HL,TABLE_X						; адрес в памяти
	LD DE,TABLE_X_SIZE					; количество читаемых байт
	LD C,Dss.Read
	rst ToDSS

	pop af
	ld c,Dss.Close
	rst ToDSS

	; ld hl,MONSTR_TABLE_file
	; ld a,1
	; ld c,Dss.Open
	; rst ToDSS
	; push af

	; LD HL,MONSTR_TABLE					; адрес в памяти
	; LD DE,MONSTR_TABLE_SIZE				; количество читаемых байт
	; LD C,Dss.Read
	; rst ToDSS

	; pop af
	; ld c,Dss.Close
	; rst ToDSS
	
	;di
;------------------------------
.SavePage+1:
	ld a,0
	out (SLOT3),a
	;
	LD	HL,CURRENT_DIR
	LD	C,Dss.CurDir
	RST	ToDSS
	;
	LD	C,Dss.CurDisk
	RST	ToDSS
	LD	(INIT_HDD_WORK.currentDisk),A
	;
	RET
	
;Temp_Buffer:	BLOCK 256,#FF

TABLE_X_file: 		db 'table_x.tbl',0
;MONSTR_TABLE_file:	db 'monsters.tbl',0


;-------[Таблица загрузки файлов]-------
; длина в страницах				01 байт
; имя файла						13 байт
; 	если имя файла < 12 символов,
; 	то добить нулями до 12

FilesTBL:
	DZ	36,'resource.res'				;0	Disk E:
	DZ	16,'map_wall.res'				;1
	DZ	32,'d2_table.tbl'				;2
	DZ	01,'d2_fram.bin',0				;3
.END	EQU ($-FilesTBL)/14				; количество файлов 

RAMBlkIDs:	BLOCK FilesTBL.END,0
;---------------------------------------
;

		DS #8B00-$						;ВЫРАВНИВАНИЕ

RECALC_MAP:
; пересчет карты на реальные номера
; страниц стенок

	LD IX,MONSTR_TABLE
	LD HL,#4000

	IN A,(SLOT1)
	PUSH AF
	LD A,(TABLE_WALL)
	OUT (SLOT1),A
	LD A,(HL)
	CP '1'
	JR NZ,NO_PROCESS

RECALC_X:
	LD IX,MONSTR_TABLE
RECALC_M2:
	LD A,(HL)							; код стенки
	BIT 4,H
	JR Z,NO_PRP							; проверить, какую таблицу пересчитываем
	BIT 5,H
	JR Z,NO_PRP							; если не 4-ю, то идти дальше, иначе
;										  - это таблица препрятствий
RECALC_M2X:
	LD A,(HL)							; код стенки
	CP 'S'								; #53
	JR Z,ZERO_PRP
	SUB 20H								; код пробела
	JR Z,ZERO_PRP
	LD A,05Fh							; препятствие
	JR ONE_PRP
ZERO_PRP:
	XOR A
ONE_PRP:
	LD (HL),A
	INC L
	JR NZ,RECALC_M2X
	INC H
	LD A,H
	AND 0Fh
	JR NZ,RECALC_M2X
	JR NO_PROCESS						; закончить

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; Сделать условие на максимальное кол-во
;  "монстров" при заполнении таблицы по
;  LDIR в процедуре MONSTR_POS, чтоб не 
;  залезть на стек или дальше страницы.
;  MAX_IX < (ST_Point-MaxStackSize-MONSTR_D_LEN)
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
NO_PRP:
	LD A,(HL)							; код стенки
	CP 'S'								; место старта?
	CALL Z,START_POS
	CP 'M'								; монстр
	CALL Z,MONSTR_POS
	CP 'N'								; огни
	CALL Z,MONSTR_POS1
	CP 'O'								; бочки
	CALL Z,MONSTR_POS2
	CP 'P'								; огонь bfg
	CALL Z,MONSTR_POS3
	SUB 20H
	JR Z,ZERO_WOLL
	SUB 10H
	JR C,ZERO_WOLL
;
			CP 15
MAP_ELS		EQU $-1
;
	JR NC,ZERO_WOLL

	PUSH HL
	PUSH BC
	LD HL,TABLE_WALL
	INC A
	LD C,A
	LD B,0
	ADD HL,BC
	LD A,(HL)

;	LD A,(TABLE_WALL+1)

	POP BC
	POP HL

	JR NO_ZERO_W
ZERO_WOLL:
	XOR A								; забивать нулями
	BIT 4,H
	JR NZ,NO_ZERO_W
	DEC A								; забивать FF-ами
NO_ZERO_W:
	LD (HL),A
	INC L
	JR NZ,NO_PRP
	INC H
	LD A,H
	AND 0Fh
	JR NZ,NO_PRP

	LD A,H
	CP 50H
	JR NZ,NO_ST
	LD (MONSTR_END_T),IX				; конец таблицы монстров
NO_ST:
	LD A,H
	CP 80h
	JR NZ,RECALC_X

NO_PROCESS:
	POP AF
	OUT (SLOT1),A
	AND A
	RET

START_POS:
	PUSH HL
	PUSH AF

	ADD HL,HL
	ADD HL,HL

	LD A,L
;	ADD A,A
;	ADD A,A
	ADD A,2
	LD (X_COORD+1),A

;	RL L
;	RL H
;	RL L
;	RL H

	LD A,H
	ADD A,A
	ADD A,A
	ADD A,2
	LD (Y_COORD+1),A

	POP AF
	POP HL
	RET

MONSTR_POS1:
; факелы
	CALL MONSTR_POS
	PUSH AF
	LD A,(FIRE_PAGE)
	LD (IX-MONSTR_D_LEN+M_PAGE),A
	LD A,6								; делить ширину на 4 и переключать по
;										  старшему адресу
	LD (IX-MONSTR_D_LEN+M_VAR3),A
	LD A,10h
	LD (IX-MONSTR_D_LEN+M_VAR4),A
	LD A,0
	LD (IX-MONSTR_D_LEN+M_VAR2),A		; гореть быстрее всех
	POP AF
	RET

MONSTR_POS2:
; бочки
	CALL MONSTR_POS
	PUSH AF
	LD A,(BAR_PAGE)
	LD (IX-MONSTR_D_LEN+M_PAGE),A
	LD A,5								; делить ширину на 2, переключать
;										  по старшему адресу
	LD (IX-MONSTR_D_LEN+M_VAR3),A
	LD A,20h
	LD (IX-MONSTR_D_LEN+M_VAR4),A
	LD A,4
	LD (IX-MONSTR_D_LEN+M_VAR2),A		; гореть быстрее всех
	POP AF
	RET

MONSTR_DELET:
; удаление монстра
; IX - на удаляемом монстре
	PUSH IX
	PUSH HL
	PUSH DE
	PUSH BC
	PUSH AF

	PUSH IX								; куда кидать
	POP DE

	LD HL,MONSTR_D_LEN
	ADD HL,DE							; откуда кидать

LOOP_DEL:
	LD A,(HL)							; признак наличия монстра
	AND A
	JR Z,NO_LDIR

	LD BC,MONSTR_D_LEN
	LDIR								; перекинут один монстр
	JR LOOP_DEL

NO_LDIR:
	LD (MONSTR_END_T),DE
	XOR A
	LD (DE),A

	POP AF
	POP BC
	POP DE
	POP HL
	POP IX
	RET


MONSTR_BFG_INS:
; вставить в таблицу монстров
;	RET
	PUSH IX
	PUSH AF
	PUSH HL
	PUSH DE

; огненный шар FIRE
	LD IX,(MONSTR_END_T)				; взять конец таблицы монстров
	CALL MONSTR_POS						; инициализировать нового монстра
	CALL MONSTR_F_INI					; для огня

	LD A,(X_COORD+1)					; координаты совпадают с игроком
	LD (IX-MONSTR_D_LEN+M_X+1),A
	LD A,(Y_COORD+1)
	LD (IX-MONSTR_D_LEN+M_Y+1),A

	LD HL,(ANGLE_R)						; угол поворота игрока
	ADD HL,HL
	ADD HL,HL
	ADD HL,HL							; x8
	LD A,H
	AND 3Eh
	LD L,A
	LD H,0
	LD DE,TAB_ANGLE3+03Eh				; взять из таблицы по направлению

	EX DE,HL
	SBC HL,DE							; скорость для FIRE

	LD A,(HL)
	LD (IX-MONSTR_D_LEN+M_VX+1),A
	LD (IX-MONSTR_D_LEN+M_VX),0
	INC HL
	LD A,(HL)
	LD (IX-MONSTR_D_LEN+M_VY+1),A
	LD (IX-MONSTR_D_LEN+M_VY),0

	LD (MONSTR_END_T),IX				; сохранить новый конец

	POP DE
	POP HL
	POP AF
	POP IX

	RET

MONSTR_POS3:
	CALL MONSTR_POS
MONSTR_F_INI:
	PUSH AF
	LD A,(BFGF_PAGE)
	LD (IX-MONSTR_D_LEN+M_PAGE),A
	LD A,8								; шар огня, исчезающий от препятствия

	LD (IX-MONSTR_D_LEN+M_VAR3),A
	LD A,10h
	LD (IX-MONSTR_D_LEN+M_VAR4),A
	LD A,0
	LD (IX-MONSTR_D_LEN+M_VAR2),A		; гореть быстрее всех
	LD A,-4
	LD (IX-MONSTR_D_LEN+M_VX+1),A
	POP AF
	RET

MONSTR_POS:
; монстры
; правильно ли проставляются координаты
;  после LDIR, а не до него???
	PUSH HL								; копирование таблицы монстра
	PUSH DE
	PUSH BC
	PUSH IX
	POP DE
	LD HL,MONSTR_DAT
	LD BC,MONSTR_D_LEN
	LDIR
	POP BC
	POP DE
	POP HL

	PUSH DE
	PUSH HL
	PUSH AF

	ADD HL,HL
	ADD HL,HL

	LD A,L
	ADD A,2
	LD (IX+M_X+1),A

	LD A,H
	ADD A,A
	ADD A,A
	ADD A,2
	LD (IX+M_Y+1),A

	LD DE,MONSTR_D_LEN
	ADD IX,DE
	LD (IX),0							; очередной конец таблицы

	POP AF
	POP HL
	POP DE
	RET
;
;***************************************

;---------------[Tables]----------------
				ALIGN 2,0
;
TABLES_START:
X_COORD:	DW 90*256
Y_COORD:	DW 90*256
ANGLE_A:	DW -160*32+#C000
ANGLE_R:	DW 0

X_SPEED:	DW #300
Y_SPEED:	DW #302
A_SPEED:	DW #200

TABLE_TRACE:	BLOCK 33,0					; таблица трассировки/банки таблицы
TABLE_WALL:	BLOCK 33,0

;		BLOCK TABLES_START+#74-$,0	;ВЫРАВНИВАНИЕ

LAST_KEY:	DB 0
NAMES:		DB 6,1

;		BLOCK TABLES_START+#7C-$,0	;ВЫРАВНИВАНИЕ

NAME1:			DB "_1X62   CBL     "
NAME2:			DB "2NDREAL3CBL     "
NAME3:			DB "_ICT2   CBL     "
;NAME4:			DB "MISS2   CBL     "
;NAME5:			DB "5EL     CBL     "
NAME6:			DB "_UNNY2  CBL     "
NAME8:			DB "94956C  CBL     "
NAME9:			DB "_ENI511CCBL     "


;
;  IFN NORM_syncPORT

; im_handler_emul_proc_address:
; 	di
; 	push af
; 	call KBD_INT
; 	pop af
; 	reti

; 	BLOCK +(#FF - low $)
; im_handler_emulator:
; 	 dw im_handler_emul_proc_address
;  ENDIF
;
	OUTEND								; конец файла doom2.exe
DIR_NAME_11:		BLOCK 11,0
CURRENT_DIR:		BLOCK 257,0
Temp_Buffer	EQU $
;
;
	DISPLAY "DOOM2.EXE starts - ",/H,BEGIN
	DISPLAY "DOOM2.EXE ends - ",/H,$
	DISPLAY "DOOM2.EXE size - ",/H,$-BEGIN

;FRAM_PROG_1000H:
	include 'D2_FRAM.asm'
;
	END
;