📄 pg.c
字号:
// primitive graphics for Hello World PSP
#include "main.h"
#include "font.c"
//system call
void sceDisplayWaitVblankStart();
void sceDisplaySetMode(long,long,long);
void sceDisplaySetFrameBuf(char *topaddr,long linesize,long pixelsize,long);
//variables
char *pg_vramtop=(char *)0x04000000;
long pg_screenmode;
long pg_showframe;
long pg_drawframe;
unsigned short rgb2col(unsigned char r,unsigned char g,unsigned char b)
{
return ((((b>>3) & 0x1F)<<10)+(((g>>3) & 0x1F)<<5)+(((r>>3) & 0x1F)<<0)+0x8000);
}
void pgWaitVn(unsigned long count)
{
for (; count>0; --count) {
sceDisplayWaitVblankStart();
}
}
void pgWaitV()
{
sceDisplayWaitVblankStart();
}
char *pgGetVramAddr(unsigned long x,unsigned long y)
{
return pg_vramtop+(pg_drawframe?FRAMESIZE:0)+x*PIXELSIZE*2+y*LINESIZE*2+0x40000000;
}
void pgInit()
{
sceDisplaySetMode(0,SCREEN_WIDTH,SCREEN_HEIGHT);
pgScreenFrame(0,0);
}
void pgPrint(unsigned long x,unsigned long y,unsigned long color,const char *str)
{
while (*str!=0 && x<CMAX_X && y<CMAX_Y) {
pgPutChar(x*8,y*8,color,0,*str,1,0,1);
str++;
x++;
if (x>=CMAX_X) {
x=0;
y++;
}
}
}
void pgPrint2(unsigned long x,unsigned long y,unsigned long color,const char *str)
{
while (*str!=0 && x<CMAX2_X && y<CMAX2_Y) {
pgPutChar(x*16,y*16,color,0,*str,1,0,2);
str++;
x++;
if (x>=CMAX2_X) {
x=0;
y++;
}
}
}
void pgPrint4(unsigned long x,unsigned long y,unsigned long color,const char *str)
{
while (*str!=0 && x<CMAX4_X && y<CMAX4_Y) {
pgPutChar(x*32,y*32,color,0,*str,1,0,4);
str++;
x++;
if (x>=CMAX4_X) {
x=0;
y++;
}
}
}
void pgFillvram(unsigned long color)
{
unsigned char *vptr0; //pointer to vram
unsigned long i;
vptr0=pgGetVramAddr(0,0);
for (i=0; i<FRAMESIZE/2; i++) {
*(unsigned short *)vptr0=color;
vptr0+=PIXELSIZE*2;
}
}
void pgBitBlt(unsigned long x,unsigned long y,unsigned long w,unsigned long h,unsigned long mag,const unsigned short *d)
{
unsigned char *vptr0; //pointer to vram
unsigned char *vptr; //pointer to vram
unsigned long xx,yy,mx,my;
const unsigned short *dd;
vptr0=pgGetVramAddr(x,y);
for (yy=0; yy<h; yy++) {
for (my=0; my<mag; my++) {
vptr=vptr0;
dd=d;
for (xx=0; xx<w; xx++) {
for (mx=0; mx<mag; mx++) {
*(unsigned short *)vptr=*dd;
vptr+=PIXELSIZE*2;
}
dd++;
}
vptr0+=LINESIZE*2;
}
d+=w;
}
}
void pgPutChar(unsigned long x,unsigned long y,unsigned long color,unsigned long bgcolor,unsigned char ch,char drawfg,char drawbg,char mag)
{
unsigned char *vptr0; //pointer to vram
unsigned char *vptr; //pointer to vram
const unsigned char *cfont; //pointer to font
unsigned long cx,cy;
unsigned long b;
char mx,my;
if (ch>255) return;
cfont=font+ch*8;
vptr0=pgGetVramAddr(x,y);
for (cy=0; cy<8; cy++) {
for (my=0; my<mag; my++) {
vptr=vptr0;
b=0x80;
for (cx=0; cx<8; cx++) {
for (mx=0; mx<mag; mx++) {
if ((*cfont&b)!=0) {
if (drawfg) *(unsigned short *)vptr=color;
} else {
if (drawbg) *(unsigned short *)vptr=bgcolor;
}
vptr+=PIXELSIZE*2;
}
b=b>>1;
}
vptr0+=LINESIZE*2;
}
cfont++;
}
}
void pgScreenFrame(long mode,long frame)
{
pg_screenmode=mode;
frame=(frame?1:0);
pg_showframe=frame;
if (mode==0) {
//screen off
pg_drawframe=frame;
sceDisplaySetFrameBuf(0,0,0,1);
} else if (mode==1) {
//show/draw same
pg_drawframe=frame;
sceDisplaySetFrameBuf(pg_vramtop+(pg_showframe?FRAMESIZE:0),LINESIZE,PIXELSIZE,1);
} else if (mode==2) {
//show/draw different
pg_drawframe=(frame?0:1);
sceDisplaySetFrameBuf(pg_vramtop+(pg_showframe?FRAMESIZE:0),LINESIZE,PIXELSIZE,1);
}
}
void pgScreenFlip()
{
pg_showframe=(pg_showframe?0:1);
pg_drawframe=(pg_drawframe?0:1);
sceDisplaySetFrameBuf(pg_vramtop+(pg_showframe?FRAMESIZE:0),LINESIZE,PIXELSIZE,0);
}
void pgScreenFlipV()
{
pgWaitV();
pgScreenFlip();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -