Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

10. Makra

Než se pustíme do samotné herní "matematiky", budeme potřebovat nějaký vývojový prostředek, který nám bude vyhodnocovat statistiku a hlásit vnitřní stavy programu. Do souboru PROGRAM.ASM doplňte před volání funkce call TurnReels volání funkce call DebugPrint a někam mezi funkce doplňte následující obsah:


; ----------------------------------------------------------------------------
;                       Print debug informations
; ----------------------------------------------------------------------------
; INPUT:	BX = current reel position
; ----------------------------------------------------------------------------

%define		DEBUG
%include	"MACROS.ASM"		; macros

WINMODE_LOST	equ	1		; winning mode - lost
WINMODE_WIN	equ	2		; winning mode - win
WINMODE_BLUFF	equ	3		; winning mode - bluff
WINMODE_BWIN	equ	4		; winning mode - bonus win
WINMODE_BLOST	equ	5		; winninf mode - bonus lost

DebugPrint:	DebugPosition bx	; debug display position
		DebugBonus		; debug display bonus
		DebugMode		; debug display winning mode
		DebugGameIn		; debug display Game-In
		DebugGameOut		; debug display Game-Out
		DebugGameProfit		; debug display Profit
		ret

; ----------------------------------------------------------------------------
;                          Set cursor position
; ----------------------------------------------------------------------------
; INPUT:	DL = column
;		DH = row
; ----------------------------------------------------------------------------

SetCursor:	push	ax		; push AX
		push	bx		; push BX
		mov	ah,2		; AH <- 2 function code
		mov	bh,0		; page
		call	Int10		; call Int 10h
		pop	bx		; pop BX
		pop	ax		; pop AX
		ret

; ----------------------------------------------------------------------------
;                        Display number with BIOS
; ----------------------------------------------------------------------------
; INPUT:	AX = number
; ----------------------------------------------------------------------------

; ------------- Push registers

DispNum:	push	ax		; push AX
		push	bx		; push BX
		push	cx		; push CX
		push	dx		; push DX

; ------------- Convert number to digits

		mov	bx,10		; BX <- 10 divider
		xor	cx,cx		; CX <- 0 counter
DispNum2:	xor	dx,dx		; DX <- 0 number HIGH
		div	bx		; divide number with 10
		push	dx		; push character in DL
		inc	cx		; increment counter in CX
		or	ax,ax		; was it last digit?
		jnz	DispNum2	; convert next digit

; ------------- Display digits

DispNum3:	pop	ax		; AL <- digit
		add	al,"0"		; AL <- convert to character
		call	DispChar	; display character
		loop	DispNum3	; display next digit

; ------------- Pop registers

		pop	dx		; pop DX
		pop	cx		; pop CX
		pop	bx		; pop BX
		pop	ax		; pop AX
		ret

GameIn:		dw	0		; debug Game-In
GameOut:	dw	0		; debug Game-Out
WinMode:	db	0		; debug win mode

Připravte soubor MACROS.ASM a naplňte ho následujícím obsahem:


; ============================================================================
;
;                            VEGASLOT - Macros
;
; ============================================================================

; ------------- Macro - clear debug window (params: row, column, length)

%macro DebugClear 3
%ifdef DEBUG
		push	ax		; push AX
		push	cx		; push CX
		push	dx		; push DX
		mov	dh,%1		; DH <- row
		mov	dl,%2		; DL <- column
		call	SetCursor	; set cursor position
		mov	cx,%3		; CX <- length of window
		mov	al," "		; AL <- blank character
%%disp:		call	DispChar	; display one character
		loop	%%disp		; next character
		mov	dh,%1		; DH <- row
		mov	dl,%2		; DL <- column
		call	SetCursor	; set cursor position
		pop	dx		; pop DX
		pop	cx		; pop CX
		pop	ax		; pop AX
%endif
%endmacro

; ------------- Macro - display debug text (param: "text")

%macro DebugText 1
%ifdef DEBUG
		push	si		; push SI
		mov	si,%%text	; SI <- text to display
		call	DispText	; display text
		jmp	short %%next	; skip text
%%text:		db	%1,0		; text to display
%%next:		pop	si		; pop SI
%endif
%endmacro

; ------------- Macro - display number (param: number)

%macro DebugNum 1
%ifdef DEBUG
		push	ax		; push AX
		mov	ax,%1		; AX <- number to display
		call	DispNum		; display number
		pop	ax		; pop AX
%endif
%endmacro

; ------------- Macro - display bonus

%macro DebugBonus 0
		DebugClear 0, 0, 12
		DebugText " Bonus:"
		DebugNum [Bonus]
%endmacro

; ------------- Macro - display reel position (param: reel position)

%macro DebugPosition 1
%ifdef DEBUG
		DebugClear 0, 12, 14
		DebugText "Reels:"
		push	ax		; push AX
		push	bx		; push BX
		push	cx		; push CX
		mov	bx,%1		; BX <- reel position
		mov	ax,bx		; AX <- position
		and	ax,POSMASK	; AX <- masked position
		call	DispNum		; display position of reel 0
		mov	al,","		; comma
		call	DispChar	; display comma
		mov	cl,5		; CL <- number of rotation
		shr	bx,cl		; rotate to next reel
		mov	ax,bx		; AX <- position
		and	ax,POSMASK	; AX <- masked position
		call	DispNum		; display position of reel 1
		mov	al,","		; comma
		call	DispChar	; display comma
		shr	bx,cl		; rotate to next reel
		mov	ax,bx		; AX <- position
		call	DispNum		; display position of reel 1
		pop	cx		; pop CX
		pop	bx		; pop BX
		pop	ax		; pop AX
