[转]我也玩PSP开发!(2)—— PSPSDK示例 源码分析

news/2024/7/10 18:32:33 标签: thread, callback, makefile, module, string, c++

    放假啊,这叫玩啊,天天不务正业,还玩些可能和未来工作无关的技术!内心充满了罪恶感啊

    写HelloWorld太无聊了,转了一圈PSPSDK发现有自带sample,方便快速上手的好东西,位置在开发包/psp/sdk/samples下 面,其中包括声音,控制器,红外,usb,wifi,电源等等。还真不少,先挑简单的看看。恩~~我看controller挺简单!就看这个!


     打开controller/base目录,只有一个main.c 和 Makefile。肯定不会很难,先make一个试试,还好很顺利,编译得到四个文件: main.o controller_basic.elf EBOOT.PBP PARAM.SFO。
    main.o 不用说肯定是main.c的生成的目标文件。
    controller_basic.elf 我知道ELF是linux下的二进制文件格式,可能PSP也是这个格式。
    EBOOT.PBP 这个就是最终的执行文件了,这个应该是包装过的,其中包含一些图标文件什么的。
    PARAM.SFO 这个我就不知道,有高手可以告诉我,(我怀疑!我猜测!是源码中定义的那些宏有关,是一些信息,最后打包到EBOOT.PBP。不要太相信,只是个思路)。

    然后就是插上usb,靠到psp/game下,建个文件夹,叫什么名都可以!然后把EBOOT.PBP(不要改名字!)放进去,运行就可以了。

    也看了运行后什么模样了!下面就是分析源码了,分析都写成注释了!

    以下是源码 :

 

/*
 * PSP Software Development Kit - 
http://www.pspdev.org
 * -----------------------------------------------------------------------
 * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
 *
 * main.c - Basic Input demo -- reads from control pad and indicates button
 *          presses.
 *
 * Copyright (c) 2005 Marcus R. Brown <mrbrown@ocgnet.org>
 * Copyright (c) 2005 James Forshaw <tyranid@gmail.com>
 * Copyright (c) 2005 John Kelley <ps2dev@kelley.ca>
 * Copyright (c) 2005 Donour Sizemore <donour@uchicago.edu>
 *
 * $Id: main.c 1095 2005-09-27 21:02:16Z jim $
 
*/


/* psp的一些头文件,从文件名应该能看出来时干嘛使得 */
#include 
< pspkernel.h >
#include 
< pspdebug.h >
#include 
< pspctrl.h >

/* psp sdk中自带标准c库和标准c++库   */
#include 
< stdlib.h >
#include 
< string .h >


/* 定义模块信息  包括版本 */
/* Define the module info section */
PSP_MODULE_INFO(
" CONTROLTEST " 0 1 1 );

/* 定义主线程属性 还没具体研究,有时间再改上*/
/* Define the main thread's attribute value (optional) */
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER 
|  THREAD_ATTR_VFPU);


/* 这个纯属为了方便 pspDebugScreenPrintf 的用法和c库中的printf用法完全一样,不过pspDebugScreenPrintf只能用在初始化了DebugScreen以后*/
/* Define printf, just to make typing easier */
#define  printf    pspDebugScreenPrintf

void  dump_threadstatus( void );

/*下面的代码会看见,这是控制主循环推出的条件变量*/
int  done  =   0 ;

/*当用户按下home键退出时的回调函数*/
/* Exit callback */
int  exit_callback( int  arg1,  int  arg2,  void   * common)
{
                     
/*让主循环推出*/
    done 
= 1;
    
return 0;
}


/* 这么看来需要一个专门的线程来监听用户的操作,建立这么一个线程监听用户来调用相应的回调函数*/
/* Callback thread */
int  CallbackThread(SceSize args,  void   * argp)
{
    
int cbid;
                      
/* 创建一个Exit Callback回调函数返回一个类似handle的东西*/
    cbid 
= sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
                      
/* 在把这个回调函数注册商 */
    sceKernelRegisterExitCallback(cbid);
                     
/* 让他睡眠 当用户要退出的时候会唤醒*/
    sceKernelSleepThreadCB();

    
return 0;
}


/* 这个纯粹是为了模块化了,把安装回调函数的代码都写着里了 */
/* Sets up the callback thread and returns its thread id */
int  SetupCallbacks( void )
{
    
int thid = 0;
                  
                     
/* 创建那个回调函数线程 */
    thid 
= sceKernelCreateThread("update_thread", CallbackThread,
                     
0x110xFA000);
    
if(thid >= 0)
    
{
                                          
/* 开始执行 */
        sceKernelStartThread(thid, 
00);
    }


    
return thid;
}


int  main( void )
{
    SceCtrlData pad;   
/*控制器的结构体*/
 

    pspDebugScreenInit(); 
/*初始化DebugScreen 这样可以用pspDebugScreenPrintf在上面输出了*/
                    
                     
/*那个回调函数线程*/
    SetupCallbacks();
                     
                     
/*好像是什么取样周期,莫非可以设置游戏时连发的速度, 默认是0*/
    sceCtrlSetSamplingCycle(
0);

                     
/* 控制器的模式 有数字(PSP_CTRL_MODE_DIGITAL)和类比(PSP_CTRL_MODE_ANALOG)两个 这里用的是类比的 */
    sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);

                     
/* done !那个主循环变量*/
    
