diff --git a/README.md b/README.md index 65e6796..da2df92 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ # libMicrofx -Make very small add-ins. \ No newline at end of file +Make very small add-ins. + +With this library you can easly make very small add-ins, but they are not as fast as add-ins made using gint, so you should use gint to write more complex add-ins. This library only provides support of the fx98xx series of CASIO monochrome calculators that support add-ins. + +## Getting started + +An example add-in is in template. Start your project with this folder. Requires sh-elf-* of the fxsdk. + +The library is in microfx_src. If the library was updated, update you project by replacing lib with a new version compiled by typing `make` in microfx_src. + +You can read the header files in lib/include/microfx to see the available functions. \ No newline at end of file diff --git a/microfx_src/Makefile b/microfx_src/Makefile new file mode 100644 index 0000000..94387ab --- /dev/null +++ b/microfx_src/Makefile @@ -0,0 +1,27 @@ +CC = sh-elf-gcc +AR = sh-elf-ar + +OUT = libMicrofx.a +OUT_DIR = lib + +SRC = src/start.c src/syscall.S src/microfx.c +OBJ = $(SRC:src/%=build/%.o) + +BUILD = build + +all: $(OBJ) | $(OUT_DIR)/ + $(AR) rsv $(OUT_DIR)/$(OUT) $(OBJ) + cp --recursive include $(OUT_DIR)/ + cp src/fx98xx.ld $(OUT_DIR)/ + +$(BUILD)/%.o: src/% | $(BUILD)/ + $(CC) -c $< -o $@ -Os + +.PRECIOUS: %/ + +%/: + @ mkdir -p $@ + +clean: $(BUILD)/ | $(OUT_DIR)/ + rm $(OUT_DIR) --recursive + rm $(BUILD) --recursive diff --git a/microfx_src/include/microfx/config.h.in b/microfx_src/include/microfx/config.h.in new file mode 100644 index 0000000..a660533 --- /dev/null +++ b/microfx_src/include/microfx/config.h.in @@ -0,0 +1,6 @@ +#ifndef MICROFX_CONFIG_H +#define MICROFX_CONFIG_H + +#define EX_VERSION "@libMicrofx_VERSION@" + +#endif diff --git a/microfx_src/include/microfx/keycodes.h b/microfx_src/include/microfx/keycodes.h new file mode 100644 index 0000000..b7182cd --- /dev/null +++ b/microfx_src/include/microfx/keycodes.h @@ -0,0 +1,6 @@ +#ifndef KEYCODES_H +#define KEYCODES_H + +#define KCEXIT 47 + +#endif diff --git a/microfx_src/include/microfx/microfx.h b/microfx_src/include/microfx/microfx.h new file mode 100644 index 0000000..87b0a4e --- /dev/null +++ b/microfx_src/include/microfx/microfx.h @@ -0,0 +1,105 @@ +#ifndef MICROFX_H +#define MICROFX_H + +#include "keycodes.h" + +/******* DISPLAY *******/ + +enum {SWHITE = 0, SBLACK}; + +/* void sclear(void); + +Clears the VRAM in white. +*/ + +void sclear(void); + +/* void supdate(void); + +Put the VRAM on the screen. +*/ + +void supdate(void); + +/* void srect(int x1, int y1, int x2, int y2); + +Draws a white rectangle with a black border of one pixel from (x1, y1) to (x2, y2) +in the VRAM. +*/ + +void srect(int x1, int y1, int x2, int y2); + +/* void spixel(int x, int y, int color); + +Set the pixel at (x, y) in the color color in the VRAM. +The available colors are SWHITE or SBLACK. +*/ + +void spixel(int x, int y, int color); + +/* void stext(int x, int y, char *text); + +Puts the text text at (x, y) on the screen using casio default font. +*/ + +void stext(int x, int y, char *text); + +/* void slocate(int x, int y, char *text); + +Works like the Locate function of CASIO Basic. +*/ + +void slocate(int x, int y, char *text); + +/******* KEYBOARD *******/ + +enum {KFAST = 0, KLONG}; + +/* int kisdown(void); + +Returns a positive int if a key is down. +Returns 0 if there is no key down. +*/ +int kisdown(void); + +/* int kcheck(int key, int type); + +/!\ Not working /!\ + +Checks if the key key is down. + +int key if 0x(1 byte for the column)(1 byte for the row). +Based on the syscalls 0x24B/0x24C. + +Type is KFAST or KLONG. +KFAST : Syscall 0x24B is used. +KLONG : Syscall 0x24C is used. +*/ +int kcheck(int key, int type); + +/* int kgetkey(void); + +Works like the Getkey function of CASIO Basic. +Returns the pressed key. +*/ +int kgetkey(void); + +/******* TOOLS *******/ + +/* void itoa(int n, char *buffer); + +Put a string of the int n in buffer. +*/ + +void itoa(int n, char *buffer); + +/******* TIME *******/ + +/* void tsleep_ms(int ms); + +Wait ms miliseconds. +*/ +void tsleep_ms(int ms); + +#endif + diff --git a/microfx_src/src/fx98xx.ld b/microfx_src/src/fx98xx.ld new file mode 100644 index 0000000..8a5279b --- /dev/null +++ b/microfx_src/src/fx98xx.ld @@ -0,0 +1,33 @@ +ENTRY(_start) + +MEMORY +{ + rom (rx) : ORIGIN = 0x00300200, LENGTH = 512K + ram (rw) : ORIGIN = 0x08100200, LENGTH = 20K +} + +SECTIONS +{ + .text : { + *(.pretext) + *(.text) + } > rom + .rodata : { + *(.rodata) + *(.rodata.str1.4) + _romdata_start = . ; + } > rom + .bss : { + _start_bss = . ; + _bssdatasize = . ; + LONG(0); + *(.bss) + *(COMMON) + _end_bss = . ; + } > ram + .data : AT(_romdata_start) { + _start_data = . ; + *(.data) + _end_data = . ; + } > ram +} diff --git a/microfx_src/src/microfx.c b/microfx_src/src/microfx.c new file mode 100644 index 0000000..4297c3e --- /dev/null +++ b/microfx_src/src/microfx.c @@ -0,0 +1,89 @@ +#include "../include/microfx/microfx.h" + +/******* DISPLAY *******/ + +/* Syscalls */ + +void _Bdisp_PutDisp_DD(void); +void _Bdisp_DrawRectangle(int x1, int y1, int x2, int y2); +void _Bdisp_AllClr_VRAM(void); +void _Bdisp_SetPoint_VRAM(int x, int y, int color); +void _PrintXY(int x, int y, unsigned char *text, int type); +void _locate(int x, int y); +void _Print(unsigned char *text); + +/* Microfx */ + +void sclear() { + _Bdisp_AllClr_VRAM(); +} + +void supdate() { + _Bdisp_PutDisp_DD(); +} + +void spixel(int x, int y, int color) { + _Bdisp_SetPoint_VRAM(x, y, color); +} + +void srect(int x1, int y1, int x2, int y2) { + _Bdisp_DrawRectangle(x1, y1, x2, y2); +} + +void stext(int x, int y, char *text) { + _PrintXY(x, y, (unsigned char*)text, 0); +} + +void slocate(int x, int y, char *text) { + _locate(x, y); + _Print((unsigned char*)text); +} + +/******* KEYBOARD *******/ + +/* Syscalls */ + +short _Keyboard_GetPressedTime(void); +int _Keyboard_IsKeyPressed_fast(short *matrixcode); +int _Keyboard_IsKeyPressed(short *matrixcode); +int _Keyboard_KeyDown(void); +int _Keyboard_PRGM_GetKey(unsigned char* buffer); + +/* Microfx */ + +int kisdown(void) { + return _Keyboard_KeyDown(); +} + +int kcheck(int key, int type) { + short skey = (short)key; + switch(type){ + case KFAST: + return _Keyboard_IsKeyPressed_fast(&skey); + break; + default: + return _Keyboard_IsKeyPressed(&skey); + break; + } +} + +int kgetkey(void){ + unsigned char buffer[12]; + _Keyboard_PRGM_GetKey(buffer); + return (buffer[1] & 0x0F) * 10 + ((buffer[2] & 0xF0 ) >> 4); +} + +/******* Time *******/ + +/* Syscalls */ + +void _Sleep(int delay_ms); +int _RTC_GetTicks(void); +int _RTC_Elapsed_ms(int start_value, int duration_in_ms); + +/* Microfx */ + +void tsleep_ms(int ms) { + _Sleep(ms); +} + diff --git a/microfx_src/src/start.c b/microfx_src/src/start.c new file mode 100644 index 0000000..665955d --- /dev/null +++ b/microfx_src/src/start.c @@ -0,0 +1,21 @@ +extern char start_bss, end_bss; +extern char start_data, end_data; +extern char romdata_start; +extern int main(void); + +__attribute__((section(".pretext"))) + +int start(int isappli, int optnum) { + int i; + char *bss_startptr = &start_bss; + for(i=0;i<&end_bss - &start_bss;i++){ + bss_startptr[i] = 0; + } + char *data_startptr = &start_data; + char *romdataptr = &romdata_start; + for(i=0;i<&end_data - &start_data;i++){ + data_startptr[i] = romdataptr[i]; + } + return main(); +} + diff --git a/microfx_src/src/syscall.S b/microfx_src/src/syscall.S new file mode 100644 index 0000000..703c5a0 --- /dev/null +++ b/microfx_src/src/syscall.S @@ -0,0 +1,76 @@ +.text + +.global __Bdisp_PutDisp_DD +.global __Bdisp_DrawRectangle +.global __Bdisp_AllClr_VRAM +.global __Bdisp_SetPoint_VRAM +.global __Bdisp_GetPoint_VRAM +.global __PrintXY +.global __locate +.global __Print +/* Keyboard */ +.global __Keyboard_GetPressedTime +.global __Keyboard_IsKeyPressed +.global __Keyboard_IsKeyPressed_fast +.global __Keyboard_KeyDown +.global __Keyboard_PRGM_GetKey +/* Time */ +.global __Sleep +.global __RTC_GetTicks +.global __RTC_Elapsed_ms +/* Files */ +/* Tools */ +.global _itoa + +#define syscall(syscall_number) \ + mov.l 1f, r0 ;\ + mov.l do_syscall, r2 ;\ + jmp @r2 ;\ + nop ;\ +.align 4 ;\ +1: .long syscall_number + +/* Display */ +__Bdisp_PutDisp_DD: + syscall(0x028) +__Bdisp_DrawRectangle: + syscall(0x0763) +__Bdisp_AllClr_VRAM: + syscall(0x143) +__Bdisp_SetPoint_VRAM: + syscall(0x146) +__Bdisp_GetPoint_VRAM: + syscall(0x149) +__PrintXY: + syscall(0x150) +__locate: + syscall(0x807) +__Print: + syscall(0x808) +/* Keyboard */ +__Keyboard_GetPressedTime: + syscall(0x249) +__Keyboard_IsKeyPressed: + syscall(0x24C) +__Keyboard_IsKeyPressed_fast: + syscall(0x24B) +__Keyboard_KeyDown: + syscall(0x24D) +__Keyboard_PRGM_GetKey: + syscall(0x6C4) +/* Time */ +__Sleep: + syscall(0x0420) +__RTC_GetTicks: + syscall(0x03B) +__RTC_Elapsed_ms: + syscall(0x03C) +/* Files */ +/* Nothing here ... */ +/* Tools */ +_itoa: + syscall(0x541) +/* Menu */ +/* Nothing here ... */ + +do_syscall: .long 0x80010070 diff --git a/template/Makefile b/template/Makefile new file mode 100644 index 0000000..a6698b8 --- /dev/null +++ b/template/Makefile @@ -0,0 +1,40 @@ +NAME = Template + +ELF = $(NAME).elf +BIN = $(NAME).bin + +CC = sh-elf-gcc + +SRC = src/main.c +OBJ = $(SRC:src/%=build/%.o) + +ICON = icon.png + +LIB = lib + +BUILD = build + +VERSION = v.1.0 + +all: $(BIN) + fxgxa --g1a -n $(NAME) -i $(ICON) --version="$(VERSION)" -o $(NAME).g1a build/$(BIN) + sh-elf-objdump -h $(BUILD)/$(ELF) + +$(BIN): $(ELF) + sh-elf-objcopy -O binary build/$(ELF) build/$(BIN) -R .bss + +$(ELF): $(OBJ) | $(LIB)/ + $(CC) $< lib/libMicrofx.a -o $(BUILD)/$@ -nostdlib -T lib/fx98xx.ld -ffreestanding -mb -m3 -Os -Wa,--dsp + +$(BUILD)/%.o: src/% | $(BUILD)/ + $(CC) -c $< -o $@ -Os -Ilib/include/ + +.PRECIOUS: %/ + +%/: + @ mkdir -p $@ + +clean: $(BUILD) + rm $(BUILD) --recursive + rm $(NAME).g1a + diff --git a/template/icon.png b/template/icon.png new file mode 100644 index 0000000..d15353b Binary files /dev/null and b/template/icon.png differ diff --git a/template/lib/fx98xx.ld b/template/lib/fx98xx.ld new file mode 100644 index 0000000..8a5279b --- /dev/null +++ b/template/lib/fx98xx.ld @@ -0,0 +1,33 @@ +ENTRY(_start) + +MEMORY +{ + rom (rx) : ORIGIN = 0x00300200, LENGTH = 512K + ram (rw) : ORIGIN = 0x08100200, LENGTH = 20K +} + +SECTIONS +{ + .text : { + *(.pretext) + *(.text) + } > rom + .rodata : { + *(.rodata) + *(.rodata.str1.4) + _romdata_start = . ; + } > rom + .bss : { + _start_bss = . ; + _bssdatasize = . ; + LONG(0); + *(.bss) + *(COMMON) + _end_bss = . ; + } > ram + .data : AT(_romdata_start) { + _start_data = . ; + *(.data) + _end_data = . ; + } > ram +} diff --git a/template/lib/include/microfx/config.h.in b/template/lib/include/microfx/config.h.in new file mode 100644 index 0000000..a660533 --- /dev/null +++ b/template/lib/include/microfx/config.h.in @@ -0,0 +1,6 @@ +#ifndef MICROFX_CONFIG_H +#define MICROFX_CONFIG_H + +#define EX_VERSION "@libMicrofx_VERSION@" + +#endif diff --git a/template/lib/include/microfx/keycodes.h b/template/lib/include/microfx/keycodes.h new file mode 100644 index 0000000..b7182cd --- /dev/null +++ b/template/lib/include/microfx/keycodes.h @@ -0,0 +1,6 @@ +#ifndef KEYCODES_H +#define KEYCODES_H + +#define KCEXIT 47 + +#endif diff --git a/template/lib/include/microfx/microfx.h b/template/lib/include/microfx/microfx.h new file mode 100644 index 0000000..7186084 --- /dev/null +++ b/template/lib/include/microfx/microfx.h @@ -0,0 +1,68 @@ +#ifndef MICROFX_H +#define MICROFX_H + +#include "keycodes.h" + +/******* DISPLAY *******/ + +enum {SWHITE = 0, SBLACK}; + +/* void sclear(void); + +Clears the screen in white. +*/ + +void sclear(void); + +/* + +*/ + +void supdate(void); + +/* + +*/ + +void srect(int x1, int y1, int x2, int y2); + +/* + +*/ + +void spixel(int x, int y, int color); + +/* + +*/ + +void stext(int x, int y, char *text); + +/* + +*/ + +void slocate(int x, int y, char *text); + +/******* KEYBOARD *******/ + +enum {KFAST = 0, KLONG}; + +int kisdown(void); +int kcheck(int key, int type); +int kgetkey(void); + +/******* TOOLS *******/ + +/* + +*/ + +void itoa(int n, char *buffer); + +/******* TIME *******/ + +void tsleep_ms(int ms); + +#endif + diff --git a/template/lib/libMicrofx.a b/template/lib/libMicrofx.a new file mode 100644 index 0000000..18dfd8b Binary files /dev/null and b/template/lib/libMicrofx.a differ diff --git a/template/src/main.c b/template/src/main.c new file mode 100644 index 0000000..5c1912b --- /dev/null +++ b/template/src/main.c @@ -0,0 +1,6 @@ +#include + +int main(void) { + stext(1, 1, "A Microfx Add-in !"); + return 1; +}