Jump to content



Photo
- - - - -

How To Code The 9860 In Assembler


  • Please log in to reply
39 replies to this topic

#1 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 31 May 2007 - 10:38 AM

Well, not much is known (yet) to the open public, but I want to change this.

This topic is intended to collect information about programming the SH3 processor in assembler and using the calculators
full capabilities. Links, tips and code snippets are welcome.

I don't want this programming to be a secret only a few can do. Though the concerns of code stealing are valid I would like to
ask anyone to give credit where credit is due and this does not only mean when you use someones code but also when you
use information that were discovered by someone else. Don't be so stingy with credit! It costs you nothing, but returns you respect
and more information that could be usefull in the future.

For a starter: The SH3 is a pretty wicked architecture with its delayed branching/jumping and its strange move commands.
But here is a good read to get into it:

http://www.elenota.p...0317_sh_3sm.pdf

I already found out, that the assembler as does support the SH3 CPU. Here is the link to documentation and download:

http://john.ccac.rwt...hen.de:8000/as/

I also tried to write a disassembler but due to the strange nature of the CPU it is quite difficult to calculate branches and follow the program flow. For now it can only decode a single instruction. You enter the 16-bit hex code and it returns you the corresponding command.
It also tries to deode binary files but it is not very successfull as soon as it comes to branchin / jumps :(

If there is interrest in it I can publish it (including the sources).

Also I will try to write a headder creator during the next few days so that you can upload your files to the calculator. The headdermaker included with the SDK requires some strange files not needed in my opinion.


So let the games begin! Please help us in creating the best add ins possible.

(even if you don't use external assemblers, the inline assembler would also be nice to get to work, but it doesnt seem to want to work at the moment... the #pragma inline_asm (function) statement does not seem to work with the SDK :( )

... hope to hear from all of you soon...

#2 kucalc

kucalc

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1422 posts
  • Location:USA
  • Interests:Programming: C/C++, Fortran, LISP, COBOL 85 Standard, PHP, x86 and SH3 Assembly<br /><br />Computer graphics

  • Calculators:
    fx-9860G / fx-7400G Plus / Algebra FX 2.0+ / fx-9770G / CFX-9850G / CFX-9850GB+ / TI-89 / TI-nSpire

Posted 31 May 2007 - 02:36 PM

*Sigh* I think I am the only person who can help you huhn_m. I don't think anyone else knows how to program the fx-9860 in assembly. But I can make that change also...

I don't want this programming to be a secret only a few can do. Though the concerns of code stealing are valid I would like to
ask anyone to give credit where credit is due and this does not only mean when you use someones code but also when you
use information that were discovered by someone else. Don't be so stingy with credit! It costs you nothing, but returns you respect
and more information that could be usefull in the future.


I'll make this deal with you: I probably have figured out much more about the fx-9860 than anyone else in the community. I'll make everything I know public (how to write in assembly, LCD, serial ports, memory, etc.), under the condition, that if anything is derived from my work than it's to be added to the EPSILON hardware project. For example, if grayscales are created from my notes about the LCD when I make it public, then I have the right to add it to the EPSILON project. The EPSILON project still will remain free for anyone to use in their projects, games and programs. I would also like that when EPSILON is made open-source, I would like to ask for developers to help me out. That's all I ask. This is the best idea I could only come up with that I would think satisfy all us.

I might as well do this. At least I can be remembered for doing something good and contributing something really big (Hopefully, I don't want to be forgotten.....). But first, I must get community approval from all of you on my idea. Why do you guys think?

#3 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 31 May 2007 - 03:06 PM

we... thanks kucalc :)

I am for it. All my code has always been and will always be published. I can also discover all this myself (or at least lots of it) but it would take
needless much time.

I would wait for vanhoas reply since he seems to be the only one at present who is interested in programming the 9860 seriously.

In the meantime (to the others interested):

using "as" you can write the folowing "sample" program:

CPU SH7700
SEGMENT code

rts
nop

this does nothing but return cleanly to the main menu. It is compiled with the folowing commands (after downloading "as"):

as filename.asm
p2bin filename.p


then you just have to add the header. I might publish a "header creator" today or at latest on saturday.

Please everyone respect kucalc and the great work he has done. Make it possible for the community to create great programs by working
together and giving credit. Don't steal sources but use them and give credit and respect and let others use your works too!


I'm an admin here and as such I have some special privileges. And if it is the only way to bring some activity and creativity back to the forum
then I do now anounce the folowing:

If I every find anyone deriving work from EPSILON, or kucalcs discoveries (that he is about to present) without giving the sources AND/OR giving
credit then this one shall be banned from the forum for 1 week. If I find the same offense done again the ban will last 1 month. And at a third time
the ban will be a 9 month ban.

If kucalc presents his work here he does so under a license (nothing else are the conditions he tells and he does this rightfully because he spent the time and it is HIS work) and this needs to be respected. If it is not by pure respect then I will surely enforce it!

#4 vanhoa

vanhoa

    Casio Overlord

  • Members
  • PipPipPipPipPipPipPip
  • 854 posts
  • Gender:Male
  • Location:Vietnam

  • Calculators:
    AFX 2.0, CP 300, CP 330, nSpire, TI 89, FX 5800

Posted 31 May 2007 - 03:33 PM

Uhm, huhn_m, I'm vanhoa and not vanhoas :D

All of my addins source for fx-9860 have ben public.

The things I know about "fx9860's hardware programing" is changing the speed of calc and SH3Timer:

http://pv-s1600.da.ru/doc/SH7705V1.ZIP SH7705V1.PDF :

9.4.1 Frequency Control Register (FRQCR)

The frequency control register (FRQCR) is a 16-bit readable/writable register used to specify whether a clock is output from the CKIO pin, the on/off state of PLL circuit 1, PLL standby, the frequency multiplication ratio of PLL circuit 1, and the frequency division ratio of the internal clock and the peripheral clock. Only word access can be used on FRQCR. As for the combination of the clock rate, refer to table 9.3, Possible Combination of Clock Modes and FRQCR Values.

The combinations listed in table 9.3 should only be set on FRQCR.
15 to 13 ? All 0 R Reserved

These bits are always read as 0. The write value should always be 0.

12 CKOEN 1 R/W Clock Output Enable
Specifies to output a clock from the CKIO pin or to fix the CKIO pin low when software standby is canceled (after an interrupt before STATUS1 becomes low and STATUS0 becomes low). The CKIO pin is fixed low during STATUS1 = low and STATUS0 = high, when the CKOEN bit is cleared to 0. Therefore, the malfunction of an external circuit because of an unstable CKIO clock in releasing software standby mode can be prevented. In clock operating mode 7, the CKIO pin is in the input state regardless of this bit.

0: Fixes the CKIO pin low in software standby mode.
1: Outputs a clock from the CKIO pin.

11, 10 ? All 0 R Reserved
These bits are always read as 0. The write value should always be 0.

9 STC1
8 STC0
Frequency Multiplication Ratio
00: ? 1 time
01: ? 2 times
10: ? 3 times
11: ? 4 times

7, 6 ? All 0 R Reserved
These bits are always read as 0. The write value should always be 0.

5 IFC1
4 IFC0
Internal Clock Frequency Division Ratio
Specify the frequency division ratio of the internal clock with respect to the output frequency of PLL circuit 1.
00: ? 1 time
01: ? 1/2 time
10: ? 1/3 time
11: ? 1/4 time

3, 2 ? All 0 R Reserved
These bits are always read as 0. The write value should always be 0.

1 PFC1
0 PFC0
Peripheral Clock Frequency Division Ratio
Specify the frequency division ratio of the peripheral clock with respect to the output frequency of PLL circuit 1.
00: ? 1 time
01: ? 1/2 time
10: ? 1/3 time
11: ? 1/4 time


And I also have the address of VRAM of fx-9860 (the vaule is different between PC and calc). I dont have the calc so i'm not so interesting in finding others...

#5 Andreas B

Andreas B

    Casio Freak

  • Members
  • PipPipPipPip
  • 160 posts
  • Gender:Male
  • Location:Norway

  • Calculators:
    fx-9860G SD

Posted 31 May 2007 - 03:39 PM

I'd say please do publish your source code and notes/documentation.

Requiring exclusive rights to your discoveries, is a bit selfish (_I think_). _If_ you want to make the software 'open source', it should be possible for others to fork the project, but they must /of course/ credit the original source. Denying commercial use is also understandable. ;)

A great thing would be to keep the development of new software open to the community, to let others understand and be able to contribute more easily than they can with a blob of a binary library. Don't think that I don't appreciate or respect your work, kucalc - my point is that more progress will be made if source code or documentation is released ;)

