-
Content Count
8,159 -
Joined
-
Last visited
Posts posted by Cafeman
-
-
still can't get Player1 to display.
Player0 display fine. Player 1 is another color and mapped to the same offset as Player 0, but those pixels are black (bg color) and don't display.
I set my PRIOR register to $21 because I think bit 5 must be set to graft player 0 to player 1. Thus PRIOR is 0010 0001 where bit zero is a 1 to give priority over the playfield. See any prob with that?!
I store the pointer for Player0 at $20,$21.
I store the pointer for Player1 at $22,#23.
My screen RAM starts at $1800. My pmbase is at $2000 ( edited -- I think). Player0 starts at $2400, Player1 starts at $2500. I'm in Antic E, so my player RAM is cutting into the screen RAM and I'll have to change that soon, but it shouldn't have an effect on Player1 not displaying when Player0 does, right?
Any thoughts?
[ 08-18-2001: Message edited by: Cafeman ]
-
Actually Tempest, I just read that recently. Did you just read that recently too? where?
-
I have yet to order stuff from Tom Zjaba online, but I've met him, and purchased stuff from him in person. I'd recommend him in a second. He's not out to screw you.
-
tillenterprises,
Yes, thanks for pointing that out -- 5200 Pitfall 2 has mildly improved visuals, but it also has twice the game!
Has anybody ever beaten that *extremely difficult* 2nd level? With the wild bats and manic jumps and scampering bugs/rats? I sure didn't, but typing this makes me feel sad because it reminds me that I ran over a defenseless racoon tonight.
-
The above code works. I assumed it is using Player0. I want to have a Player1 address which is 256 decimal bytes (#$100 bytes) beyond Player0's, correct?
It seems Player0 is at $2430. Would that make Player1 at $2530?
What would really help me is to see some example code setting up the addresses for Player0 and Player1. I tried to put stuff like this:
Player0 equ $31 ; defining Player0
Player1 equ $32 ; defining Player1
...
The thing that confuses me is that I can't see where $2430 is #$1024 bytes past a PMBASE address?! It seems like $20,$21 holds not a base address but Player0's address.
-
Here's some snippets of my code. This is from a prior version of it, but it's pretty much the same.
; ************ Hardware Adresses ***************************
DMACTL equ $D400 ;DMA Control
sDMACTL equ $07 ;DMA Control Shadow
PMBASE equ $D407 ;PM base address
CHBASE equ $D409 ;Character set base
GRACTL equ $C01D ;Graphics control
PRIOR equ $C01B ;PM priorities
...
;************* Setup Player/Missile registers ***************
lda #$3A ;Enable DMA (single line resolution/
sta sDMACTL ;normal background)
lda #$20 ;Set PM base address $20
sta PMBASE
lda #$03 ;Enable players and missiles
sta GRACTL
lda #$16 ;Color of player 0
sta sCOLPM0
ldy #$00
lda #$00 ;Size of player 0 (pick from 0,1,3 vals)
sta SIZEP0
; I'm trying to store #$30 at location $20 and
; to store #$24 at location $21:
lda #$30 ;start player's memory at $2430
sta $20 ;lo byte
lda #$24
sta $21 ;hi byte
;
lda #$01 ;Give players priority over playfield
sta PRIOR
...
;************ Copy player data to RAM ********************************
pmloop1
lda pm1,y ;Get data
; The following is Indirect Indexed Addressing.
; It stores the value of the accumulator into the address found
; $20 (lo byte) and $21 (hi byte), which by is incremented from the
; original value of $2430.
sta ($20),y ;Write it into RAM (RWL -- it was $2430 in Dan's example)
iny
cpy #$08 ;Copy 8 bytes (Compare reg Y to Hex

bne pmloop1
[ 08-17-2001: Message edited by: Cafeman ]
-
I am unable to get Player1 to work, let alone graft it to Player0.
Following Dan's PM example as I have been, I believe PMBASE is set to point to $20 (low byte) and $21 (high byte). I've been using this. The value stored here is initially $2430. I assume this is Player0 that I've been using.
Anyway, could one of you guys show me a bit of code showing how to define the Players at the top, and simple loops or code showing how to refer to them? How do you specify the xxx+256 kind of statements? Or do you use pmbase+1024 for player0, PMbase+1536 for player1? Is that 1024 a decimal or hex number? Huh? Huh? Huh?!
-
Interesting! You changed the color and position of the smiley thing, and it is really just one player.
I noticed that both use the same background/foregroudn priority setting, which leads me to another question.
Can the priority register PRIOR be set in such a way that some players are in the background while some are in the foreground at the same time?
-
River Raid.
Spy Hunter on the PSx classics disk is too hard to control & has a choppy frame rate for some reason, btw.
-
I missed CGE2k1 (and I may always miss it), but one thing about Philly -- I think it needs more room.
-
http://www.atarihq.com/5200/5200faq/05_02_01.html
Nope. Check out the 5200 FAQ section on this subject. I did it, as have many -- using a pencil eraser will usually fix up the contacts fine!
-
http://cafeman.www9.50megs.com/classics.html
Nateo,
click on this link and read the 4 articles there on Zaxxon, Outrun, River Raid, and Joust. I wrote that while keeping in mind the 'magic' that the 80's classic era had, back when I was a teen. I am also 32 now, and I agree with what's been said already.
-
Bump. Still thinking about this.
If you use a DLI to switch the memory pointer for a player, then you probably need to display the highest-on-screen player first, then at the DLI switch to the lower one.
Game code draws Player0A and Player0B in different memory locations. Other variables store each split-player's horizontal and vertical locations. All the collisions and animation is handled in the normal game code, but during the DLI you decide which of the 2 is on top and switch pointers at that line. I imagine it would take some kind of counters set up in the game code that the DLI would check. After all, you don't have much time during DLI.
During DLI you blindly switch to draw the 'lower' player. During normal game code you handle everything else, but during DLI you switch pointers. Hence, if Player0A and Player0B get on the same horizontal lines, you'll miss at least 1 frame and flicker will occur. I think?!
Question: where do you put the DLI, since a DLI is invoked by setting a bit on a certain modeline? Perhaps you have the DLI bit enabled on every modeline in the display list?
-
-
AHA! I knew I saw a picture of SNES River Raid years ago in a magazine! I've asked all kinds of people if they had access to a picture of it, and nobody could dig one up -- I asked some recent mag editors, I asked Bill Kunkle, nobody had one.
So ... what are you going to do with those prototypes? How about posting a picture of River Raid SNES, or better yet, a few pictures? Or email them to me and I'll put 'em up at my own River Raid Homage Page!!
-
Dan, in many games the flickering only starts when sprites get on the same horizontal lines. Do you think the coder implemented both methods in that case?
In other words, when he detects Player0's 2 uses getting close to one another horizontally, he branches to the every-other-frame routine instead?
Otherwise, wouldn't the birds flicker all the time regardless of their position?
-
How can you tell if you put too much processing inside a Display List Interrupt? If you take too many cycles (remembering that you basically only have the time from the end of one horizontal electron beam until it gets to the beginning of the next horizontal scanline & turns on again).
What is the impact and/or effect of not being out of the DLI in time?
-
How exactly is this done?
Here is my guess. Even if I'm wrong, I'd like to talk about how best to do this since 4 players is quite limiting.
Anyway, I've read that if you know that 2 objects will be on different horizontal planes, that this is the best time to split the sprite. IS it done via a DLI? IN other words, put a DLI halfway down the screen, and the DLI routine changes the player bitmap to the 2nd object, and changes its location in memory? Then at line 1, the swapping occurs again?
Or perhaps it is done in conjunction with careful timing of the which scanline you are on? (note that I currently have no clue how to implement this kind of coding)? Or is there a whole other (and hopefully, Better) way?
Oh btw, my first game (which is no longer titled "Firefighter") probably won't need to implement this kind of sprite/player swapping, but I'd still like to get an idea of how to do it. Like in Joust, all those birds are just 4 players?! I notice that when they get on the same horizontal plane, swapped/split players start to blink. Perhaps this is why the Pac-Man 2600 ghosts flicker? Every ghost is draw every 4th frame?
Thoughts are welcome!
-
Thanks, DEBRO!
I'm working on the Player Missile side of things currently, but I will get back the redefined character sets stuff soon. It's a bit tedious to draw (on graph paper) all the redefined characters that you you need in building backgrounds and characters, isn't it.
Question -- if using a character mode such as Antic mode 4, can you can still use players and missiles, which would simply overlay themselves over the bg graphics? Is this correct?
-
1. River Raid.
2. Enduro
3. H.E.R.O.
All have aged well, and I still play them!
-
Oh, and now that I've seen a DLI in action, I'm not going to use it on the 'clouds' at all. Cycling the entire cloud's color from dark to light looked better.
I want the cloud to look like it is made of cloud, not grey stone. With more resolution, I can actually draw the cloud curls within the cloud body; it looked too blocky in low rez.
Here's my next question though -- since this use of a DLI is tied to a specific mode line, how do you use a DLI to get more colors on a player that moves vertically?
-
Yes, I did that on purpose.
Isn't it just butt-ugly in that low resolution though! It's difficult to draw anything because you don't have small enough pixels. That's why I upgraded to Antic E -- no pictures to show of that version yet.
I couldn't find the proper address of Player2, either -- I read what it should be, but I wasn't paying close enough attention and must have calculated it wrong, because the 2nd player (a lightning bolt) never displayed.
Is it true that each player takes 256 bytes, and that player 1 is 256 bytes after player0 in memory?
-
So, do you think that to get multi-colored characters, most programmer either used multiple players/missiles, or used character mode?
For example in Joust, the bird is one color and its lance is probably a wide missile.
I always wondered why 5200 games (such as Q*bert) had such limited colors at times on their main players. If you are in character mode, you still have the same player and its one-color limitation though, correct? So you'd have to use bg graphics using redefined characters to get more colors, and perhaps just not use Players/missiles?
-
Just to add a possible solution to the mystery ... I think the scratchy bassy sound is caused by using the -limit option, which all new PC owners must use with the VSS DOS emulator. When I forgot to type this option, I noticed the sound was okay.
I still never got any other 5200 emulators to work for some reason ...

5200: Splitting 1 player into multiple players
in Atari 5200 / 8-bit Programming
Posted
Dan, are you reffering to using a Kernel, where the program sits inside a DLI to defeat Antic?