Jump to content

SpiceWare

+AtariAge Subscriber
  • Content Count

    16,912
  • Joined

  • Last visited

  • Days Won

    10

Everything posted by SpiceWare

  1. I've been thinking about not doing a demo mode in order to give more space to the samples. If I do that I'll show the last & high score on the title screen. They would get zeroed out if you changed any option, other than TV-TYPE, so as to prevent somebody from playing the KIDS level and claiming it was HARD.
  2. I'm a little annoyed with how the SECTOR display currently works as at the start of the round I want to see the radar to determine which way I need to go. From Rules of the Game: only the gradual ramp up to full speed is in place. I think what I'll end up doing at the start of a round (or new ship) is this: show SECTOR # play opening tune play sample show Score/Radar/Lives ship starts to move or this: show SECTOR # play opening tune show Score/Radar/Lives play sample ship starts to move
  3. Thanks! Not much left: spy ships & red alert e-type launch from station gameplay balance (difficulty ramp up) Delta Quadrant final sound effects space optimization final samples For the Delta Quadrant I want to have user designed levels, so need to figure out how to set up a way for that to occur. I'll probably write a PHP program for that and put it up on my web site. Have the user type in # of stations, station X-Y locations, and the ship's starting location, then have the PHP program create a patched a ROM with that info. I won't need sound effects or samples in place for that, but will need the rest so foresee the level designer being done in August. The space optimization will be a major undertaking as I'll need to make space for the final samples. At the moment I have just over 2K free (1K in bank 6, the rest in the ARM code space). The two test samples currently in place use 2.5K of space.
  4. 3.6 per the description at YouTube.
  5. Formations will now randomly launch from an offscreen station "Battlestations" will be said when formation is launched Formation Leader will home in on the player Formation will scatter if the leader is destroyed Bonus points earned if all ships in formation are destroyed. Points will be displayed after the last explosion clears. Sound effect volume is temporarily reduced while a sample is played in order to increase clarity. SECTOR # displayed while player's ship ramps up to full speed Various performance improvements. Various space optimizations, including removal of unused playfield font graphics. Time-Remaining diagnostic display (Left Difficulty A) now uses A for Vertical Blank and B for Overscan time remaining (as in Above/Below visible screen). I'll be busy with family the next couple of weeks, so look for the next update mid-July. For Harmony or Stella (requires Stella 5.0.0-pre8 or newer) draconian_20170625.bin Please reference Rules of the Game for what's been implemented and what's to come.
  6. Revised how the enemy formation will scatter if the leader is destroyed minor update to Bonus Points for better alignment with the explosion it replaces. Formation ships are now destroyed if they collide with asteroids or mines Sound effect volume is lowered when speech is active SECTOR # is now displayed while the player's ship ramps up to full speed removed unused font graphics (saved 200+ bytes) various program optimizations to free up memory Due to removing most of the font, the time-remaining diagnostic display (Left Difficulty A) now denotes the values by (A)bove for Vertical Blank, and (B)elow for Over Scan time remaining. I'll be busy with family the next couple of weeks, so look for the next update sometime during the second week of July. For Harmony or Stella (requires Stella 5.0.0-pre8 or newer) draconian_20170625.bin Please reference Rules of the Game for what's been implemented and what's to come.
  7. SpiceWare

    Battlestations

    Thanks! I've been putting in extra time of late as Draconian will be on the back-burner for the next couple of weeks due to RL.
  8. Neat! I'd suggest a minor change to the strobe registers(WSYNC, RESP0, HMOVE, etc): void vtsync() { A=2; //Set Bit 2 (D1) WSYNC; //Wait for end of Scanline VSYNC=A; //Turn On Vertical Sync WSYNC; //Wait 2 More Scanlines WSYNC; A=0; //Clear Bit 2 (D1) WSYNC; //Wait for End of 3rd Scanline VSYNC=A; //Turn On Vertical Sync return; } Makes it cleaner, less typing, and thus less chance of a mistake. Even better would be to abstract the register usage when feasible: void vtsync() { WSYNC; //Wait for end of Scanline VSYNC=2; //Turn On Vertical Sync, Set Bit 2 (D1) WSYNC; //Wait 2 More Scanlines WSYNC; WSYNC; //Wait for End of 3rd Scanline VSYNC=0; //Turn On Vertical Sync, Clear Bit 2 (D1) return; }
  9. A lot of 2600 coding involves instructions occurring at specific cycles on a scanline. How does C02 handle that? If it doesn't, then you can't position a player, missile, or ball accurately. For instance, this is one of the commonly used routines for positioning objects: ;=============================================================================== ; PosObject ;---------- ; subroutine for setting the X position of any TIA object ; when called, set the following registers: ; A - holds the X position of the object ; X - holds which object to position ; 0 = player0 ; 1 = player1 ; 2 = missile0 ; 3 = missile1 ; 4 = ball ; the routine will set the coarse X position of the object, as well as the ; fine-tune register that will be used when HMOVE is used. ; ; Note: The X position differs based on the object, for player0 and player1 ; 0 is the leftmost pixel while for missile0, missile1 and ball 1 is ; the leftmost pixel: ; players - X range is 0-159 ; missiles - X range is 1-160 ; ball - X range is 1-160 ; Note: Setting players to double or quad size will affect the position of ; the players. ;=============================================================================== PosObject: sec sta WSYNC DivideLoop sbc #15 ; 2 2 - each time thru this loop takes 5 cycles, which is bcs DivideLoop ; 2 4 - the same amount of time it takes to draw 15 pixels eor #7 ; 2 6 - The EOR & ASL statements convert the remainder asl ; 2 8 - of position/15 to the value needed to fine tune asl ; 2 10 - the X position asl ; 2 12 asl ; 2 14 sta.wx HMP0,X ; 5 19 - store fine tuning of X sta RESP0,X ; 4 23 - set coarse X position of object rts ; 6 29 The STA RESP0,X must occur at 23, 28, 33, etc (ever 5 cycles). HMP0 is on zero page, so the STA HMP0,x would normally be compiled as a 4 cycle Zero Page instruction, which would cause the STA RESP0,x to occur at the wrong time. So we force the compiler to use a word address (16-bit) instead of Zero Page address for that extra cycle of time, which is what makes this routine possible.
  10. We're working with 4 bit audio at a rather low sample rate, so it'll never sound like.
  11. Current speech samples are just placeholders I created. iesposta's working on sound effects and converting the arcade samples. One issue with samples is we don't yet know how much space we'll have for them, so they'll be one of the last things we finish. I did notice the speech was getting overwhelmed by the sound effects and sent him this:
  12. Formations will now randomly launch from an offscreen station. "Battlestations" will be said when formation is launched. Formation Leader targets the player Formation scatters if leader destroyed (this needs more work) Revised enemy ship spawning and station firing logic to use less CPU time. New image graphics in place for bonus points Bonus points will be earned if all ships in the formation are destroyed For Harmony or Stella (requires Stella 5.0.0-pre8 or newer) draconian_20170624.bin Please reference Rules of the Game for what's been implemented and what's to come.
  13. Space Rocks predates the Harmony Encore and was written using a version of the DPC+ driver which has a bug in it which prevents it from working on the Encore. batari released the 1.06 BIOS which will allow the Encore to run Space Rocks, however it's for NTSC. I was contacted yesterday by somebody in Europe who wished to run Space Rocks, but didn't wish to use the NTSC BIOS. I took a look, but am not able to rebuild Space Rocks at this time because the Linux Virtual Machine I was using to compile the C code was corrupted during an update to Parallels (which is why I now use VirtualBox). I then remembered I'd helped spendidnut with Chaotic Grill(a very impressive port of BurgerTime). He'd been using a really old version of the DPC+ driver with a bug in it that would crash the program under certain conditions. I was able to replace the driver in his ROM without having to recompile. So I've run the following via Terminal on my Mac (these commands also work under Linux) to replace the DPC+ driver used in Space Rocks: dd skip=3 count=29 if=spacerocks20121129_NTSC.bin of=srn29K.bin bs=1024 cat DPC+20121020.arm srn29K.bin > spacerocks20121129_NTSC_encore.bin dd skip=3 count=29 if=spacerocks20121129_PAL.bin of=srp29K.bin bs=1024 cat DPC+20121020.arm srp29K.bin > spacerocks20121129_PAL_encore.bin It can now be used on the Harmony Encore running the 1.05 BIOS. spacerocks20121129_NTSC_encore.bin spacerocks20121129_PAL_encore.bin
  14. That STA RESP0,x means it'll store (which is the strobe as the value stored is ignored) in either RESP0, RESP1, RESM0, RESM1 or RESBL based on the value in X. Likewise the STA.wx HMP0,x stores in HMP0, HMP1, HMM0, HMM1, or HMBL based on the value in X. The .WX as a force extension that tells DASM you want the STA to use absolute addressing (16-bit address), as it'll use a Zero Page address by default for any address in zero page (which is where the TIA registers are located). We do that because it takes 1 extra cycle, which is crucial for making the StA RES##,x happen at the correct time. The extensions DASM supports are listed in its manual: EXTENSIONS: FORCE extensions are used to force an addressing mode. In some cases, you can optimize the assembly to take fewer passes by telling it the addressing mode. Force extensions are also used with DS,DC, and DV to determine the element size. NOT ALL EXTENSIONS APPLY TO ALL PROCESSORS! example: lda.z charlie i -implied ind -indirect word 0 -implied 0x -implied indexing (0,x) 0y -implied indexing (0,y) b -byte address bx -byte address indexed x by -byte address indexed y w -word address wx -word address indexed x wy -word address indexed y l -longword (4 bytes) (DS/DC/DV) r -relative u -uninitialized (SEG) First character equivalent substitutions: b z d (byte, zeropage, direct) w e a (word, extended, absolute) The routine takes advantage of the SBC #15/BCS DivideLoop taking 5 cycles per loop, so it can position every 15th pixel (as TIA draws 3 pixels for every cycle of 6507 time). If you can position every 15th pixel then setting the appropriate HMxx value lets you set the final position at any of the 160 pixels. Repositioning an object while drawing other objects is trickier of course, so will be difficult to get a handle on if you're just learning the 2600. For that what I end up doing is having 11 different kernels per object based on the X position I need the object to end up at. (as 160 pixel / 15 = 10.67). Here's an example of the 11 reposition kernels I use for Player0 in Draconian: Resp0Strobe23: ; 20 sta RESP0 ; 3 23 SLEEP 3 ; 3 26 lda #DS_SIZE ; 2 28 sta NUSIZ0 ; 3 31 <- changes player size FP028: lda #DS_COLOR ; 2 33 sta COLUP0 ; 3 36 FP033: lda #DS_HMP0 ; 2 38 sta HMP0 ; 3 41 FP038: lda #DS_HMP1 ; 2 43 sta HMP1 ; 3 46 FP043: lda #DS_GRP0 ; 2 48 sta GRP0 ; 3 51 <- for next scanline, VDELP0 on FP048: lda #DS_BALL ; 2 53 sta ENABL ; 3 56 <- for next scanline, VDELBL on FP053: sta HMBL ; 3 59 lda #DS_MISSILE0 ; 2 61 FP058: tax ; 2 63 stx HMM0 ; 3 66 FP063: lda #DS_MISSILE1 ; 2 68 tay ; 2 70 sty HMM1 ; 3 73 lda #DS_GRP1 ; 2 75 sta.w HMOVE ; 4 79/3 sta GRP1 ; 3 6 @0-21 DIGITAL_AUDIO ; 5 11 stx ENAM0 ; 3 14 @0-21 sty ENAM1 ; 3 17 @0-21 jmp FASTJMP ; 3 20 Resp0Strobe28: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size sta RESP0 ; 3 28 jmp FP028 ; 3 31 Resp0Strobe33: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 sta RESP0 ; 3 33 jmp FP033 ; 3 36 Resp0Strobe38: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 lda #DS_HMP0 ; 2 32 sta HMP0 ; 3 35 sta RESP0 ; 3 38 jmp FP038 ; 3 41 Resp0Strobe43: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 lda #DS_HMP0 ; 2 32 sta HMP0 ; 3 35 lda #DS_HMP1 ; 2 37 sta HMP1 ; 3 40 sta RESP0 ; 3 43 jmp FP043 ; 3 46 Resp0Strobe48: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 lda #DS_HMP0 ; 2 32 sta HMP0 ; 3 35 lda #DS_HMP1 ; 2 37 sta HMP1 ; 3 40 lda #DS_GRP0 ; 2 42 sta GRP0 ; 3 45 <- for next scanline, VDELP0 on sta RESP0 ; 3 48 jmp FP048 ; 3 51 Resp0Strobe53: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 lda #DS_HMP0 ; 2 32 sta HMP0 ; 3 35 lda #DS_HMP1 ; 2 37 sta HMP1 ; 3 40 lda #DS_GRP0 ; 2 42 sta GRP0 ; 3 45 <- for next scanline, VDELP0 on lda #DS_BALL ; 2 47 sta ENABL ; 3 50 sta RESP0 ; 3 53 jmp FP053 ; 3 56 Resp0Strobe58: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 lda #DS_HMP0 ; 2 32 sta HMP0 ; 3 35 lda #DS_HMP1 ; 2 37 sta HMP1 ; 3 40 lda #DS_GRP0 ; 2 42 sta GRP0 ; 3 45 <- for next scanline, VDELP0 on lda #DS_BALL ; 2 47 sta ENABL ; 3 50 sta HMBL ; 3 53 lda #DS_MISSILE0 ; 2 55 sta RESP0 ; 3 58 jmp FP058 ; 3 61 Resp0Strobe63: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 lda #DS_HMP0 ; 2 32 sta HMP0 ; 3 35 lda #DS_HMP1 ; 2 37 sta HMP1 ; 3 40 lda #DS_GRP0 ; 2 42 sta GRP0 ; 3 45 <- for next scanline, VDELP0 on lda #DS_BALL ; 2 47 sta ENABL ; 3 50 sta HMBL ; 3 53 lda #DS_MISSILE0 ; 2 55 tax ; 2 57 stx HMM0 ; 3 60 sta RESP0 ; 3 63 jmp FP063 ; 3 66 Resp0Strobe68: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 lda #DS_HMP0 ; 2 32 sta HMP0 ; 3 35 lda #DS_HMP1 ; 2 37 sta HMP1 ; 3 40 lda #DS_GRP0 ; 2 42 sta GRP0 ; 3 45 <- for next scanline, VDELP0 on lda #DS_BALL ; 2 47 sta ENABL ; 3 50 sta HMBL ; 3 53 lda #DS_MISSILE0 ; 2 55 tax ; 2 57 stx HMM0 ; 3 60 lda #DS_MISSILE1 ; 2 62 tay ; 2 64 sta.w RESP0 ; 4 68 SLEEP 2 ; 2 70 sty HMM1 ; 3 73 lda #DS_GRP1 ; 2 75 sta.w HMOVE ; 4 79/3 sta GRP1 ; 3 6 @0-21 DIGITAL_AUDIO ; 5 11 stx ENAM0 ; 3 14 @0-21 sty ENAM1 ; 3 17 @0-21 jmp FASTJMP ; 3 20 Resp0Strobe73: ; 20 lda #DS_SIZE ; 2 22 sta NUSIZ0 ; 3 25 <- changes player size lda #DS_COLOR ; 2 27 sta COLUP0 ; 3 30 lda #DS_HMP0 ; 2 32 sta HMP0 ; 3 35 lda #DS_HMP1 ; 2 37 sta HMP1 ; 3 40 lda #DS_GRP0 ; 2 42 sta GRP0 ; 3 45 <- for next scanline, VDELP0 on lda #DS_BALL ; 2 47 sta ENABL ; 3 50 sta HMBL ; 3 53 lda #DS_MISSILE0 ; 2 55 tax ; 2 57 stx HMM0 ; 3 60 lda #DS_MISSILE1 ; 2 62 tay ; 2 64 sty HMM1 ; 3 67 lda #DS_GRP1 ; 2 69 sta.w RESP0 ; 4 73 SLEEP 2 ; 2 75 sta.w HMOVE ; 4 79/3 sta GRP1 ; 3 6 @0-21 DIGITAL_AUDIO ; 5 11 stx ENAM0 ; 3 14 @0-21 sty ENAM1 ; 3 17 @0-21 jmp FASTJMP ; 3 20
  15. That's fricken hilarious - we've tried talking shop before, it just doesn't work with somebody who makes shit up all the time.
  16. There's a standard routine for positioning objects, from the source of my tutorial. ;=============================================================================== ; PosObject ;---------- ; subroutine for setting the X position of any TIA object ; when called, set the following registers: ; A - holds the X position of the object ; X - holds which object to position ; 0 = player0 ; 1 = player1 ; 2 = missile0 ; 3 = missile1 ; 4 = ball ; the routine will set the coarse X position of the object, as well as the ; fine-tune register that will be used when HMOVE is used. ; ; Note: The X position differs based on the object, for player0 and player1 ; 0 is the leftmost pixel while for missile0, missile1 and ball 1 is ; the leftmost pixel: ; players - X range is 0-159 ; missiles - X range is 1-160 ; ball - X range is 1-160 ; Note: Setting players to double or quad size will affect the position of ; the players. ;=============================================================================== PosObject: sec sta WSYNC DivideLoop sbc #15 ; 2 2 - each time thru this loop takes 5 cycles, which is bcs DivideLoop ; 2 4 - the same amount of time it takes to draw 15 pixels eor #7 ; 2 6 - The EOR & ASL statements convert the remainder asl ; 2 8 - of position/15 to the value needed to fine tune asl ; 2 10 - the X position asl ; 2 12 asl ; 2 14 sta.wx HMP0,X ; 5 19 - store fine tuning of X sta RESP0,X ; 4 23 - set coarse X position of object rts ; 6 29 For diagonal lines you set HMM0, HMM1, and HMBL during the line then hit HMOVE at the start of every scanline. You can see that in action in this test build of Draconian, the first 2 objects in each row are drawn by the players, the next 2 are drawn by the missiles, the last by the ball.
  17. Alternating the score with SECTOR ### sounds like a winner to me! Was leaning towards leaving the level menu option in place, as opposed to making it an easter egg and adding continue logic. I think the ROM needed for that would be better allocated to the samples. fire + left/right now skips by 10.
  18. LOL - yeah, that's a bit too fast. Game gets too difficult too early as well, so I need to rethink how the speed ramp-up is done. Tricky part is getting it so that on level 1 the missiles are slightly slower than the ship, but on level 2 they're slightly faster (for Level = Normal). I was thinking about a sector display while play testing last night. I can't use more vertical space as screen jitter's returned on B-8. I've come up with 2 ideas but haven't looked into either one yet: use the formation indicator for sector # when a formation is not attacking show sector # in the corner of the gameplay area.
  19. Nathan's revised the cores to be more solid and uniform between the horizontal and vertical stations. We've also changed it so the core will color cycle (provided it's being drawn by the ball). I've revised the enemy missiles. Each level (kids, easy, etc) starts at a different speed, and they speed up as you progress through the sectors. Additionally, they don't turn as fast as before. Cosmo mine explosions now take out enemy missiles. For Harmony or Stella (requires Stella 5.0.0-pre8 or newer) draconian_20170622.bin Please reference Rules of the Game for what's been implemented and what's to come.
  20. SpiceWare

    P & I Type

    Sprite count's been bumped up from 150 to 171. They're allocated as: // sprite usage // 8 stations (0-7) // 8 e-type (8-15) // 1 player ship (16) // 5 formation (17-21) // 1 spy ship (22) // 20 attacking ships, explosions (23-42) // 128 stationary objects, explosions (43-170) // 171 total #define ETYPE_SPRITE 8 #define PLAYER_SPRITE 16 #define FORMATION_SPRITE 17 #define SPY_SPRITE 22 #define MISC_SPRITES 23 #define FIRST_STATIONARY_SPRITE 43 So 20 individual missiles could be attacking alongside a formation, spyship, and E-Type missiles that are being launched from the stations.
  21. The I-Type and P-Type show up individually as well as in formations. You may like to check out Rules of the Game blog entry.
  22. Revised stations to only shoot from the 2 pods closest to the player's ship. Fixed a bug which allowed you to destroy station pods without actually hitting them. New Sectors for the Gamma Quadrant I-Type and P-Type missiles are in play. The I-Type will try to intercept you, while the P-Type are just out on patrol. For Harmony or Stella (requires Stella 5.0.0-pre8 or newer) draconian_20170621.bin Please reference Rules of the Game for what's been implemented and what's to come.
  23. SpiceWare

    P & I Type

    The I-Type and P-Type missiles are in play. The I-Type will try to intercept you while the P-Type are just out on patrol. For a real challenge, try Sector 256! For Harmony or Stella (requires Stella 5.0.0-pre8 or newer) draconian_20170621.bin
×
×
  • Create New...