while(!done){
                                          
/* 设置光标的位置*/
        pspDebugScreenSetXY(
02);

                                           
/* 读取用户的输入,psp没键盘,就是那些按键了*/
            sceCtrlReadBufferPositive(
&pad, 1); 
                                           
                                          
/* 类比摇杆的坐标*/
        printf(
"Analog X = %d ", pad.Lx);
        printf(
"Analog Y = %d  ", pad.Ly);
                                          
/* 其他按键的判断,按了哪个就输出相应的文字,用宏都表示出来了,看名字可以看出来*/
        
if (pad.Buttons != 0){
            
if (pad.Buttons & PSP_CTRL_SQUARE){
                printf(
"Square pressed  ");
            }

            
if (pad.Buttons & PSP_CTRL_TRIANGLE){
                printf(
"Triangle pressed  ");
            }
 
            
if (pad.Buttons & PSP_CTRL_CIRCLE){
                printf(
"Cicle pressed  ");
            }
 
            
if (pad.Buttons & PSP_CTRL_CROSS){
                printf(
"Cross pressed  ");
            }
 

            
if (pad.Buttons & PSP_CTRL_UP){
                printf(
"Up pressed  ");
            }
 
            
if (pad.Buttons & PSP_CTRL_DOWN){
                printf(
"Down pressed  ");
            }
 
            
if (pad.Buttons & PSP_CTRL_LEFT){
                printf(
"Left pressed  ");
            }
 
            
if (pad.Buttons & PSP_CTRL_RIGHT){
                printf(
"Right pressed  ");
            }
      

            
if (pad.Buttons & PSP_CTRL_START){
                printf(
"Start pressed  ");
            }

            
if (pad.Buttons & PSP_CTRL_SELECT){
                printf(
"Select pressed  ");
            }

            
if (pad.Buttons & PSP_CTRL_LTRIGGER){
                printf(
"L-trigger pressed  ");
            }

            
if (pad.Buttons & PSP_CTRL_RTRIGGER){
                printf(
"R-trigger pressed  ");
            }
      
        }

    }


                     
/* 彻底退出了*/
    sceKernelExitGame();
    
return 0;
}

 

    以上就是这个sample了,一点也不难!还算是再玩得程度,不过开发包公布出来的函数还真是少的可怜啊!要想写出更好的东西,那就要看对开源代码库的移植了!

 

http://www.niftyadmin.cn/n/1414257.html

相关文章

.pem引发的血案

2019独角兽企业重金招聘Python工程师标准>>> 做各种第三方支付的时候&#xff0c;下载来的证书是.pem后缀的&#xff0c;很好奇这到底是个什么玩意&#xff0c;于是...一场惨绝人寰学习过程开始了... 先说PEM&#xff0c;最初是为了增强邮件安全&#xff0c;将X.509…

opengl 保存渲染好的图像

在前面的文章中&#xff0c;我已经可以将媒体文件通过opengl来进行显示。 opengl 在显示的YUV视频序列上画多个框 opengl 显示BMP图像 如果希望将blend&#xff0c;或者其他方法处理过之后的图像数据保存为图像文件&#xff0c;该如何做呢&#xff1f; 这个时候我们就要用到…

中间人工具---MITMF

MITMF: 强大的工具Mitmf 是一款用来进行中间人攻击的工具。它可以结合 beef 一起来使用&#xff0c;并利用 beef 强大的 hook 脚本来控制目标客户端。 MITMF 使用python编写。工具的作者是byt3bl33d3r&#xff0c;GitHub项目地址&#xff1a; https://github.com/byt3bl33d3r/M…

数据传输中的成帧

什么是数据传输中的成帧 数据传输中的成帧 成帧技术是一种用来在一个比特流内分配或标记信道的技术&#xff0c;为电信提供选择基本的时隙结构和管理方式、错误隔离和分段传输协议的手段。两个计算机或设备之间的点到点的连接中包括一根电线,在这根电线中数据作为位流传输。但是…

opengl GLSL宏加载shader source

在opengl shader的编写过程中&#xff0c;常用的两种方式是&#xff1a; 将shader 定义为字符串&#xff0c;然后使用glShaderSource加载 static const char *vs "attribute vec4 vertexIn;\n""attribute vec2 textureIn;\n""varying vec2 textureOu…

DAC相关知识点

1.回放数据64bit的数据来源有两个地方&#xff1a; A——ROM波形数据表&#xff08;数据来源可由dds产生或者matlab产生&#xff0c;本实际项目选择由dds产生的数据&#xff1a;通过写地址出来相应频率的波形&#xff09;。 B——预留的接口给客户用来回访他们的I/Q数据 &am…

简单控件Panel和PlaceHolder的使用区别

在MSDN中资料如下&#xff1a;PlaceHolder Web 服务器控件使您可以将空容器控件放置到页内&#xff0c;然后在运行时动态添加、移除或依次通过子元素。该控件只呈现其子元素&#xff1b;它不具有自己的基于 HTML 的输出。 例如&#xff0c;您可能想要根据用户选择的选项&#…

序列化json和pickle模块

json关于对象和文件的操作: 1 import json 2 lst [1,2,3,4] 3 f open("file","w",encoding"utf-8") 4 json.dump(lst,f) #将对象转成字符串,并写入文件中 5 6 f open("file", "r") 7 print(json.load(f)) …