http://xfer9860.sourceforge.net/doc/

#6 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 31 May 2007 - 03:45 PM

Hey Andreas and vanhoa (the s was for like "the butchers house" or "my friend[b]s girl" )

Thanks for your replies (and for the code and the explanation vanhoa!)

Also I didn't know about your site Andreas. Would you like to be added to the link section of casiocalc.org?

Thanks a lot for your replies. I hope we will soon have set the differences aside and begin making the greatest
programs for the 9860 ever seen (*enthusiastic*)

#7 Andreas B

Andreas B

    Casio Freak

  • Members
  • PipPipPipPip
  • 160 posts
  • Gender:Male
  • Location:Norway

  • Calculators:
    fx-9860G SD

Posted 31 May 2007 - 03:55 PM

Also I didn't know about your site Andreas. Would you like to be added to the link section of casiocalc.org?

Sure, but just add the link to the documentation. No need to link to the project (http://xfer9860.sourceforge.net/) quite yet, as it is barely functional and is based on stuff not yet in the documentation.

Edit: I also think that the number one priority except from hacking the hardware/OS, is making a decent CAS.

#8 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 31 May 2007 - 04:02 PM

ok :) (oh, and a decent CAS would really be nice :P )

#9 vanhoa

vanhoa

    Casio Overlord

  • Members
  • PipPipPipPipPipPipPip
  • 854 posts
  • Gender:Male
  • Location:Vietnam

  • Calculators:
    AFX 2.0, CP 300, CP 330, nSpire, TI 89, FX 5800