%endif
%endmacro	

; ------------- Macro - set winning mode (param: winning mode number)

%macro DebugSetMode 1
%ifdef DEBUG
		mov	byte [WinMode],%1
%endif
%endmacro

; ------------- Macro - display winning mode

%macro DebugMode 0
%ifdef DEBUG
		DebugClear 0, 26, 14
		DebugText "Mode:"
		cmp	byte [WinMode],WINMODE_LOST
		jne	%%lost
		DebugText "Lost"
%%lost:		cmp	byte [WinMode],WINMODE_WIN
		jne	%%win
		DebugText "Win"
%%win:		cmp	byte [WinMode],WINMODE_BLUFF
		jne	%%bluff
		DebugText "Bluff"
%%bluff:	cmp	byte [WinMode],WINMODE_BLOST
		jne	%%blost
		DebugText "BonusLost"
%%blost:	cmp	byte [WinMode],WINMODE_BWIN
		jne	%%bwin
		DebugText "BonusWin"
%%bwin:
%endif
%endmacro

; ------------- Macro - display Game-In

%macro DebugGameIn 0
		DebugClear 1, 0, 12
		DebugText "GameIn:"
		DebugNum word [GameIn]
%endmacro

; ------------- Macro - display Game-Out

%macro DebugGameOut 0
		DebugClear 1, 12, 13
		DebugText "GameOut:"
		DebugNum word [GameOut]
%endmacro

; ------------- Macro - display Profit

%macro DebugGameProfit 0
%ifdef DEBUG
		DebugClear 1, 25, 15
		DebugText " Profit:"
		push	ax		; push AX
		push	bx		; push BX
		push	dx		; push DX
		xor	ax,ax		; AX <- 0 prepare zero Profit LOW
		cmp	word [GameIn],0	; is there no GameIn?
		je	%%zero		; there is no GameIn
		mov	ax,1000		; AX <- 1000 multiplier
		mul	word [GameOut]	; * GameOut
		div	word [GameIn]	; / GameIn
%%zero:		mov	bx,10		; BX <- 10 divider
		xor	dx,dx		; DX <- 0 prepare zero Profit HIGH
		div	bx		; AX <- percent, DX <- decimal
		DebugNum ax		; display Profit in percents
		DebugText "."		; display decimal character
		DebugNum dx		; display decimal
		DebugText "%"		; display percent character
		pop	dx		; pop DX
		pop	bx		; pop BX
		pop	ax		; pop AX
%endif
%endmacro

Výstup interních informací budeme provádět s využitím standardních BIOS funkcí. Některé grafické karty (ovšem jen zřídka) nemusí podporovat BIOS výstup znaků pro VESA režim, v tom případě by bylo nutné program spouštět s přepínačem NOVESA.

Kromě již dříve použitých funkcí DispChar a DispText budeme dále potřebovat funkci DispNum, která zobrazí číslo, a funkci SetCursor, která nastaví pozici kurzoru na displeji. Funkce DispNum nejdříve dekóduje číslo na jednotlivé číslice (opakovaným dělením 10) a zbytky po dělení ukládá do zásobníku. Po dekódování čísla zobrazí jednotlivé číslice vyjímáním ze zásobníku, převodem na ASCII znak a zobrazením.

Abychom mohli funkce používat pouze v režimu ladění a nezabíraly nám prostor a čas v koncové verzi programu, jsou funkce pro zobrazení ladících informací realizovány jako podmíněná makra. Základním makrem je makro DebugClear. Slouží k vymazání podkladu před zobrazením ladících informací. Parametry makra jsou: řádek a pozice k zobrazení, délka pole k vymazání. Makro nastaví na požadovanou pozici kurzor a provede opakovaně výstup znaku mezery. Nakonec nastaví kurzor opět na začátek pole, aby byl připraven pro následující výstup textu.

Druhé makro, DebugText, zobrazí text na aktuální pozici kurzoru. Text k zobrazení je jediným parametrem makra. Musí být zadán jako text v uvozovkách. Makro jej dekóduje tak, že ho vloží přímo mezi instrukce.

Třetí makro, DebugNum, zobrazí číslo předané jako parametr makra.

Následující makra zobrazují konkrétní informace na displeji. K zobrazení informací jsou vyčleněny 2 řádky o 40 znacích na levém horním okraji displeje. Je-li použit režim VGA, jsou řádky celé viditelné, ale lehce zasahují do oblasti digitálního displeje automatu.

Makro DebugBonus zobrazí aktuální stav bonusu. Bonus se zobrazí jako první položka v informačním poli ladících informací. Makro DebugPosition zobrazí polohu válců. Jeho parametrem je aktuální pozice válců jako pakované číslo s 5 bity na válec. Makro DebugSetMode uloží do proměnné WinMode výherní mód. Makro DebugMode tento výherní mód zobrazí. Jsou rozlišeny výherní módy: prohra, výhra, blafování, bonus prohra a bonus výhra. Makro DebugGameIn zobrazí proměnnou GameIn, tedy částku vloženou do hry. Makro DebugGameOut zobrazí proměnnou GameOut, tj. částka vyhraná hrou. Makro DebugGameProfit zobrazí aktuální výhernost.

Download zdrojového kódu maker

Zpět na aplikaci VEGASLOT