User Tools

Site Tools


Action disabled: register
base:scoring_points

Scoring points

by Achim

There are three ways to code scoring.

1) Decimal mode

This one can be found in many games. You only have to declare a couple of variables for the player's score and switch to decimal mode.

Example for six digits:

sed		//set decimal mode
clc
lda #$50	//50 points scored
adc score1	//ones and tens
sta score1
lda score2	//hundreds and thousands
adc #00
sta score2
lda score3	//ten-thousands and hundred-thousands
adc #00
sta score3
cld		//clear decimal mode

The score can now be printed on screen:

lda score3
and #$f0	        //hundred-thousands
lsr
lsr
lsr
lsr
ora #$30		// -->ascii
sta screenposition	//print on screen
lda score3
and #$0f		//ten-thousands
ora #$30		// -->ascii
sta screenposition+1	//print on next screen position

lda score2		//same procedure for all digits
...

Switching to decimal mode can cause problems under certain conditions: Let's say an irq kicks in to write sprite registers while decimal mode is set. This would mess up all registers, of course. This might happen with a sprite mulitplexer, because these irqs are unpredictable. Idea would be to start these irqs with CLD. Another would be to disable irqs while calculating.

2) Hexadecimal mode

Not much to explain. Declare your variables for the score. Use a standard hexadecimal addition and print the result on screen (preferably with a routine like this, which converts hexadecimal to decimal, then ascii).

3) ASCII

This one's most commonly used in games. Each ascii code on screen is treated like a digit. An addition would look like this:

		ldx #$05
		lda #$00
!:		sta carry,x		//clear carry table
		dex
		bpl !-

		ldx #$05		//6 digits
!:		lda figure1,x           //current score, usually located in screen memory
		clc
		adc figure2,x           //add points
		adc carry,x
		and #$0f		//check bits0-3
		cmp #$0a		//if >=10
		bcc nocarry
		inc carry-1,x		//then set carry for next digit...
		sec
		sbc #$0a		//... -10 for correct ascii
nocarry:	ora #$30		//-->ascii
		sta sum,x
		dex
		bpl !-
		rts

figure1:	.byte		$31, $32, $30, $33, $37, $39 		//   120379 (example)
figure2:	.byte		$32, $32, $30, $39, $32, $31 		//  +220921
carry:		.byte		$00, $00, $00, $00, $00, $00		//tmp for carry
sum:		.byte		$00, $00, $00, $00, $00, $00		
base/scoring_points.txt · Last modified: 2020-01-11 12:23 by maze