### Table of Contents

# 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