[stella] Gunfight 2600: Worst Nightmare...

Subject: [stella] Gunfight 2600: Worst Nightmare...
From: Manuel Polik <manuel.polik@xxxxxxxxxxx>
Date: Wed, 21 Feb 2001 16:11:07 +0100
Hi there!

Just to show you, that I'm at least working on something, here's an
update on Gunfight 2600.

The kernel is now pushed to it's very limits, that means:

- Two cycles left in the kernel
- One cycle left in the each skipdraw branch

Plus, coming to the nightmare, I'm already doing the complete kernel
_without_ any STA WSYNC.

Ok, I didn't play all my jokers yet and maybe I'm able to get rid of one
or another CLC, SEC - or what I'm most positive about - the two EORs.

I need some more cycles, in order to replace some immediate reads with
variable reads here & there.
Even more important - to reduce flicker later, I should somewhere be
able to verify if I'm ready to reposition, which would force another...

CPY line
BEQ Reposition

...with 6 cycles :-)

If you look carefully at the demo, you see that I already had to
compromise here & there (e.g. I've redesigned the colors, so that it
doesn't matter if they're shifted a line. I just can't take care of all
timings anymore) and you see approximately where the cowboys are
restricted to move later. That changes by the minute at the moment, so I
didn't restrict the movement 100%. It's better for testing too, when the
cowboys have more freedom in their movement as I allow later.

I still can't tell wether the kernel will work out in the end, or if
I've to do more compromises or skip some features...

Comment if you like, any ideas to squeeze another cycle out of the
kernel appreciated.

Ok, now I'll see if these EORs can be removed. I had some reason to
invert all logic here in an earlier stage, maybe the reason is gone by
now :-)

Greetings,
	Manuel
	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

gunShift		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
		    LDX #$26
                STX verPosM1
                STX  verPosM0
		    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 #$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

; 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 #$00
  		sta HMM0           ;+3 10
		LDA #$00
   		sta HMM1           ;+3 10
		LDA #$00
   		sta HMP1           ;+3 10
 		sta HMP0           ;+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        LDA #$10
		    STA.w gunShift+1
                SEC
                LDA #$00
                BEQ Continue

SkipDraw2       LDA #$F0
		    STA.w gunShift
                SEC
                LDA #$00
                BEQ Continue2

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


NextLine    LDX #$1F
                TXS
                LDX #$00
                TYA
                SBC verPosP0             ;
                ADC #$13
		    STA HMOVE
                BCC SkipDraw
                LDA (colorpointer),Y
            STA COLUP0
                LDA (playerpointer),Y           ;
            STX COLUP1
Continue
                STA  GRP0          ;
                TYA
                SBC verPosP1             ;
                ADC #$13
                BCC SkipDraw2
                LDA (colorpointer+2),Y
            STA COLUP1
            STX COLUP0
                LDA (playerpointer+2),Y           ;
Continue2       
                CPY verPosBL
                PHP
		    NOP
                STA  GRP1
		    LDA gunShift
		    EOR #$F0
		    STA HMM0		    
		    LDA gunShift+1
		    EOR #$10
		    STA HMM1		    


		    STA HMOVE
                STX COLUP1
                LDA (colorpointer),Y
            STA COLUP0
                TYA
                CLC
                SBC verPosM1
                AND #$FF
                PHP
                TYA
                CLC
                SBC verPosM0
                AND #$FF
                PHP
                STX gunShift
                SEC
		    STX gunShift+1
                LDA (colorpointer+2),Y
            STA COLUP1
                STX COLUP0
                DEY
            BNE NextLine

		LDX #$FF
		TXS

oscan2          JSR  joy        ;overscan. Time to read the joysticks.
                LDX  #$1E
		    STA WSYNC
		    LDA #$02
                STA VBLANK          ; Start vertical blank
		    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,$78,$32

    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 $E8
        .byte $E6
        .byte $E4
        .byte $E2
        .byte $E2
        .byte $E2
        .byte $3E
        .byte $3E
        .byte $3E
        .byte $00
        .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

Attachment: gunfight.bin
Description: Binary data

Current Thread