Posted 31 May 2007 - 04:03 PM

Here a the zip file every body should know:

http://ix.ipn.ru/cas...velop/sh3_h.zip

Next post I may talking more about SH3 Timers. (3 total)

#10 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 31 May 2007 - 04:43 PM

may I ask where you found those information? I really searched for good information on the SH3 and I found nothing of value ... :wacko: :o

#11 vanhoa

vanhoa

    Casio Overlord

  • Members
  • PipPipPipPipPipPipPip
  • 854 posts
  • Gender:Male
  • Location:Vietnam

  • Calculators:
    AFX 2.0, CP 300, CP 330, nSpire, TI 89, FX 5800

Posted 31 May 2007 - 04:54 PM

Me too... But i started before you :unsure: and i'm being friend of many Ti/Pv programmers ;)

#12 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 31 May 2007 - 05:22 PM

so the advantage of time and "vitamine b" as we say in germany (connections :P ). Thats a plus of course! *g*

#13 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 31 May 2007 - 05:47 PM

assembly is not so much more difficult than C. I never really got C, but asm i learned quite easily ;)

Though I must admit, that the SH3 assembler code is quite ... well ... queer ...
(they have delayed jumps and some really strange commands ...)

#14 Xerxes

Xerxes

    Casio Freak

  • Members
  • PipPipPipPip
  • 130 posts
  • Gender:Male

Posted 31 May 2007 - 06:32 PM

Hi huhn_m,

I prefer programming in assembly to C and I have some experience with different assembly languages but after having a look at the SH3, I have to confirm your impression.

#15 samy

samy

    Casio Fan

  • Members
  • PipPip
  • 46 posts
  • Location:France

  • Calculators:
    graph 100; graph85

Posted 31 May 2007 - 08:22 PM

i agree with the fact to credits :r-t-f-m: the guy(s) who has(ve) done the job that enable us to do our program. I think that every body who claims to be a programmer should have moral rules like this one...

@ huhm_n: nice to see you back!!! (off topic but I'm curious): do you intend to continue mlc2 on afx one of this day... :(

ps: nice to see that people will work "hand in the hand" (don't know if this expression exist in english)

#16 Manuel Naranjo

Manuel Naranjo

    Casio Addict

  • Members
  • PipPipPip
  • 65 posts
  • Gender:Male
  • Location:Rosario, Argentina

Posted 01 June 2007 - 03:10 AM

*Sigh* I think I am the only person who can help you huhn_m. I don't think anyone else knows how to program the fx-9860 in assembly. But I can make that change also...
I'll make this deal with you: I probably have figured out much more about the fx-9860 than anyone else in the community. I'll make everything I know public (how to write in assembly, LCD, serial ports, memory, etc.), under the condition, that if anything is derived from my work than it's to be added to the EPSILON hardware project. For example, if grayscales are created from my notes about the LCD when I make it public, then I have the right to add it to the EPSILON project. The EPSILON project still will remain free for anyone to use in their projects, games and programs. I would also like that when EPSILON is made open-source, I would like to ask for developers to help me out. That's all I ask. This is the best idea I could only come up with that I would think satisfy all us.

I might as well do this. At least I can be remembered for doing something good and contributing something really big (Hopefully, I don't want to be forgotten.....). But first, I must get community approval from all of you on my idea. Why do you guys think?


Kucalc I'm really glad hearing you are going to open the source for your code-... AT LEAST :D. I think you should take your time and read some of the open source licenses. Some of the license has as one of it's requirements to add credits to the original writer I think BSD is one of those.

Anyway I'm glad to hear your decistion, and count with me if you need something (if I can make my time hehe, I have all the finals now :'( )

Cheers,
Manuel

/*JOKE
PD: Hey I want my part of the credit too ;). I helped you a bit with your startings into sh3 assembler, after all who was the one who disturbed you in the MSN while you were trying to achieve something?
*/

#17 kucalc

kucalc

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1422 posts
  • Location:USA
  • Interests:Programming: C/C++, Fortran, LISP, COBOL 85 Standard, PHP, x86 and SH3 Assembly<br /><br />Computer graphics

  • Calculators:
    fx-9860G / fx-7400G Plus / Algebra FX 2.0+ / fx-9770G / CFX-9850G / CFX-9850GB+ / TI-89 / TI-nSpire

Posted 01 June 2007 - 03:44 AM

[quote name='huhn_m' post='40798' date='May 31 2007, 07:06 AM']Please everyone respect kucalc and the great work he has done.[/quote]

Thanks.

B)-->
QUOTE(Andreas B @ May 31 2007, 07:39 AM) <{POST_SNAPBACK}>
Requiring exclusive rights to your discoveries, is a bit selfish (_I think_). _If_ you want to make the software 'open source', it should be possible for others to fork the project, but they must /of course/ credit the original source. Denying commercial use is also understandable. ;)

A great thing would be to keep the development of new software open to the community, to let others understand and be able to contribute more easily than they can with a blob of a binary library. Don't think that I don't appreciate or respect your work, kucalc - my point is that more progress will be made if source code or documentation is released ;)[/quote]

