[stella] Gunfight 2600: Descissions had to be made

Subject: [stella] Gunfight 2600: Descissions had to be made
From: Manuel Polik <manuel.polik@xxxxxxxxxxx>
Date: Mon, 05 Mar 2001 16:36:48 +0100
Hi there!

I just finished a new version of Gunfight 2600.

Changes are:

- Added Shooting animation
- Restricted the cowboy movements
- Restricted the shooting angles
- Added some playfield

I did all this in order to come closer to the original appearance of
Gunfight. I'll do playfield obstacles in the area where I now just
display the line-counter.

The next step I'll work on is the weapons system. Continuing with the
playfield right now doesn't make sense, since I just don't now how many
RAM is left after I'm done with the weapons. (I need at least need 2
bytes of X/Y coordinates, plus one byte direction + one byte lifetime
per bullet, so handling 12 bullets for example would eat up a minimum of
48 bytes RAM...) 

Please comment on the new demo. I hope it works fine for both players, I
just had no second player to test if the players can interfere with each
other during some weird Joystick movements :-)

Greetings,
	Manuel

BTW: Eckhard, if you're reading this, I've a question for you, since you
wrote some time ago to Andrew:
"One other thing that I noticed on your demo is, that it only does about
249 scanlines per frame, and every couple of scanlines there is a frame
where you do a different number of scanlines, so that the screen jumps.
Z26 displays the number of scanlines in the last completed frame, when
you start it with the -n command line switch. This could help you to
generate a proper display."

Now, _where_ do I see "the number of scanlines in the last completed
frame"?!? ATM I don't see anything...

Attachment: gunfight.bin
Description: Binary data

    processor 6502
    include vcs.h

SCREENSTART = $60

    SEG.U vars
    org $80

horPosP0            ds 1 ; Horizontal position player 0
horPosP1            ds 1 ; Horizontal position player 1
horPosM0            ds 1 ; Horizontal position missile 0
horPosM1            ds 1 ; Horizontal position missile 1
horPosBL            ds 1 ; Horizontal position ball

verPosP0            ds 1 ; Vertical position player 0
verPosP1            ds 1 ; Vertical position player 1
verPosM0            ds 1 ; Vertical position missile 0
verPosM1            ds 1 ; Vertical position missile 1
verPosBL            ds 1 ; Vertical position ball

colorBuffer         ds 2 ; Buffer player colors temporary
hairBuffer          ds 2 ; Buffer player haircolor permanent

playerShapePtr00    ds 2 ; Pointer to current player 0 shape in the ROM
playerShapePtr01    ds 2 ; Pointer to current player 1 shape in the ROM

animCounter         ds 2 ; Simple frameCounters, one for each player
playerMovement      ds 2 ; backup the Joystick readings for each player

playerShape00       ds 11 ; Player 0 shape complete in the RAM
playerShape01       ds 11 ; Player 1 shape complete in the RAM
colorShape00        ds 11 ; Player 0 colors complete in the RAM
colorShape01        ds 11 ; Player 1 colors complete in the RAM

    SEG code
    org  $F000
                    
start               SEI
                    CLD
                    LDX #$FF
                    TXS
                    LDA #$00

zero                STA $00,X      ;zero out the machine
                    DEX
                    BNE zero

                    LDA #$30       ;set up the starting vertical position of sprite
                    STA verPosP0
                    STA verPosP1
                    LDA #$25
                    STA verPosM0
                    STA verPosM1
                    STA verPosBL

                    LDA #$18
                    STA horPosP0
                    LDA #$90
                    STA horPosP1

                    LDA #$1C
                    STA COLUBK

                    LDA #$01
                    STA CTRLPF

                    LDA #<cbup00
                    sta playerShapePtr00
                    sta playerShapePtr01
                    LDA #>cbup00
                    sta playerShapePtr00+1
                    sta playerShapePtr01+1

                    LDA #$3C
                    STA hairBuffer
                    STA hairBuffer+1

                    LDX #$0A
ResetPlayers        LDA cbup00,X
                    STA playerShape00,X
                    STA playerShape01,X
                    LDA colordata,X
                    STA colorShape00,X
                    LDA colordata2,X
                    STA colorShape01,X
                    DEX
                    BPL ResetPlayers

                    LDA menwithouthats
                    STA playerShape01+9
                    LDA menwithouthats+1
                    STA playerShape01+10
                    LDA #$F4
                    STA colorShape01+9

MainLoop            JSR VerticalSync    ; 
                    JSR VerticalBlank   ; 
                    JMP MainScreen      ; MainScreen does Overscan

