[stella] Gunfight 2600: Westward Ho!

Subject: [stella] Gunfight 2600: Westward Ho!
From: Manuel Polik <manuel.polik@xxxxxxxxxxx>
Date: Mon, 19 Feb 2001 19:20:48 +0100
Hi again!

I spent some time transferring my Gunfight kernel from 1LK to a real 2LK
now. Looks promising I think.
Additionally I added the *shot* & gave the guns at least some shape.
Think I understood now, how VDEL works :-)

I've some cycles left in the second scannline, so now the crashcourse
'Drawing with missiles in 18 cycles' would come in handy :-)

Is there any working example source of drawing with missiles out
anywhere? I didn't find one in the archive.

Some theories from me about that subject:

Any HMOV during the kernel would mess up the left side with black lines,
so I'd have to do it the Activision way & do a 'STA HMOV' every single
line, I fear. Right?

First (clever I thought :-)) idea I had, was to have a fixed size of the
missile and move it one/two pixels every line. So, it could draw
something like this for example:

**
 **
  **
   **
    **
     **
      **
       **
	**
	 **
	  **
	   **
	    **
	     **
	      **
	       **

It'd paint that on the whole screen, but I'd only display 4 lines on the
vertical height of the cowboy. So a structure lokking like this:
       **	
	**
	 **
	  **

Would be displayed on the right height and I'd only need to shift it
horizontally to the right cowboy for a gun looking up (or two the left
for a gun looking down)

It didn't work out, for too possible reasons:

- Either I was too stupid...
- ...positioning wouldn't work with values > 160 & subsequently shifting
it left/right from there wouldn't work, too.

I hopefully assume it's the second reason :-)

Ok, now I'd need other ideas, sources, snippets, anything that uses
missiles to draw something.

I attached the current version of Gunfight, plus source. It's an even
bigger mess now, don't bother looking at anything except the 'nextline
loop', if you're interested in the display kernel. First goal is getting
it going, then I clean it up.

Attachment: gunfight.bin
Description: Binary data

	processor 6502
      	include vcs.h


SCREENSTART = $60

    	SEG.U vars
    	org $80

horPosP0 		ds 1		; Horizontal position
horPosP1		ds 1		; Horizontal position
horPosM0 		ds 1		; Horizontal position
horPosM1 		ds 1		; Horizontal position
horPosBL 		ds 1		; Horizontal position

verPosP0 		ds 1       	; Vertical position
verPosP1 		ds 1       	; Vertical position
verPosM0 		ds 1       	; Vertical position
verPosM1 		ds 1       	; Vertical position
verPosBL 		ds 1       	; Vertical position


colorpointer 	ds 4		; pointer to color tables
playerpointer 	ds 4		; pointer to shape tables
sizepointer 	ds 4		; pointer to size tables
color			ds 2		; cowboy colors
gunSize		ds 2		; cowboy colors

    	SEG code
        org  $F000

start           SEI
                CLD
                LDX  #$FF
                TXS
                LDA  #$00

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

                LDA  #$32       ;set up some of the variables.
                STA  COLUP0     ;set up sprite colour

                LDA  #$30       ;set up the starting vertical position of sprite
                STA  verPosP0
                STA  verPosP1
		    LDA #$25
                STA  verPosM0
                STA  verPosM1
		    STA  verPosBL
                LDX #$03
SetUpHorizontal LDA horpostab,X
                STA  horPosP0,X
                DEX
                BPL SetUpHorizontal

                LDA  #$1C
                STA  COLUBK

        
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  ; Wait until vertical sync finished

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

; Position all objects

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

                STA WSYNC           ; Finish current line
                sta HMOVE
                LDY #SCREENSTART   ; Init display Kernel
                LDA #$08
                STA REFP1	    ; Reflect Player 1
                LDA #$02
        LDA $F0


; Init pointers (yes, a very quick hack :-))

		CLC
		LDA #<p0data        ; Init Pointers
		SBC verPosP0
    		ADC #$13
		STA playerpointer ;
		LDA #>p0data        ; Init Pointers
		STA playerpointer+1 ;
		CLC
		LDA #<p0data        ; Init Pointers
		SBC verPosP1
    		ADC #$13
		STA playerpointer+2 ;
		LDA #>p0data        ; Init Pointers
		STA playerpointer+3 ;

		LDA #$01
		sta VDELP0
		sta VDELBL


		LDA #$30
		sta NUSIZ0
		sta NUSIZ1

;		STA HMCLR	; must be enough space from WSYNC!
;		LDA #$F0
;   		sta HMM0           ;+3 10
;		LDA #$10
;    		sta HMM1           ;+3 10

		inc horPosBL

		CLC
		LDA #<colordata        ; Init Pointers
		SBC verPosP0
    		ADC #$13
		STA colorpointer ;
		LDA #>colordata        ; Init Pointers
		STA colorpointer+1 ;
		CLC
		LDA #<colordata2        ; Init Pointers
		SBC verPosP1
    		ADC #$13
		STA colorpointer+2 ;
		LDA #>colordata2        ; Init Pointers
		STA colorpointer+3 ;

WaitIntimReady  LDA INTIM           ; Wait until vertical blank finished
                BNE WaitIntimReady  ;
                RTS

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

SkipDraw	NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		SEC
		LDA #$00
		BEQ Continue

