cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 233|回复: 10

[fx-9860/9750] 【开坑】【告别】在fx-9860系列上用C语言编程(翻译转载)

[复制链接]
发表于 2019-10-7 20:22:57 | 显示全部楼层 |阅读模式
本帖最后由 Myth 于 2019-10-9 23:11 编辑

Written by Zezombye@planet-casio.
Original post

#此教程由法语翻译而来,并非本人成果。感谢原作者Zezombye!

好久没上cnCalc了。

遥想刚入坑时,cnCalc一日十几新帖,各种挖黑胶、爆机操作层出不穷,diameter、imath等大神(大神过多,恕不一一列举)各显神通。再看如今,真是令人唏嘘。

入坑以来,未能给cnCalc做什么贡献,不过是写了几篇9750升级教程而已。今日退坑,决定再翻译一个planet-casio上的9860SDK教程,算是个留念,也算是致敬@diameter当年写的教程。

原教程法语,再加上我个人C语言水平过低,如有错误,还请包涵。

最后,感谢原作者@Zezombye,也感谢这个圈子内的所有人,这个圈子一直以来给我带来的快乐,我不会忘记。

原贴:https://www.planet-casio.com/Fr/forums/lecture_sujet.php?id=14992
个人网站链接:http://www.mythologyli.cn/2019/10/07/225/

fx-9860 SDK及官方文档:https://pan.baidu.com/s/1BshpzIu9OtyiTpwkuk8kGw 提取码:bg7y




评分

参与人数 1金钱 +10 专家 +1 贡献 +2 收起 理由
lch + 10 + 1 + 2

查看全部评分

 楼主| 发表于 2019-10-7 20:24:37 | 显示全部楼层
本帖最后由 Myth 于 2019-10-9 22:48 编辑

Written by Zezombye@planet-casio.
Original post

#此教程由法语翻译而来,并非本人成果。感谢原作者Zezombye!

为了更好地编写游戏,我们可以在fx-9860系列上使用C语言编程。用C语言编写的程序格式为*.g1a(与*.g1m不兼容),被称为Add-in。可以将这些程序传输到fx-9860中运行。

在本教程中,我假设您已经了解C语言,这意味着您熟悉结构、指针、变量等概念。
如果您对C语言没有足够了解,建议您查看Openclassroom教程

 楼主| 发表于 2019-10-7 20:25:18 | 显示全部楼层
本帖最后由 Myth 于 2019-10-9 22:57 编辑

第一部分:安装SDK

如果您的操作系统是Linux,请查看Gint的有关内容。如果您的操作系统是Windows,您需要安装fx-9860 SDK提取码:iced)。如果您的电脑是Mac,请在Windows上使用fx-9860 SDK。

在Windows上安装时,请勿将安装在如Program Files(x86)等带括号的文件夹中!!!

Linux(使用Gint)无此限制。
 楼主| 发表于 2019-10-7 20:27:10 | 显示全部楼层
本帖最后由 Myth 于 2019-10-13 14:25 编辑

第二部分:使用SDK

安装SDK后,将其打开。我们首先来创建一个新的项目。

单击Project<<New,然后依次填写项目路径、文件夹名称、项目名称、版本号。

批注 2019-10-07 165644.jpg

此后会弹出错误消息显示无项目文件,这是正常的。
您会发现,SDK为您自动预置了代码,您可以先编译一下。

批注 2019-10-07 165825.jpg

要编译,请单击Project<<Rebuild all

批注 2019-10-07 170314.jpg

批注 2019-10-07 170344.jpg

如果您的路径不含括号的话,此时编译应该会顺利完成。若您的编译器报错,请检查路径是否含有括号。

批注 2019-10-07 170431.jpg

然后单击Run<<Run开始在模拟器中运行程序。稍稍拉大Display窗口,使模拟器屏幕更大。然后在Menu内找到您的Add-in(图标为Debug),点击EXE打开。您会得到以下结果:

批注 2019-10-07 170637.jpg
 楼主| 发表于 2019-10-7 20:29:29 | 显示全部楼层
本帖最后由 Myth 于 2019-10-13 14:26 编辑

第三部分:关于代码的基本介绍

首先,我们打开项目文件夹,您应该看到以下文件:

批注 2019-10-07 172616.jpg

MainIcon.bmp是要在Menu中显示的图标(单色位图),更改此文件可更改程序的图标。

使用您喜欢的代码编辑器打开*.c文件(如Notepad++)。您可以从SDK中直接编辑代码,但编辑体验极差,没有突出显示和代码缩进功能。

这里,主函数是此函数:

  1. int AddIn_main(int isAppli, unsigned short OptionNum)
  2. {
  3.     unsigned int key;

  4.     Bdisp_AllClr_DDVRAM();

  5.     locate(1,4);
  6.     Print((unsigned char*)"This application is");
  7.     locate(1,5);
  8.     Print((unsigned char*)" sample Add-In.");

  9.     while(1){
  10.         GetKey(&key);
  11.     }

  12.     return 1;
  13. }
