## Ten digit playfield routine, was: [stella] 20 columns of almost-readabletext

 Subject: Ten digit playfield routine, was: [stella] 20 columns of almost-readabletext From: Jake Patterson Date: Fri, 14 Sep 2001 03:07:21 -0400 (EDT)
```On Thu, 13 Sep 2001, B. Watson wrote:

>
> This is what I spent last night doing, to get my mind off the terrorist
> bombings (there's nothing I can do to change the situation right now, so
> obsessing over it isn't helping me sleep...)
>

Well, I guess I had similar ideas for how to cope... you managed to outdo
my efforts, however.  All I came up with is a ten digit numerical
playfield routine.  There is no flicker, but it is interlaced in more or
less the same way as the scores in Space Invaders.  It simply displays the
even placed digits on even scanlines and the odd placed digits on odd scan
lines.  I set it up to count frames like an odometer. It could probably
be adapted to alphanumerics fairly easily.  There is enough time left over
to read a color for each pair of scan lines from a table.  The digit
bitmaps are also read from a table, 205 byts of ROM for the tables, plus
considerably more for the code, since the kernel is partially unwrapped.

Source and two bins attached, the second bin, slodometer.bin, simply
counts every 32 frames.  The faster, odometer.bin, would take a little
over five years to roll over all ten digits, at 60 frames per second, or
just under 1 year at 340 frames per second, which is the fastest that
MacStella can manage on my computer.

```
```; Ten digit display routine, counts frames.
; Thursday, September 13, 2001
; By Jake Patterson
;
; Somewhat derived from:
; How to Draw A Playfield.
; by Nick Bensema  9:23PM  3/2/97
;
processor 6502
include vcs.h

org \$F000

Temp			= \$80
Firstdigit		= \$90
Seconddigit		= \$91
Thirddigit		= \$92
Fourthdigit		= \$93
Fifthdigit		= \$94
Sixthdigit		= \$95
Seventhdigit	= \$96
Eigthdigit		= \$97
Ninthdigit		= \$98
Tenthdigit		= \$99
Framethingie	= \$9A

Start
SEI  ; Disable interrupts, if there are any.
CLD  ; Clear BCD math bit.

LDX  #\$FF
TXS  ; Set stack to beginning.

LDA #0
B1      STA 0,X
DEX
BNE B1

LDA #8
STA Framethingie

; *****************************************************************************
MainLoop

; *****************************************************************************

JSR  VerticalBlank	;Execute the vertical blank.
JSR  CheckSwitches	;Check Console Switches.
JSR  DrawScreen	    ;Draw the screen
JSR  OverScan		;Do more calculations during overscan
JMP  MainLoop		;Continue forever.

; *****************************************************************************
VerticalBlank

; *****************************************************************************

LDX  #0
LDA  #2
STA  WSYNC
STA  WSYNC
STA  WSYNC
STA  VSYNC ;Begin vertical sync.
STA  WSYNC ; First line of VSYNC
STA  WSYNC ; Second line of VSYNC.

LDA  #44
STA  TIM64T

LDA #0
STA CXCLR

STA  WSYNC ; Third line of VSYNC.
STA  VSYNC ; (0)

RTS

; *****************************************************************************
CheckSwitches

; *****************************************************************************

LDA #\$0000
STA PF0
STA PF1
STA PF2
STA COLUPF
STA COLUBK

RTS

; *****************************************************************************
DrawScreen

; *****************************************************************************

; *************************************** 0th through 51st scanlines (52 total)

LDY #51

SplashTopLines

LDA #0
STA COLUBK
STA COLUPF
STA PF0
STA PF1
STA PF2

STA WSYNC

DEY
BNE SplashTopLines

; ************************************** 52nd through 71st scanlines (20 total)

LDY #2

FirstLineLoop

STA WSYNC						; [59]

LDA FirstLineColor				; [0]  + 4
STA COLUPF						; [4]  + 3

LDX Firstdigit					; [7]  + 3
LDA FirstLinePF0Right,X			; [10] + 4
STA PF0							; [14] + 3

LDX Thirddigit					; [17] + 3
LDA FirstLinePF1Right,X			; [20] + 4
STA PF1							; [24] + 3

LDX Fifthdigit					; [27] + 3
LDA FirstLinePF0Right,X			; [30] + 4
STA PF2							; [34] + 3

LDA #0							; [37] + 2
STA PF0							; [39] + 3

LDX Seventhdigit				; [42] + 3
LDA FirstLinePF1Left,X			; [45] + 4
STA PF1							; [49] + 3

LDX Ninthdigit					; [52] + 3
LDA FirstLinePF2Left,X			; [55] + 4
STA PF2							; [59] + 3

STA WSYNC						; [62]

LDX Seconddigit					; [0]  + 3
LDA FirstLinePF1Left,X			; [3]  + 4
STA PF1							; [7]  + 3

LDX Fourthdigit					; [10] + 3
LDA FirstLinePF2Left,X			; [13] + 4
STA PF2							; [17] + 3

LDX Sixthdigit					; [20] + 3
LDA FirstLinePF0Right,X			; [23] + 4
NOP								; [27] + 2
STA PF0							; [29] + 3

LDX Eigthdigit					; [32] + 3
LDA FirstLinePF1Right,X			; [35] + 4
NOP								; [39] + 2
STA PF1							; [41] + 3

LDX Tenthdigit					; [44] + 3
LDA FirstLinePF0Right,X			; [47] + 4
STA PF2							; [51] + 3

DEY								; [54] + 2
BNE FirstLineLoop				; [56] + 3

; *****************************************************************************

LDY #2

SecondLineLoop

STA WSYNC						; [59]

LDA SecondLineColor				; [0]  + 4
STA COLUPF						; [7]  + 3

LDX Firstdigit					; [7]  + 3
LDA SecondLinePF0Right,X		; [10] + 4
STA PF0							; [14] + 3

LDX Thirddigit					; [17] + 3
LDA SecondLinePF1Right,X		; [20] + 4
STA PF1							; [24] + 3

LDX Fifthdigit					; [27] + 3
LDA SecondLinePF0Right,X		; [30] + 4
STA PF2							; [34] + 3

LDA #0							; [37] + 2
STA PF0							; [39] + 3

LDX Seventhdigit				; [42] + 3
LDA SecondLinePF1Left,X			; [45] + 4
STA PF1							; [49] + 3

LDX Ninthdigit					; [52] + 3
LDA SecondLinePF2Left,X			; [55] + 4
STA PF2							; [59] + 3

STA WSYNC						; [62]

LDX Seconddigit					; [0]  + 3
LDA SecondLinePF1Left,X			; [3]  + 4
STA PF1							; [7]  + 3

LDX Fourthdigit					; [10] + 3
LDA SecondLinePF2Left,X			; [13] + 4
STA PF2							; [17] + 3

LDX Sixthdigit					; [20] + 3
LDA SecondLinePF0Right,X		; [23] + 4
NOP								; [27] + 2
STA PF0							; [29] + 3

LDX Eigthdigit					; [32] + 3
LDA SecondLinePF1Right,X		; [35] + 4
NOP								; [39] + 2
STA PF1							; [41] + 3

LDX Tenthdigit					; [44] + 3
LDA SecondLinePF0Right,X		; [47] + 4
STA PF2							; [51] + 3

DEY								; [54] + 2
BNE SecondLineLoop				; [56] + 3

; *****************************************************************************

LDY #2

ThirdLineLoop

STA WSYNC						; [59]

LDA ThirdLineColor				; [0]  + 4
STA COLUPF						; [4]  + 3

LDX Firstdigit					; [7]  + 3
LDA ThirdLinePF0Right,X			; [10] + 4
STA PF0							; [14] + 3

LDX Thirddigit					; [17] + 3
LDA ThirdLinePF1Right,X			; [20] + 4
STA PF1							; [24] + 3

LDX Fifthdigit					; [27] + 3
LDA ThirdLinePF0Right,X			; [30] + 4
STA PF2							; [34] + 3

LDA #0							; [37] + 2
STA PF0							; [39] + 3

LDX Seventhdigit				; [42] + 3
LDA ThirdLinePF1Left,X			; [45] + 4
STA PF1							; [49] + 3

LDX Ninthdigit					; [52] + 3
LDA ThirdLinePF2Left,X			; [55] + 4
STA PF2							; [59] + 3

STA WSYNC						; [62]

LDX Seconddigit					; [0]  + 3
LDA ThirdLinePF1Left,X			; [3]  + 4
STA PF1							; [7]  + 3

LDX Fourthdigit					; [10] + 3
LDA ThirdLinePF2Left,X			; [13] + 4
STA PF2							; [17] + 3

LDX Sixthdigit					; [20] + 3
LDA ThirdLinePF0Right,X			; [23] + 4
NOP								; [27] + 2
STA PF0							; [29] + 3

LDX Eigthdigit					; [32] + 3
LDA ThirdLinePF1Right,X			; [35] + 4
NOP								; [39] + 2
STA PF1							; [41] + 3

LDX Tenthdigit					; [44] + 3
LDA ThirdLinePF0Right,X			; [47] + 4
STA PF2							; [51] + 3

DEY								; [54] + 2
BNE ThirdLineLoop				; [56] + 3

; *****************************************************************************

LDY #2

FourthLineLoop

STA WSYNC						; [59]

LDA FourthLineColor				; [0]  + 4
STA COLUPF						; [4]  + 3

LDX Firstdigit					; [7]  + 3
LDA FourthLinePF0Right,X		; [10] + 4
STA PF0							; [14] + 3

LDX Thirddigit					; [17] + 3
LDA FourthLinePF1Right,X		; [20] + 4
STA PF1							; [24] + 3

LDX Fifthdigit					; [27] + 3
LDA FourthLinePF0Right,X		; [30] + 4
STA PF2							; [34] + 3

LDA #0							; [37] + 2
STA PF0							; [39] + 3

LDX Seventhdigit				; [42] + 3
LDA FourthLinePF1Left,X			; [45] + 4
STA PF1							; [49] + 3

LDX Ninthdigit					; [52] + 3
LDA FourthLinePF2Left,X			; [55] + 4
STA PF2							; [59] + 3

STA WSYNC						; [62]

LDX Seconddigit					; [0]  + 3
LDA FourthLinePF1Left,X			; [3]  + 4
STA PF1							; [7]  + 3

LDX Fourthdigit					; [10] + 3
LDA FourthLinePF2Left,X			; [13] + 4
STA PF2							; [17] + 3

LDX Sixthdigit					; [20] + 3
LDA FourthLinePF0Right,X		; [23] + 4
NOP								; [27] + 2
STA PF0							; [29] + 3

LDX Eigthdigit					; [32] + 3
LDA FourthLinePF1Right,X		; [35] + 4
NOP								; [39] + 2
STA PF1							; [41] + 3

LDX Tenthdigit					; [44] + 3
LDA FourthLinePF0Right,X		; [47] + 4
STA PF2							; [51] + 3

DEY								; [54] + 2
BNE FourthLineLoop				; [56] + 3

; *****************************************************************************

LDY #2

FifthLineLoop

STA WSYNC						; [59]

LDA FifthLineColor				; [0]  + 4
STA	COLUPF						; [4]  + 3

LDX Firstdigit					; [7]  + 3
LDA FifthLinePF0Right,X			; [10] + 4
STA PF0							; [14] + 3

LDX Thirddigit					; [17] + 3
LDA FifthLinePF1Right,X			; [20] + 4
STA PF1							; [24] + 3

LDX Fifthdigit					; [27] + 3
LDA FifthLinePF0Right,X			; [30] + 4
STA PF2							; [34] + 3

LDA #0							; [37] + 2
STA PF0							; [39] + 3

LDX Seventhdigit				; [42] + 3
LDA FifthLinePF1Left,X			; [45] + 4
STA PF1							; [49] + 3

LDX Ninthdigit					; [52] + 3
LDA FifthLinePF2Left,X			; [55] + 4
STA PF2							; [59] + 3

STA WSYNC						; [62]

LDX Seconddigit					; [0]  + 3
LDA FifthLinePF1Left,X			; [3]  + 4
STA PF1							; [7]  + 3

LDX Fourthdigit					; [10] + 3
LDA FifthLinePF2Left,X			; [13] + 4
STA PF2							; [17] + 3

LDX Sixthdigit					; [20] + 3
LDA FifthLinePF0Right,X			; [23] + 4
NOP								; [27] + 2
STA PF0							; [29] + 3

LDX Eigthdigit					; [32] + 3
LDA FifthLinePF1Right,X			; [35] + 4
NOP								; [39] + 2
STA PF1							; [41] + 3

LDX Tenthdigit					; [44] + 3
LDA FifthLinePF0Right,X			; [47] + 4
STA PF2							; [51] + 3

DEY								; [54] + 2
BNE FifthLineLoop				; [56] + 3

STA WSYNC

; ************************************ 72nd through 191st scanlines (120 total)
; the incrimentor always does 9 scan lines.

LDY #0
STY COLUBK
STY COLUPF
STY PF0
STY PF1
STY PF2

DEC Framethingie
BEQ IncFirstDigit
JMP RemainingLines

IncFirstDigit

LDA #1
STA Framethingie

LDA Tenthdigit
SBC #8
BEQ IncSecondDigit

INC Tenthdigit
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
JMP RemainingLines

IncSecondDigit

STY Tenthdigit
STA WSYNC
LDA Ninthdigit
SBC #9
BEQ IncThirdDigit

INC Ninthdigit
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
JMP RemainingLines

IncThirdDigit

STY Ninthdigit
STA WSYNC
LDA Eigthdigit
SBC #9
BEQ IncFourthDigit

INC Eigthdigit
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
JMP RemainingLines

IncFourthDigit

STY Eigthdigit
STA WSYNC
LDA Seventhdigit
SBC #9
BEQ IncFifthDigit

INC Seventhdigit
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
JMP RemainingLines

IncFifthDigit

STY Seventhdigit
STA WSYNC
LDA Sixthdigit
SBC #9
BEQ IncSixthDigit

INC Sixthdigit
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
JMP RemainingLines

IncSixthDigit

STY Sixthdigit
STA WSYNC
LDA Fifthdigit
SBC #9
BEQ IncSeventhDigit

INC Fifthdigit
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
JMP RemainingLines

IncSeventhDigit

STY Fifthdigit
STA WSYNC
LDA Fourthdigit
SBC #9
BEQ IncEigthDigit

INC Fourthdigit
STA WSYNC
STA WSYNC
STA WSYNC
JMP RemainingLines

IncEigthDigit

STY Fourthdigit
STA WSYNC
LDA Thirddigit
SBC #9
BEQ IncNinthDigit

INC Thirddigit
STA WSYNC
STA WSYNC
JMP RemainingLines

IncNinthDigit

STY Thirddigit
STA WSYNC
LDA Seconddigit
SBC #9
BEQ IncTenthDigit

INC Seconddigit
STA WSYNC
JMP RemainingLines

IncTenthDigit

STY Seconddigit
STA WSYNC
LDA Firstdigit
SBC #9
BEQ Rollover

INC Firstdigit
JMP RemainingLines

Rollover				; this should only happen if this program is allowed to
; run continuously for something like 6 years.
STY Firstdigit

RemainingLines

LDY #111

RemainingLinesLoop

STA WSYNC

DEY
BNE RemainingLinesLoop

; *****************************************************************************

LDA #\$0000
STA PF0
STA PF1
STA PF2
STA COLUPF
STA COLUBK

RTS

; *****************************************************************************
OverScan

; *****************************************************************************

LDX #30
KillLines
STA WSYNC
DEX
BNE KillLines
RTS

; *****************************************************************************
; Graphics Data

; *****************************************************************************

org \$FF00		; 40 x 5 + 5 = 205 bytes in this page so far, 252 max *****

FirstLineColor	.byte \$82
SecondLineColor	.byte \$84
ThirdLineColor	.byte \$86
FourthLineColor	.byte \$88
FifthLineColor	.byte \$8A

; *****************************************************************************

FirstLinePF0Right		; 10 x 4 = 40 bytes

.byte %01000000, %01000000, %01000000, %01100000, %10100000
.byte %11100000, %01000000, %11100000, %01000000, %01000000

FirstLinePF1Left

.byte %00100000, %00100000, %00100000, %01100000, %01010000
.byte %01110000, %00100000, %01110000, %00100000, %00100000

FirstLinePF1Right

.byte %00000010, %00000010, %00000010, %00000110, %00000101
.byte %00000111, %00000010, %00000111, %00000010, %00000010

FirstLinePF2Left

.byte %00000100, %00000100, %00000100, %00000110, %00001010
.byte %00001110, %00000100, %00001110, %00000100, %00000100

; *****************************************************************************

SecondLinePF0Right		; 10 x 4 = 40 bytes

.byte %10100000, %01100000, %10100000, %10000000, %10100000
.byte %00100000, %00100000, %10000000, %10100000, %10100000

SecondLinePF1Left

.byte %01010000, %01100000, %01010000, %00010000, %01010000
.byte %01000000, %01000000, %00010000, %01010000, %01010000

SecondLinePF1Right

.byte %00000101, %00000110, %00000101, %00000001, %00000101
.byte %00000100, %00000100, %00000001, %00000101, %00000101

SecondLinePF2Left

.byte %00001010, %00000110, %00001010, %00001000, %00001010
.byte %00000010, %00000010, %00001000, %00001010, %00001010

; *****************************************************************************

ThirdLinePF0Right		; 10 x 4 = 40 bytes

.byte %10100000, %01000000, %10000000, %11000000, %11100000
.byte %01100000, %01100000, %01000000, %01000000, %11000000

ThirdLinePF1Left

.byte %01010000, %00100000, %00010000, %00110000, %01110000
.byte %01100000, %01100000, %00100000, %00100000, %00110000

ThirdLinePF1Right

.byte %00000101, %00000010, %00000001, %00000011, %00000111
.byte %00000110, %00000110, %00000010, %00000010, %00000011

ThirdLinePF2Left

.byte %00001010, %00000100, %00001000, %00001100, %00001110
.byte %00000110, %00000110, %00000100, %00000100, %00001100

; *****************************************************************************

FourthLinePF0Right		; 10 x 4 = 40 bytes

.byte %10100000, %01000000, %01000000, %10000000, %10000000
.byte %10000000, %10100000, %01000000, %10100000, %10000000

FourthLinePF1Left

.byte %01010000, %00100000, %00100000, %00010000, %00010000
.byte %00010000, %01010000, %00100000, %01010000, %00010000

FourthLinePF1Right

.byte %00000101, %00000010, %00000010, %00000001, %00000001
.byte %00000001, %00000101, %00000010, %00000101, %00000001

FourthLinePF2Left

.byte %00001010, %00000100, %00000100, %00001000, %00001000
.byte %00001000, %00001010, %00000100, %00001010, %00001000

; *****************************************************************************

FifthLinePF0Right		; 10 x 4 = 40 bytes

.byte %01000000, %11100000, %11100000, %01100000, %10000000
.byte %01100000, %01000000, %01000000, %01000000, %01000000

FifthLinePF1Left

.byte %00100000, %01110000, %01110000, %01100000, %00010000
.byte %01100000, %00100000, %00100000, %00100000, %00100000

FifthLinePF1Right

.byte %00000010, %00000111, %00000111, %00000110, %00000001
.byte %00000110, %00000010, %00000010, %00000010, %00000010

FifthLinePF2Left

.byte %00000100, %00001110, %00001110, %00000110, %00001000
.byte %00000110, %00000100, %00000100, %00000100, %00000100

; *****************************************************************************

org \$FFFC
.word Start
.word Start

org \$FF00```

Attachment: odometer.bin
Description: odometer.bin

Attachment: slodometer.bin
Description: slodometer.bin