VerticalSync        LDA #$02            ;
                    STA WSYNC           ; Finish current line
                    STA VSYNC           ; start vertical sync
                    LDA #$03            ;
                    STA TIM64T          ;
                    JMP WaitIntimReady  ; finish vertical sync

VerticalBlank       STA WSYNC           ; Finish current line
                    STA VSYNC           ; Stop vertical sync
                    LDA #$2B            ;
                    STA TIM64T          ; Init timer

; Position all objects

                    LDY #$04
PosAnother          ldx horPosP0,Y      ;
                    JSR PosPlayer
                    DEY
                    BPL PosAnother

                    STA WSYNC           ; Finish current line
                    STA HMOVE
                    LDY #SCREENSTART    ; Init display Kernel
                    LDA #$02
                    LDA $F0

                    INC horPosBL
                    INC horPosM0
                    INC horPosM0
                    INC horPosM1
                    INC horPosM1
                    INC horPosM1

                    LDA #$01
                    STA VDELP0

WaitIntimReady      LDA INTIM           ; finish vertical blank
                    BNE WaitIntimReady  ;
                    RTS

Waste               STA WSYNC           ; Waste a line
                    DEX                 ;
                    BNE Waste           ; if X is not zero, do more lines
                    RTS

SkipDraw   
                    NOP
                    SEC
                    LDA VSYNC
                    LDA #$00
                    BEQ Continue

SkipDraw2       
                    NOP
                    SEC
                    LDA VSYNC
                    LDA #$00
                    BEQ Continue2

MainScreen          STA WSYNC           ; Finish current line
                    STA VBLANK          ; Stop vertical blank

NextLine            LDX #$1F
                    TXS
                    TYA
                    STA WSYNC
                    CPY verPosBL
                    PHP
                    CPY verPosM1
                    PHP
                    CPY verPosM0
                    PHP
                    SEC
                    SBC verPosP0             ;
                    ADC #$0B
                    BCC SkipDraw
                    TAX
                    LDA colorShape00,X
                    STA colorBuffer
                    LDA playerShape00,X           ;
Continue
                    STA GRP0
                    TYA
                    SBC verPosP1             ;
                    ADC #$0B
                    BCC SkipDraw2
                    TAX
                    LDA colorShape01,X
                    STA colorBuffer+1
                    LDA playerShape01,X           ;
Continue2       
                    LDX colorBuffer
                    STY PF2
                    STA WSYNC
                    STA GRP1
                    STX COLUP0
                    LDA colorBuffer+1
                    STA COLUP1
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    NOP
                    DEY
                    BNE NextLine

                    LDX #$FF
                    TXS

                    STA WSYNC
                    LDA #$02            ;
                    STA VBLANK          ; Start vertical blank
                    
                    JSR  joy        ; Read the joysticks.

                    LDX #$01
AnimPlayer          LDA playerMovement,X
                    EOR #$FF
                    AND #$0F
                    BEQ NoAnim         
                    LDY #$3C        ; Assume No Hair
                    CMP #$01
                    BNE HairsOk
                    LDY haircolors,X ; Load Hair
HairsOk             STY hairBuffer,X
                    AND #$0F
                    BEQ NoAnim         
                    ASL
                    ASL
                    STA playerMovement,X
                    INC animCounter,X
                    LDA animCounter,X
                    AND #$18
                    LSR
                    LSR
                    LSR
                    ADC playerMovement,X
                    TAY
                    TXA
                    ASL
                    TAX
                    LDA cowboyWalk,Y
                    STA playerShapePtr00,X
                    TXA
                    LSR
                    TAX
NoAnim              DEX
                    BPL AnimPlayer

                    LDA hairBuffer
                    STA colorShape00+8
                    LDA hairBuffer+1
                    STA colorShape01+8

                    LDY #$06
AnimateCowboys      LDA (playerShapePtr01),Y
                    STA playerShape01,Y
                    LDA (playerShapePtr00),Y
                    STA playerShape00,Y
                    DEY
                    BPL AnimateCowboys

                    LDX  #$1E
                    JSR Waste 
                    JMP MainLoop        ; Repeat

joy                 LDA SWCHA      
                    LDX INPT4
                    BMI NoButton1
                    TAY
                    EOR #$FF
			  LSR
			  LSR
			  LSR
			  LSR
                    TAX
                    AND #$08
                    BEQ NoButton05
                    LDA cowboyShoot,X
                    STA playerShapePtr00
			  LDA #$00
                    STA REFP0
                    LDA #$3C
			  STA hairBuffer
                    TYA
                    ORA #$F0
                    BNE NoButton1
