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 <jpatters@xxxxxxxxxxx>
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

Current Thread