Hello all! I'm happy to announce that version 1.0 of the C development SDK for the TI84+CE and TI83PCE is available on GitHub now. Rather than going through this crazy process, you can now simply download the zip file, copy the folder to somewhere on your computer, set up your environment variables specific to your OS, and then use make in order to build your programs locally. Of course, it uses the ZDS compiler which is only natively supported on Windows, but works perfectly under Wine. If you wish to avoid even more hassle and you have access to the onlines, you can also use TI Planet's C Project Builder, available here: https://tiplanet.org/pb/ (You will need an account if you don't have one)

Now, ignoring all the craziness that happened with licenses, some standard CE C libraries have also been released. Currently there are 2; one for graphics and one for interfacing with the keypad. Included in each you will also find example programs in C using these libraries, and ASM source code licensed under the BSD 2 Clause. These libraries outperform their direct C equivalent as they are written in assembly and can behave however they want. Since they are still in version 1.0, there's a long way to go. But since things are easy to add to now, hopefully I can get some help Wink Anywho, here are the links so you can build your own programs, along with a screenshot using the C graphics library just for fun.

C Development SDK: https://github.com/CE-Programming/toolchain/releases/latest
C Standard Libraries: https://github.com/CE-Programming/libraries/releases/latest

Enjoy everyone, and please post any pull requests/bug reports and comments you may have! This has been a long ride Smile



Note:To install libraries so you can use them in development, simply read the readme provided on GitHub or in the zip. It's really easy.
Yay! Now all I need is an actual CE...

Great job as always. Can't wait to see more in the future!
pimathbrainiac wrote:
Yay! Now all I need is an actual CE...

Ditto.

Congrats on all your hard work Mateo! It's been great seeing this project progress. I can't wait to see what the community makes with this SDK.
I'll have to get a CE now. Razz (do I need a rom to use CEmu?) I could port Catylizm!
This is absolutely fantastic, Mateo! This is what I've been waiting for to start on Minesweeper Very Happy
Great work Mateo! We should also consider starting a data-structures and algorithms library. I currently have a singly-linked-list + merge sort implementation, and also found a Red/Black tree implementation which I've improved to a polymorphic version that can be used as the backing store for both a map and a set.

I also plan on releasing my scan-line renderer once I finish working out the kinks and the API, and would be willing to incorporate that into your graphics API.
elfprince13 wrote:
Great work Mateo! We should also consider starting a data-structures and algorithms library. I currently have a singly-linked-list + merge sort implementation, and also found a Red/Black tree implementation which I've improved to a polymorphic version that can be used as the backing store for both a map and a set.

I also plan on releasing my scan-line renderer once I finish working out the kinks and the API, and would be willing to incorporate that into your graphics API.

Sure, sounds great. There's a minor bug when drawing lines with the library right now, but shouldn't be too much of a problem to fix by tomorrow. Luckily ZDS also outputs the ASM source so libraries can easily be created with C code. (Which can also later be optimized Razz)

Note: Unfortunately ZDS is really limited in how it outputs things, so libraries can't be directly created in C. But it is pretty much a copy/paste for the library structure.
Spenceboy98 wrote:
(do I need a rom to use CEmu?)

You do. There are two ways to dump your ROM:
* the off-line partial ROM dumper (rom8x-type) provided by CEmu, made by Mateo;
* the connected whole ROM dumper provided by TILP beta (libticalcs), made by jacobly (calculator side) and myself (computer side), which does not interfere with the Flash memory's contents. It uses a relatively slow method, because USB communication is not yet documented in such a way that we can use an arbitrary protocol, but it works well too, at least under Linux.
A few small bugs have been fixed in the graphics library, along with the addition of 3 general purpose sprite routines. You can use ConvPNG to convert your images into data arrays that you can then use with the library routines if you wish. Please note that library header files include limited documentation of the routines; hopefully I can finish the online reference at some point Smile Anywho, since nothing has been created with the libraries yet, the graphics library shall remain as version 1. Version 2 will add clipping to all the NoClip routines, which will be backwards compatible with verison 1 as well, as per the library setup. More routines as well, because why not, and probably some cool optimizations. Thanks everyone! Smile

