|
Subject: Re: [stella] Cosmic Ark stars From: Eckhard_Stolberg@xxxxxxxxxxxxxxxxxxxxx (Eckhard Stolberg) Date: Sat, 10 May 1997 18:17:52 +0200 |
>How did they do those nice blinking background stars in "Cosmic Ark"?
>They're not correctly emulated by PC Atari, and it's even more interesting
>that they look very different when I run Cosmic Ark on my Atari 2600 hacked
>for composite video output: instead of looking like stars in the sky, they
>seem to follow some strange, changing patterns...
>
>For greater fun, please answer without looking at the code :)
OK, I cheated. I looked at the code, but it still took some experimentation
to figure it out.
Actually the answer is right in the programming manual. It says:
'WARNING: These motion registers should not be modified
during the 24 computer cycles immediately following an
HMOVE command. Unpredictable motion values may result.'
And who would have predicted an effect like that. :-)
Cosmic Ark uses missile0 for this and I am not sure if it would work with
other moving object too. The trick is to do a HMOVE command, then wait 18
cycles and finally write a different value into HMM0 again.
If you use the right values for both writes to HMM0, then the TIA gets
confused, moves the missile about 15 pixels away and keeps doing so in
every line until you do another HMOVE command, even if you change the
motion registers before. My little demo program uses $07 and $06 for this.
Several other values, that I tried, had no effect.
The rest of the effect is just changing the initial position of missile0
every couple of frames to get a moving starpattern effect and changing the
colour in every line to make the stars sparkle.
This little program displays a similar starpattern as cosmic ark does.
It should work on PAL as well as on NTSC. I hope it has enough comments to
understand how it works.
Ciao, Eckhard Stolberg
===============================================================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; TIA (Stella) write-only registers
;
Vsync equ $00
Vblank equ $01
Wsync equ $02
Colup0 equ $06
Colubk equ $09
Ctrlpf equ $0A
Resm0 equ $12
Enam0 equ $1D
Hmm0 equ $22
Hmove equ $2A
Hmclr equ $2B
;
; RAM definitions
; Note: The system RAM maps in at 0080-00FF and also at 0180-01FF. It is
; used for variables and the system stack. The programmer must make sure
; the stack never grows so deep as to overwrite the variables.
;
RamStart equ $0080
RamEnd equ $00FF
StackBottom equ $00FF
StackTop equ $0080
;
; 6532 (RIOT) registers
;
Swcha equ $0280
Swacnt equ $0281
Swchb equ $0282
Swbcnt equ $0283
Intim equ $0284
Tim64t equ $0296
;
; ROM definitions
;
RomStart equ $F000
RomEnd equ $FFFF
IntVectors equ $FFFA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Ram definitions
;
ORG $80
tablePTR DS 1
colour DS 1
counter DS 1
colourcounter DS 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Data Area
;
ORG $F800
table: DB 4,5,6,7,8,9,10,11,12,11,10,9,8,7,6,5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Program initialisation
;
Cart_Init:
SEI ; Disable interrupts.:
CLD ; Clear "decimal" mode.
LDX #$FF
TXS ; Clear the stack
Common_Init:
LDX #$28 ; Clear the TIA registers ($04-$2C)
LDA #$00
TIAClear:
STA $04,X
DEX
BPL TIAClear ; loop exits with X=$FF
LDX #$FF
RAMClear:
STA $00,X ; Clear the RAM ($FF-$80)
DEX
BMI RAMClear ; loop exits with X=$7F
LDX #$FF
TXS ; Reset the stack
IOClear:
STA Swbcnt ; console I/O always set to INPUT
STA Swacnt ; set controller I/O to INPUT
StarsInit: LDA #$03
STA colour
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Main program loop
;
Start:
LDA #$02
STA Wsync ; Wait for horizontal sync
STA Vblank ; Turn on Vblank
STA Vsync ; Turn on Vsync
STA Wsync ; Leave Vsync on for 3 lines
STA Wsync
STA Wsync
LDA #$00
STA Vsync ; Turn Vsync off
LDA #43 ; Vblank for 37 lines
STA Tim64t ; 43*64intvls=2752=8256colclks=36.2lines
LDA #$00 ;black
STA ColuBK
LDA #$0e ;white
STA ColuP0
LDA #$02 ;turn missile0 on
STA ENAM0
LDX tablePTR ;reposition missile0 every couple of
;frames for starpattern movement
LDY counter
INY
CPY #10
BNE @1
LDY #0
INX
CPX #16
BNE @1
LDX #$00
@1: STX tablePTR
STY counter
LDA table,X
TAY
STA Wsync
@2: DEY
BPL @2
STA ResM0
LDA #$70 ;this value is important for the effect
STA HMM0
STA Wsync
STA HMOVE
JSR Trick ;waste 18 cycles and load move value
STA HMM0 ;this is the tricky part
LDX colourcounter ;change colours for spakling stars
INX
STX colourcounter
CPX #3
BNE VblankLoop
LDA colour
CLC
ADC #$10
STA colour
VblankLoop:
LDA Intim
BNE VblankLoop ; wait for vblank timer
STA Wsync ; finish waiting for the current line
STA Vblank ; turn off Vblank
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Screen: LDA colour
LDY #192
@1: STA Wsync ;change the colour every line for
;sparkling stars - otherwise do what
;you want here
CLC
ADC #$03
EOR #$A0
STA ColuP0
DEY
BNE @1
LDA #$02
STA Vblank ;turn on Vblank
LDX #30
@END: STA Wsync
DEX
BNE @END
JMP Start
Trick: NOP ;the tricky subroutine
NOP
LDA #$60
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Set up the 6502 interrupt vector table
;
ORG IntVectors
NMI dw Cart_Init
Reset dw Cart_Init
IRQ dw Cart_Init
END
--
Archives available at http://www.biglist.com/lists/stella/archives/
E-mail UNSUBSCRIBE in the body to stella-request@xxxxxxxxxxx to be removed.
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] Cosmic Ark stars, kickass | Thread | [stella] Cosmic Ark stars, bwmott |
| [stella] Re: what's going on...? (w, Glenn Saunders | Date | [stella] Supercharger internals..., bwmott |
| Month |