Subject: Re: [stella] Gas gauge - revisited|
From: Joe Grand <jgrand@xxxxxxxxxxxxxx>
Date: Wed, 21 Mar 2001 22:57:54 -0500
The easiest way would be faking it with the background color, like Chris suggested.
Let's say, you'd do a defined background color change during a scannline like this:
<-- Green --><--------- normal BG color ------------> | Cycle X
Now, you'd always change the background color at the beginning of a scannline and again on cycle X. Now you can easily draw a growing red PF bar within the green bar.
Description: Binary data
processor 6502 include vcs.h Temp0 = $80 MaxScr EQU $20 ORG $F800 Start: SEI ; Initialize the machine, set interrupt disable CLD ; clear decimal mode LDX #$FF ; start X at $FF (255d) TXS ; transfer it to the stack INX ; set X to $00 TXA ; transfer it to the accumulator, A B1: STA 0,X ; store $00 at 0+X INX ; increment X BNE B1 ; if X is not zero yet, go back to @1 ; the above loop zeros out $00 to $FF ; at this point X is $00 LDA #$04 ; number of lines alike STA Temp0 ; Top: ; Start a new screen ;LDA #$05 LDA #$35 STA TIM64T ; set timer for $05*$40 = $140 (320d) clocks ; do overscan stuff here LDA #$00 ; put $00 in A STA PF0 ; clear out first playfield section STA PF1 ; clear out second playfield section STA PF2 ; clear out third playfield section STA GRP0 ; clear out player graphic 0 STA GRP1 ; clear out player graphic 1 STA ENAM0 ; clear out missile 0 STA ENAM1 ; clear out missile 1 STA ENABL ; clear out ball STA COLUP1 ; set player 1 to black STA COLUP0 ; set player 0 to black STA COLUBK ; set background to black ;wait for overscan to finish, then start blanking B2: LDA INTIM ; find current value of timer BNE B2 ; if timer not zero, wait ; when we get here, A will be $00 LDY #$02 ; this is 10000010b STY WSYNC ; wait for end of current line STY VBLANK ; start vertical, disable latches, dump orts ; this is from the 10000010b STY VSYNC ; start vertical sync STY WSYNC ; send three lines while doing vertical sync STY WSYNC STY WSYNC STA VSYNC ; end vertical sync ;LDA #$05 ; put $05 in A LDA #$43 STA TIM64T ; start VBLANK timer ; Setup the playfield graphics LDA #%10111000 ; green STA COLUPF JSR Blank ; do blanking stuff STA WSYNC ; one more line for good measure ; Draw the screen ; GOAL: draw 1 2 3 4 5 6 7 8 9 0 across screen in playfield graphics ; JOE'S NEW GOAL: draw multi-colored gas gauge in playfield graphics LDX #100 ; position drawing vertically PreDraw: STA WSYNC ; wait for one line to be done DEX ; decrease X by one BNE PreDraw ; if not done with blank space, do another line LDX #$00 NxtLine: STA WSYNC ; wait for line to finish LDA #%00110100 ; red STA COLUBK ; set background LDA #$00 STA PF0 STA PF1 STA PF2 ; First half of screen ;LDA Table1,X ; get the Xth line for playfield 0 ;STA PF0 ; store it in playfield 0 register ;LDA Table2,X ; get the Xth line for playfield 1 ;STA PF1 ; store it in playfield 1 register ;LDA Table3,X ; get the Xth line for playfield 2 ;STA PF2 ; store it in playfield 2 register NOP ; wait NOP ; wait NOP ; wait NOP ; wait NOP ; wait NOP ; wait ; Second half of screen LDA Table4,X ; get the Xth line for playfield 0 STA PF0 ; store it in playfield 0 register LDA Table5,X ; get the Xth line for playfield 1 STA PF1 ; store it in playfield 1 register ;LDA Table6,X ; get the Xth line for playfield 2 ;STA PF2 ; store it in playfield 2 register DEC Temp0 BNE NxtLine LDA #$04 STA Temp0 ; Temp0 is how many lines alike INX ; increment X CPX #$02 ; done with data yet? PF for gas gauge is only 2 bytes wide ;CPX #$08 BNE NxtLine ; if not do next line STA WSYNC LDA #$00 ; get ready to clear playfield STA PF0 STA PF1 ;STA PF2 STA COLUBK LDX #71 ; get ready to finish screen (172 lines total) Finish: STA WSYNC ; do one line DEX ; decrement counter BNE Finish ; if not on last line, do another one JMP Top ; done with this frame, go back to Top Blank: NOP B3: LDA INTIM ; find out current status of timer BNE B3 ; if timer is zero, then done, otherwise check timer STA WSYNC ; A is $00, kick out another line STA VBLANK ; blank off, disable latches, remove dump RTS org $FE00 ; *********************** GRAPHICS DATA ;Table1: .byte $00, $00, $00, $00, $00, $00, $F0, $F0 ;PF0 left half (20 bits total) ;.word $6040 ;.word $4040 ;.word $00E0 ;.word $0000 ;Table2: .byte $00, $00, $00, $00, $00, $00, $F0, $F0 ;PF1 left half ;.word $1177 ;.word $4173 ;.word $0077 ;.word $0000 ;Table3: .byte $00, $00, $00, $00, $00, $00, $F0, $F0 ;PF2 left half ;.word $2AEA ;.word $88EE ;.word $00E8 ;.word $0000 Table4: ;.byte $00, $00, $00, $00, $00, $00, $F0, $F0 ;PF0 right half (20 bits total) .byte $F0, $F0 ;.word $20E0 ;.word $A0E0 ;.word $00E0 ;.word $0000 Table5: ;.byte $00, $00, $00, $00, $00, $00, $FC, $FC ;PF1 right half .byte $FC, $FC ;.word $1577 ;.word $1517 ;.word $0017 ;.word $0000 ;Table6: .byte $00, $00, $00, $00, $00, $00, $00, $00 ;PF2 right half ;.word $AAEE ;.word $A8AE ;.word $00E8 ;.word $0000 ORG $FFFC ; vectors for 4k cart .word Start ; reset .word Start ; IRQ