I don't think you understood what I said earlier. I said EPSILON will become open-source. You can "fork" new projects from it, but what I'm asking is that you give credit (cite your sources) and if something is accomplished off my notes that I have the right to also include it in EPSILON so the EPSILON project can live on.

[quote name='Manuel Naranjo' post='40850' date='May 31 2007, 07:10 PM']Kucalc I'm really glad hearing you are going to open the source for your code-... AT LEAST :D. I think you should take your time and read some of the open source licenses. Some of the license has as one of it's requirements to add credits to the original writer I think BSD is one of those.

Anyway I'm glad to hear your decistion, and count with me if you need something (if I can make my time hehe, I have all the finals now :'( )[/quote]

I'll take some look at some licenses or I can use the good ol' "kucalc License".

[quote name='Manuel Naranjo' post='40850' date='May 31 2007, 07:10 PM']/*JOKE
PD: Hey I want my part of the credit too ;). I helped you a bit with your startings into sh3 assembler, after all who was the one who disturbed you in the MSN while you were trying to achieve something?
*/[/quote]

Lol, ok sure. :roflol:

Well then, I start the "The fx-9860 Bible" project. It's a document that contains everything I know about the fx-9860, not just the CPU, but accessing the DD, key input, memory, etc.

#18 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 01 June 2007 - 02:24 PM

So here is all of the information of the header file format I could figure out myself:

0000:	14 Bytes	0xAAAC 0xBDAF 0x9088 0x9A8D 0x0CFF 0xEFFF 0xEFFF	- Actuall Headder
000E:	11 Bytes	?		-	Copy Protection
0015:	07 Bytes	0x00h		-	Filler (?)
0020:	01 Bytes	@ (0x40h)	-	Indicates beginning of Name
0021:	8 Bytes	*		-	Name (needs to be equal to file name without the .g1a)
0020:	2 Bytes	 0x00h  - Filler
002B:	 1 Byte	 Number of eActivity Strips (0-4)
002C:	 4 Byte	 0x00h		- Filler
0030:	10 Bytes	??.??.????	-	Version
003A:	02 Bytes	0x00h		-	Filler
003C:	14 Bytes	????.????.????	-	Date (YYYY.MMDD.HHMM)
004A:	02 Bytes	0x00h		-	Filler (?)
004C:	68 Bytes	*		-	Bitmap (for menu)
If eStrip 1 is enabled (count >=1) then the folowing, else everything mentioned here 0x00
0090:	16 Bytes  - Name 1
00A0:	20 Bytes  - 0x00 Filler
00B4:	44 Bytes - Small Bitmap (eBitmap 1)

If eStrip 2 is enabled (count >=2) then the folowing, else everything mentioned here 0x00
00E0:	16 Bytes  - Name 2
00F0:	20 Bytes  - 0x00 Filler
0104:	44 Bytes - Small Bitmap (eBitmap 2)

If eStrip 3 is enabled (count >=3) then the folowing, else everything mentioned here 0x00
0130:	16 Bytes  - Name 3
0140:	20 Bytes  - 0x00 Filler
0154:	44 Bytes - Small Bitmap (eBitmap 3)

If eStrip 3 is enabled (count >=3) then the folowing, else everything mentioned here 0x00
0180:	16 Bytes  - Name 4
0190:	20 Bytes  0x00 - Filler
01A4:	44 Bytes - Small Bitmap (eBitmap 1)

The rest is again valid for all files:
01D0:	 4 Bytes 0x00 - Filler
01D4:	8 Bytes	*		-	Name
01DC:	20 Bytes	0x00 - Filler
01F0:  4 Bytes - Filesize (Total)
01F4:	12 Bytes	0x00h		-	Filler (?)


Thats everything I figured out. Except the copy protection everything is fine
just replace the AAAC in the header with ACAC (in the very beginning) and this prevents the "copy protection error".

