Pokeypy Posted April 6, 2021 Share Posted April 6, 2021 (edited) Hi, I'm trying to do just something like PLOT and DRAWTO with CC65 in C. Seems difficult. Setting a graphics mode with "_graphics()" doesn't seem to be the way to go. I mean, what to do, if the graphics mode is set? So far, I can run "tgidemo.c" from the CC65 examples. Seems to be a general purpose draw routine (for several systems). To make it work, I have to copy the driver files from "../cc65/target/atari/drv/tgi" to the Atari disk file. For compiling, I use the line: cl65 -t atari -Wl -D__RESERVED_MEMORY__=0x2000 -o tgid.obj tgidemo.c Well, that draws something. But I doubt, that's the way to do it. There must be a better way. I can also compile and run this code, which is nice. It sets up a display list and scrolls a screen with letters. Interesting. It's not really plotting and drawing, but I think, setting up a custom display list would be a step in the process. Can't you just poke in some values into a screen memory to set pixels? So how would you plot and draw? In, let's say, this game mode with four colors and a resolution of 160x195? Ideal would be a little code example to reproduce. Thanks. Edited April 7, 2021 by Pokeypy Quote Link to comment Share on other sites More sharing options...
danwinslow Posted April 6, 2021 Share Posted April 6, 2021 (edited) The TGI support for CC65 isn't the greatest as I recall (although it may have been updated since I last saw it). I can't remember if there's OS support for plot and drawto, but I think not, and that probably wouldn't be the fastest either. I always plotted directly by writing to screen memory, and for drawto I dropped in a fast line algorithm. You can find them in asm or native C with a bit of googling or searching here. *edit* Actually, I think I recall that there are some graphic libraries that other people have done that you could find. Edited April 6, 2021 by danwinslow Quote Link to comment Share on other sites More sharing options...
sanny Posted April 6, 2021 Share Posted April 6, 2021 (edited) 46 minutes ago, Pokeypy said: So far, I can run "tgidemo.c" from the CC65 examples. Seems to be a general purpose draw routine (for several systems). To make it work, I have to copy the driver files from "../cc65/target/atari/drv/tgi" to the Atari disk file. For compiling, I use the line: cl65 -t atari -Wl -D__RESERVED_MEMORY__=0x2000 -o tgid.obj tgidemo.c If you don't want the driver as separate file on the disk, you can include it into your program: cl65 -t atari -Wl -D__RESERVED_MEMORY__=0x2000 -DDYN_DRV=0 -o tgid.obj tgidemo.c Quote Well, that draws something. But I doubt, that's the way to do it. Well, that's the simplest way to do it. You can use the functions of the TGI interface, see https://cc65.github.io/doc/tgi.html. Quote There must be a better way. I can also compile and run this code, which is nice. It sets up a display list and scrolls a screen with letters. Interesting. It's not really plotting and drawing, but I think, setting up a custom display list would be a step in the process. Can't you just poke in some values into a screen memory to set pixels? Sure. You can always write directly into screen memory. Quote So how would you plot and draw? In, let's say, this game mode with four colors and a resolution of 160x195? Ideal would be a little code example to reproduce. Thanks. The tgidemo.c program by default uses the "default driver" of the platform, which happens to be GR8 on Atari. To use GR15, make the following change to tgidemo.c: --- a/samples/tgidemo.c +++ b/samples/tgidemo.c @@ -200,7 +200,8 @@ int main (void) CheckError ("tgi_load_driver"); #else /* Install the driver */ - tgi_install (tgi_static_stddrv); + //tgi_install (tgi_static_stddrv); + tgi_install (atr15_tgi); CheckError ("tgi_install"); #endif regards, chris Edited April 6, 2021 by sanny typo fix 1 Quote Link to comment Share on other sites More sharing options...
Wrathchild Posted April 6, 2021 Share Posted April 6, 2021 (edited) https://atariwiki.org/wiki/Wiki.jsp?page=3dMaze [Edit] that listing uses an older tgi so have just updated it The tgi linedraw seems fine 3D_maze.zip 3D_maze.xex Edited April 6, 2021 by Wrathchild Added program 1 Quote Link to comment Share on other sites More sharing options...
TGB1718 Posted April 6, 2021 Share Posted April 6, 2021 I have a similar situation and wrote a couple of routines in C (assembler got a bit messy and C is fast enough) however they are specific to the resolution currently being used, but could be adapted to deal with all resolutions Quote Link to comment Share on other sites More sharing options...
danwinslow Posted April 6, 2021 Share Posted April 6, 2021 (edited) https://atariwiki.org/wiki/Wiki.jsp?page=3dMaze If TGI is performant enough, that'd sure work. Edited April 6, 2021 by danwinslow Quote Link to comment Share on other sites More sharing options...
TGB1718 Posted April 6, 2021 Share Posted April 6, 2021 (edited) Here's a short Video of it in motion works with all 80*192 resolutions. Edit: should have said, the draw routine calls the plot routine multiple times to draw the lines. art.mp4 Edited April 6, 2021 by TGB1718 1 Quote Link to comment Share on other sites More sharing options...
danwinslow Posted April 6, 2021 Share Posted April 6, 2021 Nice. I recall an old thread about the fastest line drawing algorithm that also had code examples, but I can't find it before my ADHD kicks in. Quote Link to comment Share on other sites More sharing options...
Pokeypy Posted April 6, 2021 Author Share Posted April 6, 2021 2 hours ago, Wrathchild said: [Edit] that listing uses an older tgi so have just updated it Thank you very much! These days, I need my code in a Python-like format with four space characters for one level of indentation, otherwise I'm getting confused. So I changed the indentations and whitespace to my needs (attachment). I hope, you don't mind. The drawing works, but it just shows a wall, I can't walk around in the maze. That's not much of a problem here though, because I just want to study the way the drawing is done. I'll need some time to do that. But thanks again, that's a very good starting point. 3dmaze_4ind.c Quote Link to comment Share on other sites More sharing options...
Wrathchild Posted April 6, 2021 Share Posted April 6, 2021 (edited) Keys seem to be I = forward, J = turn left and L = turn right [Edit] K = move back (as in take a step back, not turn on the spot) Edited April 6, 2021 by Wrathchild stop->spot Quote Link to comment Share on other sites More sharing options...
Pokeypy Posted April 6, 2021 Author Share Posted April 6, 2021 (edited) 6 hours ago, Wrathchild said: Keys seem to be I = forward, J = turn left and L = turn right Right. I was stupid, only tested the cursor keys. Yeah, it works now. So this is what I extracted. Instant DRAWTO. Nice. Works like a charm. Can even display text. List of available functions would be here. Look for "tgi_...", further down on the page. Is this the only "graphics mode" in tgi or are there others? #include <tgi.h> /* Compiling with: cl65 -t atari -Wl -D__RESERVED_MEMORY__=0x2000 -DDYN_DRV=0 -o hello.xex hello.c */ int main() { int width; int height; tgi_install (tgi_static_stddrv); tgi_init(); width = tgi_getxres(); height = tgi_getyres(); tgi_setcolor(COLOR_WHITE); tgi_clear(); tgi_outtextxy(10, 10, "Hello World"); tgi_gotoxy(0, 10); tgi_lineto(320, 192); while (1) { } tgi_done(); return 0; } Edited April 6, 2021 by Pokeypy Quote Link to comment Share on other sites More sharing options...
sanny Posted April 6, 2021 Share Posted April 6, 2021 13 minutes ago, Pokeypy said: So this is what I extracted. Instant DRAWTO. Nice. Works like a charm. Can even display text. List of available functions would be here. Look for "tgi_...", further down on the page. Is this the only "graphics mode" in tgi or are there others? Did you read my post (post #3), or not? Link to TGI function page is there, and how to use a different graphics mode... Quote Link to comment Share on other sites More sharing options...
Wrathchild Posted April 6, 2021 Share Posted April 6, 2021 (edited) 16 minutes ago, Pokeypy said: Is this the only "graphics mode" in tgi or are there others? Chris has mention this at the end of post 3. (Implemented here https://github.com/cc65/cc65/tree/master/libsrc/atari/tgi) [Edit] ... and just pipped me to it Edited April 6, 2021 by Wrathchild Quote Link to comment Share on other sites More sharing options...
sanny Posted April 6, 2021 Share Posted April 6, 2021 ? Quote Link to comment Share on other sites More sharing options...
sanny Posted April 6, 2021 Share Posted April 6, 2021 Maybe see also https://cc65.github.io/doc/atari.html#ss6.1 for a list of TGI graphics drivers for Atari. 1 Quote Link to comment Share on other sites More sharing options...
Pokeypy Posted April 6, 2021 Author Share Posted April 6, 2021 32 minutes ago, sanny said: Did you read my post (post #3), or not? When I read your posting this afternoon, I wasn't yet ready to understand it regarding the tgi-drivers, because I didn't know, how tgi was used and you didn't show it. I could understand the advice from your posting though, how to put that option to the compile-line to avoid copying all those driver files to disk. It also would have been nice, if you had posted a little code example, how to poke into screen memory to get a pixel from it, instead of just saying, that this can be done somehow, again without showing how. Anyway. So tgi graphics modes can be selected by loading different tgi-drivers. Cool. 1 Quote Link to comment Share on other sites More sharing options...
sanny Posted April 7, 2021 Share Posted April 7, 2021 (edited) 52 minutes ago, Pokeypy said: It also would have been nice, if you had posted a little code example, how to poke into screen memory to get a pixel from it, instead of just saying, that this can be done somehow, again without showing how. This is unresolved and left as an exercise for the reader. You'll learn much more by getting it done by yourself instead of using some code snippets of someone else. ? (Hint: SAVMSC (asm), or OS.savmsc (C)) Edited April 7, 2021 by sanny 1 Quote Link to comment Share on other sites More sharing options...
stepho Posted April 7, 2021 Share Posted April 7, 2021 13 hours ago, danwinslow said: Nice. I recall an old thread about the fastest line drawing algorithm that also had code examples, but I can't find it before my ADHD kicks in. You are probably thinking of https://en.wikipedia.org/wiki/Bresenham's_line_algorithm Quote Link to comment Share on other sites More sharing options...
Wrathchild Posted April 7, 2021 Share Posted April 7, 2021 By 'thread' I would more say: If you look at '.proc LINE' in the tgi drivers then as USE_CIO_LINE isn't typically* used they will be using the Bresenham's implementation in there. https://github.com/cc65/cc65/blob/master/libsrc/atari/tgi/atari_tgi_common.inc * - though has been mentioned here by @sanny Quote Link to comment Share on other sites More sharing options...
danwinslow Posted April 7, 2021 Share Posted April 7, 2021 (edited) 3 hours ago, Wrathchild said: By 'thread' I would more say: If you look at '.proc LINE' in the tgi drivers then as USE_CIO_LINE isn't typically* used they will be using the Bresenham's implementation in there. https://github.com/cc65/cc65/blob/master/libsrc/atari/tgi/atari_tgi_common.inc * - though has been mentioned here by @sanny Not the wiki about bresenhams. The above is what I meant, although I don't see where Sanny mentioned it. I'll take your word for it. Edited April 7, 2021 by danwinslow Quote Link to comment Share on other sites More sharing options...
Wrathchild Posted April 7, 2021 Share Posted April 7, 2021 2 hours ago, danwinslow said: The above is what I meant, although I don't see where Sanny mentioned it. ? I was referring to the mention of USE_CIO_LINE on the 'here' link Quote Link to comment Share on other sites More sharing options...
danwinslow Posted April 7, 2021 Share Posted April 7, 2021 I misunderstood then. Missed the linking * Quote Link to comment Share on other sites More sharing options...
+bhall408 Posted April 10, 2021 Share Posted April 10, 2021 On 4/6/2021 at 8:00 AM, Pokeypy said: I'm trying to do just something like PLOT and DRAWTO with CC65 in C. Seems difficult. Setting a graphics mode with "_graphics()" doesn't seem to be the way to go. I mean, what to do, if the graphics mode is set? I suppose another approach would be to use CIO and S: driver... And call PLOT and DRAWTO functions of S:.. I've done that from ASM to good effect. 1 Quote Link to comment Share on other sites More sharing options...
+bhall408 Posted April 10, 2021 Share Posted April 10, 2021 6 minutes ago, bhall408 said: I suppose another approach would be to use CIO and S: driver... And call PLOT and DRAWTO functions of S:.. I've done that from ASM to good effect. Speaking of which, I already have those as a ca65 library, so I should really try calling my own ca65 code from cc65! Quote Link to comment Share on other sites More sharing options...
Pokeypy Posted April 13, 2021 Author Share Posted April 13, 2021 (edited) On 4/6/2021 at 3:50 PM, Wrathchild said: https://atariwiki.org/wiki/Wiki.jsp?page=3dMaze That's really a cool piece of code! Seems to be the basis of "Bard's Tale", which is probably my favourite game of all time (it's on the Amiga). So the last few days, I tried to understand your code. Actually, I did a rewrite in Python/Pygame, integrating other people's library code for maze generation. My script works now, it has 35K (about 1000 lines of code); it's not Atari 8 bit programming though, so it would be a bit off-topic here. As I don't have the limitations of classic computers, I can have rather large mazes, like 100x100 for example, where you really get lost. My questions about your C-version would be: - ".Border" seems to be initialized with just a "|=". So that's "....Border = ....Border | RIGHT;". Doesn't that mean, that ".Border" is undefined in the first place? - These macros like #define GoodDir( Cell, Dir ) ((g.Maze[ (Cell) ].Border & (Dir)) == 0) replace functions, right? How would they be written as functions? (As functions, I could understand that kind of code more easily.) - What do ".Walls", ".Border", ".Path" actually mean? They're just integers. How do they describe the properties of a maze cell? - Unfortunately, I also didn't fully understand your maze generating algorithm. But I see, what you were going for, for something like this (seems to be a general problem in computer science), so I used that Python library instead. I know, you wrote that code 11 years ago and probably don't have the time to answer everything in detail. But I thank you very much for it anyway. It's cool! Edited April 13, 2021 by Pokeypy Quote Link to comment 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.