#include #include #include #include #include #include #include #include #include #include #include #include #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 224 #define XRES (SCREEN_WIDTH/8) #define YRES (SCREEN_HEIGHT/8) #include "fontdata_8x8.inc" u_char *fontdata = fontdata_8x8; char text[XRES*YRES]; char buf[1024]; sceGsDispEnv disp; struct { sceGifTag giftag; sceGsDrawEnv1 draw; sceGsClear clear; } dex; uint charpkt[(6+16)*4]; void init_config_system(void) { sceDevVif0Reset(); sceDevVu0Reset(); sceGsResetPath(); sceDmaReset(1); } int makecharpkt(uint *pkt, u_char c, int x, int y, uint c1, uint c2) { u_char *cp; uint *pp, bit; int i, j; cp = &fontdata[c*8]; // gif tag - 4 times A+D pkt[0*4 + 0] = 4; pkt[0*4 + 1] = 0x10000000; pkt[0*4 + 2] = SCE_GIF_PACKED_AD; pkt[1*4 + 0] = 0; pkt[1*4 + 1] = (SCREEN_WIDTH/64)<<16; pkt[1*4 + 2] = SCE_GS_BITBLTBUF; pkt[2*4 + 0] = 0; pkt[2*4 + 1] = (y<<16) + x; pkt[2*4 + 2] = SCE_GS_TRXPOS; pkt[3*4 + 0] = 8; pkt[3*4 + 1] = 8; pkt[3*4 + 2] = SCE_GS_TRXREG; pkt[4*4 + 0] = 0; pkt[4*4 + 2] = SCE_GS_TRXDIR; // gif tag - image header pkt[5*4 + 0] = 0x8000 | 16; // EOP, 8x8 pixels pkt[5*4 + 1] = SCE_GIF_IMAGE << (58-32); pp = &pkt[6*4]; for(i = 0; i < 8; i++) { bit = 0x80; c = *cp++; for(j = 0; j < 8; j++) { if(c & bit) *pp++ = c1; else *pp++ = c2; bit >>= 1; } } FlushCache(0); return (pp - pkt)/4; } int main() { int fd, n, curX, curY; char *p, c; init_config_system(); sceGsResetGraph(0, SCE_GS_NOINTERLACE, SCE_GS_NTSC, SCE_GS_FRAME); sceGsResetPath(); sceGsSetDefDispEnv(&disp, SCE_GS_PSMCT32, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); sceGsPutDispEnv(&disp); sceGsSetDefDrawEnv(&dex.draw, SCE_GS_PSMCT32, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); dex.draw.xyoffset1.OFX = 0; dex.draw.xyoffset1.OFY = 0; sceGsSetDefClear(&dex.clear, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0, 0, 0); SCE_GIF_CLEAR_TAG(&dex.giftag); dex.giftag.NLOOP = 8 + 6; dex.giftag.EOP = 1; dex.giftag.NREG = 1; dex.giftag.REGS0 = 0xe; FlushCache(0); sceGsPutDrawEnv(&dex.giftag); fd = sceOpen("host0:text", SCE_RDONLY); if(fd < 0) { printf("Can't open 'text'\n"); exit(1); } curX = 0; curY = 0; while(curY < YRES) { n = sceRead(fd, buf, sizeof(buf)); if(n == 0) break; p = buf; while(n-- > 0 && curY < YRES) { c = *p++; switch(c) { case '\r': break; default: text[curY*XRES + curX++] = c; if(curX < XRES) break; // fall through case '\n': curX = 0; curY++; break; case '\t': do text[curY*XRES + curX++] = ' '; while((curX&7) != 0 && curX < XRES); // BUG in original: ==0 break; } } } sceClose(fd); sceDmaChan *chGif = sceDmaGetChan(SCE_DMA_GIF); for(curY = 0; curY < YRES; curY++) for(curX = 0; curX < XRES; curX++) { n = makecharpkt(charpkt, text[curY*XRES + curX], curX*8, curY*8, 0xFFFFFF, 0); sceDmaSendN(chGif, charpkt, n); sceDmaSync(chGif, 0, 0); } sceGsSyncPath(0, 0); return 0; }