复制代码

程序将从这里的主函数开始。当然,您不用考虑int AddIn_main()中的参数。事实上,Add-in可以在Menu或E-act中被启动,但由于在绝大多数情况下程序是从Menu启动的,您可以忽略这些参数。

首先要注意的是,尽管fx9860 SDK有C标准库,但它却不支持printf()函数和scanf()函数。事实上,计算器没有PC那样输入流和输出流的概念。像在CASIO BASIC中一样,有必要在输出时进行定位。例如:

  1. locate(int x, int y); //将光标放在x,y处
  2. Print(char* str); //显示字符串
复制代码

没有scanf()函数令人恼火,但其实您不太需要它。毕竟大多数人想要制作游戏,而大多数游戏不要求输入文本。

如果确实有输入文本的需要,请自己编写函数或使用EasyInput库

如果要在屏幕上输出数字,则有两种选择:

要么使用sprintf()函数,例如:
  1. int a = 30, u = 40;
  2. char* str = malloc(u);
  3. sprintf(str, " %d", a);
  4. locate(1,1);
  5. Print(str);
复制代码

您也可以使用不在C标准库中的itoa函数:

  1. void itoa(int n, char s[])
  2. {
  3.      int i, j, sign;
  4.      char c;

  5.      if ((sign = n) < 0)
  6.          n = -n;
  7.      i = 0;
  8.      do {
  9.          s[i++] = n % 10 + '0';
  10.      } while ((n /= 10) > 0);
  11.      if (sign < 0)
  12.          s[i++] = '-';
  13.      s[i] = '\0';
  14.      for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
  15.          c = s[i];
  16.          s[i] = s[j];
  17.          s[j] = c;
  18.      }
  19. }
复制代码

考虑到使用sprintf()会使加载项增加30 KB,建议使用第二种方式。若要使用sprintf(),请务必记得#include<stdio.h>。

另外,请注意该编译器不支持C99标准,因此,请注意变量声明的位置与for循环的使用。


  • 函数Bdisp_AllClr_DDVRAM()用于清空DD和VRAM。

要了解DD与VRAM的区别,请设想现在要绘制一个图案。首先,图案在VRAM上绘制,然后发送给DD,后者将其显示出来。

由VRAM向DD的发送并不是自动的,需要通过Bdisp_PutDisp_DD()函数来实现。需要注意的是,某些函数会自动进行此操作,例如GetKey()函数。


  • 函数GetKey(int *key)用于按键检测。

请注意,若没有按下任何键,该函数将暂停程序的执行,直到一个键按下为止。我们稍后将介绍一些不会使程序暂停的函数。要特别注意的是,GetKey()将刷新DD。
 楼主| 发表于 2019-10-7 20:30:09 | 显示全部楼层
(未完待续)
发表于 2019-10-9 22:31:15 来自手机 | 显示全部楼层
支持你,感谢分享和翻译
 楼主| 发表于 2019-10-11 08:34:05 | 显示全部楼层
本帖最后由 Myth 于 2019-10-11 08:39 编辑

第四部分:使用MonochromeLib

MonochromeLib是使用fx-9860 SDK时必不可少的库:它极大地提高了绘图速度(帧率)。

您可以从这里下载.

您将得到MonochromeLib.c和MonochromeLib.h两个文件,请将它们移动到您的项目文件夹中,并添加到您的项目中。

在SDK的左侧,右键单击Source Files,然后点击Add,把您项目文件夹中的MonochromeLib.c文件选中;同样地,右键单击Header Files,然后点击Add,把您项目文件夹中的MonochromeLib.h文件选中。

批注 2019-10-11 080342.jpg

批注 2019-10-11 080956.jpg

注意:打开MonochromeLib.h文件,您会注意到一些#define被注释掉了,这是为了避免占用太多空间。您可以根据需要进行更改。

ss (2017-11-29 at 05.29.19).png


最后,在原先创建的*.c文件中,添加#include “MonochromeLib.h”,最后用ML_clear_vram()函数代替Bdisp_AllClr_DDVRAM()函数。

在SDK中,单击Project<<Rebuild all(如为灰色,先单击Run<<Stop)。程序应该可以正常编译,并且运行结果与之前相同——但要快一点。

在以后的编程中,尽可能使用MonochromeLib中的绘图功能,而非fxlib中的函数。
发表于 2019-10-12 19:12:30 | 显示全部楼层
感谢!
发表于 2019-10-13 16:41:53 | 显示全部楼层
希望继续更新!
 楼主| 发表于 2019-10-13 16:56:49 | 显示全部楼层
cctvgm 发表于 2019-10-13 16:41
希望继续更新!

这个教程很短的,剩的也不多了
其实真说要编程的话,看到这儿再结合diameter的帖子,我觉得已经够了
这两天比较忙,不过以后应该会更完的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|Archiver|手机版|cnCalc计算器论坛  

GMT+8, 2019-10-24 07:34 , Processed in 0.118566 second(s), 26 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表