|
Subject: [stella] Gunfight 2600 From: Manuel Polik <manuel.polik@xxxxxxxxxxx> Date: Tue, 13 Feb 2001 14:16:01 +0100 |
Hi there!
I just finished an early play-kernel of my current project 'Gunfight
2600'.
(The reason why I was quit some days now :-))
At the moment, this is a single-line kernel, but I'm 100% sure, that
I've to do a double-line one, when adding the missiles(guns) & the ball
(shots).
It's just single at the moment, so that I force myself to tight code.
Besides, the cowboys even look better when streched a bit vertically :-)
Uhm, though it doesn't look too bad, I've already a ...uhm... *little*
problem:
I'm already too slow with writing player0. At the moment it works, but
if I start to animate the coboys, I have to switch to indirect sprite
access, needing more cycles than the direct access now. This would ruin
the colors of player0.
I give you the idea how the kernel works at the moment:
I substract the desired vertical postion of the sprite from the current
scannline.
This result is checked if smaller than the cowboy size and if yes, taken
to index(!) the sprite.
Pretty clever I thought, but too slow.
Here's the part ripped out (& additionally commented) of the complete
source:
-----------------
MainScreen STA WSYNC ; Finish current line
STA VBLANK ; Stop vertical blank
nextLine TYA ; Y holds current scannline
SBC verPos0 ; the substraction I was talking about
TAX ; Take it as index. Clever I thought :-)
STA WSYNC ; Here we go Start drawing a line
BPL sprite1 ; positivie value -> sprite possible
NOP ; \
LDA $00 ; / 5 useless timing cycles
LDA #$00 ; no sprite -> clear it
BEQ Continue ; Continue
sprite1 CMP #$13 ; Sprite already done with drawing?
BMI Sprite2 ; N: Draw it!
LDA #$00 ; Y: Clear it
BEQ Continue ; Continue
Sprite2 LDA p0data,x ; Load Sprite shape
Continue STA GRP0 ; We are _always_ on cycle 12 now
LDA colordata,x ;
STA COLUP0 ; Store sprite & color
; [...] Repeat everything exactly for player 2
INY ; next scanline
CPY #$B0 ; all done?
BNE nextLine ; N: Do another line
-----------------
Now - I can't push the STA WSYNC further down. STA COLUP0 is finished on
cycle 22. Just one cycle more and the colors are ruined.
So, are there any ideas to speed this up some more?
Greetings,
Manuel
P.S.: Yes, I already know that the source is a big mess on some
locations and that the joystick routine is criminal/useless :-) All that
stuff was some quick copy & paste from various sources to have a base
for developing the kernel. I'll fix all this later, when I'm done with
the display kernel. processor 6502
include vcs.h
horPos0 = $80 ;This is the vertical position of the sprite
horPos1 = $81 ;This is the vertical position of the sprite
verPos0 = $82 ;This is the vertical position of the sprite
verPos1 = $83 ;This is the vertical position of the sprite
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 #$60 ;set up the starting vertical position of sprite
STA verPos0
STA horPos0
STA verPos1
STA horPos1
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 horPos0,Y ;+3 3
JSR PosPlayer
DEY
BPL PosAnother
STA WSYNC ; Finish current line
sta HMOVE
LDY #$00
LDA #$08
STA REFP1
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
MainScreen STA WSYNC ; Finish current line
STA VBLANK ; Stop vertical blank
nextLine TYA ;2
SBC verPos0 ;5
TAX
STA WSYNC
BPL sprite1 ;7/8
NOP ;...
LDA $00 ;... 7 extra cycles
LDA #$00 ;9
BEQ Continue ;12
sprite1 CMP #$13 ;10
BMI Sprite2 ;12/13
LDA #$00 ;14
BEQ Continue ;17
Sprite2 LDA p0data,x ;19
Continue STA GRP0 ;22 = 3+ 12(+7extra) v 17 (+2extra) v 19
LDA colordata,x
STA COLUP0
TYA
CLC
SBC verPos1
TAX
BPL sprite3
NOP ;...
LDA $00 ;... 7 extra cycles
LDA #$00
BEQ Continue2
sprite3 CMP #$13
BMI Sprite4
LDA #$00
BEQ Continue2
Sprite4 LDA p0data,x ;If not then load the sprite data.
Continue2 STA GRP1
LDA colordata,x
STA COLUP1
INY
CPY #$B0
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 horPos0 ;set horizontal motion register to one pixel right
LDA horPos0
CMP #$99
BNE HorPosOK
DEC horPos0
HorPosOK rts
left DEC horPos0 ;set horizontal motion register to one pixel left
LDA horPos0
CMP #$FF
BNE HorPosOK2
INC horPos0
HorPosOK2 rts
down LDA verPos0 ;make sure we haven't gone over the top of the screen
CMP #$AB
BEQ NoClimb
INC verPos0 ;if not then increase the vertical position
NoClimb RTS
up LDA verPos0
CMP #$01
BEQ NoSink
DEC verPos0 ;decrease the vertical position
NoSink RTS
right2 INC horPos1 ;set horizontal motion register to one pixel right
LDA horPos1
CMP #$A0
BNE HorPosOK3
DEC horPos1
HorPosOK3 rts
left2 DEC horPos1 ;set horizontal motion register to one pixel left
LDA horPos1
CMP #$FF
BNE HorPosOK4
INC horPos1
HorPosOK4 rts
up2 LDA verPos1 ;make sure we haven't gone over the top of the screen
CMP #$B0
BEQ NoClimb2
INC verPos1 ;if not then increase the vertical position
NoClimb2 RTS
down2 LDA verPos1
CMP #$20
BEQ NoSink2
DEC verPos1 ;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
p0data
.byte %00101000
.byte %00101100
.byte %00111100
.byte %11111111
.byte %00110100
.byte %00111110
.byte %00111100
.byte %00011000
.byte %00111111
.byte %01111111
.byte %11111100
.byte %10111100
.byte %10111100
.byte %10111100
.byte %01111110
.byte %00100110
.byte %01001100
.byte %10001000
.byte %11101110
ORG $FF00
colordata
.byte $00
.byte $00
.byte $00
.byte $00
.byte $54
.byte $54
.byte $54
.byte $54
.byte $0a
.byte $0b
.byte $0c
.byte $0d
.byte $0e
.byte $0f
.byte $10
.byte $11
.byte $12
.byte $13
.byte $14
org $FFFC
.word start
.word startAttachment:
gunfight.bin
Description: Binary data
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] 6-digit score with TWO, Thomas Jentzsch | Thread | Re: [stella] Gunfight 2600, Manuel Polik |
| Re: [stella] 6-digit score with TWO, Thomas Jentzsch | Date | [stella] chewing a unicycle, Andrew Davie |
| Month |