|
Subject: Re: [stella] Wide Missile Spacing? From: Andrew Towers <mariofrog@xxxxxxxxxxx> Date: Thu, 11 Dec 2003 14:36:25 +1100 |
> Theoretically possible? Unfortunately no. The mode "double width & triple copies" does not exist.
I've wondered about this one for a while but I've never gotten around to testing it. Theoretically if the timing is just right it should be possible to get at least 4 double-width players on the screen, 2 copies of P0 double-width and 2 copies of P1 double-width.
However I can't get it to work in the emulators (Z26 or StellaX) and I have no Supercharger or Cuttle to test this out on some real hardware. So if someone can try this and tell me what happens.. :)
What you should see is 4 normal-width players on the top row with the dragon graphics split in half - this is to check the spacing. On the second row should be one copy of the left dragon using double-width graphics - just for reference.
On the third row I'm trying to draw 2 dragons, the left dragon facing right and the right dragon facing left. The left edge of the left dragon should be hard up against the right edge of the left vertical strip (!), and the left edge of the right dragon should be hard up against the left edge of the right strip, drawn on top of the strip =)
If it doesn't work or the positions aren't quite right, you can move the graphics left/right one pixel at a time by moving the joystick left or right. Press the fire button to reset the position adjustment. If I'm out by one or two pixels in my timings this should make it work ;) Otherwise the whole thing is a dud.
Thanks, Andrew.
Attachment:
dragons.bin
Description: Binary data
;---------------------------------------------------------------------------
;
; Generic 2600 Game
;
;---------------------------------------------------------------------------
processor 6502
include vcs.h
;---------------------------------------------------------------------------
; Constants
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
; RAM Variables
;---------------------------------------------------------------------------
line equ $80
adjust equ $81
debounce equ $82
MAC SLEEP
IF {1} = 1
ECHO "ERROR: SLEEP 1 not allowed !"
END
ENDIF
IF {1} & 1
nop $00
REPEAT ({1}-3)/2
nop
REPEND
ELSE
REPEAT ({1})/2
nop
REPEND
ENDIF
ENDM
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
org $F000
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
; Start of Program
;---------------------------------------------------------------------------
; Clear memory, locate character graphics positions and such,
; initialize key memory values, start GameLoop.
;-------------------------------------------------------------
Start
sei
cld
ldx #$FF
txs
lda #0
clear
sta 0,x
dex
bne clear
;---------------------------------------------------------------------------
; Initialize variables / registers
;---------------------------------------------------------------------------
lda #$2F ;48
sta COLUP0
lda #$2F ;99
sta COLUP1
lda #$20
sta COLUPF
lda #%11110000
sta PF1
lda #$01 ; set vertical delay on for both players
sta VDELP0
sta VDELP1
LDA #2
STA adjust ; initial hmove value, should be correct
LDA #20
STA debounce ; for Z26
;--------------------------------------------------------------------------
; GameLoop
;--------------------------------------------------------------------------
GameLoop
jsr VSync ;start vertical retrace
jsr VBlank ; spare time during screen blank
jsr Picture ; draw one screen
jsr overscan ; do overscan
jmp GameLoop ;back to top
;--------------------------------------------------------------------------
; VSync
;--------------------------------------------------------------------------
VSync
lda #2 ;bit 1 needs to be 1 to start retrace
sta VSYNC ;start retrace
sta WSYNC ;wait a few lines
sta WSYNC
lda #44 ;prepare timer to exit blank period (44)
sta TIM64T ;turn it on
sta WSYNC ;wait one more
sta VSYNC ;done with retrace, write 0 to bit 1
rts ; VSync
;--------------------------------------------------------------------------
; VBlank
;--------------------------------------------------------------------------
; Game Logic
;--------------------------------------------------------------------------
VBlank
; check for joystick button, reset the hmove adjust
LDA INPT4
BMI NoReset ; -> not pressed, done
LDA #2
STA adjust ; initial hmove value, should be correct
RTS
; check for left/right direction
NoReset
LDA debounce
BEQ DoCheck
DEC debounce
RTS
DoCheck
BIT SWCHA
BPL MoveRight ; if d7=0 (S)
BVC MoveLeft ; if d6=0 (V)
RTS ; VBlank
MoveRight
DEC adjust
LDA #20
STA debounce
RTS
MoveLeft
INC adjust
LDA #20
STA debounce
RTS
;--------------------------------------------------------------------------
; Overscan
;--------------------------------------------------------------------------
; More Game Logic
;--------------------------------------------------------------------------
overscan
sta WSYNC
lda #$00
sta COLUBK
lda #36 ; Use the timer to make sure overscan takes (34)
sta TIM64T ; 30 scan lines. 29 scan lines * 76 = 2204 / 64 = 34.4
endOS
lda INTIM ; We finished, but wait for timer
bne endOS ; by looping till zero
sta WSYNC ; End last scanline
lda #$82
sta VBLANK
lda #$02
sta VBLANK
rts ; overscan
;--------------------------------------------------------------------------
; Draw TV Pictures
;--------------------------------------------------------------------------
;
;--------------------------------------------------------------------------
Picture
pictureLoop
lda INTIM ;check timer for end of VBLANK period
bne pictureLoop ;loop until it reaches 0
sta WSYNC ;-
lda #$80 ;2
sta VBLANK ;3 end screen blank
SLEEP 24 ; [29]
; position the players as close as possible to their final
; positions (pixels 32 and 48 respectively)
STA RESP0 ;3 [32]
NOP ;2
STA RESP1 ;3 [37]
; note: turning on stretch 2x mode delays the graphics output
; by one pixel (in Z26 and StellaX anyway) so I have to shift
; both players left one more pixel than I would expect to.
;LDA #(2 << 4) ; exactly on pixel 48
;STA HMP0
;LDA #(1 << 4) ; exactly on pixel 48
;STA HMP1
; actually let the user adjust the position with the joystick
LDA adjust ; allow position to be tweaked
AND #%00001111 ; ignore top bits
ROL
ROL
ROL
ROL
STA HMP0
SEC
SBC #%00010000 ; subtract 1
AND #%11110000 ; wrap around
STA HMP1
STA WSYNC ;-
STA HMOVE
SLEEP 24
STA HMCLR
LDX #%00000101 ;2 stretch 2x
;LDX #%00000100 ;2 2 copies far
STX NUSIZ0 ;3
STX NUSIZ1 ;3
JMP renderIt
ALIGN 256
renderIt
;------------------------------------------------------------------
; first just draw the non-stretched players
LDA #%00000100 ;2 2 copies far
STA NUSIZ0 ;3
STA NUSIZ1 ;3
; this is a copy of the "real" code from down below with
; all the trick parts nop'd or deleted out. the timing
; is exactly the same though.
LDY #25 ; 26 lines to draw
renderLoop1
STA WSYNC ;-
; set up all graphics at the start of the line
; use VDELP so we can just push through the graphics later
LDA gfx0,Y ;4
STA GRP0 ;3
LDA gfx1,Y ;4
STA GRP1 ;3
LDA gfx2,Y ;4
STA GRP0 ;3
LDA gfx3,Y ;4
; nothing better to do right now, set up colours etc
SLEEP 10 ;10
; use these values to switch back and forth quickly
NOP ;2
STA GRP1 ;3 [40]
NOP ;2
; push through the new graphics for the righthand side
STA GRP0 ;3 [45]
; go around and do it again and again
DEY ;2
BPL renderLoop1 ;3 /2
lda #0 ;2
sta GRP0
sta GRP1
sta GRP0
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
;------------------------------------------------------------------
; now draw them just 2x stretched the whole time
LDA #%00000101 ;2 stretch 2x
STA NUSIZ0 ;3
STA NUSIZ1 ;3
; this is a copy of the "real" code from down below with
; all the trick parts nop'd or deleted out. the timing
; is exactly the same though.
LDY #25 ; 26 lines to draw
renderLoop2
STA WSYNC ;-
; set up all graphics at the start of the line
; use VDELP so we can just push through the graphics later
LDA gfx0,Y ;4
STA GRP0 ;3
LDA gfx1,Y ;4
STA GRP1 ;3
LDA gfx2,Y ;4
STA GRP0 ;3
LDA gfx3,Y ;4
; nothing better to do right now, set up colours etc
SLEEP 10 ;10
; use these values to switch back and forth quickly
NOP ;2
STA GRP1 ;3 [40]
NOP ;2
; push through the new graphics for the righthand side
STA GRP0 ;3 [45]
; go around and do it again and again
DEY ;2
BPL renderLoop2 ;3 /2
lda #0 ;2
sta GRP0
sta GRP1
sta GRP0
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
;------------------------------------------------------------------
; now draw them using the trick to switch backward and forward
; between 2x stretched and 2 copies far.
LDA #%00000101 ;2 stretch 2x
STA NUSIZ0 ;3
STA NUSIZ1 ;3
; this is the "real" code referred to above.
LDY #25 ; 26 lines to draw
renderLoop3
STA WSYNC ;-
; set up all graphics at the start of the line
; use VDELP so we can just push through the graphics later
LDA gfx0,Y ;4
STA GRP0 ;3
LDA gfx1,Y ;4
STA GRP1 ;3
LDA gfx2,Y ;4
STA GRP0 ;3
LDA gfx3,Y ;4
; nothing better to do right now, set up colours etc
SLEEP 10 ;10
; use these values to switch back and forth quickly
LDX #%00000101 ;2 stretch 2x
STA GRP1 ;3 [40]
LDA #%00000100 ;2 2 copies far
; push through the new graphics for the righthand side
STA GRP0 ;3 [45]
SLEEP 3 ;3
; now do the switching trick
STA NUSIZ0 ;3 [51]
STX NUSIZ0 ;3 [54]
STA NUSIZ1 ;3 [57]
STX NUSIZ1 ;3 [60]
; go around and do it again and again
DEY ;2
BPL renderLoop3 ;3 /2
;------------------------------------------------------------------
lda #0 ;2
sta GRP0
sta GRP1
sta GRP0
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
STA WSYNC
; draw a few copies down the screen
; DEC line
; BEQ exitLoop
; JMP screenLoop
exitLoop
ldx #97
ScanLoop
sta WSYNC
dex
bne ScanLoop
;sta COLUPF
rts ; Picture
;------------------------------------------------------------------
;------------------------------------------------------------------
;---------------------------------------------------------------------------
align 256
; left half of left image
gfx0
.byte #%00001010
.byte #%00101110
.byte #%10111101
.byte #%11011011
.byte #%10011111
.byte #%00111111
.byte #%11011111
.byte #%11101111
.byte #%11110111
.byte #%11011011
.byte #%11100011
.byte #%11010011
.byte #%10100011
.byte #%11000111
.byte #%10100110
.byte #%11001111
.byte #%10001110
.byte #%00000100
.byte #%00011111
.byte #%00010111
.byte #%00101011
.byte #%00110111
.byte #%00011011
.byte #%01101111
.byte #%00011010
.byte #%00010010
; right half of left image
gfx1
.byte #%00000000
.byte #%00000000
.byte #%11010100
.byte #%11101110
.byte #%10111000
.byte #%11010000
.byte #%11100000
.byte #%11110000
.byte #%11100000
.byte #%11010000
.byte #%10100000
.byte #%11000000
.byte #%10100000
.byte #%01000000
.byte #%10000000
.byte #%00000000
.byte #%00000100
.byte #%11101010
.byte #%11111111
.byte #%11000000
.byte #%00001110
.byte #%11111101
.byte #%10011111
.byte #%11110110
.byte #%00000000
.byte #%00000000
; left half of right image
gfx2
.byte #%00000000
.byte #%00000000
.byte #%00101011
.byte #%01110111
.byte #%00011101
.byte #%00001011
.byte #%00000111
.byte #%00001111
.byte #%00000111
.byte #%00001011
.byte #%00000101
.byte #%00000011
.byte #%00000101
.byte #%00000010
.byte #%00000001
.byte #%00000000
.byte #%00100000
.byte #%01010111
.byte #%11111111
.byte #%00000011
.byte #%01110000
.byte #%10111111
.byte #%11111001
.byte #%01101111
.byte #%00000000
.byte #%00000000
; right half of right image
gfx3
.byte #%01010000
.byte #%01110100
.byte #%10111101
.byte #%11011011
.byte #%11111001
.byte #%11111100
.byte #%11111011
.byte #%11110111
.byte #%11101111
.byte #%11011011
.byte #%11000111
.byte #%11001011
.byte #%11000101
.byte #%11100011
.byte #%01100101
.byte #%11110011
.byte #%01110001
.byte #%00100000
.byte #%11111000
.byte #%11101000
.byte #%11010100
.byte #%11101100
.byte #%11011000
.byte #%11110110
.byte #%01011000
.byte #%01001000
;---------------------------------------------------------------------------
; Program Startup
;---------------------------------------------------------------------------
org $FFFC
.word Start
.word Start
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] Wide Missile Spacing?, Rob | Thread | Re: [stella] Wide Missile Spacing?, Christopher Tumber |
| Re: [stella] Need Help with 13 - ch, R Mundschau | Date | Re: [stella] tia hue luminance, Glenn Saunders |
| Month |