Don't ask me how this stupid protection works :)

#19 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 01 June 2007 - 03:21 PM

i know, i know ... i doublepost ...

Here is the add in creator:

This program creates headers for binary programs for the FX-9860.
The G1A files created by the program should be valid
(though they not 100% conform to the casio standard) and are loaded
by FA-124 and also transfered to the calc.

The program takes binary files as created by the assembler "as" and the
included tool "p2bin" as input and outputs the G1A file after asking for some
information like the version or the programs name.

HOWEVER! The icon editor is not yet implemented. All icons are just made
black. I'll try to do the icon editor this evening or tomorrow :)

Have fun and report bugs in the forum


it is ? 2007 by huhn_m. Sources will be included in the version with the icon editor!

#20 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 01 June 2007 - 09:12 PM

The Operatingsystem Functions seem to reside at 0x80010070 hex.

Function numbers seem to be given through the R0 register. For example i think the folowing should be valid:

Function Number: 0x146 (R0)
Function Description: Set Pixel to VRAM
Function Arguments: r4 := x
							  r5 := y
							  r6 := 1 = black / 0 = white
This is a complete functions description. The trick is now to get the sources of the 0x80010070 location so that we can disassemble
the operationg system functions and get REAL direct hardware access.

The same parameters are valid for setting the pixel on the DD (driver), but the function number is 0x147.
For setting both at the same time the function number is 0x148.

Do you want me to document all those functions? It should not be too difficult .... But the main goal is to get THEIR source code, so
we can get hardware access.

#21 Andreas B

Andreas B

    Casio Freak

  • Members
  • PipPipPipPip
  • 160 posts
  • Gender:Male
  • Location:Norway

  • Calculators:
    fx-9860G SD

Posted 01 June 2007 - 10:47 PM

A table could be neat, maybe just a view over R0 value and corresponding function. Are these function comparable to system calls/OS, or are they from the SDK library?
Finding out what makes them work is the interesting part. When that is done - we can make our own open implementation, and focus more on documenting that.

#22 vanhoa

vanhoa

    Casio Overlord

  • Members
  • PipPipPipPipPipPipPip
  • 854 posts
  • Gender:Male
  • Location:Vietnam

  • Calculators:
    AFX 2.0, CP 300, CP 330, nSpire, TI 89, FX 5800

Posted 02 June 2007 - 09:01 AM

The Operatingsystem Functions seem to reside at 0x80010070 hex.

Function numbers seem to be given through the R0 register. For example i think the folowing should be valid:

Function Number: 0x146 (R0)
Function Description: Set Pixel to VRAM
Function Arguments: r4 := x
							  r5 := y
							  r6 := 1 = black / 0 = white
This is a complete functions description. The trick is now to get the sources of the 0x80010070 location so that we can disassemble
the operationg system functions and get REAL direct hardware access.

The same parameters are valid for setting the pixel on the DD (driver), but the function number is 0x147.
For setting both at the same time the function number is 0x148.

Do you want me to document all those functions? It should not be too difficult .... But the main goal is to get THEIR source code, so
we can get hardware access.


I dont think so. look at the disassembled code and see this at the address of _Bdisp_PutDisp_DD:

