;Atari 2600 Two Player Score Kernel

;Score Routine Variables
SCORE0  EQU $E8         ;Player One Score
SCORE1  EQU $E9         ;Player Two Score
SC0ONE  EQU $EA         ;One Score Ones Digit Offset
SC1ONE  EQU $EB         ;Player Ten Score Ones Digit Offset
SC0TEN  EQU $EC         ;Player One Score Ones Digit Offset
SC1TEN  EQU $ED         ;Player Ten Score Ones Digit Offset
SC0GFX  EQU $EE         ;Player One Score Graphics Data 
SC1GFX  EQU $EF         ;Player Two Score Graphics Data 

;Prep Scores For Diplay
SCPREP: LDX #1          ;Offset into SCORE0/SCORE1
SCPREL: LDA SCORE0,X    ;Get SCORE1 (First Pass) or SCORE0 (Second Pass) 
        AND #$0F        ;Remove Tens Digit
        STA TEMP0       ;And Save It
        ASL             ;Multiply By 4
        ASL             ;(Carry will be Clear because of AND/ASL)
        ADC TEMP0       ;Add To Original Value for Multiply by 5
        STA SC0ONE,X    ;Store in SC0ONE (First Pass) or SC1ONE (Second Pass)
        LDA SCORE0,X    ;Get SCORE1 (First Pass) or SCORE0 (Second Pass) 
        AND #$F0        ;Remove Ones Digit
        LSR             ;Divide by 4
        LSR             ;
        STA TEMP0       ;And Save It
        LSR             ;Divide by 4 Again
        LSR             ;(Leaving Carry Clear)
        ADC TEMP0       ;Add Saved Value, Resulting in Digit / 16 * 5
        STA SC0TEN,X    ;Store in SC0TEN (First Pass) or SC1TEN (Second Pass)
        DEX             ;Point to SCORE 1
        BPL SCPREL      ;AND Loop if >0
        RTS             ;Return

;scdisp() - Score Display Kernel - Uses 12 Scanlines Total
SCDISP: LDA #2          ;      - Use Player Colors
        STA CTRLPF      ;      - Set Playfield Control Register
        LDX #5          ;   43 - cycle after looping
SCDISL: LDY SC0TEN      ; 3 46 - get the tens digit offset for the Score
        LDA DGTGFX,Y    ; 5 51 -   use it to load the digit graphics
        AND #$F0        ; 2 53 -   remove the graphics for the ones digit
        STA SC0GFX      ; 3 56 -   AND save it
        LDY SC0ONE      ; 3 59 - get the ones digit offset for the Score
        LDA DGTGFX,Y    ; 5 64 -   use it to load the digit graphics
        AND #$0F        ; 2 66 -   remove the graphics for the tens digit
        ORA SC0GFX      ; 3 69 -   merge with the tens digit graphics
        STA SC0GFX      ; 3 72 -   AND save it
        STA WSYNC       ; 3 75 -   wait for end of scanline
        STA PF1         ; 3  3 - @66-28, update playfield for Score dislay
        LDY SC1TEN      ; 3  6 - get the left digit offset for the Timer
        LDA DGTGFX,Y    ; 5 11 -   use it to load the digit graphics
        AND #$F0        ; 2 13 -   remove the graphics for the ones digit
        STA SC1GFX      ; 3 16 -   AND save it
        LDY SC1ONE      ; 3 19 - get the ones digit offset for the Timer
        LDA DGTGFX,Y    ; 5 24 -   use it to load the digit graphics
        AND #$0F        ; 2 26 -   remove the graphics for the tens digit
        ORA SC1GFX      ; 3 29 -   merge with the tens digit graphics
        STA SC1GFX      ; 3 32 -   AND save it
        JSR SCDISX      ;12 44 - waste 12 cycles
        STA PF1         ; 3 47 - @39-54, update playfield for Timer display
        LDY SC0GFX      ; 3 50 - preload for next scanline 
        STA WSYNC       ; 3 53 - wait for end of scanline
        STY PF1         ; 3  3 - @66-28, update playfield for the Score display
        INC SC0TEN      ; 5  8 - advance for the next line of graphic data
        INC SC1TEN      ; 5 13 - advance for the next line of graphic data
        INC SC0ONE      ; 5 18 - advance for the next line of graphic data
        INC SC1ONE      ; 5 23 - advance for the next line of graphic data
        JSR SCDISX      ;12 35 - waste 12 cycles
        DEX             ; 2 37 - decrease the loop counter
        STA PF1         ; 3 40 - @39-54, update playfield for the Timer display
        BNE SCDISL      ; 2 42 - (3 43) if dex != 0 then branch to ScoreLoop
        STA WSYNC       ; 3 45 - wait for end of scanline
        STX PF1         ; 3  3 - x = 0, so this blanks out playfield        
        STA WSYNC       ; 3  6 - wait for end of scanline
SCDISX: RTS             ; 6 12 - Return