NoButton05          TYA
NoButton1           LDX INPT5
                    BMI NoButton2
			  TAY
                    EOR #$FF
                    AND #$0F
			  TAX
			  AND #$04
                    BEQ NoButton15
                    LDA cowboyShoot,X
                    STA playerShapePtr01
			  LDA #$08
                    STA REFP1
                    LDA #$3C
			  STA hairBuffer+1
			  TYA
                    ORA #$0F
                    BNE NoButton2
NoButton15          TYA
NoButton2           LDX #$01
JoyPlayer2      
                    STA playerMovement,X
                    LSR
                    TAY
                    BCC up
UpDone              TYA     
                    LSR
                    TAY
                    BCC down
DownDone            TYA    
                    LSR
                    TAY
                    BCC left
LeftDone            TYA    
                    LSR
                    TAY
                    BCC right
RightDone           TYA
                    DEX
                    BPL JoyPlayer2
                    RTS

right               INC horPosP0,X
                    LDA horPosP0,X
                    CMP rightrestriction,X
                    BNE HorPosOK
                    DEC horPosP0,X
                    LDA playerMovement,X
                    ORA #$08
                    STA playerMovement,X
HorPosOK            LDA #$00
                    STA REFP0,X
                    JMP RightDone

left                DEC horPosP0,X
                    LDA horPosP0,X
                    CMP leftrestriction,X
                    BNE HorPosOK2
                    INC horPosP0,X
                    LDA playerMovement,X
                    ORA #$04
                    STA playerMovement,X
HorPosOK2           LDA #$08
                    STA REFP0,X
                    JMP LeftDone

up                  INC verPosP0,X
                    LDA verPosP0,X
                    CMP #SCREENSTART-1
                    BNE VerPosOk
                    DEC  verPosP0,X
                    LDA playerMovement,X
                    ORA #$01
                    STA playerMovement,X
VerPosOk            JMP UpDone

down                DEC verPosP0,X
                    LDA  verPosP0,X
                    CMP #$0D
                    BNE VerPosOk2
                    INC  verPosP0,X
                    LDA playerMovement,X
                    ORA #$02
                    STA playerMovement,X
VerPosOk2           JMP DownDone

PosPlayer
                    sta WSYNC           ;begin scanline
                    lda HorzTable,X     ;+4  7  
                    sta HMP0,Y          ;+3 10
                    and #$0F            ;+2 12
                    tax                 ;+2 14
P0                  dex                 ;+2 16
                    bpl P0              ;
                    sta RESP0,Y         ;
                    rts

cowboyWalk 
         .byte #<cbup01,#<cbup00,#<cbup01,#<cbup02  ; DummyLine
         .byte #<cbup01,#<cbup00,#<cbup01,#<cbup02  ; Up
         .byte #<cbup01,#<cbup00,#<cbup01,#<cbup02  ; Down
         .byte #<cbup01,#<cbup00,#<cbup01,#<cbup02  ; DummyLine
         .byte #<cblt01,#<cblt00,#<cblt01,#<cblt02  ; Left
         .byte #<cblu01,#<cblu00,#<cblu01,#<cblu02  ; Left-Up
         .byte #<cbld01,#<cbld00,#<cbld01,#<cbld02  ; Left-Down
         .byte #<cbup01,#<cbup00,#<cbup01,#<cbup02  ; DummyLine
         .byte #<cblt01,#<cblt00,#<cblt01,#<cblt02  ; Right
         .byte #<cblu01,#<cblu00,#<cblu01,#<cblu02  ; Right-Up
         .byte #<cbld01,#<cbld00,#<cbld01,#<cbld02  ; Right-Down

menwithouthats
    .byte %00111000
    .byte %00000000

cowboyShoot
         .byte #<cbup01 ; DummyLine
         .byte #<cbup01 ; DummyLine
         .byte #<cbup01 ; DummyLine
         .byte #<cbup01 ; DummyLine
         .byte #<cblt03 ; Left
         .byte #<cblu03 ; Left-Up
         .byte #<cbld03 ; Left-Down
         .byte #<cbup01 ; DummyLine
         .byte #<cblt03 ; Right
         .byte #<cblu03 ; Right-Up
         .byte #<cbld03 ; Right-Down

cbup00
    .byte %00001100
    .byte %01101100
    .byte %01101100
    .byte %00111000
    .byte %00111010
    .byte %10111010
    .byte %01111100
    .byte %00010000
    .byte %00111000
    .byte %01111100
    .byte %00111000