Also, if anyone is interested in how to actually create assembly libraries, simply navigate your way to this page:
http://ce-programming.github.io/documentation/tutorials/asm/lib-creation/

You can also use the standard libraries in order to get started, as those should be helpful guides.

Edit:Work has begun on a simple I/O file library that use native OS functions. For example; "f_CreateAppVar("AppVar",100);" will create a 100 byte AppVar if possible, and return a pointer to the data. If it fails for some reason, it will return NULL. Other functions are available to find, write, and read to AppVars, and later support will be for any variable type.
So I seem to have run into a bit of a roadblock.

Unfortunately ez80cc seems to crash under wine for me, and PB reports compile errors but won't display them (it's a multifile project)...
elfprince13 wrote:
So I seem to have run into a bit of a roadblock.

Unfortunately ez80cc seems to crash under wine for me, and PB reports compile errors but won't display them (it's a multifile project)...

Need a little more information please Smile What project, errors, links, etc. Thanks!4

Note: Try modifying the makefile to include source in multiple directories if you have a project that has sources files in multiple directories.
The PB version is here (I assume adri has to poke at it?).

As for ez80cc, I doubt there's much you can do, but...

Code:
[thomas@Mithlond] ScanLineRender $ wineconsole ../toolchain/CEdev/bin/ez80cc.exe
err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a060, {485e7de8-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a068,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a080, {485e7de9-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a088,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a0a0, {485e7dea-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a0a8,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a0c0, {485e7deb-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a0c8,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a0e0, {485e7dec-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a0e8,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a100, {485e7ded-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a108,): stub
fixme:win:RegisterDeviceNotificationW (hwnd=0x170f00, filter=0x53f56c,flags=0x00000001) returns a fake device notification handle!
wine: Unhandled page fault on read access to 0x45435c6e at address 0x45435c6e (thread 0031), starting debugger...
[thomas@Mithlond] ScanLineRender $ wine ../toolchain/CEdev/bin/ez80cc.exe
err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a060, {485e7de8-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a068,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a080, {485e7de9-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a088,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a0a0, {485e7dea-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a0a8,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a0c0, {485e7deb-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a0c8,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a0e0, {485e7dec-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a0e8,): stub
fixme:advapi:RegisterTraceGuidsW (0x100778a, 0x100a100, {485e7ded-0a80-11d8-ad15-505054503030}, 1, 0x33fe40, (null), (null), 0x100a108,): stub
fixme:win:RegisterDeviceNotificationW (hwnd=0x170f00, filter=0x53f56c,flags=0x00000001) returns a fake device notification handle!
wine: Unhandled page fault on read access to 0x45435c6e at address 0x45435c6e (thread 0009), starting debugger...
Unhandled exception: page fault on read access to 0x45435c6e in 32-bit code (0x45435c6e).
Register dump:
 CS:001b SS:0023 DS:0023 ES:0023 FS:1007 GS:000f
 EIP:45435c6e ESP:0032f96c EBP:0032fed0 EFLAGS:00010202(  R- --  I   - - - )
 EAX:00000001 EBX:00000000 ECX:ffff0000 EDX:00010000
 ESI:00000001 EDI:00530e70
Stack dump:
0x0032f96c:  5c766564 5c6e6962 30387a65 632e6363
0x0032f97c:  02006e6f 02100210 02100210 02100210
0x0032f98c:  02100210 02100210 02100210 02840284
0x0032f99c:  02840284 02840284 02840284 02840284
0x0032f9ac:  02100210 02100210 02100210 03810210
0x0032f9bc:  03810381 03810381 03010381 03010301
0200: sel=1007 base=7ffc0000 limit=00000fff 32-bit rw-
Backtrace:
=>0 0x45435c6e (0x0032fed0)
  1 0x7b846d7c in kernel32 (+0x36d7b) (0x0032fee8)
  2 0x7b8494fe in kernel32 (+0x394fd) (0x0032ff28)
  3 0x7bc5d35c (0x0032ff38)
  4 0x7bc5f501 (0x0032ffb8)
  5 0x7bc5d322 (0x0032ffd8)
  6 0x7bc3c879 (0x0032ffe8)
0x45435c6e: -- no code accessible --
Modules:
Module   Address         Debug info   Name (3 modules)
PE     400000-  417000   Deferred        ez80cc
PE   7b810000-7b9ad000   Export          kernel32
PE   7bc10000-7bc14000   Deferred        ntdll
Threads:
process  tid      prio (all id:s are in hex)
00000008 (D) D:\Documents\sc2.11_eclipse_workspace\Scanline-Rendering\ScanLineRender\toolchain\CEdev\bin\ez80cc.exe
   00000009    0 <==
0000000e services.exe
   00000027    0
   00000026    0
   0000001e    0
   00000018    0
   00000016    0
   00000014    0
   00000010    0
   0000000f    0
00000012 winedevice.exe
   0000001d    0
   00000019    0
   00000017    0
   00000013    0
0000001a plugplay.exe
   00000021    0
   00000020    0
   0000001b    0
00000022 wdfmgr.exe
   0000002d    0
   0000002c    0
   0000002b    0
   0000002a    0
   00000028    0
   00000023    0
00000024 explorer.exe
   0000002e    0
   00000025    0
For reference, the compiler is spitting crazy internal errors on a trivial macro invocation, then a function call... and who knows what else it could yield on other parts of your code.
Specifically:

Code:
const int32_t testZ = getZForXY(prim, curPixel, line);
and invocations of

Code:
#define INIT_POINT(p, xv, yv, zv) \
(p).x = (xv); \
(p).y = (yv); \
(p).z = (zv)
CE SDK has been updated to 1.1 in order to use an improved makefile from jacobly, in addition to be able to use the exit() function to jump out of your program.
I somehow can't get it working. I follow your steps, by creating a User Variable in the System, etc.
That will look like this:

I've set the PATH variable like that:

With that, I opened Command Prompt, and type "make" which should work, but it gives me always this:


I'm sure it is the right folder.

Can someone help me get it working? Smile

Windows 10 (probably that's enough.. Wink)
You need "" around the PATH variable. Try "C:\Users\Peter\My Documents\ez80\CEdev\bin"; instead. Smile
MateoConLechuga wrote:
You need "" around the PATH variable. Try "C:\Users\Peter\My Documents\ez80\CEdev\bin"; instead. Smile

Many, many thanks for this, and your help over SAX! Smile
I moved the folder to somewhere else, which has no spaces in the directory file, and now it works Very Happy
PT_ wrote:
MateoConLechuga wrote:
You need "" around the PATH variable. Try "C:\Users\Peter\My Documents\ez80\CEdev\bin"; instead. Smile

Many, many thanks for this, and your help over SAX! Smile
I moved the folder to somewhere else, which has no spaces in the directory file, and now it works Very Happy


Cool, sounds good Smile I'll update the readme a little more to be a bit more guideful.

Also, I am done with version 1.0 of the File I/O library. Rather than tell you all about it, here is the header file for your amusement. It operates almost identically to the standard fread, fwrite, etc, just that the type is an unsigned int rather than a FILE*.

EDIT: Here's the library routines so far in case anyone is interested in not doing things the super hard way anymore: (Seriously though, you can make pretty much anything now. It's so easy, it's kind of ridiculous no one has Razz)

All this information will be made into an a webpage on the documentation page with clickable links for each function. I would be much obliged if someone could test some of these functions to make sure they are all working properly. Beta testers, anyone? Smile

File IO library:

Code:
/**
 * Closes all open slots
 * Call before you use any varaible functions
 */
void ti_CloseAll(void);

/**
 * Opens a varaible given then name and flags
 * ti_Open opens an AppVar as default file storage
 * ti_OpenVar opens a Program or Protected Program, depending on the type given
 * If there isn't enough memory to create the variable, or a slot isn't open, NULL is returned
 * Otherwise it returns the available slot number (1-5)
 * Available modes:
 * "r"  - Opens a file for reading. The file must exist. Keeps file in archive if in archive.                                   (Archive)
 * "w"  - Creates an empty file for writing. Overwrites file if already exists.                                                 (RAM)
 * "a"  - Appends to a file. Writing operations, append data at the end of the file. The file is created if it does not exist.  (RAM)
 * "r+" - Opens a file to update both reading and writing. The file must exist. Moves file from archive to RAM if in archive.   (RAM)
 * "w+" - Creates an empty file for both reading and writing. Overwrites file if already exists.                                (RAM)
 * "a+" - Opens a file for reading and appending. Moves file from archive to RAM if in archive. Created if it does not exist.   (RAM)
 * Unlike the standard implementation of fopen, the "b" (binary) mode is not available because characters are only 8 bits wide on this platform.
 * Type:
 *  Specifies the type of variable to open
 */
unsigned int ti_Open(const char *varname, const char *mode);
unsigned int ti_OpenVar(const char *varname, const char *mode, unsigned int type);

/**
 * Frees an open variable slot
 * Returns zero if closing failed
 */
unsigned int ti_Close(const unsigned int slot);

/**
 * Writes to the current variable pointer given:
 * data:
 *  pointer to data to write
 * size:
 *  size (in bytes) of the data we are writting
 * count:
 *  number of data chunks to write to the variable slot
 * slot:
 *  varaible slot to write the data to
 * Returns the number of bytes written
 */
unsigned int ti_Write(const void *data, unsigned int size, unsigned int count, unsigned int slot);

/**
 * Reads from the current variable pointer given:
 * data:
 *  pointer to data to read into
 * size:
 *  size (in bytes) of the data we are reading
 * count:
 *  number of data chunks to read from the variable slot
 * slot:
 *  varaible slot to read from
 * Returns the number of bytes read
 */
unsigned int ti_Read(const void *data, unsigned int size, unsigned int count, unsigned int slot);

/**
 * Puts a character directly into the slot data pointer, and increments the offset
 * Returns 'EOF' if current offset is larger than file size, or memory isn't large enough
 * c is internally converted to an unsigned char
 * c is returned if no error occurs
 * slot:
 *  varaible slot to put the character to
 */
unsigned int ti_PutC(unsigned int c, unsigned int slot);

/**
 * Pulls a character directly from the slot data pointer, and increments the offset
 * Reads 'EOF' if current offset is larger than file size
 * slot:
 *  varaible slot to get the character from
 */
unsigned int ti_GetC(unsigned int slot);

/**
 * Seeks to an offset from the origin:
 * SEEK_SET (2) - Seek from beginning of file
 * SEEK_END (1) - Seek from end of file
 * SEEK_CUR (0) - Seek from current offset in file
 * slot:
 *  varaible slot seeking in
 */
unsigned int ti_Seek(int offset, unsigned int origin, unsigned int slot);

/**
 * Seeks to the start of the given variable
 * Basically an ti_Seek(0, SEEK_SET, slot);
 * slot:
 *  varaible slot seeking in
 */
unsigned short ti_Rewind(unsigned int slot);

/**
 * Returns the value of the current cursor offset
 */
unsigned short ti_Tell(unsigned int slot);

/**
 * Returns the size of the variable in the slot
 */
unsigned short ti_GetSize(unsigned int slot);

/**
 * Resizes the slot to the new size; note that the current file
 * offset is set to the beginning of the file
 */
unsigned int ti_Resize(unsigned int new_size, unsigned int slot);

/**
 * Returns zero if the slot is not in the archive
 */
unsigned int ti_IsArchived(unsigned int slot);

/**
 * Sets the varaible into either the archive or RAM
 * Returns zero if the operation fails if not enough memory or some other error
 * NOTE: This routine also closes the file handle. You must reopen the file
 */
unsigned int ti_SetArchiveStatus(unsigned int archived, unsigned int slot);

/**
 * ti_Delete    - Deletes an AppVar given the name
 * ti_DeleteVar - Deletes a varaible given the name and type
 */
unsigned int ti_Delete(const char *varname);
unsigned int ti_DeleteVar(const char *varname, unsigned int type);


Graphics Library:

Code:
#ifndef H_GRAPHC
#define H_GRAPHC

#pragma asm "include "libheader.asm""
#pragma asm "include "GRAPHC.asm""
#pragma asm "segment code"

/**
 * Quickly set and get pixels.
 * No clipping is performed.
 */
#define currentDrawingBuffer         (*(uint8_t**)(0xE30014))
#define gc_FastPixelPtr(x, y)        ((uint8_t*)(currentDrawingBuffer + x + y*320))
#define gc_FastSetPixel(x, y, c)     (*(gc_FastPixelPtr(x,y)) = c)
#define gc_FastGetPixel(x, y)        (*(gc_FastPixelPtr(x,y)))

/**
 * Initializes the graphics setup.
 * This includes setting the LCD into 8bpp mode and
 * loading the default palette
 */
void gc_InitGraph(void);

/**
 * Closes the graphics setup.
 * Restores the LCD to 16bpp prefered by the OS
 * and clears the screen
 */
void gc_CloseGraph(void);

/**
 * Sets up the default palette where high=low
 */
void gc_SetDefaultPalette(void);

/**
 * Sets up the palette; size is in bytes
 */
void gc_SetPalette(unsigned short *palette, unsigned short size);

/**
 * Fills the screen with the given palette index
 */
void gc_FillScrn(unsigned char color);

/**
 * Sets the XY pixel measured from the top left origin of the screen to the
 * given palette index color. This routine performs clipping.
 */
void gc_SetPixel(int x, int y, unsigned char color);

/**
 * Gets the palette index color of the XY pixel measured from the top
 * left origin of the screen. This routine performs clipping.
 */
unsigned char gc_GetPixel(int x, int y);

/**
 * Gets the 1555 color located at the given palette index.
 */
unsigned short gc_GetColor(unsigned char index);

/**
 * Sets the 1555 color located at the given palette index.
 */
void gc_SetColor(unsigned char index, unsigned short color);

/**
 * Draws a line given the x,y,x,y coordinates measured from the top left origin.
 * No clipping is performed.
 */
void gc_NoClipLine(unsigned short x0, unsigned char y0, unsigned short x1, unsigned char y1, unsigned char color);

/**
 * Draws a filled rectangle measured from the top left origin.
 * No clipping is performed.
 */
void gc_NoClipRectangle(unsigned short x, unsigned char y, unsigned short width, unsigned char height, unsigned char color);

/**
 * Draws a rectangle outline measured from the top left origin.
 * No clipping is performed.
 */
void gc_NoClipRectangleOutline(unsigned short x, unsigned char y, unsigned short width, unsigned char height, unsigned char color);

/**
 * Draws a fast horizontal line measured from the top left origin.
 * No clipping is performed.
 */
void gc_NoClipHorizLine(unsigned short x, unsigned char y, unsigned short length, unsigned char color);

/**
 * Draws a fast vertical line measured from the top left origin.
 * No clipping is performed.
 */
void gc_NoClipVertLine(unsigned short x, unsigned char y, unsigned char length, unsigned char color);

/**
 * Draws a filled circle measured from the top left origin.
 * No clipping is performed.
 * This routine disasbles interrupts
 */
void gc_NoClipCircle(unsigned short x, unsigned char y, unsigned short radius, unsigned char color);

/**
 * Draws circle outline measured from the top left origin.
 * Clipping is performed.
 * This routine disasbles interrupts
 */
void gc_ClipCircleOutline(unsigned short x, unsigned char y, unsigned short radius, unsigned char color);

/**
 * Forces all graphics routines to write to the offscreen buffer
 */
void gc_DrawBuffer(void);

/**
 * Forces all graphics routines to write to the visible screen
 */
void gc_DrawScreen(void);

/**
 * Swaps the buffer with the visible screen and vice versa.
 * The current drawing location remains the same.
 */
void gc_SwapDraw(void);

/**
 * Returns 0 if graphics routines are currently drawing to visible screen
 * The current drawing location remains the same.
 */
unsigned char gc_DrawState(void);

/**
 * Outputs a character at the current cursor position
 * No text clipping is performed.
 */
void gc_PrintChar(char c);

/**
 * Outputs a signed integer at the current cursor position.
 * No text clipping is performed.
 * Values range from: (-8388608-8388607)
 */
void gc_PrintInt(int n);

/**
 * Outputs an unsigned integer at the current cursor position.
 * No text clipping is performed.
 * Values range from: (0-16777215)
 */
void gc_PrintUnsignedInt(unsigned int n);

/**
 * Outputs a string at the current cursor position
 * No text clipping is performed.
 */
void gc_PrintString(char *string);

/**
 * Outputs a string at the given XY coordinates measured from the top left origin.
 * The current cursor position is updated.
 * No text clipping is performed.
 */
void gc_PrintStringXY(char *string, unsigned short x, unsigned char y);

/**
 * Returns the current text cursor X position
 */
unsigned short gc_TextX(void);

/**
 * Returns the current text cursor Y position
 */
unsigned char gc_TextY(void);

/**
 * Sets the text cursor XY position
 */
void gc_SetTextXY(unsigned short x, unsigned char y);

/**
 * Sets the current text color.
 * Low 8 bits represent the foreground color.
 * High 8 bits represent the background color.
 */
void gc_SetTextColor(unsigned short color);

/**
 * Sets the transparent color used in text and sprite functions
 * Default index transparency color is 0xFF
 * Returns the previous transparent color
 */
unsigned char gc_SetTransparentColor(unsigned char color);

/**
 * Draws a given sprite to the screen as fast as possible; no transparency, clipping, or anything of the sort.
 * Basically just a direct rectangular data dump onto vram.
 * Note: This routine disables interrupts.
 */
void gc_NoClipDrawSprite(unsigned char *sprite, unsigned short x, unsigned char y, unsigned char width, unsigned char height);

/**
 * Draws a given sprite to the screen using transparency set with gc_SetTransparentColor()
 * Not as fast as gc_NoClipDrawSprite(), but still performs pretty well.
 * Note: This routine disables interrupts.
 */
void gc_NoClipDrawTransparentSprite(unsigned char *sprite, unsigned short x, unsigned char y, unsigned char width, unsigned char height);

/**
 * Quickly grab the background behind a sprite (useful for transparency)
 * spriteBuffer must be pointing to a large enough buffer to hold width*height number of bytes
 * spriteBuffer is updated with the screen coordinates given.
 * A pointer to spriteBuffer is also returned for ease of use.
 * Note: This routine disables interrupts.
 */
unsigned char *gc_NoClipGetSprite(unsigned char *spriteBuffer, unsigned short x, unsigned char y, unsigned char width, unsigned char height);

/**
 * Set the font routines to use the provided font, formated 8x8
 */
void gc_SetCustomFontData(unsigned char *fontdata);

/**
 * Set the font routines to use the provided font spacing
 */
void gc_SetCustomFontSpacing(unsigned char *fontspacing);

/**
 * Call gc_SetFontMonospace(0) to set the font routine to not use monospace font
 */
void gc_SetFontMonospace(unsigned char monospace);

#endif


Keypad library:


Code:
#ifndef H_KEYPADC
#define H_KEYPADC

#pragma asm "include "libheader.asm""
#pragma asm "include "KEYPADC.asm""
#pragma asm "segment code"

/**
 * Scans the given keyboard row and returns the row value
 * Note: Diasbles interrupts
 */
unsigned char kb_ScanGroup(unsigned char row);

/**
 * Scans the keyboard quickly to tell if any key was pressed
 * Note: Diasbles interrupts
 */
unsigned char kb_AnyKey(void);

/**
 * Scans the keyboard to update data values
 * Note: Diasbles interrupts
 */
void kb_Scan(void);

/**
 * Resets the keyboard
 * Only use if you modify keyboard timmings or numer of rows
 */
void kb_Reset(void);
Another question: how can I display a string in Ans on the screen? I think it should be something with _RclAns, and _CreateTempString, but I've no idea. Or in pseudo-code:

Code:
gc_PrintStringXY(Ans, 10, 10)
  
Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.

» Go to Registration page
» Goto page 1, 2, 3 ... 15, 16, 17  Next
» View previous topic :: View next topic  
Page 1 of 17
» All times are UTC - 5 Hours
 
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

 

Advertisement