;Úprava MSX hry Magical Tree
;ADJMAGICT ; 20-OCT-91 ; 17:38

;(C) Roman Štec, Kladno

	.RADIX 16T

;na adrese 8FF8 se předpokládá instrukce JP 0D000
;tělo hry se nalézá od 9000 do CFFF

	ORG	0D000

;--------------------------------
MODE	EQU	8FFF
LIVES	EQU	4148		;zde se odečítají životy
SETINT	EQU	9080		;nastavení vykonávání interruptu
SUBINT	EQU	402C		;rutina interruptu
;--------------------------------
START	DI
	LD	A,(0006)	;je datový registr VDP
	CP	10		;na portu 10?
	LD	HL,TESTM5	;přednastavení rutiny pro SORD
	JR	Z,SORDM5	;ano je, pak program běží v SORDu
	CALL	0138		;jsme v MSXu, přečteme SLOT registr
	PUSH	AF		;a schováme ho
	XOR	A		;sloty prohledáváme od 0
	LD	(MODE),A
	LD	B,4		;sloty jsou 4
HLEDEJ	LD	A,(MODE)	;vyzvedneme číslo hledanýho slotu
	LD	HL,4000		;chceme adresu 4000H
	PUSH	HL		;tu si schováme
	PUSH	BC		;rovněž tak zbývající počet slotů
	CALL	0024		;a připojíme žádaný slot
	POP	BC		;obnovíme registry
	POP	HL
	LD	A,(HL)		;a zkusíme zapsat na adresu 4000H
	CPL			;hodnotu opačnou, než tam je
	LD	(HL),A
	LD	C,(HL)		;načež se podíváme, co se tam nachází
	CP	C		;je tam to, co jsme tam zapsali?
	JR	Z,NASEL		;ano, pak je tam RAM a můžeme pokračovat
	LD	HL,MODE		;RAM tam není, tak zvětšíme číslo slotu
	INC	(HL)		;prohlížet budeme celkem
	DJNZ	HLEDEJ		;4 krát
	POP	AF		;pak obnovíme původní SLOT registr
	CALL	013B
	EI			;povolíme přerušení
	RET			;a končíme. V basiku pak musí být hlášení,
				;že hra vyžaduje RAM od 4000H
;--------------------------------
NASEL	POP	AF		;našli jsme slot s RAM od 4000H
	LD	A,0A		;proto zahodíme původní stav SLOT registru
	LD	(HELP),A	;a do textu dáme LF, aby se vytiskl celý
	LD	HL,TESTMX	;připravíme adresu MSX rutiny přerušení
SORDM5	LD	(SETINT),HL	;a ve hře jí pak změníme na žádanou
	LD	HL,0F3E9	;systémová změna barev
	LD	(HL),0F		;bílá písmena
	INC	HL
	LD	A,4		;na modrém podkladu
	LD	(HL),A
	INC	HL
	LD	(HL),A		;s modrým pozadím
	CALL	00CC		;smažeme FUNC texty
	CALL	006F		;nastavíme TEXT režim 32x24 a tím i barvy
	LD	HL,TEXT		;adresa hlášení
TISK	LD	A,(HL)		;načteme znak
	OR	A		;je to <NUL>?
	JR	Z,PAUSE		;ano, takže to je všechno
	CALL	00A2		;v opačným případě znak zobrazíme
	INC	HL		;posuneme adresu na další znak
	JR	TISK		;a cyklíme
PAUSE	LD	BC,1000		;chvilku počkáme
PAUS1	XOR	A
PAUS2	DEC	A
	JR	NZ,PAUS2
	DEC	BC
	OR	B
	JR	NZ,PAUS1	;a potom přesumeme hru na místo basiku
	CALL	EXCLOP		;a basik na místo hry
	CALL	013E		;přečteme status registr VDP, čímž VDP
	LD	HL,(4002)	;odblokujeme a hru odstartujeme od adresy,
	JP	(HL)		;která je na adrese inicializace slotu
;--------------------------------
EXCLOP	DI			;záměna dvou oblastí - má to praktický
	LD	HL,9000		;význam pouze v SORDu, aby se zachovala
	LD	DE,4000		;část emulátoru, který by byl jinak poškozen
	LD	B,D
	LD	C,E
EX1	LD	A,(DE)
	LDI
	DEC	HL
	LD	(HL),A
	INC	HL
	JP	PE,EX1
	RET
;--------------------------------
TESTMX	PUSH	AF		;rutina přerušení v MSX počítači
	LD	A,78		;nastavíme osmou řadu kláves
	OUT	(0AA),A		;ke čtení
	IN	A,(0A9)		;zeptáme se co tam je
	BIT	1,A		;je stisklá klávesa HOME?
	LD	A,0		;kód instrukce, při kterém neubývají životy
	JR	Z,DEAD1		;ano, je stisklý HOME
	IN	A,(0A9)		;HOME není, tak zkoušíme dál
	BIT	2,A		;je stisklý INS?
	LD	A,35		;kód instrukce DEC (HL) - původní ubývání
	JR	NZ,VEN		;není stisklý ani INS, tak jdeme ven
DEAD1	LD	(LIVES),A	;změníme instrukci ve hře
	JR	VEN		;a jdeme ven
;---------------
TESTM5	PUSH	AF		;rutina přerušení pro SORDa
	IN	A,(30)		;přečteme stav řady kláves přeřazovačů
	CPL
	AND	0C		;bity 2 a 3 to jsou levý a pravý SHIFT
	JR	Z,SHIFTY	;byly stisknuty oba současně, skočíme
	IN	A,(50)		;není stisknutý náhodou RESET?
	RLCA			;sedmý bit
	JR	C,RESET		;ano, RESET je stisklý, skočíme
VEN	POP	AF		;to už je všechno, takže obnovíme registry
	JP	SUBINT		;a pokračujeme v původní rutině přerušení
;---------------
SHIFTY	CALL	EXCLOP		;byly-li SHIFTy, tak končíme. Vrátíme
	RST	0		;zpátky polovinu emulátoru a odstartujeme ho
;---------------
RESET	IN	A,(50)		;je RESET stisklý stále?
	RLCA			;pokud ano, tak cyklíme, dokud nebude
	JR	C,RESET		;uvolněn
	LD	A,(LIVES)	;nabereme instrukci ve hře, kde se odečítají
	XOR	35		;životy a uložíme tam instrukci opačnou
	LD	(LIVES),A
	JR	VEN		;a končíme
;--------------------------------
TEXT	DB 0C,0A,0A,0A,0A,0A,0A,09,'Pro SORD m.5',0D,0A,0A
	DB '      upravil LZR Soft',0D,0A,0A,09,20
	DB '20-OCT-91',0D,0A,0A,0A,0A,0A,0A,0A,0A,0A,0A
HELP	DB 0,' Nesmrtelnost:',0D,0A,0A,' HOME - zapne, INS - vypne',0
;--------------------------------
ZKONEC				;adresa za koncem podprogramu
	END	8FF8		;start hry
