Videopac / Odyssey2 forum
September 27, 2021, 09:46:46 PM *
Welcome, Guest. Please login or register.

Login with username, password and session length
News: If you have some news and you want it to be shown here, pm Janzl!
 
   Home   Help Login Register links videopac.nl  
Pages: [1]   Go Down
  Print  
Author Topic: Beginner O2 Programming. Questions about a HelloWorld example.  (Read 571 times)
Caleb Garner
Trying to get the cartridge in...
*
Posts: 19


« on: June 01, 2021, 12:42:36 PM »

OK so this is where the rubber meets the road and runs over the noob programmer!  Totally new here to the forum.  Hello World! Smiley

So just so you know where i'm at..  i was able to get the resources from http://atari2600land.com/odyssey2/odyssey2howtoprogram.html

     - I have some programming experience, but not professional. mostly a working understanding of the concepts.  vars loops functions etc..  but have mostly used game dev tools like Construct, GameSalad and other "code free" solutions
     - I have O2em working
     - I was able to compile a "helloworld.bin" and run it successfully in the emulator (with some awesome help from 2600AtariLand and others) here https://atariage.com/forums/topic/320931-just-starting-out-exploring-making-homebrews-for-o2/

So. I feel like that flow is good now and so I'm turning my attention to understanding how to understand what is going on in this hello world example and future example .a48 files.  


I've been staring at this hello world code for awhile and I just don't understand the "flow" here..  The imagine of the code should be visible below.  

 

     1.  I understand that starter code is needed now and is it safe to say that all programs need to have this at the start of the .a48 file?  

Is this something that is always needed at the start of a program?  basically, can i skip this and move past that for my code?  

...
   cpu   8048
   org   400h
   include   "g7000.h"    
    
   jmp      myinit
   jmp      irq              ; interrupt
   jmp      timer      ; timer
   jmp      vsyncirq       ; VSYNC-interrupt
   jmp       start
       jmp       soundirq       ; sound-interrupt

myinit

    call init           ; to skip Select game message

timer      ; needed, but can be blank, like this
...

 

     2. What exactly is VDC or VDC registers?  I'm working on chapter 2.7 http://web.archive.org/web/20130609214629/http://soeren.informationstheater.de/g7000/chapter2.html from the link at the very top of this post and there's a lot to unpack even in this simple example.

 

     3. they talk about using gfxoff and gfxon..  what is this all about?  are you supposed to do this with each frame?  Hide everything at the start of the code and then reveal the graphic at the end?  why is this?  what's going on?  

 

     4. call, mov, movp, inc, db.. what are these?  is there some kind of manual or list of what these are and how they work in relation to the O2?  



     5. i have a basic understanding of pointers, but is there some kind of map of memory "slots" that are specific to the O2?   I'm not experienced i working with points so when i see various hex values i'm just trying to understand if these values are unique to O2 and if so how do I know how to correctly reference them by name?  



     6. in the Hello World code below there are all these r0 through r6 in various locations, not in order.  the comments help a little, but they are kinda cryptic for me..  

 

like:

 
...
mov r0,#vdc_char0  ; start char
...

...
inc   r1.                   ; advance pointer
...
 


advance pointer?   start char (character?)

 

I have more questions but i think 6 is plenty to start with!  Smiley    as I analyze and break down how to work creatively within these code paradigms.  

 
Thanks!

Caleb


Logged
TedFoolery
Attacked the Timelord
***
Posts: 101


« Reply #1 on: June 01, 2021, 05:43:35 PM »

1. Yes, those 6 JMPs at the beginning need to be there and in that order. The BIOS jumps to these locations when needed and the "init", "vsyncirq", etc. are default routines in the BIOS that handles these tasks. For most basic stuff, you can leave them unchanged. But, this setup allows you to write your own routines for advanced things, like custom sounds, split screen colors, re-using characters/sprites, etc. NOTE: you really should have a "retr" after the "timer" label

2:The VDC is the chip that handles the graphics. The VDC registers are the memory locations that control the sprites, characters, quads and grid. Example, for Sprite 0, #00h is the X coordinate, #01h is the Y coordinate, and #02h controls size and color. It's an 8x8 pixel shape and is defined at $080 thru $087.
For Character 0, $010 is the Y coordinate, $011 is X, $012 points to which character is shown (kinda) and $013h sets color (and is also tied to $012). Google for o2doc.pdf to find more details.

