[stella] GunFight 2600: One Limit Reached!

Subject: [stella] GunFight 2600: One Limit Reached!
From: Manuel Polik <manuel.polik@xxxxxxxxxxx>
Date: Wed, 14 Feb 2001 17:09:12 +0100
Hi there!

I'm through with the single line kernel now -> I definitely need two
lines.
The current demo (#2) pushed the single kernel to the max, there's some
cycles left, but none of my desired features can be added with these
few...

Changes:
1 - assimilated all of Thomas' superior knowledge and put it 
    straight into the kernel
2 - limited the movement of the cowboys. 
    (Is it still enough for you Eckhard? :-))
3 - changed the colors. Now the sprites look exactly like 
    Pat Garret & Billy the Kid.
4 - Enabled the Missile to display something that, nearly but not 
    totally, looks different than a pistol (#1)
5 - Messed up the source some more with quick copy & paste stuff

If you like, please comment on the demo as such, or about the 'nextline'
loop. Any ideas/improvements appreciated.
-> All the rest of the source is just to get that thing going, I'll fix
& clean up that mess later. 

Greetings,
	Manuel

#1 Uhm, I read the german translation of 'The Restaurant At The End Of
The Universe' and tried to re-translate that joke. If it shows no
similarity to the original words at all now, it's only 50% my fault.
#2 I forced it to display like a double line kernel, but it'd work as
single. Just remove the second STA WSYNC. I did this, that YOU already
get used to the new double line look :-)

Attachment: gunfight.bin
Description: Binary data

	processor 6502
      	include vcs.h


SCREENSTART = $60

    	SEG.U vars
    	org $80

horPos 		ds 5		; Horizontal positions (Player/Player/Missile/Missile/Ball)
verPos 		ds 2       	; Vertical positions (Player/Player)
colorpointer 	ds 4		; pointer to color tables
playerpointer 	ds 4		; pointer to shape tables
sizepointer 	ds 4		; pointer to size tables

    	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  verPos
                STA  verPos+1

                LDX #$03
SetUpHorizontal LDA horpostab,X
                STA  horPos,X
                DEX
                BPL SetUpHorizontal

                LDA  #$1C
                STA  COLUBK

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

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 horPos,Y          ;+3  3
                JSR PosPlayer
                DEY
                BPL PosAnother

                STA WSYNC           ; Finish current line
                sta HMOVE

                LDX #SCREENSTART   ; Init display Kernel
                LDA #$08
                STA REFP1	    ; Reflect Player 1
                LDA #$02
		STA ENAM0
		STA ENAM1

	        LDA $F0



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

		LDA #<p0data        ; Init Pointers
		STA playerpointer ;
		LDA #>p0data        ; Init Pointers
		STA playerpointer+1 ;
		LDA #<p0data        ; Init Pointers
		STA playerpointer+2 ;
		LDA #>p0data        ; Init Pointers
		STA playerpointer+3 ;

		LDA #<colordata        ; Init Pointers
		STA colorpointer ;
		LDA #>colordata        ; Init Pointers
		STA colorpointer+1 ;
		LDA #<colordata2        ; Init Pointers
		STA colorpointer+2 ;
		LDA #>colordata2        ; Init Pointers
		STA colorpointer+3 ;

		LDA #<sizedata        ; Init Pointers
		STA sizepointer ;
		LDA #>sizedata        ; Init Pointers
		STA sizepointer+1 ;
		LDA #<sizedata2        ; Init Pointers
		STA sizepointer+2 ;
		LDA #>sizedata2        ; Init Pointers
		STA sizepointer+3 ;


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

SkipDraw	NOP
		LDA VSYNC
		NOP
		LDA #$00
		BEQ Continue

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

SkipDraw2	NOP
		LDA VSYNC
		NOP
		LDA #$00
		BEQ Continue2

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

nextLine        TXA
		CLC
		SBC verPos             ;
		STA WSYNC               
		STA WSYNC
    		ADC #$13
                TAY
    		BCC SkipDraw
		LDA (colorpointer),Y
                STA COLUP0
		LDA (playerpointer),Y           ;
Continue        STA  GRP0

		TXA
		CLC
		SBC verPos+1             ;
    		ADC #$13
                TAY
    		BCC SkipDraw2
		LDA (colorpointer+2),Y
		STA COLUP1
		LDA (playerpointer+2),Y           ;
Continue2       STA  GRP1

		DEX
                BNE nextLine

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

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 horPos ;set horizontal motion register to one pixel right
		INC horPos+3
      		LDA horPos+3
      		CMP #$40
      		BNE HorPosOK
      		DEC horPos
      		DEC horPos+3
HorPosOK 	rts

left  		DEC horPos+3  
      		DEC horPos       ;set horizontal motion register to one pixel left
      		LDA horPos
      		CMP #$FF
        	BNE HorPosOK2
      		INC horPos+3
      		INC horPos
HorPosOK2 	rts

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

down    	LDA verPos
        	CMP #$14
        	BEQ NoSink
        	DEC  verPos    ;decrease the vertical position
NoSink  	RTS

right2  	INC horPos+2 
	INC horPos+1 ;set horizontal motion register to one pixel right
      LDA horPos+1
      CMP #$99
        BNE HorPosOK3
      DEC horPos+2
      DEC horPos+1
HorPosOK3 rts

left2    DEC horPos+1       ;set horizontal motion register to one pixel left
	 DEC horPos+2
      LDA horPos+2
      CMP #$60
        BNE HorPosOK4
      INC horPos+1
      INC horPos+2
HorPosOK4 rts

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

down2   LDA verPos+1
        CMP #$14
        BEQ NoSink2
        DEC  verPos+1    ;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 $10,$90,$89,$19

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

    ORG $FF00

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

sizedata
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0

sizedata2
        .byte $00
        .byte $00
        .byte $00
        .byte $00
        .byte $00
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $F0
        .byte $30
        .byte $30
        .byte $30
        .byte $00
        .byte $10
        .byte $10
        .byte $10
        .byte $10

        org $FFFC
        .word start
        .word start
Current Thread