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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[stella] 20 columns of almost-reada, B. Watson | Thread | Re: Ten digit playfield routine, wa, B. Watson |
[stella] 20 columns of almost-reada, B. Watson | Date | [stella] Tune2600 v0.5, Thomas Jentzsch |
Month |