3. You can't change the VDC while showing graphics, so you have to turn them off, make the changes, then turn them back on (you don't need to keep doing this on each frame - just when changing something). This can cause flickering, so typically you'd do a "call waitvsync" which loops and waits until a vertical blank (when the tv has finished drawing the screen) and then you can turn the graphics off and make your changes before the TV draws the screen again. After you get your bearings on O2 programming, look up "tables" in Soeren's examples. There are functions to draw the graphics during the vertical blank period and it makes for very smooth, flicker-free graphics.

4. Just google for 8048 or MCS-48 for a pdf of the instruction set of the 8048 CPU. Too much cover here, but "call XXX" is a jump to a subroutine. The subroutine will end with a "ret" or "retr" to return where it jumped form. "mov" just moves data. "movp" moves data from a "p"ointed location. "db" is data byte. - just raw data.

5. The o2doc.pdf is a basic memory map for the VDC and other tech stuff. The O2 only has 128 bytes of external ram and just 29 bytes (I think) of usable internal ram.

6. there are no "variables" like high level languages, just registers. You get 8 registers plus an 'accumulator" which is the work-horse of registers. "r0" thru "r7" and "a" are all you get and each can only hold a value of #00h to #ffh (0 - 255)

In the helloworld example I'll try to give more explanation:
start
        call    gfxoff              ; switch the graphics off
        mov     r0,#vdc_char0       ; start char There are only 12 characters in the O2. They behave like sprites in that the can be placed anywhere, but the differ in that you can't change the shape.
        mov     r3,#20h             ; x-position
        mov     r4,#20h             ; y-position
        mov     r2,#0Bh             ; length -- 11 characters to show, so we need to loop 11 times. We'll count down
        mov     r1,#hellostr & 0FFh ; the string to print
                                    ; must be in the same page -- the data for the string of characters to print stored in the "db" statements at the bottom
loop    mov     a,r1                ; get pointer - Move the value stored in r1 to the accumulator (the address of the data sting below)
        movp    a,@a                ; get char - get the data for the "db" line and store it in the accumulator
        mov     r5,a                ; into to right register - move the accumulator to r5
        inc     r1                  ; advance pointer - increment the pointer so the time in the loop will get the next character
        mov     r6,#col_chr_white   ; colour - set the color
        call    printchar           ; print it - this is a function call to a BIOS routine. It requires the above registers to be set. It does all the complex work of figuring out which character to draw and sets the VCD registers. It also advances the X coordinate stored in r3 by #08h so the next character will be placed correctly.
        djnz    r2,loop             ; do it again -- "djnz" means Decrement and Jump if Not Zero. It decrements r2 and if it does not equal zero, it will jump to "loop" above
        call    gfxon               ; lets see what is written
stop    jmp     stop                ; Thats all

hellostr db     1Dh, 12h, 0Eh, 0Eh, 17h, 0Ch
         db     11h, 17h, 13h, 0Eh, 1Ah
Logged
Caleb Garner
Trying to get the cartridge in...
*
Posts: 19


« Reply #2 on: June 03, 2021, 03:10:13 AM »

Hi Ted, thanks for this reply!  Sorry for the delay, I've had a busy couple days and wanted to get my mind in the right state to free my mind! Smiley



1. so regarding the "retr" (what is that?) should it be like this?

...
timer     ;
retr       ;

start
...

2. thanks for the VDC explanation.  Now in this reply, you talk about sprite 0.. but the hello world has no sprite 0 reference.  i'm being super thorough about what my hello world is and what is happening at each point.  I understand what you mean by sprite, just am trying to really understand this HW source before i move on to some of the other examples i have (including a "movesprite" example). 

but to your sprite talk you say #00h is the x coordinate.  is this some universal x coordinate value?  how do you know this value is x, or did you simply choose to make #00h the x coordinate?  my understanding is that there are a finite number of sprites and graphics, perhaps there's some map where each sprite / size / location are hard coded somewhere?  that actually makes a ton of sense as i understand there are combo graphics also that can be made by the predetermined symbols which again is a brilliant example of efficiency.. am i off base here?  i maybe running too far with my understanding.. 

If i'm not to far off base, then there must be some document out there right that would give me all these values to reference right?  I understand hex values as well, but the values you're giving me don't really have any meaning / context at this time. 

3. ok yes think i follow you on that and how to redraw stuff.  basically gfx on is displaying whatever the last update was and then and as you said when it's time to update something run some code with gfxoff and then display again showing the new results from the code.

