[stella] Gunfight 2600: Little progress...

Subject: [stella] Gunfight 2600: Little progress...
From: Manuel Polik <manuel.polik@xxxxxxxxxxx>
Date: Fri, 09 Mar 2001 09:53:29 +0100
Hi there!

Here's the next little step of Gunfight 2600:

After I talked everybody into giving me 9 bullets, I started with a
version that let's the bullets bounce from the borders, then, seeing the
output and watching it for two minutes I halfway got a headache :-)

I subsequently dumped all that & restarted with 6 bullets. Fine result
now, don't you agree?
(Ok, it's the death of the 3-way shot, maybe of 2-way too, but why
forcing it, when the little VCS such isn't capable enough)

BTW: The older two test versions crashed the StellaX emulator with
various effects when positioning objects on coordinates <0 or >160. At
least I _assume_ that this was the reason, not quite sure here. Now I
really wonder how these two old versions behaved on the real thing?
Worked like on Z26, crashed like StellaX or ???

Hope you like the new BIN, it's a funny demo, isn't it?

Greetings,
	Manuel

Attachment: gunfight.bin
Description: Binary data

    processor 6502
    include vcs.h

SCREENSTART = $60
UP          = SCREENSTART
DOWN        = $00
LEFT        = $00
RIGHT       = $A0

    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

frameCounter        ds 1 ;

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

rnd                 ds 2 ; random

bulletHorPos        ds 6 ; X Koordinates of the bullets
bulletVerPos        ds 6 ; Y Koordinates of the bullets
bulletData          ds 6 ; Direction & other Data of the bullets

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 pos
                    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

; Testing Code...
                    LDX #$05
BulletSpread        JSR Random
                    JSR Random
                    JSR Random
                    AND #$3E
                    STA bulletHorPos,X
                    JSR Random
                    JSR Random
                    JSR Random
                    AND #$3F
                    STA bulletVerPos,X
                    TXA
                    ASL
                    TAY
                    STY bulletData,X
                    DEX
                    BPL BulletSpread

                    LDA #$01
                    STA VDELP0
              
MainLoop            JSR VerticalSync    ; 
                    JSR VerticalBlank   ; 
                    JMP MainScreen      ; The mainscreen must be no sub!

; Here we're in the vertical sync, it animates the cowboys, too! 
; Manuels Reminder: There's 20 cycles left before the RTS...

VerticalSync        LDA #$02            ;
                    STA WSYNC           ; Finish current line
                    STA VSYNC           ; start vertical sync

                    LDY #$06
AnimateCowboys      LDA (playerShapePtr01),Y
                    STA playerShape01,Y
                    LDA (playerShapePtr00),Y
                    STA playerShape00,Y
                    TYA                 ; A needs to be zero at the end
                    DEY
                    BPL AnimateCowboys
                    RTS

; Here we're in the vertical blank!

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

; Move bullets
                    LDX #$05
BulletMove          
                    LDA bulletData,X
                    LSR
                    BCC DoVertical
                    LSR
                    LSR
                    JMP SkipVertical ; Maybe BCS later...
DoVertical          LSR
                    BCS vertIncrement
                    DEC bulletVerPos,X
                    LSR
                    BCC SkipVertical
                    DEC bulletVerPos,X
                    JMP SkipVertical ; Maybe BCS later...
vertIncrement
                    INC bulletVerPos,X
                    LSR
                    BCC SkipVertical
                    INC bulletVerPos,X

SkipVertical        LSR
                    BCS HorzIncrement
                    DEC bulletHorPos,X
                    LSR
                    BCC SkipHorizontal
                    DEC bulletHorPos,X
                    JMP SkipVertical ; Maybe BCS later...
HorzIncrement
                    INC bulletHorPos,X
                    LSR
                    BCC SkipHorizontal
                    INC bulletHorPos,X
SkipHorizontal

; Bounce bullets
                    LDA bulletData,X
                    LDY bulletVerPos,X
                    BPL BulletDownOK                    
                    ORA #%00000010
BulletDownOK
                    CPY #UP
                    BMI BulletUpOK                    
                    AND #%11111101
BulletUpOK
                    LDY bulletHorPos,X
                    BNE BulletLeftOK                    
                    ORA #%00001000
BulletLeftOK
                    CPY #RIGHT
                    BNE BulletRightOK                    
                    AND #%11110111
BulletRightOK
                    STA bulletData,X
                    DEX
                    BPL BulletMove



; Copy the right bulletdtata to the actual used bullet pointers.

                    INC frameCounter
                    LDA frameCounter
                    AND #$01
                    TAY
                    LDX bulletaccesstab,Y
                    LDY #$02
CopyNextBullet      LDA bulletHorPos,X
                    STA horPosM0,Y
                    LDA bulletVerPos,X
                    STA verPosM0,Y
                    INX
                    DEY
                    BPL CopyNextBullet

; 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

WaitIntimReady      LDA INTIM           ; finish vertical blank
                    BNE WaitIntimReady  ;
                    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
                    NOP
                    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
                    DEY
                    BNE NextLine

; Ok, screen is drawn, now start the overscan & blank the screen

                    LDX #$FF
                    TXS

                    STA WSYNC
                    LDA #$02            ;
                    STA VBLANK          ; Start vertical blank
                    LDA #$23            ;
                    STA TIM64T          ; Init timer

; We're in the overscan now...
                    
                    JSR  joy        ; Read the joysticks.

; After we read the joysticks, animate!

                    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

                    JSR WaitIntimReady  
                    JMP MainLoop

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+2
                    BNE VerPosOk
                    DEC  verPosP0,X
                    LDA playerMovement,X
                    ORA #$01
                    STA playerMovement,X
VerPosOk            JMP UpDone

down                DEC verPosP0,X
                    LDA  verPosP0,X
                    CMP #$0C
                    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

Random
       lda rnd
       lsr
       lsr
       sbc rnd
       lsr
       ror rnd+1
       ror rnd
       ror rnd
       lda rnd
       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

    ORG $F400

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

bulletaccesstab
    .byte $00,$03

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
Current Thread