JagChris Posted July 15, 2010 Share Posted July 15, 2010 (edited) This is not a C tutorial or a tutorial on pointers. There are plenty of resources 'out there' for that. This assumes some basic knowledge of the C language and a desire to begin applying that understanding to the Jaguar. This is Belboz's brief breakdown of his 'Hello World' file along with a reprinting of the source code, jag.c and font.h for any discussion or questions anyone may have. Well I wanted the bare minimum to get the jag up, setup a video buffer, and print a message. Since there is no printf routines, I threw together a few simple routines that write the character font to the video buffer. It is pretty simple to understand the video buffer once you think about it. You have 64000 bytes set aside for the screen memory: (320X200 pixels = 320 times 200 or 64000) So the first byte in video memory is the color register to use to draw the top left pixel in. Next byte is the color reg for the next pixel to the right of the previous. Once you go through the first 320 bytes the next value is the color reg for the first pixel on the next line down. I wrote zeros to the video memory. Which means use color register 0 for drawing those pixels. I had previously set color register zero to black. Think of those color registers from 0 - 255 as 256 seperate paint cans. You can setup each to whatever color you want. Then the video memory just tells the system which of those paint cans to use to draw that pixel on the screen. Whats nice about this kind of video mode (which is called a color indexed mode) is that you can change the values of those 256 color registers (or paint cans) at anytime. And when you do the pixels on screen that use those registers automatically change to the new color you set. The two lines above the loop that clears the video memory are where I write values to the first two color registers. I set register 0 to black and register 1 to white. So if video memory contains a zero that corresponding pixel uses register 0 which is black. If it contains a 1 it uses register 1 which I set to white. But basically it boils down to the video memory telling the computer what color register to use for a pixel instead of 16bit and higher modes where each pixel value is actually the RGB values for that pixel. So if your in a 320 X 200 mode in 16bit color mode. You need 320 times 200 time 2 or 128000 bytes for video memory. No color registers are used. Each 16 bits (or two bytes) is the RGB value for a pixel. 24 bit mode is the same way, but it needs 3 bytes for each pixel. So 320 x 200 24bit would be 320 times 200 time 3 or 192000 bytes for video memory. #include"font.h" extern void *vidmem; unsigned char *jagscreen; void DrawCharLine (int charloc, int screenloc) { static unsigned char shift[] = { 7, 6, 5, 4, 3, 2, 1, 0 }; int xcnt; for (xcnt = 0; xcnt < F_WIDTH; xcnt++) { if (((textfont[charloc] >> shift[xcnt]) & 0x1)) jagscreen[screenloc++] = 1; else jagscreen[screenloc++] = 0; } } void DrawChar (int x, int y, char ch) { int ycnt, charloc, screenloc; charloc = ch * F_CHARSIZE; screenloc = (y * T_XREZ) + x; for (ycnt = 0; ycnt < F_HEIGHT; ycnt++) { DrawCharLine (charloc, screenloc); screenloc += T_XREZ; charloc++; } } void DrawString (int x, int y, char *str) { int cnt; for (cnt = 0; str[cnt] != 0; cnt++) { DrawChar (x, y, str[cnt]); x += F_WIDTH; } } void __main(void) { int w; jagscreen = (unsigned char *)&vidmem; *(unsigned short int *) 0xf00400 = 0x0000; /* Color reg 0 = black */ *(unsigned short int *) 0xf00402 = 0xffff; /* Color reg 1 = white */ for(w=0;w<64000;w++) jagscreen[w]=0; DrawString(1,1,"Hello World"); for(;; /* Infinite Loop. Alpine users can delete this. */ asm(" illegal"); } Edited July 15, 2010 by JagChris Quote Link to comment https://forums.atariage.com/topic/166088-hello-world-on-the-jag/ Share on other sites More sharing options...
JagChris Posted July 15, 2010 Author Share Posted July 15, 2010 FONT.H #define F_WIDTH 0x08 #define F_HEIGHT 0x08 #define F_CHARSIZE 0x08 #define T_XREZ 320 #define T_YREZ 200 unsigned char textfont[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E, 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x7C, 0x38, 0x7C, 0x10, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0, 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99, 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00, 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00, 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x78, 0x78, 0x30, 0x00, 0x30, 0x00, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x30, 0x7C, 0xC0, 0x78, 0x0C, 0xF8, 0x30, 0x00, 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00, 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00, 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x7C, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0x7C, 0x00, 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00, 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00, 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00, 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00, 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00, 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x60, 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00, 0x30, 0x00, 0x7C, 0xC6, 0xDE, 0xDE, 0xDE, 0xC0, 0x78, 0x00, 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00, 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x7E, 0x00, 0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x60, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3E, 0x00, 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xDC, 0x78, 0x1C, 0x00, 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00, 0x78, 0xCC, 0xE0, 0x70, 0x1C, 0xCC, 0x78, 0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, 0xC6, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00, 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, 0x38, 0x6C, 0x60, 0xF0, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8, 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00, 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xC6, 0x00, 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E, 0x00, 0x00, 0xDC, 0x76, 0x66, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x7C, 0xC0, 0x78, 0x0C, 0xF8, 0x00, 0x10, 0x30, 0x7C, 0x30, 0x30, 0x34, 0x18, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, 0x00, 0x00, 0xC6, 0xD6, 0xFE, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8, 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00, 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, 0xE9 }; Quote Link to comment https://forums.atariage.com/topic/166088-hello-world-on-the-jag/#findComment-2051555 Share on other sites More sharing options...
Tyrant Posted July 15, 2010 Share Posted July 15, 2010 Hmm... where in this is the Jag being set up? it seems to me that this code takes over after the point that the video registers and basic object list have already been set up, and doesn't cover them in any detail. Which is a shame, because otherwise I would recommend changing them so as to use a 240 line high screen, which is a better fit for both pal and ntsc screens. Still, once you've got basic video set up, something like this would be helpful as a basic starting point for people I suppose. Quote Link to comment https://forums.atariage.com/topic/166088-hello-world-on-the-jag/#findComment-2051569 Share on other sites More sharing options...
JagChris Posted July 15, 2010 Author Share Posted July 15, 2010 Are you talking about the startup.s bootstrap code? I can make another thread for his makefile he has with this. You guys can discuss that in there. Quote Link to comment https://forums.atariage.com/topic/166088-hello-world-on-the-jag/#findComment-2051573 Share on other sites More sharing options...
belboz Posted July 15, 2010 Share Posted July 15, 2010 Chris posted the assembly startup code. Which is just a slightly modified version of the Atari stuff. I agree 320x240 would definitely be better, and it is super trivial to make a couple changes to implement it. Basically the 320x200 was a holdover from when I was doing a quick port of my old MSDOS Atari 8-bit Emulator (Pokey was its name). I used 320x200 for that and set the Jag up the same to test the code. Someone wanted a simple hello world program, so I just hacked it together quick with the startup code from Pokey. Quote Link to comment https://forums.atariage.com/topic/166088-hello-world-on-the-jag/#findComment-2051667 Share on other sites More sharing options...
belboz Posted July 15, 2010 Share Posted July 15, 2010 p.s. Chris linked to the code on my website in the first post here. So if you want to see all the files (I kept the project quite tiny), download it off my site. Quote Link to comment https://forums.atariage.com/topic/166088-hello-world-on-the-jag/#findComment-2051668 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.