swapd0 Posted March 13, 2021 Share Posted March 13, 2021 Coding for the Jaguar is a nightmare... Ok, let's go to the topic and see if someone spot what I'm doing wrong. I've a something like a filesystem to get the assets from the ROM, (sounds, graphics or anything else), then I upload the game code to the skunk board (default address $4000) and play/test the game. Now I've the assets of three games burned together into the ROM, I upload the code of each game and it works. I've coded the menu to select a game and launch it, the code copy a small code at the end of the ram and run it, this small code copy the game to $4000 and jumps there. Now comes the funny thing. Game 1 works Game 2 you can see the menu, but it hangs when it shows the intro scene Game 3 you hear the music but no image, sometimes it runs but with glitches and I doesn't read very well the joypad (I've to press fire several times to start the game) Even if I call run_game at the start of the code it doesn't work. It looks like the Jaguar can't be initalizated two times, one for the menu, the other at the start of each game. I've no idea why this doesn't work. LOAD_ADDRESS .equ 2*1024*1024-64 ; end of ram ;_run_game(const void *begin, const void *end) _run_game:: move.w #$2700,sr move.w #$7fff,VI ; VI lea _copy_run,a0 move.l #LOAD_ADDRESS,a1 move.w #(_end_copy_run-_copy_run)/2-1,d7 .loop: move.w (a0)+,(a1)+ dbf d7,.loop move.l 4(sp),a0 move.l 8(sp),a1 jmp LOAD_ADDRESS _copy_run: move.l #$4000,a2 .loop: move.w (a0),$f00058 ; BG move.l (a0)+,(a2)+ cmp.l a0,a1 bge.s .loop jmp $4000.w _end_copy_run: Quote Link to comment https://forums.atariage.com/topic/318299-bug-hunting/ Share on other sites More sharing options...
Zerosquare Posted March 13, 2021 Share Posted March 13, 2021 (edited) move.l 4(sp),a0 move.l 8(sp),a1 If the stack pointer is located at the end of RAM, at that point the values on the stack may have been overwritten by the code you've copied there. Load the values from the stack before copying. Also, check the operator priority there: move.w #(_end_copy_run-_copy_run)/2-1,d7 Is it evaluated as ((_end_copy_run-_copy_run)/2)-1, or (_end_copy_run-_copy_run)/(2-1)? Edited March 13, 2021 by Zerosquare Quote Link to comment https://forums.atariage.com/topic/318299-bug-hunting/#findComment-4777091 Share on other sites More sharing options...
swapd0 Posted March 14, 2021 Author Share Posted March 14, 2021 The stack pointer is located at $4000-4 in all games. I think that the problem is somewhere in the init code, because the games boot but sometimes it hangs or have a lot of graphics glitches (some black horizontal lines). I'm going to copy the init code and call it into the main function. Quote Link to comment https://forums.atariage.com/topic/318299-bug-hunting/#findComment-4777421 Share on other sites More sharing options...
Zerosquare Posted March 14, 2021 Share Posted March 14, 2021 3 hours ago, swapd0 said: The stack pointer is located at $4000-4 in all games. I don't mean the stack pointer in the game, I mean the stack pointer in your menu code. Quote Link to comment https://forums.atariage.com/topic/318299-bug-hunting/#findComment-4777488 Share on other sites More sharing options...
swapd0 Posted March 14, 2021 Author Share Posted March 14, 2021 (edited) 2 hours ago, Zerosquare said: I don't mean the stack pointer in the game, I mean the stack pointer in your menu code. It's also at $4000-4 I've found the following. This is part of the menu of BurgerTom, I've included all the DPRINT to see where it hangs. If I upload the code to the skunk if works and I get a lot of text messages BUT if I load the menu that just execute the copy_run code I don't get the "new strip" message. WTF!?! It's defined and initialized to 0, why it doesn't work when I copy the code at $4000? _text_strip must be somewhere in the data segment and it must be part of the binary code that I upload. static SPRITE_STRIP *_text_strip = NULL; ... void init_text() { DPRINT_FN(); if ( _text_strip == NULL ) { DPRINT("new strip\n"); _text_strip = new_strip(256, 224, 0); } DPRINT("clear strip\n"); clear_strip(_text_strip); DPRINT("clear strip done\n"); _text_metadata.offset = 0; _text_metadata.width = 4; _text_metadata.hx = 0; _text_metadata.hy = 0; ... Looking at the .map file... it's into the bss? ? .bss._select_sprite 0x00000000000357fc 0x18 .bss._select_sprite 0x00000000000357fc 0x18 obj/menu.o .bss._text_strip 0x0000000000035818 0x4 .bss._text_strip 0x0000000000035818 0x4 obj/menu.o .bss._text_metadata 0x000000000003581c 0x20 .bss._text_metadata 0x000000000003581c 0x20 obj/menu.o Edited March 14, 2021 by swapd0 Quote Link to comment https://forums.atariage.com/topic/318299-bug-hunting/#findComment-4777558 Share on other sites More sharing options...
swapd0 Posted March 14, 2021 Author Share Posted March 14, 2021 If I use this, new_strip it's called when I execute the game from the menu, but it still hangs maybe because I've a lot of code like that. static SPRITE_STRIP *_text_strip __attribute__ ((section (".data"))) = NULL; Quote Link to comment https://forums.atariage.com/topic/318299-bug-hunting/#findComment-4777566 Share on other sites More sharing options...
swapd0 Posted March 14, 2021 Author Share Posted March 14, 2021 (edited) It looks like I must use -fno-zero-initialized-in-bss flag. And yes, that was the problem, now I understand why sometimes (around 1/20) the game didn't boot. Edited March 14, 2021 by swapd0 1 Quote Link to comment https://forums.atariage.com/topic/318299-bug-hunting/#findComment-4777590 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.