tonc吧 关注:24贴子:286

向VisualBoyAdvance发送消息

只看楼主收藏回复

写个无聊的东西~~~~
在HAM中有一个ham_VBAText("……")函数,可以向VisualBoyAdvance发送消息。这在debug中非常有用。而在tonclib中没有这个功能,只有向No$GBA发送消息的nocash_puts("……"),当然No$GBA在DEBUG方面要比VBA要强大得多,有了这个功能确实就没有前者的必要性了。还有就是向VBA发送消息实在太简单了,在VBA的README文件中有详细的说明,有现成的函数可以利用。在这里就实际运用一下这个函数。


IP属地:山东1楼2016-03-12 21:03回复
    首先,新建一个tonc的GBA工程。
    新建一个头文件debugVBA.h。
    将VBA的README文件中相关的代码拷进去。就是下面这个:


    IP属地:山东2楼2016-03-12 21:03
    回复
      void print(char *s)
      {
      asm volatile("mov r0, %0;"
      "swi 0xff;"
      : // no ouput
      : "r" (s)
      : "r0");
      }


      IP属地:山东3楼2016-03-12 21:04
      回复
        OK,已经可以向VBA输出文字了,用vba打开编译好的rom,然后打开【工具】(tools)菜单的第二个【日志】(logging),会弹出一个日志对话框。回到VBA显示窗口按GBA的A键,看,日志框中出现了相应的文字。


        IP属地:山东6楼2016-03-12 21:05
        回复


          IP属地:山东7楼2016-03-12 21:06
          回复
            那么输出变量呢?那就要用到sprintf函数了。大家知道printf是将字符串打印到屏幕,而sprintf则是将字符串打印到另一个字符串。这样用:
            sprintf(字符串缓冲区,"格式化文本",变量列表);


            IP属地:山东8楼2016-03-12 21:06
            回复


              IP属地:山东10楼2016-03-12 21:07
              回复
                下面我们改进一下,把向VBA和向No$GBA发送消息的函数弄在一起,因为我们做些小测试用VBA就够了,而没必要动用No$GBA这么高级的东东,但偶尔也需要用一下。放到一个函数可以方便使用。下面把输出函数加了一个参数,用来区分是往VBA还是NO$GBA中输出。为什么不能让这两种输出同时存在,谁的消息谁接呢?经检测,向NO$GBA中输出的字符串可以被VBA忽略,程序会正常继续运行;但NO$GBA却不能接程序受向VBA发送的字符串,遇到了便会中断,需要手动跳转才能继续运行,如果消息多了就比较烦人。毕竟,VBA只是个模拟器,NO$GBA是调试器。VBA为了游戏的流畅,不知道是什么的东西就不理他,直接跳过去;而NO$GBA是专门找bug的,遇到不能解释的东东当然不会放过。在某些情况下,把含有向vba输出消息的rom放在NO$GBA中运行,可以当做一种简便的debug的技巧,因为会异常中断。但在这里不是我们需要的。所以,二者先只能取其一了。代码如下:


                IP属地:山东11楼2016-03-12 21:08
                回复
                  void print(int mosi, char *s)
                  {
                  if (mosi == 1)//如果参数mosi为1则向VBA输出文字
                  {
                  asm volatile("mov r0, %0;"
                  "swi 0xff;"
                  : // no ouput
                  : "r" (s)
                  : "r0");
                  }
                  else if(mosi == 0)//如果参数mosi为0则向NO$GBA输出文字
                  {
                  nocash_puts (s);
                  }
                  else {}
                  }


                  IP属地:山东12楼2016-03-12 21:08
                  回复
                    把主函数也改一下。


                    IP属地:山东13楼2016-03-12 21:08
                    回复
                      好了,这样print函数的第一个参数如果是0则向NO$GBA发送字符串,是1则向VBA发送字符串。NO$GBA查看消息的方法是,【window】菜单的【TYY debug messages】。


                      IP属地:山东15楼2016-03-12 21:09
                      回复


                        IP属地:山东16楼2016-03-12 21:09
                        回复
                          对了,tonclib有一个专门的变量char nocash_buffer[80] ,用来作为向NO$GBA发送消息的字符串,我们可以直接使用nocash_buffer这个变量来代替代码中的cc,而不用声明。代码又省了一行:


                          IP属地:山东17楼2016-03-12 21:10
                          回复
                            下面再补充一个在ADS或SDT中使用的方法。ARM官方系列工具的汇编语法和GCC的不同,我们直接插入汇编语句,下面这个例子还使用了GSLIB函数库:


                            IP属地:山东19楼2016-03-12 21:11
                            回复
                              感觉用这个做个纯文字游戏也没问题,只不过GBA并不是这么玩的~~~


                              IP属地:山东22楼2016-03-12 21:19
                              收起回复