figuring out how to put two 2k games together into one 4k cart

Started by Chris!, September 09, 2014, 09:40:05 AM

Previous topic - Next topic

Chris!

After an hour or so of fiddling around, I figured out how to put two 2k games into one 4k cart. Here's what you need to put at the beginning of the program.

cpu 8048

org 400h

include "g7000.h"

jmp 02c3h
jmp irq ; interrupt
jmp timer ; timer
jmp vsyncirq ; VSYNC-interrupt
jmp start ; after selectgame
jmp soundirq ; sound-interrupt

timer
;retr




start
mov r7,a
xrl a,#002h ; adjust x pos
jz jumptogame_2

jmp begin_game_1


jumptogame_2
jmp 0387h

begin_game_1

In this example, if the number 2 is pressed the game will go to the second game in the other bank. All other button presses lead to the first game. Ah, the thrill of discovery.
All my Odyssey2 projects, now in one place!
http://www.atari2600land.com/odyssey2.html

Packrat

Interesting. Would be curious if this is how other games did this too (not that what you found is wrong - cool stuff)?

manopac

yes, this is how most games do it - because it's the standard "Select Game" routine anyways ...
also, it is described in the g7kbios document by Sören Gust ...

"At power on or after reset the BIOS jumps directly to 0400h, the first address of the external ROM. Normally
you put a  jmp selectgame = 02C3h there, this initialises the VDC, internal and external RAM. Then it
displays the "SELECT GAME" message and waits for a key. After that it jumps to 0408h. There you have to
start your code with another jmp, because 040Ah is used by the interrupt. Which key was pressed is stored in A.
All sprites, chars, quads and the grids are initialised, the VDC is enabled and the graphics are on."

the essential parts of the source above (the one actually taking care of the selection, minus all the BIOS and Interrupt-Vectors you have to put on the lines described by the BIOS, details can be read in the doc mentioned above)

   jmp 02c3h                                    <- (because BIOS on address 0000h jumps to address 0400h, so this is the very start of every program on an ody2 or G7000) make a jump to the Select game routine (better would be "jmp BIOS_selectgame", as this would also work with g7000.h included and makes the code readable)

   jmp   start      ; after selectgame    <- the select game BIOS routine jumps to the address stored in 0408h after the user presses a key


start
   mov r7,a                                          <- select game returns the pressed key in the accumulator, here it is saved in r7, you only need this if you want to compare to more than one key and thus need the result of selectgame again
   xrl a,#002h   ; adjust x pos                   <- doing an xor creates essentially a comparison -> if the result is zero, then a = 02h
   jz jumptogame_2                                <- so jump to game 2 if the result is zero ... (= Key 2)

   jmp begin_game_1                             <- otherwise jump to game 1

jumptogame_2
   jmp 0387h                                        <- jump to game 2 (in Bank0 -> this is equivalent to "jmp BIOS_bank0"

begin_game_1

but all this is, is a comparison which key the select game routine returns (and jumping accordingly) - the switch and jumps can differ if for example no bank switching is involved (e.g., the first 2K games with two ore more games) - then no bankswitching, but jumps to addresses in the same bank would be used ...

sex, lies, and videopac

manopac

and just for the fun of it - here's what you would do if you need 3 keys and want the user to only switch with 1, 2 and 3, and no other key:

start:
   mov r7,a
   xrl a,#001h   
   jnz noGame1

   jmp begin_game_1

noGame1
   mov a,r7
   xrl a,#002h   
   jnz noGame2

   jmp begin_game_2

noGame2
   mov a,r7
   xrl a,#003h   
   jnz noGameSelected

   jmp begin_game_3

noGameSelected
       jmp BIOS_selectgame
sex, lies, and videopac

Chris!

Soren Gust's website is no more, and I'm having a bit of a problem with that.
All my Odyssey2 projects, now in one place!
http://www.atari2600land.com/odyssey2.html

Janzl

I'm happy I downloaded his docs long ago :) Not that I ever use them anymore :(
Ne tirez pas sur le administrator!

Packrat

Quote from: Chris! on September 09, 2014, 07:07:54 PM
Soren Gust's website is no more, and I'm having a bit of a problem with that.

What? I was on his site not that long ago. Would be curious as to what happened. Plus would be nice to move that programming stuff to another location if possible, as I'm sure some would still find it useful.

manopac

Quote from: Chris! on September 09, 2014, 07:07:54 PM
Soren Gust's website is no more, and I'm having a bit of a problem with that.

damn ... you are right ... if you want the tech doc from his site, drop me a PM with your email and I'll send it to you
sex, lies, and videopac

timdu

A few months ago, I asked Rene some questions about learning assembly, and he informed me that:

Soeren Gusts website was a great start to learn Videopac assembly, but it doesn't seem to exist anymore. However, you can find it in the internet archives here:

http://web.archive.org/web/20130608030041/http://soeren.informationstheater.de/g7000/toc.html


Tim