Jump to content

Mallard Games

Members
  • Content Count

    105
  • Joined

  • Last visited

Everything posted by Mallard Games

  1. Oops sorry, that is very strange considering the only code i change was breaking up the checkstate subroute into 2 parts. The portion that actually does the bankswitching was moved into the macro and that's pretty much it. Technically it shouldn't of have borked, but it did...? 🧐
  2. Hi, Back from a long hiatus, and now am refreshed and ready to start working on my project again. I reworked the code so all the bankswitching now works. The only issue now is for some strange reason now moving left and right is borked! Here is what I have so far, I don't see any jumps that would skip that bit of code. Any ideas? Source-12_25_19.zip
  3. How do i make a .sym file, the tutorial states: Which only creates a list file and Stella is complaining about there being no symbol file to load... 🤯 UPDATE: rc7e helped me in the ZeroPage stream with getting a sym file created. The answer for anyone else who needs it is to append -s like so: dasm kernel.asm -lkernel.lst -skernel.sym -f3 -v5 -okernel.bin Now here's what I've figured out, after the button is pressed at address 5116: bmi CheckFireDone it jumps to address 506e: 506e lsr 506f lsr 5070 lsr 5071 tax 5072 cmp $1ff6,x 5075 Which is actually in the middle of my bankswitching code... Return_Code tsx lda $02,x lsr lsr lsr lsr lsr tax cmp SelectBank1,x ; bank 1 rts So it does try to bankswitch but then ends up in 109a 10a9 TitleScreen_Kernal 10a9 WaitForVblankEnd_TitleScreen 10a9 bit TIMINT 10ac bpl WaitForVblankEnd_TitleScreen 10ae ldy #31 10b0 TopPaddingLoop 10b0 sta WSYNC 10b2 dey Which makes absolutely no sense to me... UPDATE: scratch that i think i have an idea of what's going on. Short version: Super Epic Fail on my part! Now the problem is how can i change it so the jumps inside CheckState in bank 3 work? or just how do i refactor my code??? ☠️🤮☠️
  4. Question how do I emulate the fire button being pressed on player 1's controller while in the debugger?
  5. Finally got a chance to look at the source code again and could not see any glaring issues. What I thought was the code jumping into no mans land was actually a mistake on my part. In fact it is jumping into one of the Vertical Sync code. It then jumps back into bank 1. What's is very strange to me is despite the code setting the state correctly, it never jumps to the proper bank despite the bankswitching code being there like it's completely ignoring it.
  6. Yes, that's how I came to the conclusion above. Funny thing is if you look into the listing file the very last used address is: 8 4ffe 00 10 .word.w InitSystem I was exhausted today so I couldn't look into further. Hopefully tomorrow I can do some more testing and see if I can figure it out.
  7. @Flojomojo @Thomas Jentzsch @Nukey Shay @stephena @Arenafoot I can confirm the FlashAir wireless capabilities works on the Atgames Portable Frogger/Pac-Man Edition.
  8. I did everything you stated and still can't get it to transition. What's strange is despite the macro ensuring everything lines up correctly it still jumps to what seems like the middle of the input subroutine. What's strange is the pc is at 5xxx which doesn't line up what what the listing file. Source Code: https://www.dropbox.com/sh/5snzytblleo9zzi/AABhxkPUVp2V_GZmItcrLZOIa?dl=0
  9. What do you mean by By the way moved the subroutine into bank 3 and added it to the macro. Still am having issues. Source: https://www.dropbox.com/sh/d65mqk4crtc4xr3/AACJb9jisk6PcyJu-Ndw4gZja?dl=0
  10. The question is how do I align the code so it's "exactly at the address the cpu will fetch the next instruction from". Also I moved the 2 pla's up so they do execute and removed the jmp that will never execute or succeed if it does. CheckState lda GameState ; check the gamestate cmp #STATE_TITLESCREEN ; has it changed beq StateCheckDone ; if not then branch pla ; clear low byte of jump address from stack pla ; clear high byte of jump address from stack cmp SelectBank2 ; bankswitch to bank 2 StateCheckDone rts
  11. Fixed the RTS not being cancelled. CheckState lda GameState ; check the gamestate cmp #STATE_TITLESCREEN ; has it changed beq StateCheckDone ; if not then branch cmp SelectBank2 ; bankswitch to bank 2 pla ; clear low byte of jump address from stack pla ; clear high byte of jump address from stack jmp GameMode ; jump to game mode StateCheckDone rts Tried moving that bit of code so it is right above reset, and it stops the crashing but now it just sticks to the title screen. ; *********************************************************************************** ; Start of Bank 1 ; Title Screen Bank ; *********************************************************************************** seg Bank_1 ; end of uninitialized segment - start of ROM Bank 1 org $1000 ; start ROM at $1000 rorg $1000 ; start ROM at $1000 JUMP_TABLE CheckState lda GameState ; check the gamestate cmp #STATE_TITLESCREEN ; has it changed beq StateCheckDone ; if not then branch cmp SelectBank2 ; bankswitch to bank 2 pla ; clear low byte of jump address from stack pla ; clear high byte of jump address from stack jmp GameMode ; jump to game mode StateCheckDone rts ; we'll call the start of our program "Reset". Reset sei ; Disable Any Interrupts cld ; Clear BCD math bit. ldx #$FF ; put X to the top... txs ; ...and use it reset the stack pointer ; Clear RAM and all TIA registers lda #0 ; Put Zero into A, X is at $FF Clear sta 0,x ; Now, this doesn't mean what you think... dex ; decrement X (decrease X by one) bne Clear ; if the last command resulted in something ; that's "N"ot "Equal" to Zero, branch back ; to "Clear" ; ************************************************************************** ; One time initializations ; ************************************************************************** lda #BLUE sta COLUBK ; set the background color to sky blue lda #BROWN sta COLUPF ; set the playfield color to brown lda #WHITE sta COLUP1 ; set crosshair color to white lda INTIM ; get a random value from INTIM sta Random ; use it to seed the random number generator lda #STATE_TITLESCREEN ; 0 = title screen state sta GameState ; store it AttarctMode TitleScreenLoop jsr VerticalSync ; perform vertical sync jsr CheckJoystick ; check for joystick input jsr CheckState ; check if the gamestate has changed jsr TitleScreen_Kernal ; jump to title screen kernal jsr OverScan ; (3 13) jump to OverScan Routine jmp TitleScreenLoop ; jump to start of loop TitleScreen_Kernal WaitForVblankEnd_TitleScreen bit TIMINT ; load timer... bpl WaitForVblankEnd_TitleScreen ; killing time if the timer's not yet zero ldy #31 ; 16 scanline of padding on the top TopPaddingLoop: sta WSYNC ; wait for sync dey ; decrement y bne TopPaddingLoop ; loop until the top of the screen is padded 16 scanlines ldy #64 ; Y is going to hold how many lines we have to do ; ...we're going to count scanlines here. theoretically ; since this example is ass simple, we could just repeat ; the timer trick, but often its important to know ; just what scan line we're at. ldx #02 ; interlaced sta WSYNC ; We do a WSYNC just before that so we don't turn on sta VBLANK ; End the VBLANK period with the zero ;*********************** Scan line Loop ScanLoop_TitleScreen sta WSYNC ; (3 0) Wait for the previous line to finish lda pf0dataleft-1,y ; (4 4) load left pf0 data into the acumulator sta PF0 ; (3 7) and store it lda pf1dataleft-1,y ; (4 11) load left pf1 data into the acumulator sta PF1 ; (3 14) and store it lda pf2dataleft-1,y ; (4 17) load left pf2 data into the acumulator sta PF2 ; (3 21) and store it lda pf0dataright-1,y ; (4 25) load right pf0 data into the acumulator sta PF0 ; (3 28) and store it *MUST OCCUR AFTER CYCLE 28* SLEEP 3 ; (3 31) sleep for 3 cycles lda pf1dataright-1,y ; (4 35) load right pf1 data into the acumulator sta PF1 ; (3 38) and store it *MUST OCCUR AFTER CYCLE 38* SLEEP 5 ; (5 43) sleep for 5 cycles lda pf2dataright-1,y ; (4 47) load right pf2 data into the acumulator sta PF2 ; (3 50) and store it *MUST OCCUR AFTER CYCLE 50* dex ; (2 52) decrement x bne ScanLoop_TitleScreen ; (2/3 54/55) and repeat if we're not finished with all the scanlines. ldx #02 ; (2 56/57) load 2 into x register dey ; (2 58/59) subtract one off the line counter thingy bne ScanLoop_TitleScreen ; (2/3 60/61 61/62) and repeat if we're not finished with all the scanlines. sty PF0 ; clear PF0 register to prevent garbage from appearing on the screen sty PF1 ; and PF1... sty PF2 ; and PF2 just in case ldy #31 ; (2 62/63 63/64) 16 scanlines of padding on the bottom BottomPaddingLoop: sta WSYNC ; (3 0) wait for sync dey ; (2 2) decrement y bne BottomPaddingLoop ; (2/3 4/5) loop until the bottom of the screen is padded 16 scanlines rts ; ************************************* ; Data Section Follows ; ************************************* Source Code: https://www.dropbox.com/sh/zjbuabjg4i0p7c9/AAAXbjqu6ODRiGrQqi8_sR5Aa?dl=0
  12. I know the contest already ended but, I'm already subscribed.
  13. If your talking about cmp SelectBank2 ; bankswitch to bank 2 It bankswitches to the second bank where the game mode code is. The bankswitching takes so time to happen so I added the 3 nop instructions to pass the time. I have removed them since.
  14. Back again, I have some good news progress has been slow but, steady. Some minor bug fixes have been made that should improve the code a bit. Now comes the hard part, getting the game to transition from the title screen to the game mode. Here is the code I am using: CheckState lda GameState ; check the gamestate cmp #STATE_TITLESCREEN ; has it changed beq StateCheckDone ; if not then branch cmp SelectBank2 ; bandswitch to bank 2 nop nop nop jmp GameMode ; jump to game mode StateCheckDone rts It's almost exactly like the bankswitching code except it's a jump instead of jump to subroutine and there are check to see if we need to perform the jump based on what the current state of the game is. The issue is when I try to perform the bankswitch the game crashes on Stella with "Illegal Instruction". My guess is the 2600 doesn't like me abandoning the CheckState routine altogether if the game state is changed, but at that point the subroutine doesn't need to finish since the rest of the code doesn't need to execute at all. I must say in all seriousness though this is starting to hurt my head. Source: https://www.dropbox.com/sh/ku4ip913q718h0n/AABpPC0h8maEuBAL4U7dtl3Oa?dl=0
  15. Weird they both say 2.8" LCD screen on the box. Sorry about that I actually don't know much about these including what year they're from. That's why I'm asking the community for advice.
  16. Which of these 2 AtGames Flashback Portable's would you recommend I buy? 1) Atari Flashback Portable Console (80 Games Included) (eu) /retro by Atari ESRB Rating: Everyone 2.6 out of 5 stars  7 Xbox One $29.00(15 used & new offers) 2) Atari Flashback Portable Deluxe Edition - Hand Held Console by Atari 4.6 out of 5 stars  7 $29.99(5 used & new offers)
  17. Should I just go for last years model then since I can just add in any exclusive games via the SD card?
  18. So with September just starting and the summer officially over we are officially getting close to the release of the latest version of Atari Portable 2019. Is there a list of what games will be included yet and what new features if any there will be?
  19. Is it necessary to clear the PF register At the end if the loop?
  20. Just reread the example he gave, he meant I should lda pf0dataleft-1,y Instead of lda pf0dataleft,y and then I can remove the padding byte.
  21. How do I subtract 1 from the data tables? This is just a snippet of the full source but, I just double checked and I do dey In both examples. I don't clear my PF registers after each scanline is that bad, should I be worried?
  22. We're talking about this loop: ldy #64 ; Y is going to hold how many lines we have to do ; ...we're going to count scanlines here. theoretically ; since this example is ass simple, we could just repeat ; the timer trick, but often its important to know ; just what scan line we're at. sta WSYNC ; We do a WSYNC just before that so we don't turn on sta VBLANK ; End the VBLANK period with the zero ;*********************** Scan line Loop ScanLoop_TitleScreen sta WSYNC ; (3 0) Wait for the previous line to finish lda pf0dataleft,y ; (4 4) load left pf0 data into the acumulator sta PF0 ; (3 7) and store it lda pf1dataleft,y ; (4 11) load left pf1 data into the acumulator sta PF1 ; (3 14) and store it lda pf2dataleft,y ; (4 17) load left pf2 data into the acumulator sta PF2 ; (3 21) and store it lda pf0dataright,y ; (4 25) load right pf0 data into the acumulator sta PF0 ; (3 28) and store it *MUST OCCUR AFTER CYCLE 28* SLEEP 3 ; (3 31) sleep for 3 cycles lda pf1dataright,y ; (4 35) load right pf1 data into the acumulator sta PF1 ; (3 38) and store it *MUST OCCUR AFTER CYCLE 38* SLEEP 5 ; (5 43) sleep for 5 cycles lda pf2dataright,y ; (4 47) load right pf2 data into the acumulator sta PF2 ; (3 50) and store it *MUST OCCUR AFTER CYCLE 50* dey ; (2 58/59) subtract one off the line counter thingy bne ScanLoop_TitleScreen ; (2/3 60/61 61/62) and repeat if we're not finished with all the scanlines. That's 64 lines right? If I change it to: ldy #63 ; Y is going to hold how many lines we have to do ; ...we're going to count scanlines here. theoretically ; since this example is ass simple, we could just repeat ; the timer trick, but often its important to know ; just what scan line we're at. sta WSYNC ; We do a WSYNC just before that so we don't turn on sta VBLANK ; End the VBLANK period with the zero ;*********************** Scan line Loop ScanLoop_TitleScreen sta WSYNC ; (3 0) Wait for the previous line to finish lda pf0dataleft,y ; (4 4) load left pf0 data into the acumulator sta PF0 ; (3 7) and store it lda pf1dataleft,y ; (4 11) load left pf1 data into the acumulator sta PF1 ; (3 14) and store it lda pf2dataleft,y ; (4 17) load left pf2 data into the acumulator sta PF2 ; (3 21) and store it lda pf0dataright,y ; (4 25) load right pf0 data into the acumulator sta PF0 ; (3 28) and store it *MUST OCCUR AFTER CYCLE 28* SLEEP 3 ; (3 31) sleep for 3 cycles lda pf1dataright,y ; (4 35) load right pf1 data into the acumulator sta PF1 ; (3 38) and store it *MUST OCCUR AFTER CYCLE 38* SLEEP 5 ; (5 43) sleep for 5 cycles lda pf2dataright,y ; (4 47) load right pf2 data into the acumulator sta PF2 ; (3 50) and store it *MUST OCCUR AFTER CYCLE 50* dey ; (2 58/59) subtract one off the line counter thingy bpl ScanLoop_TitleScreen ; (2/3 60/61 61/62) and repeat if we're not finished with all the scanlines. would it be more efficient for looping through 64 scanlines of playfield data?
  23. When doing loops, if you want to iterate against say 64 items the formula is: x-1 for example lda #63 ; loop 64 times and not lda #64 ; loop 64 times correct?
  24. So I know in these modern times most of us use Windows to do our coding. Some even use Macintosh or Linux. Others use Linux hosted in the cloud, or a VPS. I'm interested in learning more about what systems were used in the 80's when the 2600 was 🔥 hot 🔥 to program games?
×
×
  • Create New...