_Bdisp_PutDisp_DD:
D2D1:			mov.l			@(H'004,pc),r2;
D002:			mov.l			@(H'008,pc),r0;
422B:			jmp				@r2			;
0009:			nop								;
8001:			mov.b			r0,@(H'1,r0);r0++
0070:			????							;
0000:			????							;
0028:			clrmac						;

after execute 422B, it jumped to the address 0x80010070:
D202:			mov.l			@(H'008,pc),r2;
4008:			shll2			r0			;
002E:			mov.l			@(r0,r2),r0;
402B:			jmp				@r0			;

then it jumped to 0xA0036534, this is in the ROM address (I think ROM adress (the OS address) started from 0xA0000000)...

If I have the FX-9860's ROM image, I can validate this and may know what is at 0xA0036534 (0x00036534)...

__________________________________________________

You should take a look at, you will see the way to test a key fast.

_Bkey_GetKeyTableInfo
003004e0:
....
0030053C:

 _KeyCodeConvert
0030053c:
...
003005B4:

_Hkey_Check_Key_SDK:;<!--this is the main check key function-->
0030063c:
...
00300768:

_IsKeyDown:;<!--This is not the function you need to point much-->
00300768:	4F22:			sts.l			pr,@-15		;
0030076A:	7FFC:			add				#H'FFFFFFFC,r15;r15-=3
0030076C:	63F3:			mov				r15,r3		;r3=r15
0030076E:	BEE5:			bsr				H'1DCA		;
00300770:	2F36:			mov.l			r3,@-r15	;
00300772:	7F04:			add				#H'04,r15	;r15+=4
00300774:	63F0:			mov.b			@r15,r3		;
00300776:	633C:			extu.b		r3,r3			;
00300778:	4311:			cmp/pz		r3				;
0030077A:	8B03:			bf				H'006			;
0030077C:	84F1:			mov.b			@(H'1,r15),r0;
0030077E:	600C:			extu.b		r0,r0			;
00300780:	4011:			cmp/pz		r0				;
00300782:	8903:			bt				H'006			;
00300784:	7F04:			add				#H'04,r15	;r15+=4
00300786:	4F26:			lds.l			@r15+,pr	;
00300788:	000B:			rts									;
0030078A:	E000:			mov				#H'00,r0	;
0030078C:	BF56:			bsr				H'1EAC		;
0030078E:	64F3:			mov				r15,r4		;
00300790:	7F04:			add				#H'04,r15	;
00300792:	4F26:			lds.l			@r15+,pr	;
00300794:	000B:			rts									;
00300796:	0009:			nop									;


#23 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 02 June 2007 - 09:22 AM

I have to OS image. These Instructions (at 80010070) are at adress 0x10070 in the rom image.
Maybe that could mean that the rom image does only contain the system wrappers (like the casio libraries) while
the "real" functions of the system are not updateable (and with this also not destroyable?!)
Also this could enable us to improve the OS by rewriting its routines and redirecting the calls to own programs.
Now that would be nice :) We would just need to patch the $10070 handlers

Can you pm me your mail adress? then I can mail you the os image ...

(btw. how did you get the code from 80010070? The memory viewer and disassembler of the SDK do not seem to show them?!?)

I could also get a "real" rom image if we could initiate communication from within an assembler program...

#24 vanhoa

vanhoa

    Casio Overlord

  • Members
  • PipPipPipPipPipPipPip
  • 854 posts
  • Gender:Male
  • Location:Vietnam

  • Calculators:
    AFX 2.0, CP 300, CP 330, nSpire, TI 89, FX 5800

Posted 02 June 2007 - 10:09 AM

Legendary_Wind AT hotmail.com

I used a very basic way to get them:

1. Create a new file test.txt in the sd card (which will be saved in the SDCard folder)

Loop
2. Read 2 bytes: tmp=*(unsigned short*)(0x80010070+2*i)
3. write tmp to test.txt
Until i++>=size

4. Close test.txt

5. Open test.txt with a text editor :P


#25 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 02 June 2007 - 10:25 AM

*lol* why didn't I get that idea!

(mail sent!)

#26 alias4399

alias4399

    Casio Freak

  • Members
  • PipPipPipPip
  • 180 posts
  • Location:Impossible to say.. Its not like this is a constant!

  • Calculators:
    CFX 9850GB Plus
    FX 9860G

Posted 02 June 2007 - 02:03 PM

Hey guys!

Hi huhn_m, great to see you know how to do all this.. assembly stuff

Like many of the others, I'm still trying to wrap my head around C

Nice work though!

Alias

#27 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 02 June 2007 - 02:13 PM

I used your method vanhoa and this is what it said at 0xA0036534:

ROM:00000000				 add	 #-1, r4
ROM:00000002				 add	 #1, r7
ROM:00000004				 cmp/hs  r5, r7
ROM:00000006				 bf	  h'FFFFFFEC
ROM:00000008				 mov.l   @r15, r3
ROM:0000000A				 add	 r5, r4
ROM:0000000C				 mov	 r4, r0
ROM:0000000E				 sub	 r3, r0
ROM:00000010				 add	 #4, r15
ROM:00000012				 mov.l   @r15+, r12
ROM:00000014				 rts
ROM:00000016				 mov.l   @r15+, r14

The code corresponds to 0x36534 in the OSUpdate image i sent you,

*edit* I think the bf (branch) is wrong, because I started extracting at A0036534 and itseems to jump backwards but since there is not "before" it just wraps arround the adresses. I'll use the OSImage and provide better code asap.

#28 kucalc

kucalc

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1422 posts
  • Location:USA
  • Interests:Programming: C/C++, Fortran, LISP, COBOL 85 Standard, PHP, x86 and SH3 Assembly<br /><br />Computer graphics

  • Calculators:
    fx-9860G / fx-7400G Plus / Algebra FX 2.0+ / fx-9770G / CFX-9850G / CFX-9850GB+ / TI-89 / TI-nSpire

Posted 02 June 2007 - 06:03 PM

I have to OS image.
....
I could also get a "real" rom image if we could initiate communication from within an assembler program...


huhn_m, the OS image I sent you is the real image. Trust me.

Anyways, I added more to the wiki: fx-9860 Hardware Wiki

I added a assembly equivalent of the KEYBIOS and also take a look at the Display Driver page I wrote.

#29 vanhoa

vanhoa

    Casio Overlord

  • Members
  • PipPipPipPipPipPipPip
  • 854 posts
  • Gender:Male
  • Location:Vietnam

  • Calculators:
    AFX 2.0, CP 300, CP 330, nSpire, TI 89, FX 5800

Posted 02 June 2007 - 06:24 PM

80010070 is the address of __JumpTableTOP

________________________________________________________________________________
___________
How to get the asm source of a function in fx9860G_library.lib?

First start a new project, and make sure u use that function before compile.

Open <Your project dir>\Debug\FXADDINror.map

You will see a mapping list, look like:

SECTION							START	  END		 SIZE   ALIGN
...
FILE=filebios
								  00302090  003027bf	   730
  _BfileMCS_GetFileHandle
								  00302090		6e   func ,g		 * 
  _Bfile_CloseFile
								  003020fe		6e   func ,g		 * 
  _BfileMCS_HandleCheck
								  0030216c		40   func ,g		 * 
  _MCSFile_InitAll
								  003021ac		3c   func ,g		 * 
  _Bfile_ReadFile
								  003021e8		e8   func ,g		 * 
  _Bfile_WriteFile
								  003022d0		de   func ,g		 * 
  _Bfile_SeekFile
								  003023ae		6a   func ,g		 * 
  _Bfile_OpenMainMemory
								  00302418		42   func ,g		 * 
  _Bfile_OpenFile
								  0030245a		 6   func ,g		 * 
  _Bfile_GetMediaFree
								  00302460		cc   func ,g		 * 
  _Bfile_GetFileSize
								  0030252c		7a   func ,g		 * 
  _Bfile_CreateMainMemory
								  003025a6		84   func ,g		 * 
  _Bfile_CreateFile
								  0030262a		16   func ,g		 * 
  _Bfile_CreateDirectory
								  00302640		 8   func ,g		 * 
  _Bfile_RenameMainMemory
								  00302648		6a   func ,g		 * 
  _Bfile_DeleteMainMemory
								  003026b2		6a   func ,g		 * 
  _Bfile_DeleteFile
								  0030271c		40   func ,g		 * 
  _Bfile_DeleteDirectory
								  0030275c		64   func ,g		 * 
FILE=keybios
								  003027c0  00302b03	   344
  _GetKeyWait
								  003027c0		40   func ,g		 * 
  _Bkey_GetKeyTableInfo
								  00302800		5c   func ,g		 * 
  _KeyCodeConvert
								  0030285c		78   func ,g		 * 
  _END$270
								  0030289a		 0   none ,l		 * 
  __Delay
								  003028d4		88   func ,g		 * 
  _Hkey_Check_Key_SDK
								  0030295c	   12c   func ,g		 * 
  _IsKeyDown
								  00302a88		30   func ,g		 * 
  _IsKeyUp
								  00302ab8		4c   func ,g		 * 
FILE=timer
								  00302b04  00302c03	   100
  _GetSDKLibraryVersion
								  00302b04		 6   func ,g		 * 
  _SetTimer
								  00302b0a		54   func ,g		 * 
  _KillTimer
								  00302b5e		44   func ,g		 * 
  _Sleep
								  00302ba2		62   func ,g		 *


And then, you will have its start address and its length, that's enouph to get the source...

#30 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 03 June 2007 - 10:36 AM

nice work kucalc! I think the code needs some commenting, so I'll probably do this :)

Just don't know if I have time today and tomorrow. But tuesday is definately 9860 day :P

by the way I have the folowing theory:

The r15 register (seen for example in the key bios) seems to point to an downwards growing stack.
I think this, because often data is written to it in the folowing form:

STS.L pr,@-r15

what means, that the value in the register is decremented and then the pr register is written to the position in memory
indicated by this value. When a program ends the pr register is often then restored by writing:

LDS.L @r15+, pr

This gets the value from the memory position pointed at by r15 and then increments the value in r15.

This seems like the classic "stack" to me...

Could someone please confirm that I'm not completly wrong with this theory?

#31 Andreas B

Andreas B

    Casio Freak

  • Members
  • PipPipPipPip
  • 160 posts
  • Gender:Male
  • Location:Norway

  • Calculators:
    fx-9860G SD

Posted 03 June 2007 - 12:05 PM

Renesas docs (those with the instruction set) mention that r15 is used as SP in their C-compiler.

mov.l	r12, @-r15  ; decrease SP, push r12 to stack
mov.l	@r15+, r12  ;pop value back into r12, increase SP
; it might be sufficient to only use "mov", as these instructions seem to default to handling long's (32 bit)


Are parameters for C-functions passed through the stack or through registers (I'm betting on stack)?

#32 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 03 June 2007 - 12:08 PM

thanks

well, I tried with set pixel, and the parameters were passed through registers. (see the function example some posts above)

#33 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 03 June 2007 - 12:23 PM

I also do not get the folowing command:

mov.l r4, @(h'10,r15)

The h'10 is a 5 bit value, but only 4 bits are allowed! (MOV.L Rn,@(disp4:Rm) == 0001nnnnmmmmdddd)

Is th?s already multiplied by 4 (because of the long word)?

#34 Andreas B

Andreas B

    Casio Freak

  • Members
  • PipPipPipPip
  • 160 posts
  • Gender:Male
  • Location:Norway

  • Calculators:
    fx-9860G SD

Posted 03 June 2007 - 12:40 PM

Yes. Docs, page 118:

MOV.L Rm,@(disp,Rn)		Rm → (disp ? 4 + Rn)


#35 huhn_m

huhn_m

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1957 posts
  • Gender:Male
  • Location:Germany / Dresden
  • Interests:Assembler(!!!)
    Computers and Programming
    Operating Systems
    Programmable Calculators
    Maths and everything arround it

  • Calculators:
    FX-82SX / AFX 2.0+ (ROM 1.03) / FX 1.0+ (ROM 1.03)

Posted 03 June 2007 - 01:21 PM

yes, I knew that.

The thing is ACTUALLY the DISP value is multiplied by 4 and has 4 bits. But here the DISP value is already bigger than possible because it has 5 bits.

As I understood the docs the value (here $10) is multiplied by 4. I think the description is a little incrorrect.

#36 kucalc

kucalc

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1422 posts
  • Location:USA
  • Interests:Programming: C/C++, Fortran, LISP, COBOL 85 Standard, PHP, x86 and SH3 Assembly<br /><br />Computer graphics

  • Calculators:
    fx-9860G / fx-7400G Plus / Algebra FX 2.0+ / fx-9770G / CFX-9850G / CFX-9850GB+ / TI-89 / TI-nSpire

Posted 03 June 2007 - 03:42 PM

[quote name='huhn_m' post='40903' date='Jun 3 2007, 02:36 AM']nice work kucalc! I think the code needs some commenting, so I'll probably do this :)

Just don't know if I have time today and tomorrow. But tuesday is definately 9860 day :P[/quote]

Ok, cool. :D

B)-->
QUOTE(Andreas B @ Jun 3 2007, 04:05 AM) <{POST_SNAPBACK}>
Are parameters for C-functions passed through the stack or through registers (I'm betting on stack)?[/quote]

[quote name='huhn_m' post='40908' date='Jun 3 2007, 04:08 AM']well, I tried with set pixel, and the parameters were passed through registers. (see the function example some posts above)[/quote]

Yes, I think it starts off at R4 then continues on (R5 then R6 then R7....).

#37 samy

samy

    Casio Fan

  • Members
  • PipPip
  • 46 posts
  • Location:France

  • Calculators:
    graph 100; graph85

Posted 28 January 2008 - 06:41 PM

Hello,
(waking of the topic)
i wonder wether someone know of the opcodes of the sh3 asm? <_<

#38 kucalc

kucalc

    Casio Maniac

  • Admin
  • PipPipPipPipPipPipPipPip
  • 1422 posts
  • Location:USA
  • Interests:Programming: C/C++, Fortran, LISP, COBOL 85 Standard, PHP, x86 and SH3 Assembly<br /><br />Computer graphics

  • Calculators:
    fx-9860G / fx-7400G Plus / Algebra FX 2.0+ / fx-9770G / CFX-9850G / CFX-9850GB+ / TI-89 / TI-nSpire

Posted 28 January 2008 - 07:09 PM

Lol, it should be in the PDF that was linked in the first post of this thread.

#39 samy

samy

    Casio Fan

  • Members
  • PipPip
  • 46 posts
  • Location:France

  • Calculators:
    graph 100; graph85

Posted 30 January 2008 - 05:13 PM

ok thanks!
i didn't take the time to check out since the link is broken, but with your tip i was able to find a new link on planete casio, here it is (if womeone else is intersted in it):
http://documentation...0317_sh_3sm.pdf

(kucalc: are you still developping mlc?)

#40 Guest_asm_*

Guest_asm_*
  • Guests

Posted 04 July 2009 - 10:04 PM

I also do not get the folowing command:

mov.l r4, @(h'10,r15)

The h'10 is a 5 bit value, but only 4 bits are allowed! (MOV.L Rn,@(disp4:Rm) == 0001nnnnmmmmdddd)

Is this already multiplied by 4 (because of the long word)?

Indeed, the disassembler has already multiplied the displacement by four.
The binary code should read: 0001 | 1111 | 0100 | 0100 (Code |R15| R4 | Displacement)

Note: The assembler will automatically divide your displacement by four (longword) or two (word).
Max. disp. f. long: H'3C
Max. disp. f. word: H'1E
Max. disp. f. byte: H'0F





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users