SkipDraw2	NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		SEC
		LDA #$00
		BEQ Continue2

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

NextLine    LDX #$1F
		TXS
		LDX #$00
		TYA
		SBC verPosP0             ;
		STA WSYNC
    		ADC #$13
    		BCC SkipDraw
		lda color
            STA COLUP0
		LDA (colorpointer),Y
		sta color
		LDA (playerpointer),Y           ;
            STX COLUP1
Continue
	    	STA  GRP0
		TYA
		SBC verPosP1             ;
    		ADC #$13
		BCC SkipDraw2
		lda color+1
            STA COLUP1
		LDA (colorpointer+2),Y
		sta color+1
            STX COLUP0
		LDA (playerpointer+2),Y           ;
Continue2       
		CPY verPosBL
		PHP
		NOP
		NOP
		NOP
		NOP
		STX COLUP1
		STA  GRP1
		lda color
            STA COLUP0
		TYA
		CLC
		SBC verPosM1
		AND #$FE
		PHP
		TYA
		CLC
		SBC verPosM0
		AND #$FE
		PHP
		SEC
		NOP
		NOP
		NOP
		NOP
		NOP
		lda color+1
            STA COLUP1
		STX COLUP0
		DEY
            BNE NextLine

		LDX #$FF
		TXS

oscan2          JSR  joy        ;overscan. Time to read the joysticks.
                LDX  #$1E
                JSR Waste 
                JMP MainLoop        ; Repeat

joy             LDY #$00
                LDA  SWCHA      
                ASL
        	BCC right
        	ASL
        	BCC left
       	 	ASL
        	BCC down
        	ASL
        	BCC up
        	ASL
        	BCC right2
        	ASL
        	BCC left2
        	ASL
        	BCC down2
        	ASL
        	BCC up2
        	RTS
    
right   	INC horPosM1
		INC horPosP0
     		LDA horPosP0
     		CMP #$31
     		BNE HorPosOK
     		DEC horPosP0
     		DEC horPosM1
HorPosOK 	rts

left  		DEC horPosM1  
      		DEC horPosP0       ;set horizontal motion register to one pixel left
      		LDA horPosP0
      		CMP #$07
        	BNE HorPosOK2
      		INC horPosM1
      		INC horPosP0
HorPosOK2 	rts

up      	LDA  verPosP0    ;make sure we haven't gone over the top of the screen
        	CMP #SCREENSTART-1
        	BEQ NoClimb
        	INC  verPosP0    ;if not then increase the vertical position
        	INC  verPosM1    ;if not then increase the vertical position
NoClimb 	RTS

down    	LDA verPosP0
        	CMP #$15
        	BEQ NoSink
        	DEC  verPosP0    ;decrease the vertical position
        	DEC  verPosM1    ;decrease the vertical position
NoSink  	RTS

right2  	INC horPosM0 
	INC horPosP1 ;set horizontal motion register to one pixel right
      LDA horPosP1
      CMP #$99
        BNE HorPosOK3
      DEC horPosM0
      DEC horPosP1
HorPosOK3 rts

left2    DEC horPosP1       ;set horizontal motion register to one pixel left
	 DEC horPosM0
      LDA horPosP1
      CMP #$68
        BNE HorPosOK4
      INC horPosP1
      INC horPosM0
HorPosOK4 rts

up2      LDA  verPosP1    ;make sure we haven't gone over the top of the screen
        CMP #SCREENSTART-1
        BEQ NoClimb2
        INC  verPosP1    ;if not then increase the vertical position
        INC  verPosM0    ;if not then increase the vertical position
NoClimb2 RTS

down2   LDA verPosP1
        CMP #$15
        BEQ NoSink2
        DEC  verPosP1    ;decrease the vertical position
        DEC  verPosM0    ;decrease the vertical position
NoSink2  RTS

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              ;when branch not taken: +2 (18 + x*5)
    sta RESP0,Y         ;(21 + x*5)
    sta WSYNC
    rts

    ORG $FE00

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

horpostab
    .byte $18,$90,$89,$21

    ORG $FF80

p0data  
        .byte %11101110
        .byte %10001000
        .byte %01001100
        .byte %00100110
        .byte %01111110
        .byte %10111100
        .byte %10111100
        .byte %10111100
        .byte %11111100
        .byte %01111111
        .byte %00111111
        .byte %00011000
        .byte %00111100
        .byte %00111110
        .byte %00110100
        .byte %11111111
        .byte %00111100
        .byte %00101100
        .byte %00101000

colordata
        .byte $00
        .byte $00
        .byte $00
        .byte $00
        .byte $00
        .byte $88
        .byte $86
        .byte $84
        .byte $82
        .byte $82
        .byte $82
        .byte $3C
        .byte $3C
        .byte $3C
        .byte $3C
        .byte $13
        .byte $15
        .byte $15
        .byte $17

colordata2
        .byte $00
        .byte $00
        .byte $00
        .byte $00
        .byte $00
        .byte $F8
        .byte $F6
        .byte $F4
        .byte $F2
        .byte $F2
        .byte $F2
        .byte $3E
        .byte $3E
        .byte $3E
        .byte $00
        .byte $11
        .byte $12
        .byte $13
        .byte $14

        org $FFFC
        .word start
        .word start
Current Thread