Soeren's examples?  what/who is that?  tables?   is there some cheat sheet somewhere?  these functions are predefined or is it like other programming where functions are something you make to call on sippes of code (forgive me, i'm a lightweight programming more famliar with things like javascript / html5)

4. how do know what's 8048 code that's general vs knowing what specific events know how to talk to unique things like joystick and fire buttons, keyboard presses, etc.  or how to make sounds etc.  some kind of cheat sheet for that too?  like how to mess with the square waves to make unique sounds. 

5. ok awesome i'll study this https://atarihq.com/danb/files/o2doc.pdf this might be what answers some of my #4 questions and earlier. 

6. ooh wow ok awesome.  this is super helpful to understand.  because i'm trying to understand how i'd keep track of scores.. how would i display points sequentially or adding like 10 points for one enemy vs. 50 points for another one..   i don't know what a register is or how you would use the 8 but i'll see what i can make of it this week.  and accumulator, i've never heard of that before. 

you say there are 12 characters..  but this chart shows more than 12 right?  are these perhaps not chars?  what are the 12 chars (short for characters i'm assuming)



  mov     r3,#20h             ; x-position (x position of what exactly?  how do you know what this x value is "x"ing?   same of course for the y-position

  mov     r2,#0Bh             ; length -- 11 characters (ok that's interesting, but this goes back to your mention of 8 registers. is there a list of these?  is this 8048 code?

  mov     r1,#hellostr & 0FFh ; the string to print (did you make up the term hellostr or is that just a coincidence that we have a hello world program

what is "a" in this code?  what is "db" in this code?  i'm going to tinker with changing some of these values to see how it affects things, but i still need to make sure i understand what is going on before me changing values even makes any sense if it does make something change! Smiley

i'll dig more into some of this as it goes on.  i REALLY appreciate you helping break this down better.  I just have to figure out how to better understand these concepts to make sense of them. 

Sincerely,
Caleb

Logged
Chris!
Give this man a Jopac!
******
Posts: 1232



WWW
« Reply #3 on: June 03, 2021, 06:15:55 AM »

6. He's referring to the twelve characters you can have onscreen all at once. 'db' stands for data bank, it's the corresponding value of the character to put on screen. For example, to put a F on the screen, the value in the data needs to be 1bh. The X and Y position is the positions for the characters. In the code below, the x position of character 0 (the first character) is 20h. The h is short for 'hexadecimal" which means it is not decimal that we're all used to (base 10) but rather hexadecimal (base 16). The h is used to tell the program we're talking in hexidecimal and not decimal. There are no sprites used in the Hello world example, so there is no code for them. 'retr' means 'return', it is used to jump back to somwhere else in the code, in this case, what is after 'timer' in the 6 jmp commands.
Logged

All my Odyssey2 projects, now in one place!
http://www.atari2600land.com/odyssey2.html
TedFoolery
Attacked the Timelord
***
Posts: 101


« Reply #4 on: June 03, 2021, 04:16:12 PM »

1. that's correct, but there should be a tab or spaces in front of the retr:
timer
    retr

2. I just mentioned sprites as an example, they are not used in the hello world example at all. sorry for the confusion. Maybe this will help explain the VDC a bit better - if you set address $00h of the VDC to #10h, you'll set the X position of Sprite 0 to 16, setting address $01h to #20h will set the Y position of Sprite 0 to 32. This would be like:
    mov r0,#00h    ;set register zero to zero
    movx r0,#010h    move #010h into whatever r0 is set to (which is zero)
    mov r0,#01h    ;set register zero to one
    movx r0,#020h    move #020h into whatever r0 is set to (which is one)

There are maps of the VDC in some of the PDFs online. But here's a quick rundown
$00 - sprite 0, y position
$01 - sprite 0, x position
$02 - sprite 0 , color and size
$03 - unused

$04 - sprite 1, y position
$05 - sprite 1, x position
$06 - sprite 1 , color and size
$07 - unused

$08 - $0b - same as above, but for sprite 2
$0c - $0f - same as above, but for sprite 3

$10 - character 0, y position
$11 - character 0, x position
$12 - character 0, character set pointer (which character to show)
$13 - character 0, color/character set pointer bit 8

$14 - $17 - same as above, but for character 1
$18 - $1b - same as above, but for character 2
$1c - $1f - same as above, but for character 3
... keep going until
$3c - $3f - same as above, but for character 11

$40 - $7f - Quad characters (4 sets of 4 characters spaced apart) these are set just like regular characters

$80 - $87 - Sprite 0 shape
$88 - $8f - Sprite 1 shape
$90 - $97 - Sprite 2 shape
$90 - $97 - Sprite 3 shape

$a0 - vdc control - sets certain parameters of the grid and other things
$a3 - color register - controls background and grid colors

$c0-$c8 - horizontal grid bars
$d0 -$d8 - horizontal grid bars (bottom line)
#e0-$e9 - vertical grid bars

3. Soeren is guy who created the hello world example in that archive page you mentioned. Here's the top of his page: http://web.archive.org/web/20130609190242/http://soeren.informationstheater.de/g7000/Index.html
Click on "Programming the G7000 / Odyssey˛ BIOS." and download the PDF to read off-line. He goes through a bunch of examples and the source code of the examples is also in that archive. I highly recommend going over these.

4. Any call is an O2 specific function. The 8048 commands really just move data around or do math or logic. The 8048 doesn't know what a joystick or keyboard is. They put routines in the bios that "connects-the-dots' between hardware and software Doing a "call waitforkey" goes to the key reading subroutine and puts the key value in the accumulator for you. The accumulator is referred to as "a" in the code.

6. This confused me at first too. The O2 doesn't have characters like an old 8-bit computer (C64/Atari/Apple/Spectrum) or a DOS screen. Those had a 24x40 grid of characters. The O2 has just 12 characters that kind of behave like sprites. You can put a character anywhere on the screen. You only have 12 of them, though and you can choose which character shape of those 64 in that pic to show. So each of those 12 characters has it's own x and y position.

The "db" stands for data byte. In the example, those are the values for the letters in HELLO WORLD, H=#1dh, E=$12h. During the loop, it is reading those values and putting them in r5

Here's an even simpler program. It puts just one character on the screen (not tested, but should work).

start
        call    gfxoff              ; switch the graphics off
        mov     r0,#vdc_char0       ;use character 0
        mov     r3,#20h             ; x-position
        mov     r4,#20h             ; y-position
        mov     r5,#20h                ; Show the "A" character
        mov     r6,#col_chr_white   ; color - set the color
        call    printchar           ; print it - this is a function call to a BIOS routine. It reads the values in the registers above and places them in the correct VDC addresses
        call    gfxon               ; lets see what is written
stop    jmp     stop                ; Thats all


Logged
Caleb Garner
Trying to get the cartridge in...
*
Posts: 19


« Reply #5 on: June 04, 2021, 10:07:19 PM »

@chris thanks for that info.  so there are 12 characters.  are the 4 quads in that count or are the 4 quads in addition to the 12 characters? 

I take it that all 12 characters can move around freely? 

how do people compose quads?  my understanding is they are built by using up to 4 character.

'retr' means 'return' but how does it work?  how does it know where to "return" too?  return for example is before the next bit of code in this hello world example, but if  I followed you correctly it returns to code that is below it?  I tend to think of return as taking it back to the top somewhere. 

@TedFoolery

New - Are there any original game source codes out there?  I'd just love to see how big are the .a48 files to make games like KC Munchkin and others.  Are these thousands of lines of code or less than 100?  something in between?  This is mostly just trying to understand how intimidated I should be by real games lol Smiley

1. You mentioned I should tab or spaces in front of the retr.  so assembly recognizes whitespace?  or is the tab/spacing just for human readability?  Just making sure I understand why it matters

2. OK Are these sprites actually intel code or is that Odyssey Bios stuff?  That's why i feel like i don't know where the 8048 machine language ends and the Odyssey 2 stuff begins. 

3. Ah ok Soeren, yes I have been here and i do have that PDF, in fact that's how I got here with my questions.  I don't like to read ahead in a document so I didn't look past the hello world, but I get I will learn more pushing past the hello world a bit and see what else is in this lengthy pdf. 

4. an a = accumulator ok awesome!  i still don't know what it is, but i understand enough to research it more as i'm sure it's explained elsewhere! Smiley   

and thanks that does make sense..  that's where i was concerned.  i thought there might be a whole world of 8048 stuff that's for making spreadsheets or whatever office stuff that wouldn't mean anything for making games..   Trying to stay laser focused on O2 knowledge to make games

6. ok that clears that up BUT there are 12 characters PLUS the 4 quads?  or do Quads (my understanding is they are made up of 4 character) eat some of those 12 characters?  or is it 12 + 4 quads? 

db = databyte ok awesome.   what does mov actually mean?   move?  just doesn't quite seem like the best choice because mov seems to be called on many different ways that don't all feel like it's about "moving" an object. 

ok and lastly reflecting on your simplified example code

        mov     r0,#vdc_char0       ;use character 0

OK this think I follow.  if i wanted the second character, ...char1..  this is the "12 character" referred too above.  got it.

        mov     r3,#20h             ; x-position

so r3 is the registry for X position for char0, but what connects them?  there's no reference to #20h in the r0,#vdc_char0 and there is no #vdc_char0 in the r3 line?  r4 r5 r6 all don't appear to have something in them that associates them with char0, or is it that relationship simply because they are just below char0? 

        mov     r4,#20h             ; y-position
        mov     r5,#20h                ; Show the "A" character
        mov     r6,#col_chr_white   ; color - set the color



Logged
Chris!
Give this man a Jopac!
******
Posts: 1232



WWW
« Reply #6 on: June 04, 2021, 11:12:35 PM »

The 4 quads are groups of four characters that are independent of the 12 characters you get. A code for one of my 2k games takes about 2,000 lines of code. All the characters can move around freely if you want them to. The code in the Hello World example just has them at one spot so they don't move.
Logged

All my Odyssey2 projects, now in one place!
http://www.atari2600land.com/odyssey2.html
Caleb Garner
Trying to get the cartridge in...
*
Posts: 19


« Reply #7 on: June 05, 2021, 12:56:13 AM »

@chris what games have you made?  just getting a sense of how far 2000 lines went. 

So I was playing (just picked up 4 new games from a local store for $12!) invaders from outer space
https://www.youtube.com/watch?v=hryPZIcaksY

There 10 balls, 2 player ships, 2 enemy ships, 2 player laser bolts and 2 enemy laser bolts. 

but there is also two score values at the bottom and INVADERS in the middle as well as the blue box they are all sitting on.. 

so how can the blue bar and characters exist while the game above has all that going on?

I'm assuming that the two player ships and two enemy ships are the quads. 

Thanks,
Caleb
Logged
manopac
Game & App Development
Give this man a Jopac!
*
Posts: 1157



« Reply #8 on: June 05, 2021, 10:48:51 AM »

@chris what games have you made?  just getting a sense of how far 2000 lines went. 

So I was playing (just picked up 4 new games from a local store for $12!) invaders from outer space
https://www.youtube.com/watch?v=hryPZIcaksY

There 10 balls, 2 player ships, 2 enemy ships, 2 player laser bolts and 2 enemy laser bolts. 

but there is also two score values at the bottom and INVADERS in the middle as well as the blue box they are all sitting on.. 

so how can the blue bar and characters exist while the game above has all that going on?

I'm assuming that the two player ships and two enemy ships are the quads. 

Thanks,
Caleb

10 Balls - Characters
2 player ships / 2 enemy ships = 4 sprites
laser bolts = 2 characters (they are reused - you will never see 4 laser bolts in one frame)
score values = 2 quad chars
INVA DERS = 2 quad chars

from reading some of your previous questions - you are thinking too high level ... "mov" (move) has nothing to do with moving an object - it's about moving data in memory - we are talking very very low level here (basically one level above the electronic layer of current on/off ...)

the first thing you need to understand are the components of the O2:

processor (8048h)
VDC (Video Display Chip)
memory (both internal RAM and external RAM and of course internal and external ROM (the BIOS inside the 8048h and the cartridge that is plugged in)

all those are best described by Dan B in his O2 tech manual:
http://www.atarihq.com/danb/o2.shtml

then you have to get familiar with the instruction set of the processor - what commands does it understand, what do they do, what "variables" are available (registers, accumulator,
best document for this:
https://home.kpn.nl/rene_g7400/vp_info/8048ins.txt

next you need to understand the layout of the memory regions and how to copy ("mov") data from one memory region to the other memory region or to the VDC (same doc as above)

next step would be understand what the VDC can do (Sprites, Characters, Quad-Chars, Grid, Sound, etc), and what the different registers in the VDC mean - what happens if you write data to a specific region in the VDC (for example - if you look into the Tech Doc, you will see this:

Register $A3 is the register that controls the background and grid color. The bits
have the following functions:
Bit 0..2: Grid color
Bit 3..5: Background color
Bit 6: Grid luminance (0=dim/1=bright)
Bit 7: Unused

which means that if you write something into VDC register $A3, it will change the background color and the color of the grid - Appendix B in the same document tells you the available colors and that "4" is red for background and grid - so putting a value of "0 0 100 000" (binary -  $20 in hex) there will set the grid to black and the background to red (with grid luminance 0 = "dim")

next you need to understand what the BIOS does - it basically provides you with routines you can reuse (everything in the BIOS can also be programmed by yourself, but that takes memory away from your cartridge if you program the same routines that already exist) -> that's Soeren's document where you also got the Hello World from

the best collection of resources is still Rene's tech info page - he links to all you need:
https://home.kpn.nl/rene_g7400/vp_info.html

I collected some sources for tools I made that let you play around with some of the VDC registers on my webpage:
http://www.guttenbrunner.com/videopac/

(I hardly use any BIOS routines in there, so they are quite different from what you see in Soeren's document, but they will show you how many lines of code I used to create for example the Grid-Builder tool)

hope that helps a bit :-)





 
Logged

sex, lies, and videopac
Caleb Garner
Trying to get the cartridge in...
*
Posts: 19


« Reply #9 on: June 05, 2021, 03:17:30 PM »

awesome thanks so much for that further breakdown!   but a few more questions about invaders..     

1. how was the blue bar created?  is it possible to make the background multiple colors?  how many can it be divided into?  having control of the background like that could go a long way..  blockout for example not only has multiple colored bars, some of the blocks in those can be removed.  is the background able to perhaps be further broken down?  https://www.youtube.com/watch?v=xBtFOlqG-d0

2. so sprites can be custom characters?  and there are 4 of them.. on top of the 12 characters.. on top of the 4 quads.  that's actually really nice.

I know I have a lot to learn before any of this really can be utilized by me but still trying to understand the capabilities of the games and the restrictions we're working with. 

I'm going to play around with the hello world more.  maybe some simple interactions like..  each direction and button press changes the color of the hello world message..  just start seeing how to change registers.. 

I think I have enough info now to draw from that makes way more sense!

Logged
manopac
Game & App Development
Give this man a Jopac!
*
Posts: 1157



« Reply #10 on: June 05, 2021, 03:28:31 PM »

1. yes - background can be multiple colors - because you can basically change the background any time during buildup of the screen - unfortunately you can't exactly change it always in the same position, so if you change the background in the "visible" part of the screen, you will get flickering - changing the background during the HBlank (horizontal blank - the time the raster beam of a TV needs to go from right to left before starting to draw the new line) results in a stable picture and no flickering - but now, it can't be broken down further ... what you see in the video is actually not blocks of background, but grid (and to have different colored blocks, the grid color was changed for every row in the grid using the HBlank changes)

(grid is what is used to draw the mazes in all the games, e.g. KC Munchkin - but the grid also has a bit you can set which does not only draw lines but also fills the block next to every drawn line)

2. yes - the biggest difference between sprites and characters:
- sprites are custom defined, characters from the character set
- sprites can overlap
- there are collission registers to check if sprites collided with something else
Logged

sex, lies, and videopac
Caleb Garner
Trying to get the cartridge in...
*
Posts: 19


« Reply #11 on: June 05, 2021, 09:24:31 PM »

ok awesome that makes sense.  how is a sprite customized?  is there a graphics program or file or is it somehow defined in some binary grid or something? 
Logged
manopac
Game & App Development
Give this man a Jopac!
*
Posts: 1157



« Reply #12 on: June 05, 2021, 10:26:14 PM »

low level ... there are no graphics programs (maybe someone wrote one, I don't know) or files - you just have to fill registers in the VDC again - Ted even wrote it above :-)

$80 - $87 - Sprite 0 shape
$88 - $8f - Sprite 1 shape
$90 - $97 - Sprite 2 shape
$90 - $97 - Sprite 3 shape

so basically
$80 - first line of sprite 0
$81 - second line of sprite 0
etc.
$87 - last line of sprite 0

and every line 8 bits -> 8 register each 8 bits = 8x8 sprite
Logged

sex, lies, and videopac
Caleb Garner
Trying to get the cartridge in...
*
Posts: 19


« Reply #13 on: June 05, 2021, 11:53:52 PM »

ah yea a bit of information overload, but i'm grateful for it!  your explanation makes a ton of sense though in how each sprite is defined.  i figured it wasn't a file..  i imagine an editor existed but i also bet something could be made super easy.  hell i might try something like that..  make it with construct 3.  a tool i actually KNOW =D

Logged
Pages: [1]   Go Up
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!