cbup01
    .byte %01101100
    .byte %01101100
    .byte %01101100
    .byte %00111000
    .byte %10111010
    .byte %10111010
    .byte %01111100

cbup02
    .byte %01100000
    .byte %01101100
    .byte %01101100
    .byte %00111000
    .byte %10111000
    .byte %10111010
    .byte %01111100

cblt00
    .byte %11000011
    .byte %11000110
    .byte %01101100
    .byte %00111000
    .byte %10111000
    .byte %10111110
    .byte %01111000

cblt01
    .byte %00111100
    .byte %00111000
    .byte %00111000
    .byte %00111000
    .byte %01111000
    .byte %01111000
    .byte %00111000

cblt02
    .byte %11000011
    .byte %11000110
    .byte %01101100
    .byte %00111000
    .byte %01111000
    .byte %00111100
    .byte %00111000

cblt03
    .byte %00111100
    .byte %00111000
    .byte %00111000
    .byte %00111000
    .byte %00111100
    .byte %00111111
    .byte %00111000

cbld00
    .byte %11001100
    .byte %11001110
    .byte %01101100
    .byte %00111000
    .byte %01111000
    .byte %11111000
    .byte %01111000

cbld01
    .byte %01111110
    .byte %01101100
    .byte %01101100
    .byte %00111000
    .byte %10111010
    .byte %11111100
    .byte %01111000

cbld02
    .byte %11001100
    .byte %11001110
    .byte %01101100
    .byte %00111000 
    .byte %10111100
    .byte %10111111
    .byte %01111100

cbld03
    .byte %01111110
    .byte %01101100
    .byte %01101100
    .byte %00111000
    .byte %01111010
    .byte %11111100
    .byte %01111000


cblu00
    .byte %11001100
    .byte %11001110
    .byte %01101100
    .byte %00111000
    .byte %00111000
    .byte %01111100
    .byte %01111100

cblu01
    .byte %01111110
    .byte %01101100
    .byte %01101100
    .byte %00111000
    .byte %11111001
    .byte %11111110
    .byte %01111100

cblu02
    .byte %11001100
    .byte %11001110
    .byte %01101100
    .byte %00111000
    .byte %10111000
    .byte %11111110
    .byte %01111100

cblu03
    .byte %01111110
    .byte %01101100
    .byte %01101100
    .byte %00111000
    .byte %10111000
    .byte %01111110
    .byte %01111101

rightrestriction
    .byte $29,$99

leftrestriction
    .byte $FF,$6F

haircolors
    .byte $00,$F4

colordata
        .byte $F4
        .byte $F2
        .byte $F2
        .byte $F0
        .byte $00
        .byte $00
        .byte $00
        .byte $3C
        .byte $3C
        .byte $15
        .byte $17

colordata2
        .byte $E4
        .byte $E2
        .byte $E2
        .byte $E0
        .byte $00
        .byte $00
        .byte $00
        .byte $3C
        .byte $3C
        .byte $00
        .byte $00

    ORG $FF00

HorzTable    ;this must not cross a page boundary
    .byte $30,$20,$10,$00,$F0,$E0,$D0,$C0,$B0,$A0,$90
    .byte $71,$61,$51,$41,$31,$21,$11,$01,$F1,$E1,$D1,$C1,$B1,$A1,$91
    .byte $72,$62,$52,$42,$32,$22,$12,$02,$F2,$E2,$D2,$C2,$B2,$A2,$92
    .byte $73,$63,$53,$43,$33,$23,$13,$03,$F3,$E3,$D3,$C3,$B3,$A3,$93
    .byte $74,$64,$54,$44,$34,$24,$14,$04,$F4,$E4,$D4,$C4,$B4,$A4,$94
    .byte $75,$65,$55,$45,$35,$25,$15,$05,$F5,$E5,$D5,$C5,$B5,$A5,$95
    .byte $76,$66,$56,$46,$36,$26,$16,$06,$F6,$E6,$D6,$C6,$B6,$A6,$96
    .byte $77,$67,$57,$47,$37,$27,$17,$07,$F7,$E7,$D7,$C7,$B7,$A7,$97
    .byte $78,$68,$58,$48,$38,$28,$18,$08,$F8,$E8,$D8,$C8,$B8,$A8,$98
    .byte $79,$69,$59,$49,$39,$29,$19,$09,$F9,$E9,$D9,$C9,$B9,$A9,$99
    .byte $7A,$6A,$5A,$4A,$3A,$2A,$1A,$0A,$FA,$EA,$DA,$CA,$BA,$AA,$9A

        org $FFFC
        .word start
        .word start
Current Thread