diff options
Diffstat (limited to 'frontends/calculator/CEdev/include')
34 files changed, 7680 insertions, 7680 deletions
diff --git a/frontends/calculator/CEdev/include/.linker_script b/frontends/calculator/CEdev/include/.linker_script index e3a1887..eb5ea8b 100644 --- a/frontends/calculator/CEdev/include/.linker_script +++ b/frontends/calculator/CEdev/include/.linker_script @@ -1,305 +1,305 @@ -symbol __low_bss = bss.base -symbol __len_bss = bss.length -symbol __heaptop = bss.high -symbol __heapbot = bss.top -order header, icon, launcher, libs, startup, cleanup, exit, code, data, strsect, text -if STATIC - srcs "../../lib/static/atof.src" - srcs "../../lib/static/ceil.src" - srcs "../../lib/static/fabs.src" - srcs "../../lib/static/acos.src" - srcs "../../lib/static/cos.src" - srcs "../../lib/static/exp.src" - srcs "../../lib/static/log.src" - srcs "../../lib/static/ufltinfo.src" - srcs "../../lib/static/pow.src" - srcs "../../lib/static/strtod.src" - srcs "../../lib/static/asin.src" - srcs "../../lib/static/sinh.src" - srcs "../../lib/static/log10.src" - srcs "../../lib/static/sin.src" - srcs "../../lib/static/atan.src" - srcs "../../lib/static/atan2.src" - srcs "../../lib/static/fmod.src" - srcs "../../lib/static/tanh.src" - srcs "../../lib/static/tan.src" - srcs "../../lib/static/frexp.src" - srcs "../../lib/static/sqrt.src" - srcs "../../lib/static/floor.src" - srcs "../../lib/static/ldexp.src" - srcs "../../lib/static/modf.src" - srcs "../../lib/static/ufltrnd.src" -else - srcs "../../lib/linked/frexp.src" - srcs "../../lib/linked/atan2.src" - srcs "../../lib/linked/atof.src" - srcs "../../lib/linked/acos.src" - srcs "../../lib/linked/sqrt.src" - srcs "../../lib/linked/atan.src" - srcs "../../lib/linked/sinh.src" - srcs "../../lib/linked/tan.src" - srcs "../../lib/linked/floor.src" - srcs "../../lib/linked/ldexp.src" - srcs "../../lib/linked/ufltrnd.src" - srcs "../../lib/linked/fabs.src" - srcs "../../lib/linked/log10.src" - srcs "../../lib/linked/strtod.src" - srcs "../../lib/linked/fmod.src" - srcs "../../lib/linked/asin.src" - srcs "../../lib/linked/exp.src" - srcs "../../lib/linked/ufltinfo.src" - srcs "../../lib/linked/cosh.src" - srcs "../../lib/linked/modf.src" - srcs "../../lib/linked/log.src" - srcs "../../lib/linked/tanh.src" - srcs "../../lib/linked/ceil.src" - srcs "../../lib/linked/cos.src" - srcs "../../lib/linked/pow.src" - srcs "../../lib/linked/sin.src" -end if -srcs "../../lib/shared/os_textbuffer.src" -srcs "../../lib/shared/debugger.src" -srcs "../../lib/shared/zx7_Decompress.src" -srcs "../../lib/shared/random.src" -srcs "../../lib/shared/atomic_load_decreasing_32.src" -srcs "../../lib/shared/removeallbreakpoints.src" -srcs "../../lib/shared/removebreakpoint.src" -srcs "../../lib/shared/srandom.src" -srcs "../../lib/shared/tice.src" -srcs "../../lib/shared/removewatchpoint.src" -srcs "../../lib/shared/atomic_load_increasing_32.src" -srcs "../../lib/shared/setwatchpoint.src" -srcs "../../lib/shared/interrupts.src" -srcs "../../lib/shared/removeallwatchpoints.src" -srcs "../../lib/shared/getstringinput.src" -srcs "../../lib/shared/dzx7_turbo.src" -srcs "../../lib/shared/atomic_load_32.src" -srcs "../../lib/shared/setwritewatchpoint.src" -srcs "../../lib/shared/setreadwatchpoint.src" -srcs "../../lib/shared/os.src" -srcs "../../lib/shared/usb.src" -srcs "../../lib/shared/setreadwritewatchpoint.src" -srcs "../../lib/shared/abort.src" -srcs "../../lib/shared/setbreakpoint.src" -srcs "../../lib/shared/dzx7_standard.src" -srcs "../../lib/shared/delay.src" -srcs "../../lib/shared/frftoub.src" -srcs "../../lib/shared/fpupop1.src" -srcs "../../lib/shared/frimulu.src" -srcs "../../lib/shared/ladd.src" -srcs "../../lib/shared/atoi.src" -srcs "../../lib/shared/idivs.src" -srcs "../../lib/shared/isnan.src" -srcs "../../lib/shared/case24d.src" -srcs "../../lib/shared/isupper.src" -srcs "../../lib/shared/memmove.src" -srcs "../../lib/shared/frameset0.src" -srcs "../../lib/shared/sneg.src" -srcs "../../lib/shared/setjmp.src" -srcs "../../lib/shared/strcspn.src" -srcs "../../lib/shared/fpdiv.src" -srcs "../../lib/shared/istiy.src" -srcs "../../lib/shared/frstof.src" -srcs "../../lib/shared/abs.src" -srcs "../../lib/shared/frsmulu.src" -srcs "../../lib/shared/strdup.src" -srcs "../../lib/shared/sprintf.src" -srcs "../../lib/shared/sldix.src" -srcs "../../lib/shared/finite.src" -srcs "../../lib/shared/lnot.src" -srcs "../../lib/shared/imulu.src" -srcs "../../lib/shared/setflag.src" -srcs "../../lib/shared/iscntrl.src" -srcs "../../lib/shared/fpupop2.src" -srcs "../../lib/shared/ishrs.src" -srcs "../../lib/shared/fpsub.src" -srcs "../../lib/shared/fpmul.src" -srcs "../../lib/shared/case24.src" -srcs "../../lib/shared/isinf.src" -srcs "../../lib/shared/bldix.src" -srcs "../../lib/shared/ldiv.src" -srcs "../../lib/shared/strcmp.src" -srcs "../../lib/shared/strcasecmp.src" -srcs "../../lib/shared/sand.src" -srcs "../../lib/shared/strrchr.src" -srcs "../../lib/shared/sshrs.src" -srcs "../../lib/shared/tolower.src" -srcs "../../lib/shared/isgraph.src" -srcs "../../lib/shared/case8d.src" -srcs "../../lib/shared/snot.src" -srcs "../../lib/shared/round.src" -srcs "../../lib/shared/seqcased.src" -srcs "../../lib/shared/frbtof.src" -srcs "../../lib/shared/fruitof.src" -srcs "../../lib/shared/fritof.src" -srcs "../../lib/shared/log2.src" -srcs "../../lib/shared/fpultof.src" -srcs "../../lib/shared/bshrs.src" -srcs "../../lib/shared/seqcase.src" -srcs "../../lib/shared/bremu.src" -srcs "../../lib/shared/lmulu.src" -srcs "../../lib/shared/strncmp.src" -srcs "../../lib/shared/frbmuls.src" -srcs "../../lib/shared/scmpzero.src" -srcs "../../lib/shared/isxdigit.src" -srcs "../../lib/shared/bdivs.src" -srcs "../../lib/shared/strndup.src" -srcs "../../lib/shared/memset.src" -srcs "../../lib/shared/strncpy.src" -srcs "../../lib/shared/itol.src" -srcs "../../lib/shared/strstr.src" -srcs "../../lib/shared/sdivs.src" -srcs "../../lib/shared/lcmpu.src" -srcs "../../lib/shared/case8.src" -srcs "../../lib/shared/indcall.src" -srcs "../../lib/shared/sqrtf.src" -srcs "../../lib/shared/sstix.src" -srcs "../../lib/shared/fpftol.src" -srcs "../../lib/shared/rand.src" -srcs "../../lib/shared/lstix.src" -srcs "../../lib/shared/lrems.src" -srcs "../../lib/shared/ildiy.src" -srcs "../../lib/shared/lmuls.src" -srcs "../../lib/shared/fppack.src" -srcs "../../lib/shared/lor.src" -srcs "../../lib/shared/icmpzero.src" -srcs "../../lib/shared/strpbrk.src" -srcs "../../lib/shared/sstiy.src" -srcs "../../lib/shared/land.src" -srcs "../../lib/shared/ldivu.src" -srcs "../../lib/shared/frsmuls.src" -srcs "../../lib/shared/strtok.src" -srcs "../../lib/shared/iand.src" -srcs "../../lib/shared/ldivs.src" -srcs "../../lib/shared/ineg.src" -srcs "../../lib/shared/stoi.src" -srcs "../../lib/shared/sremu.src" -srcs "../../lib/shared/sldiy.src" -srcs "../../lib/shared/bstiy.src" -srcs "../../lib/shared/memchr.src" -srcs "../../lib/shared/ior.src" -srcs "../../lib/shared/fpneg.src" -srcs "../../lib/shared/isascii.src" -srcs "../../lib/shared/lldix.src" -srcs "../../lib/shared/smuls.src" -srcs "../../lib/shared/smulu.src" -srcs "../../lib/shared/isspace.src" -srcs "../../lib/shared/frftous.src" -srcs "../../lib/shared/sshl.src" -srcs "../../lib/shared/sdivu.src" -srcs "../../lib/shared/fpadd.src" -srcs "../../lib/shared/lsub.src" -srcs "../../lib/shared/bldiy.src" -srcs "../../lib/shared/ixor.src" -srcs "../../lib/shared/lstiy.src" -srcs "../../lib/shared/srand.src" -srcs "../../lib/shared/uldiv.src" -srcs "../../lib/shared/frftos.src" -srcs "../../lib/shared/frubtof.src" -srcs "../../lib/shared/ishru.src" -srcs "../../lib/shared/sshru.src" -srcs "../../lib/shared/atos.src" -srcs "../../lib/shared/iremu.src" -srcs "../../lib/shared/lshrs.src" -srcs "../../lib/shared/strspn.src" -srcs "../../lib/shared/strnlen.src" -srcs "../../lib/shared/bmuls.src" -srcs "../../lib/shared/sor.src" -srcs "../../lib/shared/imuls.src" -srcs "../../lib/shared/fpltof.src" -srcs "../../lib/shared/sxor.src" -srcs "../../lib/shared/istix.src" -srcs "../../lib/shared/bdivu.src" -srcs "../../lib/shared/bshl.src" -srcs "../../lib/shared/memcmp.src" -srcs "../../lib/shared/srems.src" -srcs "../../lib/shared/strchr.src" -srcs "../../lib/shared/ildix.src" -srcs "../../lib/shared/frustof.src" -srcs "../../lib/shared/lneg.src" -srcs "../../lib/shared/atol.src" -srcs "../../lib/shared/longjmp.src" -srcs "../../lib/shared/labs.src" -srcs "../../lib/shared/memcpy.src" -srcs "../../lib/shared/isalpha.src" -srcs "../../lib/shared/bshru.src" -srcs "../../lib/shared/isprint.src" -srcs "../../lib/shared/strcat.src" -srcs "../../lib/shared/div.src" -srcs "../../lib/shared/isalnum.src" -srcs "../../lib/shared/lshl.src" -srcs "../../lib/shared/case16d.src" -srcs "../../lib/shared/ispunct.src" -srcs "../../lib/shared/toupper.src" -srcs "../../lib/shared/frftoui.src" -srcs "../../lib/shared/idivu.src" -srcs "../../lib/shared/isdigit.src" -srcs "../../lib/shared/sbrk.src" -srcs "../../lib/shared/fpcmp.src" -srcs "../../lib/shared/lcmpzero.src" -srcs "../../lib/shared/stoiu.src" -srcs "../../lib/shared/inot.src" -srcs "../../lib/shared/frimuls.src" -srcs "../../lib/shared/lcmps.src" -srcs "../../lib/shared/irems.src" -srcs "../../lib/shared/lldiy.src" -srcs "../../lib/shared/ishl.src" -srcs "../../lib/shared/strncat.src" -srcs "../../lib/shared/bstix.src" -srcs "../../lib/shared/lxor.src" -srcs "../../lib/shared/lshru.src" -srcs "../../lib/shared/bmulu.src" -srcs "../../lib/shared/calloc.src" -srcs "../../lib/shared/frftoi.src" -srcs "../../lib/shared/islower.src" -srcs "../../lib/shared/case16.src" -srcs "../../lib/shared/frameset.src" -srcs "../../lib/shared/strcpy.src" -srcs "../../lib/shared/frftob.src" -srcs "../../lib/shared/strncasecmp.src" -srcs "../../lib/shared/brems.src" -srcs "../../lib/shared/lremu.src" -srcs "../../lib/shared/case.src" -srcs "../../lib/shared/strlen.src" -srcs "../../lib/shared/gamma.src" -srcs "../../lib/shared/uuitoa.src" -srcs "../../lib/shared/udtog.src" -srcs "../../lib/shared/uscan.src" -srcs "../../lib/shared/strtoul.src" -srcs "../../lib/shared/print_sputch.src" -srcs "../../lib/shared/print_putch.src" -srcs "../../lib/shared/strtol.src" -srcs "../../lib/shared/bsearch.src" -srcs "../../lib/shared/vsprintf.src" -srcs "../../lib/shared/print_putstring.src" -srcs "../../lib/shared/ustoa.src" -srcs "../../lib/shared/maptab.src" -srcs "../../lib/shared/ultoa.src" -srcs "../../lib/shared/usscan.src" -srcs "../../lib/shared/udtof.src" -srcs "../../lib/shared/realloc.src" -srcs "../../lib/shared/free.src" -srcs "../../lib/shared/udtoe.src" -srcs "../../lib/shared/uitoa.src" -srcs "../../lib/shared/qsort.src" -srcs "../../lib/shared/fpdata.src" -srcs "../../lib/shared/uustoa.src" -srcs "../../lib/shared/upscan.src" -srcs "../../lib/shared/malloc.src" -srcs "../../lib/shared/uprint.src" -srcs "../../lib/shared/ureverse.src" -srcs "../../lib/shared/uultoa.src" -srcs "../../lib/shared/print_globals.src" -srcs "../../lib/fileio/files.src" -srcs "../../lib/fileio/fclose.src" -srcs "../../lib/fileio/feof.src" -srcs "../../lib/fileio/fopen.src" -srcs "../../lib/fileio/fwrite.src" -srcs "../../lib/fileio/ftell.src" -srcs "../../lib/fileio/fputs.src" -srcs "../../lib/fileio/fgets.src" -srcs "../../lib/fileio/remove.src" -srcs "../../lib/fileio/fputc.src" -srcs "../../lib/fileio/fgetc.src" -srcs "../../lib/fileio/fread.src" -srcs "../../lib/fileio/fseek.src" +symbol __low_bss = bss.base
+symbol __len_bss = bss.length
+symbol __heaptop = bss.high
+symbol __heapbot = bss.top
+order header, icon, launcher, libs, startup, cleanup, exit, code, data, strsect, text
+if STATIC
+ srcs "../../lib/static/atof.src"
+ srcs "../../lib/static/ceil.src"
+ srcs "../../lib/static/fabs.src"
+ srcs "../../lib/static/acos.src"
+ srcs "../../lib/static/cos.src"
+ srcs "../../lib/static/exp.src"
+ srcs "../../lib/static/log.src"
+ srcs "../../lib/static/ufltinfo.src"
+ srcs "../../lib/static/pow.src"
+ srcs "../../lib/static/strtod.src"
+ srcs "../../lib/static/asin.src"
+ srcs "../../lib/static/sinh.src"
+ srcs "../../lib/static/log10.src"
+ srcs "../../lib/static/sin.src"
+ srcs "../../lib/static/atan.src"
+ srcs "../../lib/static/atan2.src"
+ srcs "../../lib/static/fmod.src"
+ srcs "../../lib/static/tanh.src"
+ srcs "../../lib/static/tan.src"
+ srcs "../../lib/static/frexp.src"
+ srcs "../../lib/static/sqrt.src"
+ srcs "../../lib/static/floor.src"
+ srcs "../../lib/static/ldexp.src"
+ srcs "../../lib/static/modf.src"
+ srcs "../../lib/static/ufltrnd.src"
+else
+ srcs "../../lib/linked/frexp.src"
+ srcs "../../lib/linked/atan2.src"
+ srcs "../../lib/linked/atof.src"
+ srcs "../../lib/linked/acos.src"
+ srcs "../../lib/linked/sqrt.src"
+ srcs "../../lib/linked/atan.src"
+ srcs "../../lib/linked/sinh.src"
+ srcs "../../lib/linked/tan.src"
+ srcs "../../lib/linked/floor.src"
+ srcs "../../lib/linked/ldexp.src"
+ srcs "../../lib/linked/ufltrnd.src"
+ srcs "../../lib/linked/fabs.src"
+ srcs "../../lib/linked/log10.src"
+ srcs "../../lib/linked/strtod.src"
+ srcs "../../lib/linked/fmod.src"
+ srcs "../../lib/linked/asin.src"
+ srcs "../../lib/linked/exp.src"
+ srcs "../../lib/linked/ufltinfo.src"
+ srcs "../../lib/linked/cosh.src"
+ srcs "../../lib/linked/modf.src"
+ srcs "../../lib/linked/log.src"
+ srcs "../../lib/linked/tanh.src"
+ srcs "../../lib/linked/ceil.src"
+ srcs "../../lib/linked/cos.src"
+ srcs "../../lib/linked/pow.src"
+ srcs "../../lib/linked/sin.src"
+end if
+srcs "../../lib/shared/os_textbuffer.src"
+srcs "../../lib/shared/debugger.src"
+srcs "../../lib/shared/zx7_Decompress.src"
+srcs "../../lib/shared/random.src"
+srcs "../../lib/shared/atomic_load_decreasing_32.src"
+srcs "../../lib/shared/removeallbreakpoints.src"
+srcs "../../lib/shared/removebreakpoint.src"
+srcs "../../lib/shared/srandom.src"
+srcs "../../lib/shared/tice.src"
+srcs "../../lib/shared/removewatchpoint.src"
+srcs "../../lib/shared/atomic_load_increasing_32.src"
+srcs "../../lib/shared/setwatchpoint.src"
+srcs "../../lib/shared/interrupts.src"
+srcs "../../lib/shared/removeallwatchpoints.src"
+srcs "../../lib/shared/getstringinput.src"
+srcs "../../lib/shared/dzx7_turbo.src"
+srcs "../../lib/shared/atomic_load_32.src"
+srcs "../../lib/shared/setwritewatchpoint.src"
+srcs "../../lib/shared/setreadwatchpoint.src"
+srcs "../../lib/shared/os.src"
+srcs "../../lib/shared/usb.src"
+srcs "../../lib/shared/setreadwritewatchpoint.src"
+srcs "../../lib/shared/abort.src"
+srcs "../../lib/shared/setbreakpoint.src"
+srcs "../../lib/shared/dzx7_standard.src"
+srcs "../../lib/shared/delay.src"
+srcs "../../lib/shared/frftoub.src"
+srcs "../../lib/shared/fpupop1.src"
+srcs "../../lib/shared/frimulu.src"
+srcs "../../lib/shared/ladd.src"
+srcs "../../lib/shared/atoi.src"
+srcs "../../lib/shared/idivs.src"
+srcs "../../lib/shared/isnan.src"
+srcs "../../lib/shared/case24d.src"
+srcs "../../lib/shared/isupper.src"
+srcs "../../lib/shared/memmove.src"
+srcs "../../lib/shared/frameset0.src"
+srcs "../../lib/shared/sneg.src"
+srcs "../../lib/shared/setjmp.src"
+srcs "../../lib/shared/strcspn.src"
+srcs "../../lib/shared/fpdiv.src"
+srcs "../../lib/shared/istiy.src"
+srcs "../../lib/shared/frstof.src"
+srcs "../../lib/shared/abs.src"
+srcs "../../lib/shared/frsmulu.src"
+srcs "../../lib/shared/strdup.src"
+srcs "../../lib/shared/sprintf.src"
+srcs "../../lib/shared/sldix.src"
+srcs "../../lib/shared/finite.src"
+srcs "../../lib/shared/lnot.src"
+srcs "../../lib/shared/imulu.src"
+srcs "../../lib/shared/setflag.src"
+srcs "../../lib/shared/iscntrl.src"
+srcs "../../lib/shared/fpupop2.src"
+srcs "../../lib/shared/ishrs.src"
+srcs "../../lib/shared/fpsub.src"
+srcs "../../lib/shared/fpmul.src"
+srcs "../../lib/shared/case24.src"
+srcs "../../lib/shared/isinf.src"
+srcs "../../lib/shared/bldix.src"
+srcs "../../lib/shared/ldiv.src"
+srcs "../../lib/shared/strcmp.src"
+srcs "../../lib/shared/strcasecmp.src"
+srcs "../../lib/shared/sand.src"
+srcs "../../lib/shared/strrchr.src"
+srcs "../../lib/shared/sshrs.src"
+srcs "../../lib/shared/tolower.src"
+srcs "../../lib/shared/isgraph.src"
+srcs "../../lib/shared/case8d.src"
+srcs "../../lib/shared/snot.src"
+srcs "../../lib/shared/round.src"
+srcs "../../lib/shared/seqcased.src"
+srcs "../../lib/shared/frbtof.src"
+srcs "../../lib/shared/fruitof.src"
+srcs "../../lib/shared/fritof.src"
+srcs "../../lib/shared/log2.src"
+srcs "../../lib/shared/fpultof.src"
+srcs "../../lib/shared/bshrs.src"
+srcs "../../lib/shared/seqcase.src"
+srcs "../../lib/shared/bremu.src"
+srcs "../../lib/shared/lmulu.src"
+srcs "../../lib/shared/strncmp.src"
+srcs "../../lib/shared/frbmuls.src"
+srcs "../../lib/shared/scmpzero.src"
+srcs "../../lib/shared/isxdigit.src"
+srcs "../../lib/shared/bdivs.src"
+srcs "../../lib/shared/strndup.src"
+srcs "../../lib/shared/memset.src"
+srcs "../../lib/shared/strncpy.src"
+srcs "../../lib/shared/itol.src"
+srcs "../../lib/shared/strstr.src"
+srcs "../../lib/shared/sdivs.src"
+srcs "../../lib/shared/lcmpu.src"
+srcs "../../lib/shared/case8.src"
+srcs "../../lib/shared/indcall.src"
+srcs "../../lib/shared/sqrtf.src"
+srcs "../../lib/shared/sstix.src"
+srcs "../../lib/shared/fpftol.src"
+srcs "../../lib/shared/rand.src"
+srcs "../../lib/shared/lstix.src"
+srcs "../../lib/shared/lrems.src"
+srcs "../../lib/shared/ildiy.src"
+srcs "../../lib/shared/lmuls.src"
+srcs "../../lib/shared/fppack.src"
+srcs "../../lib/shared/lor.src"
+srcs "../../lib/shared/icmpzero.src"
+srcs "../../lib/shared/strpbrk.src"
+srcs "../../lib/shared/sstiy.src"
+srcs "../../lib/shared/land.src"
+srcs "../../lib/shared/ldivu.src"
+srcs "../../lib/shared/frsmuls.src"
+srcs "../../lib/shared/strtok.src"
+srcs "../../lib/shared/iand.src"
+srcs "../../lib/shared/ldivs.src"
+srcs "../../lib/shared/ineg.src"
+srcs "../../lib/shared/stoi.src"
+srcs "../../lib/shared/sremu.src"
+srcs "../../lib/shared/sldiy.src"
+srcs "../../lib/shared/bstiy.src"
+srcs "../../lib/shared/memchr.src"
+srcs "../../lib/shared/ior.src"
+srcs "../../lib/shared/fpneg.src"
+srcs "../../lib/shared/isascii.src"
+srcs "../../lib/shared/lldix.src"
+srcs "../../lib/shared/smuls.src"
+srcs "../../lib/shared/smulu.src"
+srcs "../../lib/shared/isspace.src"
+srcs "../../lib/shared/frftous.src"
+srcs "../../lib/shared/sshl.src"
+srcs "../../lib/shared/sdivu.src"
+srcs "../../lib/shared/fpadd.src"
+srcs "../../lib/shared/lsub.src"
+srcs "../../lib/shared/bldiy.src"
+srcs "../../lib/shared/ixor.src"
+srcs "../../lib/shared/lstiy.src"
+srcs "../../lib/shared/srand.src"
+srcs "../../lib/shared/uldiv.src"
+srcs "../../lib/shared/frftos.src"
+srcs "../../lib/shared/frubtof.src"
+srcs "../../lib/shared/ishru.src"
+srcs "../../lib/shared/sshru.src"
+srcs "../../lib/shared/atos.src"
+srcs "../../lib/shared/iremu.src"
+srcs "../../lib/shared/lshrs.src"
+srcs "../../lib/shared/strspn.src"
+srcs "../../lib/shared/strnlen.src"
+srcs "../../lib/shared/bmuls.src"
+srcs "../../lib/shared/sor.src"
+srcs "../../lib/shared/imuls.src"
+srcs "../../lib/shared/fpltof.src"
+srcs "../../lib/shared/sxor.src"
+srcs "../../lib/shared/istix.src"
+srcs "../../lib/shared/bdivu.src"
+srcs "../../lib/shared/bshl.src"
+srcs "../../lib/shared/memcmp.src"
+srcs "../../lib/shared/srems.src"
+srcs "../../lib/shared/strchr.src"
+srcs "../../lib/shared/ildix.src"
+srcs "../../lib/shared/frustof.src"
+srcs "../../lib/shared/lneg.src"
+srcs "../../lib/shared/atol.src"
+srcs "../../lib/shared/longjmp.src"
+srcs "../../lib/shared/labs.src"
+srcs "../../lib/shared/memcpy.src"
+srcs "../../lib/shared/isalpha.src"
+srcs "../../lib/shared/bshru.src"
+srcs "../../lib/shared/isprint.src"
+srcs "../../lib/shared/strcat.src"
+srcs "../../lib/shared/div.src"
+srcs "../../lib/shared/isalnum.src"
+srcs "../../lib/shared/lshl.src"
+srcs "../../lib/shared/case16d.src"
+srcs "../../lib/shared/ispunct.src"
+srcs "../../lib/shared/toupper.src"
+srcs "../../lib/shared/frftoui.src"
+srcs "../../lib/shared/idivu.src"
+srcs "../../lib/shared/isdigit.src"
+srcs "../../lib/shared/sbrk.src"
+srcs "../../lib/shared/fpcmp.src"
+srcs "../../lib/shared/lcmpzero.src"
+srcs "../../lib/shared/stoiu.src"
+srcs "../../lib/shared/inot.src"
+srcs "../../lib/shared/frimuls.src"
+srcs "../../lib/shared/lcmps.src"
+srcs "../../lib/shared/irems.src"
+srcs "../../lib/shared/lldiy.src"
+srcs "../../lib/shared/ishl.src"
+srcs "../../lib/shared/strncat.src"
+srcs "../../lib/shared/bstix.src"
+srcs "../../lib/shared/lxor.src"
+srcs "../../lib/shared/lshru.src"
+srcs "../../lib/shared/bmulu.src"
+srcs "../../lib/shared/calloc.src"
+srcs "../../lib/shared/frftoi.src"
+srcs "../../lib/shared/islower.src"
+srcs "../../lib/shared/case16.src"
+srcs "../../lib/shared/frameset.src"
+srcs "../../lib/shared/strcpy.src"
+srcs "../../lib/shared/frftob.src"
+srcs "../../lib/shared/strncasecmp.src"
+srcs "../../lib/shared/brems.src"
+srcs "../../lib/shared/lremu.src"
+srcs "../../lib/shared/case.src"
+srcs "../../lib/shared/strlen.src"
+srcs "../../lib/shared/gamma.src"
+srcs "../../lib/shared/uuitoa.src"
+srcs "../../lib/shared/udtog.src"
+srcs "../../lib/shared/uscan.src"
+srcs "../../lib/shared/strtoul.src"
+srcs "../../lib/shared/print_sputch.src"
+srcs "../../lib/shared/print_putch.src"
+srcs "../../lib/shared/strtol.src"
+srcs "../../lib/shared/bsearch.src"
+srcs "../../lib/shared/vsprintf.src"
+srcs "../../lib/shared/print_putstring.src"
+srcs "../../lib/shared/ustoa.src"
+srcs "../../lib/shared/maptab.src"
+srcs "../../lib/shared/ultoa.src"
+srcs "../../lib/shared/usscan.src"
+srcs "../../lib/shared/udtof.src"
+srcs "../../lib/shared/realloc.src"
+srcs "../../lib/shared/free.src"
+srcs "../../lib/shared/udtoe.src"
+srcs "../../lib/shared/uitoa.src"
+srcs "../../lib/shared/qsort.src"
+srcs "../../lib/shared/fpdata.src"
+srcs "../../lib/shared/uustoa.src"
+srcs "../../lib/shared/upscan.src"
+srcs "../../lib/shared/malloc.src"
+srcs "../../lib/shared/uprint.src"
+srcs "../../lib/shared/ureverse.src"
+srcs "../../lib/shared/uultoa.src"
+srcs "../../lib/shared/print_globals.src"
+srcs "../../lib/fileio/files.src"
+srcs "../../lib/fileio/fclose.src"
+srcs "../../lib/fileio/feof.src"
+srcs "../../lib/fileio/fopen.src"
+srcs "../../lib/fileio/fwrite.src"
+srcs "../../lib/fileio/ftell.src"
+srcs "../../lib/fileio/fputs.src"
+srcs "../../lib/fileio/fgets.src"
+srcs "../../lib/fileio/remove.src"
+srcs "../../lib/fileio/fputc.src"
+srcs "../../lib/fileio/fgetc.src"
+srcs "../../lib/fileio/fread.src"
+srcs "../../lib/fileio/fseek.src"
diff --git a/frontends/calculator/CEdev/include/.makefile b/frontends/calculator/CEdev/include/.makefile index 8bc89e6..c6f243c 100644 --- a/frontends/calculator/CEdev/include/.makefile +++ b/frontends/calculator/CEdev/include/.makefile @@ -1,213 +1,213 @@ -#---------------------------- -# Core C Makefile -#---------------------------- -CLEANUP ?= YES -BSSHEAP_LOW ?= D031F6 -BSSHEAP_HIGH ?= D13FD6 -STACK_HIGH ?= D1A87E -INIT_LOC ?= D1A87F -USE_FLASH_FUNCTIONS ?= YES -OUTPUT_MAP ?= YES -ARCHIVED ?= NO -OPT_MODE ?= -optsize -#---------------------------- -SRCDIR ?= src -OBJDIR ?= obj -BINDIR ?= bin -GFXDIR ?= src/gfx -#---------------------------- - -VERSION := 8.5 - -#---------------------------- -# try not to edit anything below these lines unless you know what you are doing -#---------------------------- - -#---------------------------- - -# define some common makefile things -empty := -space := $(empty) $(empty) -comma := , - -TARGET ?= $(NAME) -ICONPNG ?= $(ICON) -DEBUGMODE = NDEBUG -CCDEBUGFLAG = -nodebug - -# verbosity -V ?= 0 -ifeq ($(V),0) -Q = @ -else -Q = -endif - -# get the os specific items -ifeq ($(OS),Windows_NT) -SHELL := cmd.exe -MAKEDIR := $(CURDIR) -NATIVEPATH = $(subst /,\,$1) -WINPATH = $(NATIVEPATH) -WINRELPATH = $(subst /,\,$1) -RM = del /q /f 2>nul -CEDEV ?= $(call NATIVEPATH,$(realpath ..\..)) -BIN ?= $(call NATIVEPATH,$(CEDEV)/bin) -LD = $(call NATIVEPATH,$(BIN)/fasmg.exe) -CC = $(call NATIVEPATH,$(BIN)/ez80cc.exe) -CV = $(call NATIVEPATH,$(BIN)/convhex.exe) -PG = $(call NATIVEPATH,$(BIN)/convpng.exe) -CD = cd -CP = copy /y -MV = move /y >nul -NULL = >nul 2>&1 -RMDIR = call && (if exist $1 rmdir /s /q $1) -MKDIR = call && (if not exist $1 mkdir $1) -QUOTE_ARG = "$(subst ",',$1)"#' -TO_LOWER = $1 -else -MAKEDIR := $(CURDIR) -NATIVEPATH = $(subst \,/,$1) -WINPATH = $(shell winepath -w $1) -WINRELPATH = $(subst /,\,$1) -RM = rm -f -CEDEV ?= $(call NATIVEPATH,$(realpath ..\..)) -BIN ?= $(call NATIVEPATH,$(CEDEV)/bin) -CC = $(call NATIVEPATH,wine "$(BIN)/ez80cc.exe") -LD = $(call NATIVEPATH,$(BIN)/fasmg) -CV = $(call NATIVEPATH,$(BIN)/convhex) -PG = $(call NATIVEPATH,$(BIN)/convpng) -CD = cd -CP = cp -MV = mv -RMDIR = rm -rf $1 -MKDIR = mkdir -p $1 -QUOTE_ARG = '$(subst ','\'',$1)'#' -TO_LOWER = $(shell printf %s $(call QUOTE_ARG,$1) | tr [:upper:] [:lower:]) -endif -FASMG_FILES = $(subst $(space),$(comma) ,$(patsubst %,"%",$(subst ",\",$(subst \,\\,$(call NATIVEPATH,$1)))))#" - -# ensure native paths -SRCDIR := $(call NATIVEPATH,$(SRCDIR)) -OBJDIR := $(call NATIVEPATH,$(OBJDIR)) -BINDIR := $(call NATIVEPATH,$(BINDIR)) -GFXDIR := $(call NATIVEPATH,$(GFXDIR)) - -# generate default names -TARGETBIN := $(TARGET).bin -TARGETMAP := $(TARGET).map -TARGET8XP := $(TARGET).8xp -ICON_ASM := iconc.src - -# init conditionals -F_STARTUP := $(call NATIVEPATH,$(CEDEV)/lib/cstartup.src) -F_LAUNCHER := $(call NATIVEPATH,$(CEDEV)/lib/libheader.src) -F_CLEANUP := $(call NATIVEPATH,$(CEDEV)/lib/ccleanup.src) - -# source: http://blog.jgc.org/2011/07/gnu-make-recursive-wildcard-function.html -rwildcard = $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)$(filter $(subst *,%,$2),$d)) - -# find all of the available C, H and ASM files (Remember, you can create C <-> assembly routines easily this way) -CSOURCES := $(call rwildcard,$(SRCDIR),*.c) -CPPSOURCES := $(call rwildcard,$(SRCDIR),*.cpp) -USERHEADERS := $(call rwildcard,$(SRCDIR),*.h *.hpp) -ASMSOURCES := $(call rwildcard,$(SRCDIR),*.asm) - -# create links for later -LINK_CSOURCES := $(CSOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.src) -LINK_CPPSOURCES := $(CPPSOURCES:$(SRCDIR)/%=$(OBJDIR)/%.src) -LINK_ASMSOURCES := $(ASMSOURCES) - -# files created to be used for linking -LINK_FILES := $(LINK_CSOURCES) $(LINK_CPPSOURCES) $(LINK_ASMSOURCES) -LINK_LIBS := $(wildcard $(CEDEV)/lib/libload/*.lib) -LINK_LIBLOAD := $(CEDEV)/lib/libload.lib - -# check if there is an icon present that we can convert; if so, generate a recipe to build it properly -ifneq ("$(wildcard $(ICONPNG))","") -F_ICON := $(OBJDIR)/$(ICON_ASM) -ICON_CONV := $(PG) -c $(ICONPNG)$(comma)$(call NATIVEPATH,$(F_ICON))$(comma)$(DESCRIPTION) -LINK_ICON = , $(call FASMG_FILES,$(F_ICON)) used -endif - -# determine if output should be archived or compressed -ifeq ($(ARCHIVED),YES) -CVFLAGS += -a -endif -ifeq ($(COMPRESSED),YES) -CVFLAGS += -x -endif -ifeq ($(CLEANUP),YES) -LINK_CLEANUP = , $(call FASMG_FILES,$(F_CLEANUP)) used -endif -ifeq ($(OUTPUT_MAP),YES) -LDMAPFLAG = -i map -endif - -# choose static or linked flash functions -ifeq ($(USE_FLASH_FUNCTIONS),YES) -STATIC := 0 -else -STATIC := 1 -endif - -# define the C flags used by the Zilog compiler -CFLAGS ?= \ - -noasm $(CCDEBUGFLAG) -nogenprint -keepasm -quiet $(OPT_MODE) -cpu:EZ80F91 -noreduceopt -nolistinc -nomodsect -define:_EZ80F91 -define:_EZ80 -define:$(DEBUGMODE) - -# these are the linker flags, basically organized to properly set up the environment -LDFLAGS ?= \ - $(call QUOTE_ARG,$(call NATIVEPATH,$(CEDEV)/include/fasmg-ez80/ld.fasmg)) \ - -i $(call QUOTE_ARG,include $(call FASMG_FILES,$(CEDEV)/include/.linker_script)) \ - $(LDDEBUGFLAG) \ - $(LDMAPFLAG) \ - -i $(call QUOTE_ARG,range bss $$$(BSSHEAP_LOW) : $$$(BSSHEAP_HIGH)) \ - -i $(call QUOTE_ARG,symbol __stack = $$$(STACK_HIGH)) \ - -i $(call QUOTE_ARG,locate header at $$$(INIT_LOC)) \ - -i $(call QUOTE_ARG,STATIC := $(STATIC)) \ - -i $(call QUOTE_ARG,srcs $(call FASMG_FILES,$(F_LAUNCHER)) used if libs.length$(LINK_ICON)$(LINK_CLEANUP)$(comma) $(call FASMG_FILES,$(F_STARTUP)) used$(comma) $(call FASMG_FILES,$(LINK_FILES))) \ - -i $(call QUOTE_ARG,libs $(call FASMG_FILES,$(LINK_LIBLOAD)) used if libs.length$(comma) $(call FASMG_FILES,$(LINK_LIBS))) - -# this rule is trigged to build everything -all: dirs $(BINDIR)/$(TARGET8XP) ; - -# this rule is trigged to build debug everything -debug: LDDEBUGFLAG = -i dbg -debug: DEBUGMODE = DEBUG -debug: CCDEBUGFLAG = -debug -debug: dirs $(BINDIR)/$(TARGET8XP) ; - -dirs: - @echo C CE SDK Version $(VERSION) && \ - $(call MKDIR,$(BINDIR)) && \ - $(call MKDIR,$(OBJDIR)) - -$(BINDIR)/$(TARGET8XP): $(BINDIR)/$(TARGETBIN) - $(Q)$(CD) $(BINDIR) && \ - $(CV) $(CVFLAGS) $(notdir $<) $(notdir $@) - -$(BINDIR)/$(TARGETBIN): $(LINK_FILES) $(F_ICON) - $(Q)$(LD) $(LDFLAGS) $@ - -# this rule handles conversion of the icon, if it is ever updated -$(OBJDIR)/$(ICON_ASM): $(ICONPNG) - $(Q)$(ICON_CONV) - -# these rules compile the source files into object files -$(OBJDIR)/%.src: $(SRCDIR)/%.c $(USERHEADERS) - $(Q)$(call MKDIR,$(call NATIVEPATH,$(@D))) && \ - $(CC) $(CFLAGS) $(call QUOTE_ARG,$(call WINPATH,$(addprefix $(MAKEDIR)/,$<))) && \ - $(MV) $(call QUOTE_ARG,$(call TO_LOWER,$(@F))) $(call QUOTE_ARG,$@) - -clean: - $(Q)$(call RMDIR,$(OBJDIR)) - $(Q)$(call RMDIR,$(BINDIR)) - @echo Cleaned build files. - -gfx: - $(Q)$(CD) $(GFXDIR) && convpng - -version: - @echo C SDK Version $(VERSION) - -.PHONY: all clean version gfx dirs debug +#----------------------------
+# Core C Makefile
+#----------------------------
+CLEANUP ?= YES
+BSSHEAP_LOW ?= D031F6
+BSSHEAP_HIGH ?= D13FD6
+STACK_HIGH ?= D1A87E
+INIT_LOC ?= D1A87F
+USE_FLASH_FUNCTIONS ?= YES
+OUTPUT_MAP ?= YES
+ARCHIVED ?= NO
+OPT_MODE ?= -optsize
+#----------------------------
+SRCDIR ?= src
+OBJDIR ?= obj
+BINDIR ?= bin
+GFXDIR ?= src/gfx
+#----------------------------
+
+VERSION := 8.5
+
+#----------------------------
+# try not to edit anything below these lines unless you know what you are doing
+#----------------------------
+
+#----------------------------
+
+# define some common makefile things
+empty :=
+space := $(empty) $(empty)
+comma := ,
+
+TARGET ?= $(NAME)
+ICONPNG ?= $(ICON)
+DEBUGMODE = NDEBUG
+CCDEBUGFLAG = -nodebug
+
+# verbosity
+V ?= 0
+ifeq ($(V),0)
+Q = @
+else
+Q =
+endif
+
+# get the os specific items
+ifeq ($(OS),Windows_NT)
+SHELL := cmd.exe
+MAKEDIR := $(CURDIR)
+NATIVEPATH = $(subst /,\,$1)
+WINPATH = $(NATIVEPATH)
+WINRELPATH = $(subst /,\,$1)
+RM = del /q /f 2>nul
+CEDEV ?= $(call NATIVEPATH,$(realpath ..\..))
+BIN ?= $(call NATIVEPATH,$(CEDEV)/bin)
+LD = $(call NATIVEPATH,$(BIN)/fasmg.exe)
+CC = $(call NATIVEPATH,$(BIN)/ez80cc.exe)
+CV = $(call NATIVEPATH,$(BIN)/convhex.exe)
+PG = $(call NATIVEPATH,$(BIN)/convpng.exe)
+CD = cd
+CP = copy /y
+MV = move /y >nul
+NULL = >nul 2>&1
+RMDIR = call && (if exist $1 rmdir /s /q $1)
+MKDIR = call && (if not exist $1 mkdir $1)
+QUOTE_ARG = "$(subst ",',$1)"#'
+TO_LOWER = $1
+else
+MAKEDIR := $(CURDIR)
+NATIVEPATH = $(subst \,/,$1)
+WINPATH = $(shell winepath -w $1)
+WINRELPATH = $(subst /,\,$1)
+RM = rm -f
+CEDEV ?= $(call NATIVEPATH,$(realpath ..\..))
+BIN ?= $(call NATIVEPATH,$(CEDEV)/bin)
+CC = $(call NATIVEPATH,wine "$(BIN)/ez80cc.exe")
+LD = $(call NATIVEPATH,$(BIN)/fasmg)
+CV = $(call NATIVEPATH,$(BIN)/convhex)
+PG = $(call NATIVEPATH,$(BIN)/convpng)
+CD = cd
+CP = cp
+MV = mv
+RMDIR = rm -rf $1
+MKDIR = mkdir -p $1
+QUOTE_ARG = '$(subst ','\'',$1)'#'
+TO_LOWER = $(shell printf %s $(call QUOTE_ARG,$1) | tr [:upper:] [:lower:])
+endif
+FASMG_FILES = $(subst $(space),$(comma) ,$(patsubst %,"%",$(subst ",\",$(subst \,\\,$(call NATIVEPATH,$1)))))#"
+
+# ensure native paths
+SRCDIR := $(call NATIVEPATH,$(SRCDIR))
+OBJDIR := $(call NATIVEPATH,$(OBJDIR))
+BINDIR := $(call NATIVEPATH,$(BINDIR))
+GFXDIR := $(call NATIVEPATH,$(GFXDIR))
+
+# generate default names
+TARGETBIN := $(TARGET).bin
+TARGETMAP := $(TARGET).map
+TARGET8XP := $(TARGET).8xp
+ICON_ASM := iconc.src
+
+# init conditionals
+F_STARTUP := $(call NATIVEPATH,$(CEDEV)/lib/cstartup.src)
+F_LAUNCHER := $(call NATIVEPATH,$(CEDEV)/lib/libheader.src)
+F_CLEANUP := $(call NATIVEPATH,$(CEDEV)/lib/ccleanup.src)
+
+# source: http://blog.jgc.org/2011/07/gnu-make-recursive-wildcard-function.html
+rwildcard = $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)$(filter $(subst *,%,$2),$d))
+
+# find all of the available C, H and ASM files (Remember, you can create C <-> assembly routines easily this way)
+CSOURCES := $(call rwildcard,$(SRCDIR),*.c)
+CPPSOURCES := $(call rwildcard,$(SRCDIR),*.cpp)
+USERHEADERS := $(call rwildcard,$(SRCDIR),*.h *.hpp)
+ASMSOURCES := $(call rwildcard,$(SRCDIR),*.asm)
+
+# create links for later
+LINK_CSOURCES := $(CSOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.src)
+LINK_CPPSOURCES := $(CPPSOURCES:$(SRCDIR)/%=$(OBJDIR)/%.src)
+LINK_ASMSOURCES := $(ASMSOURCES)
+
+# files created to be used for linking
+LINK_FILES := $(LINK_CSOURCES) $(LINK_CPPSOURCES) $(LINK_ASMSOURCES)
+LINK_LIBS := $(wildcard $(CEDEV)/lib/libload/*.lib)
+LINK_LIBLOAD := $(CEDEV)/lib/libload.lib
+
+# check if there is an icon present that we can convert; if so, generate a recipe to build it properly
+ifneq ("$(wildcard $(ICONPNG))","")
+F_ICON := $(OBJDIR)/$(ICON_ASM)
+ICON_CONV := $(PG) -c $(ICONPNG)$(comma)$(call NATIVEPATH,$(F_ICON))$(comma)$(DESCRIPTION)
+LINK_ICON = , $(call FASMG_FILES,$(F_ICON)) used
+endif
+
+# determine if output should be archived or compressed
+ifeq ($(ARCHIVED),YES)
+CVFLAGS += -a
+endif
+ifeq ($(COMPRESSED),YES)
+CVFLAGS += -x
+endif
+ifeq ($(CLEANUP),YES)
+LINK_CLEANUP = , $(call FASMG_FILES,$(F_CLEANUP)) used
+endif
+ifeq ($(OUTPUT_MAP),YES)
+LDMAPFLAG = -i map
+endif
+
+# choose static or linked flash functions
+ifeq ($(USE_FLASH_FUNCTIONS),YES)
+STATIC := 0
+else
+STATIC := 1
+endif
+
+# define the C flags used by the Zilog compiler
+CFLAGS ?= \
+ -noasm $(CCDEBUGFLAG) -nogenprint -keepasm -quiet $(OPT_MODE) -cpu:EZ80F91 -noreduceopt -nolistinc -nomodsect -define:_EZ80F91 -define:_EZ80 -define:$(DEBUGMODE)
+
+# these are the linker flags, basically organized to properly set up the environment
+LDFLAGS ?= \
+ $(call QUOTE_ARG,$(call NATIVEPATH,$(CEDEV)/include/fasmg-ez80/ld.fasmg)) \
+ -i $(call QUOTE_ARG,include $(call FASMG_FILES,$(CEDEV)/include/.linker_script)) \
+ $(LDDEBUGFLAG) \
+ $(LDMAPFLAG) \
+ -i $(call QUOTE_ARG,range bss $$$(BSSHEAP_LOW) : $$$(BSSHEAP_HIGH)) \
+ -i $(call QUOTE_ARG,symbol __stack = $$$(STACK_HIGH)) \
+ -i $(call QUOTE_ARG,locate header at $$$(INIT_LOC)) \
+ -i $(call QUOTE_ARG,STATIC := $(STATIC)) \
+ -i $(call QUOTE_ARG,srcs $(call FASMG_FILES,$(F_LAUNCHER)) used if libs.length$(LINK_ICON)$(LINK_CLEANUP)$(comma) $(call FASMG_FILES,$(F_STARTUP)) used$(comma) $(call FASMG_FILES,$(LINK_FILES))) \
+ -i $(call QUOTE_ARG,libs $(call FASMG_FILES,$(LINK_LIBLOAD)) used if libs.length$(comma) $(call FASMG_FILES,$(LINK_LIBS)))
+
+# this rule is trigged to build everything
+all: dirs $(BINDIR)/$(TARGET8XP) ;
+
+# this rule is trigged to build debug everything
+debug: LDDEBUGFLAG = -i dbg
+debug: DEBUGMODE = DEBUG
+debug: CCDEBUGFLAG = -debug
+debug: dirs $(BINDIR)/$(TARGET8XP) ;
+
+dirs:
+ @echo C CE SDK Version $(VERSION) && \
+ $(call MKDIR,$(BINDIR)) && \
+ $(call MKDIR,$(OBJDIR))
+
+$(BINDIR)/$(TARGET8XP): $(BINDIR)/$(TARGETBIN)
+ $(Q)$(CD) $(BINDIR) && \
+ $(CV) $(CVFLAGS) $(notdir $<) $(notdir $@)
+
+$(BINDIR)/$(TARGETBIN): $(LINK_FILES) $(F_ICON)
+ $(Q)$(LD) $(LDFLAGS) $@
+
+# this rule handles conversion of the icon, if it is ever updated
+$(OBJDIR)/$(ICON_ASM): $(ICONPNG)
+ $(Q)$(ICON_CONV)
+
+# these rules compile the source files into object files
+$(OBJDIR)/%.src: $(SRCDIR)/%.c $(USERHEADERS)
+ $(Q)$(call MKDIR,$(call NATIVEPATH,$(@D))) && \
+ $(CC) $(CFLAGS) $(call QUOTE_ARG,$(call WINPATH,$(addprefix $(MAKEDIR)/,$<))) && \
+ $(MV) $(call QUOTE_ARG,$(call TO_LOWER,$(@F))) $(call QUOTE_ARG,$@)
+
+clean:
+ $(Q)$(call RMDIR,$(OBJDIR))
+ $(Q)$(call RMDIR,$(BINDIR))
+ @echo Cleaned build files.
+
+gfx:
+ $(Q)$(CD) $(GFXDIR) && convpng
+
+version:
+ @echo C SDK Version $(VERSION)
+
+.PHONY: all clean version gfx dirs debug
diff --git a/frontends/calculator/CEdev/include/assert.h b/frontends/calculator/CEdev/include/assert.h index 04c3a34..0341a98 100644 --- a/frontends/calculator/CEdev/include/assert.h +++ b/frontends/calculator/CEdev/include/assert.h @@ -1,19 +1,19 @@ -#include <debug.h> -#include <stdio.h> -#include <stdlib.h> - -#ifdef assert -#undef assert -#endif - -#ifdef NDEBUG -#define assert(ignore) ((void)0) -#else -#define assert(e) \ - do { \ - if (!(e)) { \ - dbg_sprintf(dbgout, "Assertion failure: %s, file: %s, line %d\n", #e, __FILE__, __LINE__); \ - abort(); \ - } \ - } while (0) -#endif +#include <debug.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef assert
+#undef assert
+#endif
+
+#ifdef NDEBUG
+#define assert(ignore) ((void)0)
+#else
+#define assert(e) \
+ do { \
+ if (!(e)) { \
+ dbg_sprintf(dbgout, "Assertion failure: %s, file: %s, line %d\n", #e, __FILE__, __LINE__); \
+ abort(); \
+ } \
+ } while (0)
+#endif
diff --git a/frontends/calculator/CEdev/include/compression.h b/frontends/calculator/CEdev/include/compression.h index 234d25d..89754c9 100644 --- a/frontends/calculator/CEdev/include/compression.h +++ b/frontends/calculator/CEdev/include/compression.h @@ -1,27 +1,27 @@ -/** - * @file - * @author Matt "MateoConLechuga" Waltz - * @brief Optimized (de)compression routines - */ - -#ifndef COMPRESSION_H -#define COMPRESSION_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Decompress a block of zx7 encoded data - * - * @param dest Pointer to destination for uncompressed data - * @param src Pointer to compressed data -*/ -void zx7_Decompress(void *dest, void *src); - -#ifdef __cplusplus -} -#endif - -#endif - +/**
+ * @file
+ * @author Matt "MateoConLechuga" Waltz
+ * @brief Optimized (de)compression routines
+ */
+
+#ifndef COMPRESSION_H
+#define COMPRESSION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Decompress a block of zx7 encoded data
+ *
+ * @param dest Pointer to destination for uncompressed data
+ * @param src Pointer to compressed data
+*/
+void zx7_Decompress(void *dest, void *src);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/frontends/calculator/CEdev/include/ctype.h b/frontends/calculator/CEdev/include/ctype.h index 215dae0..29301aa 100644 --- a/frontends/calculator/CEdev/include/ctype.h +++ b/frontends/calculator/CEdev/include/ctype.h @@ -1,30 +1,30 @@ -#ifndef CTYPE_H -#define CTYPE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define TRUE 1 -#define FALSE 0 - -int isalnum(int c); -int isalpha(int c); -int iscntrl(int c); -int isdigit(int c); -int isgraph(int c); -int islower(int c); -int isprint(int c); -int ispunct(int c); -int isspace(int c); -int isupper(int c); -int tolower(int c); -int toupper(int c); -int isascii(int c); -int isxdigit(int c); - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef CTYPE_H
+#define CTYPE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TRUE 1
+#define FALSE 0
+
+int isalnum(int c);
+int isalpha(int c);
+int iscntrl(int c);
+int isdigit(int c);
+int isgraph(int c);
+int islower(int c);
+int isprint(int c);
+int ispunct(int c);
+int isspace(int c);
+int isupper(int c);
+int tolower(int c);
+int toupper(int c);
+int isascii(int c);
+int isxdigit(int c);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/debug.h b/frontends/calculator/CEdev/include/debug.h index aabbd41..bb20b94 100644 --- a/frontends/calculator/CEdev/include/debug.h +++ b/frontends/calculator/CEdev/include/debug.h @@ -1,124 +1,124 @@ -/** - * @file - * @author Matt "MateoConLechuga" Waltz - * @brief Contains useful debugging features for use with the integrated CEmu debugger - */ - -#include <stdio.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * void dbg_sprintf(out, const char *format, ...) - * - * @brief Use to print to the emulator console. - * - * See the syntax for 'printf' for more information - * @param out Can be dbgout (black) or dbgerr (red) - * @param format Uses printf-formated specifier string - * @def dbg_sprintf - */ - -/** - * void dbg_ClearConsole(void) - * - * @brief Clears the emulator's console screen. - * @def dbg_ClearConsole - */ - -#ifndef NDEBUG - -/** - * Opens the emulator debugger - */ -void dbg_Debugger(void); - -/** - * Sets an emulated breakpoint at a particular address - * - * @param address The address of the breakpoint to remove - */ -void dbg_SetBreakpoint(void *address); - -/** - * Removes an emulated breakpoint at a particular address - * - * @param address The address of the breakpoint to remove - */ -void dbg_RemoveBreakpoint(void *address); - -/** - * Sets an emulated empty watchpoint at a particular address - * - * @param address The address of the watchpoint to set - * @param length The size of the data at the address (values 1-4) - */ -void dbg_SetWatchpoint(void *address, unsigned int length); - -/** - * Sets an emulated read watchpoint at a particular address - * - * @param address The address of the watchpoint to set - * @param length The size of the data at the address (values 1-4) - */ -void dbg_SetReadWatchpoint(void *address, unsigned int length); - -/** - * Sets an emulated write watchpoint at a particular address - * - * @param address The address of the watchpoint to set - * @param length The size of the data at the address (values 1-4) - */ -void dbg_SetWriteWatchpoint(void *address, unsigned int length); - -/** - * Sets an emulated read/write watchpoint at a particular address - * - * @param address The address of the watchpoint to set - * @param length The size of the data at the address (values 1-4) - */ -void dbg_SetReadWriteWatchpoint(void *address, unsigned int length); - -/** - * Removes an emulated watchpoint at a particular address - * - * @param address The address of the watchpoint to remove - */ -void dbg_RemoveWatchpoint(void *address); - -/** - * Removes all emulated watchpoints - */ -void dbg_RemoveAllWatchpoints(void); - -/** - * Removes all emulated breakpoints - */ -void dbg_RemoveAllBreakpoints(void); - -#define dbgout ((char*)0xFB0000) /**< Standard debug output */ -#define dbgerr ((char*)0xFC0000) /**< Error debug output */ -#define dbg_sprintf sprintf -#define dbg_ClearConsole() (*(unsigned char*)0xFD0000 = 1) -#else -#define dbg_Debugger(ignore) ((void)0) -#define dbg_SetBreakpoint(ignore) ((void)0) -#define dbg_RemoveBreakpoint(ignore) ((void)0) -#define dbg_SetWatchpoint(ignore,ignore) ((void)0) -#define dbg_SetReadWatchpoint(ignore,ignore) ((void)0) -#define dbg_SetWriteWatchpoint(ignore,ignore) ((void)0) -#define dbg_SetReadWriteWatchpoint(ignore,ignore) ((void)0) -#define dbg_RemoveWatchpoint(ignore) ((void)0) -#define dbg_RemoveAllWatchpoints(ignore) ((void)0) -#define dbg_RemoveAllBreakpoints(ignore) ((void)0) -#define dbg_sprintf if(0)(void) -#define dbg_ClearConsole(ignore) ((void)0) -#define dbgout (NULL) -#define dbgerr (NULL) -#endif - -#ifdef __cplusplus -} -#endif +/**
+ * @file
+ * @author Matt "MateoConLechuga" Waltz
+ * @brief Contains useful debugging features for use with the integrated CEmu debugger
+ */
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * void dbg_sprintf(out, const char *format, ...)
+ *
+ * @brief Use to print to the emulator console.
+ *
+ * See the syntax for 'printf' for more information
+ * @param out Can be dbgout (black) or dbgerr (red)
+ * @param format Uses printf-formated specifier string
+ * @def dbg_sprintf
+ */
+
+/**
+ * void dbg_ClearConsole(void)
+ *
+ * @brief Clears the emulator's console screen.
+ * @def dbg_ClearConsole
+ */
+
+#ifndef NDEBUG
+
+/**
+ * Opens the emulator debugger
+ */
+void dbg_Debugger(void);
+
+/**
+ * Sets an emulated breakpoint at a particular address
+ *
+ * @param address The address of the breakpoint to remove
+ */
+void dbg_SetBreakpoint(void *address);
+
+/**
+ * Removes an emulated breakpoint at a particular address
+ *
+ * @param address The address of the breakpoint to remove
+ */
+void dbg_RemoveBreakpoint(void *address);
+
+/**
+ * Sets an emulated empty watchpoint at a particular address
+ *
+ * @param address The address of the watchpoint to set
+ * @param length The size of the data at the address (values 1-4)
+ */
+void dbg_SetWatchpoint(void *address, unsigned int length);
+
+/**
+ * Sets an emulated read watchpoint at a particular address
+ *
+ * @param address The address of the watchpoint to set
+ * @param length The size of the data at the address (values 1-4)
+ */
+void dbg_SetReadWatchpoint(void *address, unsigned int length);
+
+/**
+ * Sets an emulated write watchpoint at a particular address
+ *
+ * @param address The address of the watchpoint to set
+ * @param length The size of the data at the address (values 1-4)
+ */
+void dbg_SetWriteWatchpoint(void *address, unsigned int length);
+
+/**
+ * Sets an emulated read/write watchpoint at a particular address
+ *
+ * @param address The address of the watchpoint to set
+ * @param length The size of the data at the address (values 1-4)
+ */
+void dbg_SetReadWriteWatchpoint(void *address, unsigned int length);
+
+/**
+ * Removes an emulated watchpoint at a particular address
+ *
+ * @param address The address of the watchpoint to remove
+ */
+void dbg_RemoveWatchpoint(void *address);
+
+/**
+ * Removes all emulated watchpoints
+ */
+void dbg_RemoveAllWatchpoints(void);
+
+/**
+ * Removes all emulated breakpoints
+ */
+void dbg_RemoveAllBreakpoints(void);
+
+#define dbgout ((char*)0xFB0000) /**< Standard debug output */
+#define dbgerr ((char*)0xFC0000) /**< Error debug output */
+#define dbg_sprintf sprintf
+#define dbg_ClearConsole() (*(unsigned char*)0xFD0000 = 1)
+#else
+#define dbg_Debugger(ignore) ((void)0)
+#define dbg_SetBreakpoint(ignore) ((void)0)
+#define dbg_RemoveBreakpoint(ignore) ((void)0)
+#define dbg_SetWatchpoint(ignore,ignore) ((void)0)
+#define dbg_SetReadWatchpoint(ignore,ignore) ((void)0)
+#define dbg_SetWriteWatchpoint(ignore,ignore) ((void)0)
+#define dbg_SetReadWriteWatchpoint(ignore,ignore) ((void)0)
+#define dbg_RemoveWatchpoint(ignore) ((void)0)
+#define dbg_RemoveAllWatchpoints(ignore) ((void)0)
+#define dbg_RemoveAllBreakpoints(ignore) ((void)0)
+#define dbg_sprintf if(0)(void)
+#define dbg_ClearConsole(ignore) ((void)0)
+#define dbgout (NULL)
+#define dbgerr (NULL)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/frontends/calculator/CEdev/include/decompress.h b/frontends/calculator/CEdev/include/decompress.h index 451008b..1fdfa1e 100644 --- a/frontends/calculator/CEdev/include/decompress.h +++ b/frontends/calculator/CEdev/include/decompress.h @@ -1,23 +1,23 @@ -/** - * @file - * @author Matt "MateoConLechuga" Waltz - * @brief Optimized decompression routines - */ - -#ifndef DECOMPRESS_H -#define DECOMPRESS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#warning compatibility defines (do not use) -void dzx7_Turbo(void *src, void *dst); -void dzx7_Standard(void *src, void *dst); - -#ifdef __cplusplus -} -#endif - -#endif - +/**
+ * @file
+ * @author Matt "MateoConLechuga" Waltz
+ * @brief Optimized decompression routines
+ */
+
+#ifndef DECOMPRESS_H
+#define DECOMPRESS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#warning compatibility defines (do not use)
+void dzx7_Turbo(void *src, void *dst);
+void dzx7_Standard(void *src, void *dst);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/frontends/calculator/CEdev/include/errno.h b/frontends/calculator/CEdev/include/errno.h index f72dfef..0e397bf 100644 --- a/frontends/calculator/CEdev/include/errno.h +++ b/frontends/calculator/CEdev/include/errno.h @@ -1,15 +1,15 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef ERRNO_H -#define ERRNO_H - -#define ERR_NOR 1 /* read not allowed for file */ -#define ERR_NOW 2 /* write not allowed for file */ -#define ERR_IO 3 /* io error */ -#define EDOM 4 /* domain error */ -#define ERANGE 5 /* range error */ -extern int errno; -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef ERRNO_H
+#define ERRNO_H
+
+#define ERR_NOR 1 /* read not allowed for file */
+#define ERR_NOW 2 /* write not allowed for file */
+#define ERR_IO 3 /* io error */
+#define EDOM 4 /* domain error */
+#define ERANGE 5 /* range error */
+extern int errno;
+#endif
diff --git a/frontends/calculator/CEdev/include/fasmg-ez80/ez80.inc b/frontends/calculator/CEdev/include/fasmg-ez80/ez80.inc index 6e8e005..73c2175 100644 --- a/frontends/calculator/CEdev/include/fasmg-ez80/ez80.inc +++ b/frontends/calculator/CEdev/include/fasmg-ez80/ez80.inc @@ -1,862 +1,862 @@ -define @ez80 @ez80 -macro @ez80.suffix @l, @il* - @ez80.l = @l - @ez80.il = @il - @ez80.lil = @ez80.l or @ez80.il shl 1 - @ez80.pre = @ez80.lil or @ez80.lil shl 3 or 100o -end macro -macro @ez80.byte @values*& - db @values -end macro -macro @ez80.offset @value* - local value - value = @value - if elementsof value - err 'invalid offset' - else if value < -200o | 200o <= value - err 'offset is out of range' - end if - db value -end macro -macro @ez80.word @value* - local value - value = @value - if elementsof value - err 'invalid immediate' - end if - emit word + @ez80.il: @value -end macro -macro @ez80.idxpre @regs*& - local pre - iterate @reg, @regs - pre = @reg metadata 1 scale 1 - if pre > 300o - @ez80.byte pre - break - end if - end iterate -end macro -macro @ez80.idxoff @reg* - local reg - reg = @reg - if reg metadata 1 scale 1 > 300o - @ez80.offset @reg scale 0 - else if reg scale 0 - err 'invalid arguments' - end if -end macro -macro @ez80.emit @values*& - if defined @ez80.pre - db @ez80.pre - end if - iterate @value, @values - @ez80.@value - end iterate -end macro -macro @ez80.nest @inst*& - if defined @ez80.pre - @ez80.pre =: @ez80.pre - end if - @inst -end macro -macro @ez80.check @ind*, @expr& - match @left ) @right, <@expr> - match @ ( @mid, <@left> - @ez80.check @ind, @mid @right - else - @ind =: 0 - end match - else - @ind =: 1 - end match -end macro -macro @ez80.classify @val, @ind*, @arg& - match, @arg - @ind =: 0 - else - @val =: @arg - match ( @ ), @arg - @ez80.check @ind, @ - else - @ind =: 0 - end match - end match -end macro - -long? = 3 -; FIXME: dup relocations -macro dw? @values*& - if @ez80.adl - emit word?: @values - else - match left =dup? right, @values - emit word?: @values - else - iterate @value, @values - @ez80.word @value - end iterate - end match - end if -end macro -macro dl? @values*& - if @ez80.adl - match left =dup? right, @values - emit long?: @values - else - iterate @value, @values - @ez80.word @value - end iterate - end match - else - emit long?: @values - end if -end macro -iterate @name, dw, rw, dl, rl - struc (name) @name? @values*& - label name: long? - @name? @values - end struc -end iterate -macro assume? @expr* - match =adl? == @adl, @expr - local adl - adl = @adl - if adl = adl and 1 - @ez80.l = adl - @ez80.il = adl - @ez80.adl = adl - else - err 'adl assume should be 0 or 1' - end if - else - err 'invalid assume statement' - end match -end macro -assume? adl = 1 - -element @ez80.breg -element b?: @ez80.breg * 003o + 030o -element nz?: @ez80.breg * 010o + 001o -element z?: @ez80.breg * 010o + 011o -element nc?: @ez80.breg * 010o + 021o -element c?: @ez80.breg * 003o + 031o -element po?: @ez80.breg * 010o + 041o -element pe?: @ez80.breg * 010o + 051o -nv? = po? -v? = pe? -element p?: @ez80.breg * 010o + 061o -element m?: @ez80.breg * 010o + 071o -element d?: @ez80.breg * 003o + 032o -element e?: @ez80.breg * 003o + 033o -element h?: @ez80.breg * 003o + 034o -element ixh?: @ez80.breg * 335o + 034o -element iyh?: @ez80.breg * 375o + 034o -element l?: @ez80.breg * 003o + 035o -element ixl?: @ez80.breg * 335o + 035o -element iyl?: @ez80.breg * 375o + 035o -element f?: @ez80.breg * 002o + 036o -element a?: @ez80.breg * 003o + 037o - -element @ez80.irmb -element i?: @ez80.irmb * 107o + 127o -element r?: @ez80.irmb * 117o + 137o -element mb?: @ez80.irmb * 155o + 156o - -element @ez80.wreg -element bc?: @ez80.wreg * 007o + 000o -element de?: @ez80.wreg * 007o + 020o -element hl?: @ez80.wreg * 007o + 040o -element ix?: @ez80.wreg * 335o + 040o -element iy?: @ez80.wreg * 375o + 040o -element sp?: @ez80.wreg * 006o + 060o -element af?: @ez80.wreg * 001o + 060o -element af'? - -@ez80.is_reg equ metadata 1 element 1 eq - -macro inst! @name*, @params& - restore @name? - define @name? @name? - @ez80.oplist equ @name? - namespace @name? - macro s? @args& - @ez80.suffix 0, @ez80.il - @name? @args - end macro - macro l? @args& - @ez80.suffix 1, @ez80.il - @name? @args - end macro - macro is? @args& - @ez80.suffix @ez80.l, 0 - @name? @args - end macro - macro il? @args& - @ez80.suffix @ez80.l, 1 - @name? @args - end macro - macro sis? @args& - @ez80.suffix 0, 0 - @name? @args - end macro - macro lis? @args& - @ez80.suffix 1, 0 - @name? @args - end macro - macro sil? @args& - @ez80.suffix 0, 1 - @name? @args - end macro - macro lil? @args& - @ez80.suffix 1, 1 - @name? @args - end macro - end namespace - local @temp - virtual - iterate @param, @params - match @arg @, @param* - @temp = string `@arg shr 8 - db 'local ', @temp, ', ', @temp, 'ind', 10 - match @arg &, @param - db 'iterate @, ', `@arg, 10, 9, 'indx %%-%+1', 10, 9 - end match - db '@ez80.classify ', @temp, ', ', @temp, 'ind, ' - match @@ &, @param - db '@', 10, 'end iterate', 10 - else - db `@arg, 10 - end match - end match - end iterate - load @temp: $ - $$ from $$ - end virtual - esc macro @name?: @params - local before, after, noerr - label before - eval @temp -end macro -macro end?.inst! - label after - if ~defined noerr & before = after - err 'invalid arguments' - end if - restore @ez80.pre - assume? adl = @ez80.adl - esc end macro -end macro - -iterate <@name, @opc*>, \ - nop, 000o, \ - rlca, 007o, \ - rrca, 017o, \ - rla, 027o, \ - rra, 037o, \ - daa, 047o, \ - cpl, 057o, \ - scf, 067o, \ - ccf, 077o, \ - halt, 166o, \ - exx, 331o, \ - di, 363o, \ - ei, 373o, \ - neg, <355o, 104o>, \ - retn, <355o, 105o>, \ - reti, <355o, 115o>, \ - rrd, <355o, 147o>, \ - rld, <355o, 157o>, \ - slp, <355o, 166o>, \ - stmix, <355o, 175o>, \ - rsmix, <355o, 176o>, \ - inim, <355o, 202o>, \ - otim, <355o, 203o>, \ - ini2, <355o, 204o>, \ - indm, <355o, 212o>, \ - otdm, <355o, 213o>, \ - ind2, <355o, 214o>, \ - inimr, <355o, 222o>, \ - otimr, <355o, 223o>, \ - ini2r, <355o, 224o>, \ - indmr, <355o, 232o>, \ - otdmr, <355o, 233o>, \ - ind2r, <355o, 234o>, \ - ldi, <355o, 240o>, \ - cpi, <355o, 241o>, \ - ini, <355o, 242o>, \ - outi, <355o, 243o>, \ - outi2, <355o, 244o>, \ - ldd, <355o, 250o>, \ - cpd, <355o, 251o>, \ - ind, <355o, 252o>, \ - outd, <355o, 253o>, \ - outd2, <355o, 254o>, \ - ldir, <355o, 260o>, \ - cpir, <355o, 261o>, \ - inir, <355o, 262o>, \ - otir, <355o, 263o>, \ - oti2r, <355o, 264o>, \ - lddr, <355o, 270o>, \ - cpdr, <355o, 271o>, \ - indr, <355o, 272o>, \ - otdr, <355o, 273o>, \ - otd2r, <355o, 274o>, \ - inirx, <355o, 302o>, \ - otirx, <355o, 303o>, \ - indrx, <355o, 312o>, \ - otdrx, <355o, 313o> - inst @name - @ez80.emit <byte @opc> - end inst -end iterate - -iterate @name, inc, dec - inst @name, @reg* - if regind - if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 0 = 040o - @ez80.emit idxpre reg, byte 063o + %, idxoff reg - end if - else if reg eq reg element 1 - if reg @ez80.is_reg @ez80.wreg & reg metadata 1 scale 1 and 004o - @ez80.emit idxpre reg, byte reg metadata 1 scale 0 - 005o \ - + % shl 3 - else if reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 and 001o - @ez80.emit idxpre reg, byte reg metadata 1 scale 0 shl 3 \ - and 070o or % + 3 - end if - end if - end inst -end iterate - -inst ex, @arg1, @arg2* - if arg1ind - if arg2ind - err 'invalid indirection' - else if arg1 eq sp? & arg2 eq arg2 element 1 \ - & arg2 @ez80.is_reg @ez80.wreg & arg2 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg2, byte 343o - end if - else if arg2ind - @ez80.nest ex? @arg2, @arg1 - else if (arg1 eq af? & arg2 eq af'?) | (arg1 eq af'? & arg2 eq af?) - @ez80.emit byte 010o - else if (arg1 eq de? & arg2 eq hl?) | (arg1 eq hl? & arg2 eq de?) - @ez80.emit byte 353o - end if -end inst - -inst djnz, @addr* - if addrind - err 'invalid indirection' - else - @ez80.emit byte 020o, offset addr - after - end if -end inst -inst jr, @arg1*, @arg2 - if arg1ind | arg2ind - err 'invalid indirection' - else if ~defined arg2 - @ez80.emit byte 030o, offset arg1 - after - else - if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 0 and 047o = 001o - @ez80.emit byte arg1 metadata 1 scale 0 and 030o or 040o, \ - offset arg2 - after - end if - end if -end inst -inst jq, @arg1*, @arg2 - local off, keep - if arg1ind | arg2ind - err 'invalid indirection' - else if ~defined arg2 - off = arg1 - before - 2 - if defined @ez80.pre - off = off - 1 - end if - if defined noerr & ~arg1 eq after | defined keep - define keep - end if - if defined after & arg1 eq after & ~defined keep - define noerr - else if ~elementsof off & -200o <= off & off < 200o - @ez80.emit byte 030o, offset off - else - @ez80.emit byte 303o, word arg1 - end if - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 0 and 007o = 001o - off = arg2 - before - 2 - if defined @ez80.pre - off = off - 1 - end if - if defined noerr & ~arg2 eq after | defined keep - define keep - end if - if defined after & arg2 eq after & ~defined keep - define noerr - else if arg1 metadata 1 scale 0 < 040o & ~elementsof off & -200o <= off & off < 200o - @ez80.emit byte arg1 metadata 1 scale 0 and 030o or 040o, \ - offset off - else - @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 302o, \ - word arg2 - end if - end if -end inst - -inst ld, @dst, @src* - local opc - if dstind & srcind - err 'invalid indirection' - else if dstind - if dst relativeto dst element 1 & dst @ez80.is_reg @ez80.wreg - if dst metadata 1 scale 0 = 040o - if src eq src element 1 & src @ez80.is_reg @ez80.breg \ - & src metadata 1 scale 1 = 003o - @ez80.emit idxpre dst, byte src metadata 1 scale 0 \ - and 007o or 160o, idxoff dst - else if src eq src element 1 & src @ez80.is_reg @ez80.wreg \ - & src metadata 1 scale 1 and 005o = 005o - opc = src metadata 1 scale 0 or 017o - if src metadata 1 scale 1 > 300o - if dst metadata 1 scale 1 xor src metadata 1 scale 1 \ - and 040o - opc = opc + 017o - else - opc = opc + 020o - end if - end if - if dst metadata 1 scale 1 > 300o - @ez80.emit idxpre dst, byte opc, idxoff dst - else - @ez80.emit <byte 355o, opc> - end if - else - @ez80.emit idxpre dst, byte 066o, idxoff dst, byte src - end if - else if src eq a? & dst metadata 1 scale 0 < 040o - @ez80.emit byte dst metadata 1 scale 0 or 002o - end if - else if src eq a? - @ez80.emit byte 062o, word dst - else if src eq src element 1 & src @ez80.is_reg @ez80.wreg \ - & src metadata 1 scale 1 and 004o - if src metadata 1 scale 0 = 040o - @ez80.emit idxpre src, byte 042o, word dst - else - @ez80.emit <byte 355o, src metadata 1 scale 0 or 103o>, word dst - end if - end if - else if srcind - if ~dst eq dst element 1 - else if src relativeto src element 1 & src @ez80.is_reg @ez80.wreg - if src metadata 1 scale 0 = 040o - if dst @ez80.is_reg @ez80.breg & dst metadata 1 scale 1 = 003o - @ez80.emit idxpre src, byte dst metadata 1 scale 0 \ - shl 3 and 070o or 106o, idxoff src - else if dst @ez80.is_reg @ez80.wreg \ - & dst metadata 1 scale 1 and 005o = 005o - opc = dst metadata 1 scale 0 or 007o - if dst metadata 1 scale 1 > 300o - if dst metadata 1 scale 1 xor src metadata 1 scale 1 \ - and 040o - opc = opc + 012o - else - opc = opc + 020o - end if - end if - if src metadata 1 scale 1 > 300o - @ez80.emit idxpre src, byte opc, idxoff src - else - @ez80.emit <byte 355o, opc> - end if - end if - else if dst eq a? & src metadata 1 scale 0 < 040o - @ez80.emit byte src metadata 1 scale 0 or 012o - end if - else if dst eq a? - @ez80.emit byte 072o, word src - else if dst @ez80.is_reg @ez80.wreg & dst metadata 1 scale 1 and 004o - if dst metadata 1 scale 0 = 040o - @ez80.emit idxpre dst, byte 052o, word src - else - @ez80.emit <byte 355o, dst metadata 1 scale 0 or 113o>, word src - end if - end if - else if dst eq dst element 1 - if dst @ez80.is_reg @ez80.breg - if src eq src element 1 & src @ez80.is_reg @ez80.breg \ - & dst metadata 1 scale 1 and src metadata 1 scale 1 and 001o \ - & (dst metadata 1 scale 0 xor src metadata 1 scale 0 and 006o \ - | dst metadata 1 scale 1 = src metadata 1 scale 1) \ - & (~dst eq src | dst metadata 1 scale 0 > 033o) - @ez80.emit <idxpre dst, src>, \ - byte dst metadata 1 scale 0 shl 3 and 070o \ - + src metadata 1 scale 0 and 007o or 100o - else if src eq src element 1 & src @ez80.is_reg @ez80.irmb \ - & dst eq a? - @ez80.emit <byte 355o, src metadata 1 scale 0> - else if dst metadata 1 scale 1 and 001o - @ez80.emit idxpre dst, \ - byte dst metadata 1 scale 0 shl 3 and 070o or 006o, \ - byte src - end if - else if dst @ez80.is_reg @ez80.wreg & dst metadata 1 scale 1 and 004o - if dst eq sp? & src eq src element 1 & src @ez80.is_reg @ez80.wreg \ - & src metadata 1 scale 0 = 040o - @ez80.emit idxpre src, byte 371o - else if dst eq hl? & src eq i? - @ez80.emit <byte 355o, 327o> - else - @ez80.emit idxpre dst, byte dst metadata 1 scale 0 or 001o, \ - word src - end if - else if dst @ez80.is_reg @ez80.irmb & src eq a? - @ez80.emit <byte 355o, dst metadata 1 scale 1> - else if dst eq i? & src eq hl? - @ez80.emit <byte 355o, 307o> - end if - end if -end inst - -inst add, @arg1*, @arg2 - if ~defined arg2 - @ez80.nest a?, @arg1 - else if arg1ind - err 'invalid indirection' - else if arg1 eq a? - if arg2ind - if arg2 relativeto arg2 element 1 & arg2 @ez80.is_reg @ez80.wreg \ - & arg2 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg2, byte 206o, idxoff arg2 - end if - else if arg2 eq arg2 element 1 & arg2 @ez80.is_reg @ez80.breg \ - & arg2 metadata 1 scale 1 and 001o - @ez80.emit idxpre arg2, byte arg2 metadata 1 scale 0 and 007o \ - or 200o - else - @ez80.emit <byte 306o, arg2> - end if - else if arg2ind - err 'invalid indirection' - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.wreg \ - & arg2 eq arg2 element 1 & arg1 @ez80.is_reg @ez80.wreg \ - & arg1 metadata 1 scale 0 = 040o & arg2 metadata 1 scale 1 and 004o \ - & (arg1 metadata 1 scale 0 <> arg2 metadata 1 scale 0 \ - | arg1 metadata 1 scale 1 = arg2 metadata 1 scale 1) - @ez80.emit idxpre arg1, byte arg2 metadata 1 scale 0 or 011o - end if -end inst -iterate @name, adc, sbc - inst @name, @arg1*, @arg2 - if ~defined arg2 - if arg1 @ez80.is_reg @ez80.wreg - @ez80.nest hl?, @arg1 - else - @ez80.nest a?, @arg1 - end if - else if arg1ind - err 'invalid indirection' - else if arg1 eq a? - if arg2ind - if arg2 relativeto arg2 element 1 \ - & arg2 @ez80.is_reg @ez80.wreg \ - & arg2 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg2, byte 176o + % shl 4, idxoff arg2 - end if - else if arg2 eq arg2 element 1 & arg2 @ez80.is_reg @ez80.breg \ - & arg2 metadata 1 scale 1 and 001o - @ez80.emit idxpre arg2, byte arg2 metadata 1 scale 0 and 007o \ - or 170o + % shl 4 - else - @ez80.emit <byte 276o + % shl 4, arg2> - end if - else if arg2ind - err 'invalid indirection' - else if arg1 eq hl? & arg2 eq arg2 element 1 \ - & arg2 @ez80.is_reg @ez80.wreg \ - & arg2 metadata 1 scale 1 and 002o - @ez80.emit <byte 355o, arg2 metadata 1 scale 0 + 122o - % shl 3> - end if - end inst -end iterate -iterate <@name, @opc*>, \ - sub, 220o, \ - and, 240o, \ - xor, 250o, \ - or, 260o, \ - cp, 270o - inst @name, @arg1*, @arg2 - if ~defined arg2 - if arg1ind - if arg1 relativeto arg1 element 1 \ - & arg1 @ez80.is_reg @ez80.wreg \ - & arg1 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg1, byte @opc or 006o, idxoff arg1 - end if - else if arg1 relativeto arg1 element 1 \ - & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 1 and 001o - @ez80.emit idxpre arg1, byte arg1 metadata 1 scale 0 and 007o \ - or @opc - else - @ez80.emit <byte @opc or 106o, arg1> - end if - else if arg1ind - err 'invalid indirection' - else if arg1 eq a? - @ez80.nest @name? @arg2 - end if - end inst -end iterate -inst tst, @arg1*, @arg2 - if ~defined arg2 - if arg1ind - if arg1 eq hl? - @ez80.emit <byte 355o, 064o> - end if - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 1 = 003o - @ez80.emit <byte 355o, \ - arg1 metadata 1 scale 0 shl 3 and 070o or 004o> - else - @ez80.emit <byte 355o, 144o, arg1> - end if - else if arg1ind - err 'invalid indirection' - else if arg1 eq a? - @ez80.nest tst? @arg2 - end if -end inst - -inst ret, @cond - if ~defined cond - @ez80.emit byte 311o - else if condind - err 'invalid indirection' - else if cond eq cond element 1 & cond @ez80.is_reg @ez80.breg \ - & cond metadata 1 scale 0 and 007o = 001o - @ez80.emit byte cond metadata 1 scale 0 and 070o or 300o - end if -end inst -iterate @name, pop, push - inst @name, @reg*& - while defined reg + regind - if regind - err 'invalid indirection' - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 1 and 001o - @ez80.emit idxpre reg, \ - byte reg metadata 1 scale 0 + 275o + % shl 2 - else if `@name = 'push' - @ez80.nest pea? reg - else - err 'invalid argument' - end if - restore reg, regind - end while - end inst -end iterate - -inst jp, @arg1*, @arg2 - if ~defined arg2 - if ~arg1ind - @ez80.emit byte 303o, word arg1 - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.wreg \ - & arg1 metadata 1 scale 0 = 040o - @ez80.emit idxpre arg1, byte 351o - end if - else if arg1ind | arg2ind - err 'invalid indirection' - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 0 and 007o = 001o - @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 302o, word arg2 - end if -end inst -inst call, @arg1*, @arg2 - if arg1ind | arg2ind - err 'invalid indirection' - else if ~defined arg2 - @ez80.emit byte 315o, word arg1 - else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \ - & arg1 metadata 1 scale 0 and 007o = 001o - @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 304o, word arg2 - end if -end inst -inst rst, @addr* - if addrind - err 'invalid indirection' - else if addr = addr and 070o - @ez80.emit byte addr or 307o - else - err 'invalid rst target' - end if -end inst - -iterate <@name, @opc*>, \ - rlc, 000o, \ - rrc, 010o, \ - rl, 020o, \ - rr, 030o, \ - sla, 040o, \ - sra, 050o, \ - srl, 070o - inst @name, @reg* - if `@name = 'rl' & ~defined @ez80.pre & ~elementsof reg - rb long? * reg - define noerr - else if regind - if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 0 = 040o - @ez80.emit idxpre reg, byte 313o, idxoff reg, byte @opc or 006o - end if - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 = 003o - @ez80.emit <byte 313o, reg metadata 1 scale 0 and 007o or @opc> - end if - end inst -end iterate -iterate @name, bit, res, set - inst @name, @bit, @reg* - if bitind - err 'invalid indirection' - else if regind - if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 0 = 040o - @ez80.emit idxpre reg, byte 313o, idxoff bit shr 3 + reg, \ - byte bit shl 3 and 070o or % shl 6 or 006o - end if - else if reg eq reg element 1 - if reg @ez80.is_reg @ez80.breg & reg metadata 1 scale 1 = 003o \ - & bit = bit and 007o - @ez80.emit <byte 313o, reg metadata 1 scale 0 and 007o \ - or % shl 6 or bit shl 3> - else if reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 1 = 007o & bit = bit and 017o - @ez80.emit <byte 313o, bit shl 3 and 070o or % shl 6 \ - or reg metadata 1 scale 0 shr 3 \ - or 001o and not bit shr 3> - end if - end if - end inst -end iterate - -inst out, @port, @reg* - if ~portind - err 'missing indirection' - else if regind - err 'invalid indirection' - else if port eq bc? | port eq c? - if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 = 003o - @ez80.emit <byte 355o, reg metadata 1 scale 0 shl 3 and 070o \ - or 101o> - else if ~reg - @ez80.emit <byte 355o, 161o> - end if - else if reg eq a? - @ez80.emit <byte 323o, port> - end if -end inst -inst in, @reg*, @port - if ~defined port - @ez80.nest in? f?, @reg - else if regind - err 'invalid indirection' - else if ~portind - err 'missing indirection' - else if port eq bc? | port eq c? & reg eq reg element 1 \ - & reg @ez80.is_reg @ez80.breg & reg metadata 1 scale 1 and 002o - @ez80.emit <byte 355o, reg metadata 1 scale 0 shl 3 and 070o \ - or 100o> - else if reg eq a? - @ez80.emit <byte 333o, port> - end if -end inst -inst in0, @reg*, @port - if ~defined port - @ez80.nest in0? f?, @reg - else if regind - err 'invalid indirection' - else if ~portind - err 'missing indirection' - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 and 002o - @ez80.emit <byte 355o, reg metadata 1 scale 0 shl 3 and 070o \ - or 000o, port> - end if -end inst -inst out0, @port, @reg* - if ~portind - err 'missing indirection' - else if regind - err 'invalid indirection' - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \ - & reg metadata 1 scale 1 = 003o - @ez80.emit <byte 355o, reg metadata 1 scale 0 shl 3 and 070o \ - or 001o, port> - end if -end inst -inst tstio, @src* - if srcind - err 'invalid indirection' - else - @ez80.emit <byte 355o, 164o, src> - end if -end inst - -inst lea, @dst, @src* - if dstind | srcind - err 'invalid indirection' - else if dst eq dst element 1 & src relativeto src element 1 \ - & dst @ez80.is_reg @ez80.wreg & src @ez80.is_reg @ez80.wreg \ - & dst metadata 1 scale 0 <> 060o & src metadata 1 scale 1 > 300o - local opc - if dst metadata 1 scale 1 and 002o - opc = src metadata 1 scale 1 shr 5 and 001o \ - or dst metadata 1 scale 0 or 002o - else if dst relativeto src - opc = dst metadata 1 scale 1 shr 5 and 001o or 062o - else - opc = dst metadata 1 scale 1 shr 5 and 001o or 124o - end if - @ez80.emit <byte 355o, opc>, offset src scale 0 - end if -end inst -inst pea, @src* - if srcind - err 'invalid indirection' - else if src relativeto src element 1 & src @ez80.is_reg @ez80.wreg \ - & src metadata 1 scale 1 > 300o - @ez80.emit <byte 355o, src metadata 1 scale 1 shr 5 and 001o + 145o>, \ - offset src scale 0 - end if -end inst - -inst im, @mode* - if modeind - err 'invalid indirection' - else if mode = 0 - @ez80.emit <byte 355o, 106o> - else if mode = 1 - @ez80.emit <byte 355o, 126o> - else if mode = 2 - @ez80.emit <byte 355o, 136o> - else - err 'invalid mode' - end if -end inst - -inst mlt, @reg* - if regind - err 'invalid indirection' - else if reg eq reg element 1 & reg @ez80.is_reg @ez80.wreg \ - & reg metadata 1 scale 1 and 002o - @ez80.emit <byte 355o, reg metadata 1 scale 0 or 114o> - end if -end inst - -purge inst -purge end?.inst +define @ez80 @ez80
+macro @ez80.suffix @l, @il*
+ @ez80.l = @l
+ @ez80.il = @il
+ @ez80.lil = @ez80.l or @ez80.il shl 1
+ @ez80.pre = @ez80.lil or @ez80.lil shl 3 or 100o
+end macro
+macro @ez80.byte @values*&
+ db @values
+end macro
+macro @ez80.offset @value*
+ local value
+ value = @value
+ if elementsof value
+ err 'invalid offset'
+ else if value < -200o | 200o <= value
+ err 'offset is out of range'
+ end if
+ db value
+end macro
+macro @ez80.word @value*
+ local value
+ value = @value
+ if elementsof value
+ err 'invalid immediate'
+ end if
+ emit word + @ez80.il: @value
+end macro
+macro @ez80.idxpre @regs*&
+ local pre
+ iterate @reg, @regs
+ pre = @reg metadata 1 scale 1
+ if pre > 300o
+ @ez80.byte pre
+ break
+ end if
+ end iterate
+end macro
+macro @ez80.idxoff @reg*
+ local reg
+ reg = @reg
+ if reg metadata 1 scale 1 > 300o
+ @ez80.offset @reg scale 0
+ else if reg scale 0
+ err 'invalid arguments'
+ end if
+end macro
+macro @ez80.emit @values*&
+ if defined @ez80.pre
+ db @ez80.pre
+ end if
+ iterate @value, @values
+ @ez80.@value
+ end iterate
+end macro
+macro @ez80.nest @inst*&
+ if defined @ez80.pre
+ @ez80.pre =: @ez80.pre
+ end if
+ @inst
+end macro
+macro @ez80.check @ind*, @expr&
+ match @left ) @right, <@expr>
+ match @ ( @mid, <@left>
+ @ez80.check @ind, @mid @right
+ else
+ @ind =: 0
+ end match
+ else
+ @ind =: 1
+ end match
+end macro
+macro @ez80.classify @val, @ind*, @arg&
+ match, @arg
+ @ind =: 0
+ else
+ @val =: @arg
+ match ( @ ), @arg
+ @ez80.check @ind, @
+ else
+ @ind =: 0
+ end match
+ end match
+end macro
+
+long? = 3
+; FIXME: dup relocations
+macro dw? @values*&
+ if @ez80.adl
+ emit word?: @values
+ else
+ match left =dup? right, @values
+ emit word?: @values
+ else
+ iterate @value, @values
+ @ez80.word @value
+ end iterate
+ end match
+ end if
+end macro
+macro dl? @values*&
+ if @ez80.adl
+ match left =dup? right, @values
+ emit long?: @values
+ else
+ iterate @value, @values
+ @ez80.word @value
+ end iterate
+ end match
+ else
+ emit long?: @values
+ end if
+end macro
+iterate @name, dw, rw, dl, rl
+ struc (name) @name? @values*&
+ label name: long?
+ @name? @values
+ end struc
+end iterate
+macro assume? @expr*
+ match =adl? == @adl, @expr
+ local adl
+ adl = @adl
+ if adl = adl and 1
+ @ez80.l = adl
+ @ez80.il = adl
+ @ez80.adl = adl
+ else
+ err 'adl assume should be 0 or 1'
+ end if
+ else
+ err 'invalid assume statement'
+ end match
+end macro
+assume? adl = 1
+
+element @ez80.breg
+element b?: @ez80.breg * 003o + 030o
+element nz?: @ez80.breg * 010o + 001o
+element z?: @ez80.breg * 010o + 011o
+element nc?: @ez80.breg * 010o + 021o
+element c?: @ez80.breg * 003o + 031o
+element po?: @ez80.breg * 010o + 041o
+element pe?: @ez80.breg * 010o + 051o
+nv? = po?
+v? = pe?
+element p?: @ez80.breg * 010o + 061o
+element m?: @ez80.breg * 010o + 071o
+element d?: @ez80.breg * 003o + 032o
+element e?: @ez80.breg * 003o + 033o
+element h?: @ez80.breg * 003o + 034o
+element ixh?: @ez80.breg * 335o + 034o
+element iyh?: @ez80.breg * 375o + 034o
+element l?: @ez80.breg * 003o + 035o
+element ixl?: @ez80.breg * 335o + 035o
+element iyl?: @ez80.breg * 375o + 035o
+element f?: @ez80.breg * 002o + 036o
+element a?: @ez80.breg * 003o + 037o
+
+element @ez80.irmb
+element i?: @ez80.irmb * 107o + 127o
+element r?: @ez80.irmb * 117o + 137o
+element mb?: @ez80.irmb * 155o + 156o
+
+element @ez80.wreg
+element bc?: @ez80.wreg * 007o + 000o
+element de?: @ez80.wreg * 007o + 020o
+element hl?: @ez80.wreg * 007o + 040o
+element ix?: @ez80.wreg * 335o + 040o
+element iy?: @ez80.wreg * 375o + 040o
+element sp?: @ez80.wreg * 006o + 060o
+element af?: @ez80.wreg * 001o + 060o
+element af'?
+
+@ez80.is_reg equ metadata 1 element 1 eq
+
+macro inst! @name*, @params&
+ restore @name?
+ define @name? @name?
+ @ez80.oplist equ @name?
+ namespace @name?
+ macro s? @args&
+ @ez80.suffix 0, @ez80.il
+ @name? @args
+ end macro
+ macro l? @args&
+ @ez80.suffix 1, @ez80.il
+ @name? @args
+ end macro
+ macro is? @args&
+ @ez80.suffix @ez80.l, 0
+ @name? @args
+ end macro
+ macro il? @args&
+ @ez80.suffix @ez80.l, 1
+ @name? @args
+ end macro
+ macro sis? @args&
+ @ez80.suffix 0, 0
+ @name? @args
+ end macro
+ macro lis? @args&
+ @ez80.suffix 1, 0
+ @name? @args
+ end macro
+ macro sil? @args&
+ @ez80.suffix 0, 1
+ @name? @args
+ end macro
+ macro lil? @args&
+ @ez80.suffix 1, 1
+ @name? @args
+ end macro
+ end namespace
+ local @temp
+ virtual
+ iterate @param, @params
+ match @arg @, @param*
+ @temp = string `@arg shr 8
+ db 'local ', @temp, ', ', @temp, 'ind', 10
+ match @arg &, @param
+ db 'iterate @, ', `@arg, 10, 9, 'indx %%-%+1', 10, 9
+ end match
+ db '@ez80.classify ', @temp, ', ', @temp, 'ind, '
+ match @@ &, @param
+ db '@', 10, 'end iterate', 10
+ else
+ db `@arg, 10
+ end match
+ end match
+ end iterate
+ load @temp: $ - $$ from $$
+ end virtual
+ esc macro @name?: @params
+ local before, after, noerr
+ label before
+ eval @temp
+end macro
+macro end?.inst!
+ label after
+ if ~defined noerr & before = after
+ err 'invalid arguments'
+ end if
+ restore @ez80.pre
+ assume? adl = @ez80.adl
+ esc end macro
+end macro
+
+iterate <@name, @opc*>, \
+ nop, 000o, \
+ rlca, 007o, \
+ rrca, 017o, \
+ rla, 027o, \
+ rra, 037o, \
+ daa, 047o, \
+ cpl, 057o, \
+ scf, 067o, \
+ ccf, 077o, \
+ halt, 166o, \
+ exx, 331o, \
+ di, 363o, \
+ ei, 373o, \
+ neg, <355o, 104o>, \
+ retn, <355o, 105o>, \
+ reti, <355o, 115o>, \
+ rrd, <355o, 147o>, \
+ rld, <355o, 157o>, \
+ slp, <355o, 166o>, \
+ stmix, <355o, 175o>, \
+ rsmix, <355o, 176o>, \
+ inim, <355o, 202o>, \
+ otim, <355o, 203o>, \
+ ini2, <355o, 204o>, \
+ indm, <355o, 212o>, \
+ otdm, <355o, 213o>, \
+ ind2, <355o, 214o>, \
+ inimr, <355o, 222o>, \
+ otimr, <355o, 223o>, \
+ ini2r, <355o, 224o>, \
+ indmr, <355o, 232o>, \
+ otdmr, <355o, 233o>, \
+ ind2r, <355o, 234o>, \
+ ldi, <355o, 240o>, \
+ cpi, <355o, 241o>, \
+ ini, <355o, 242o>, \
+ outi, <355o, 243o>, \
+ outi2, <355o, 244o>, \
+ ldd, <355o, 250o>, \
+ cpd, <355o, 251o>, \
+ ind, <355o, 252o>, \
+ outd, <355o, 253o>, \
+ outd2, <355o, 254o>, \
+ ldir, <355o, 260o>, \
+ cpir, <355o, 261o>, \
+ inir, <355o, 262o>, \
+ otir, <355o, 263o>, \
+ oti2r, <355o, 264o>, \
+ lddr, <355o, 270o>, \
+ cpdr, <355o, 271o>, \
+ indr, <355o, 272o>, \
+ otdr, <355o, 273o>, \
+ otd2r, <355o, 274o>, \
+ inirx, <355o, 302o>, \
+ otirx, <355o, 303o>, \
+ indrx, <355o, 312o>, \
+ otdrx, <355o, 313o>
+ inst @name
+ @ez80.emit <byte @opc>
+ end inst
+end iterate
+
+iterate @name, inc, dec
+ inst @name, @reg*
+ if regind
+ if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \
+ & reg metadata 1 scale 0 = 040o
+ @ez80.emit idxpre reg, byte 063o + %, idxoff reg
+ end if
+ else if reg eq reg element 1
+ if reg @ez80.is_reg @ez80.wreg & reg metadata 1 scale 1 and 004o
+ @ez80.emit idxpre reg, byte reg metadata 1 scale 0 - 005o \
+ + % shl 3
+ else if reg @ez80.is_reg @ez80.breg \
+ & reg metadata 1 scale 1 and 001o
+ @ez80.emit idxpre reg, byte reg metadata 1 scale 0 shl 3 \
+ and 070o or % + 3
+ end if
+ end if
+ end inst
+end iterate
+
+inst ex, @arg1, @arg2*
+ if arg1ind
+ if arg2ind
+ err 'invalid indirection'
+ else if arg1 eq sp? & arg2 eq arg2 element 1 \
+ & arg2 @ez80.is_reg @ez80.wreg & arg2 metadata 1 scale 0 = 040o
+ @ez80.emit idxpre arg2, byte 343o
+ end if
+ else if arg2ind
+ @ez80.nest ex? @arg2, @arg1
+ else if (arg1 eq af? & arg2 eq af'?) | (arg1 eq af'? & arg2 eq af?)
+ @ez80.emit byte 010o
+ else if (arg1 eq de? & arg2 eq hl?) | (arg1 eq hl? & arg2 eq de?)
+ @ez80.emit byte 353o
+ end if
+end inst
+
+inst djnz, @addr*
+ if addrind
+ err 'invalid indirection'
+ else
+ @ez80.emit byte 020o, offset addr - after
+ end if
+end inst
+inst jr, @arg1*, @arg2
+ if arg1ind | arg2ind
+ err 'invalid indirection'
+ else if ~defined arg2
+ @ez80.emit byte 030o, offset arg1 - after
+ else
+ if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \
+ & arg1 metadata 1 scale 0 and 047o = 001o
+ @ez80.emit byte arg1 metadata 1 scale 0 and 030o or 040o, \
+ offset arg2 - after
+ end if
+ end if
+end inst
+inst jq, @arg1*, @arg2
+ local off, keep
+ if arg1ind | arg2ind
+ err 'invalid indirection'
+ else if ~defined arg2
+ off = arg1 - before - 2
+ if defined @ez80.pre
+ off = off - 1
+ end if
+ if defined noerr & ~arg1 eq after | defined keep
+ define keep
+ end if
+ if defined after & arg1 eq after & ~defined keep
+ define noerr
+ else if ~elementsof off & -200o <= off & off < 200o
+ @ez80.emit byte 030o, offset off
+ else
+ @ez80.emit byte 303o, word arg1
+ end if
+ else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \
+ & arg1 metadata 1 scale 0 and 007o = 001o
+ off = arg2 - before - 2
+ if defined @ez80.pre
+ off = off - 1
+ end if
+ if defined noerr & ~arg2 eq after | defined keep
+ define keep
+ end if
+ if defined after & arg2 eq after & ~defined keep
+ define noerr
+ else if arg1 metadata 1 scale 0 < 040o & ~elementsof off & -200o <= off & off < 200o
+ @ez80.emit byte arg1 metadata 1 scale 0 and 030o or 040o, \
+ offset off
+ else
+ @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 302o, \
+ word arg2
+ end if
+ end if
+end inst
+
+inst ld, @dst, @src*
+ local opc
+ if dstind & srcind
+ err 'invalid indirection'
+ else if dstind
+ if dst relativeto dst element 1 & dst @ez80.is_reg @ez80.wreg
+ if dst metadata 1 scale 0 = 040o
+ if src eq src element 1 & src @ez80.is_reg @ez80.breg \
+ & src metadata 1 scale 1 = 003o
+ @ez80.emit idxpre dst, byte src metadata 1 scale 0 \
+ and 007o or 160o, idxoff dst
+ else if src eq src element 1 & src @ez80.is_reg @ez80.wreg \
+ & src metadata 1 scale 1 and 005o = 005o
+ opc = src metadata 1 scale 0 or 017o
+ if src metadata 1 scale 1 > 300o
+ if dst metadata 1 scale 1 xor src metadata 1 scale 1 \
+ and 040o
+ opc = opc + 017o
+ else
+ opc = opc + 020o
+ end if
+ end if
+ if dst metadata 1 scale 1 > 300o
+ @ez80.emit idxpre dst, byte opc, idxoff dst
+ else
+ @ez80.emit <byte 355o, opc>
+ end if
+ else
+ @ez80.emit idxpre dst, byte 066o, idxoff dst, byte src
+ end if
+ else if src eq a? & dst metadata 1 scale 0 < 040o
+ @ez80.emit byte dst metadata 1 scale 0 or 002o
+ end if
+ else if src eq a?
+ @ez80.emit byte 062o, word dst
+ else if src eq src element 1 & src @ez80.is_reg @ez80.wreg \
+ & src metadata 1 scale 1 and 004o
+ if src metadata 1 scale 0 = 040o
+ @ez80.emit idxpre src, byte 042o, word dst
+ else
+ @ez80.emit <byte 355o, src metadata 1 scale 0 or 103o>, word dst
+ end if
+ end if
+ else if srcind
+ if ~dst eq dst element 1
+ else if src relativeto src element 1 & src @ez80.is_reg @ez80.wreg
+ if src metadata 1 scale 0 = 040o
+ if dst @ez80.is_reg @ez80.breg & dst metadata 1 scale 1 = 003o
+ @ez80.emit idxpre src, byte dst metadata 1 scale 0 \
+ shl 3 and 070o or 106o, idxoff src
+ else if dst @ez80.is_reg @ez80.wreg \
+ & dst metadata 1 scale 1 and 005o = 005o
+ opc = dst metadata 1 scale 0 or 007o
+ if dst metadata 1 scale 1 > 300o
+ if dst metadata 1 scale 1 xor src metadata 1 scale 1 \
+ and 040o
+ opc = opc + 012o
+ else
+ opc = opc + 020o
+ end if
+ end if
+ if src metadata 1 scale 1 > 300o
+ @ez80.emit idxpre src, byte opc, idxoff src
+ else
+ @ez80.emit <byte 355o, opc>
+ end if
+ end if
+ else if dst eq a? & src metadata 1 scale 0 < 040o
+ @ez80.emit byte src metadata 1 scale 0 or 012o
+ end if
+ else if dst eq a?
+ @ez80.emit byte 072o, word src
+ else if dst @ez80.is_reg @ez80.wreg & dst metadata 1 scale 1 and 004o
+ if dst metadata 1 scale 0 = 040o
+ @ez80.emit idxpre dst, byte 052o, word src
+ else
+ @ez80.emit <byte 355o, dst metadata 1 scale 0 or 113o>, word src
+ end if
+ end if
+ else if dst eq dst element 1
+ if dst @ez80.is_reg @ez80.breg
+ if src eq src element 1 & src @ez80.is_reg @ez80.breg \
+ & dst metadata 1 scale 1 and src metadata 1 scale 1 and 001o \
+ & (dst metadata 1 scale 0 xor src metadata 1 scale 0 and 006o \
+ | dst metadata 1 scale 1 = src metadata 1 scale 1) \
+ & (~dst eq src | dst metadata 1 scale 0 > 033o)
+ @ez80.emit <idxpre dst, src>, \
+ byte dst metadata 1 scale 0 shl 3 and 070o \
+ + src metadata 1 scale 0 and 007o or 100o
+ else if src eq src element 1 & src @ez80.is_reg @ez80.irmb \
+ & dst eq a?
+ @ez80.emit <byte 355o, src metadata 1 scale 0>
+ else if dst metadata 1 scale 1 and 001o
+ @ez80.emit idxpre dst, \
+ byte dst metadata 1 scale 0 shl 3 and 070o or 006o, \
+ byte src
+ end if
+ else if dst @ez80.is_reg @ez80.wreg & dst metadata 1 scale 1 and 004o
+ if dst eq sp? & src eq src element 1 & src @ez80.is_reg @ez80.wreg \
+ & src metadata 1 scale 0 = 040o
+ @ez80.emit idxpre src, byte 371o
+ else if dst eq hl? & src eq i?
+ @ez80.emit <byte 355o, 327o>
+ else
+ @ez80.emit idxpre dst, byte dst metadata 1 scale 0 or 001o, \
+ word src
+ end if
+ else if dst @ez80.is_reg @ez80.irmb & src eq a?
+ @ez80.emit <byte 355o, dst metadata 1 scale 1>
+ else if dst eq i? & src eq hl?
+ @ez80.emit <byte 355o, 307o>
+ end if
+ end if
+end inst
+
+inst add, @arg1*, @arg2
+ if ~defined arg2
+ @ez80.nest a?, @arg1
+ else if arg1ind
+ err 'invalid indirection'
+ else if arg1 eq a?
+ if arg2ind
+ if arg2 relativeto arg2 element 1 & arg2 @ez80.is_reg @ez80.wreg \
+ & arg2 metadata 1 scale 0 = 040o
+ @ez80.emit idxpre arg2, byte 206o, idxoff arg2
+ end if
+ else if arg2 eq arg2 element 1 & arg2 @ez80.is_reg @ez80.breg \
+ & arg2 metadata 1 scale 1 and 001o
+ @ez80.emit idxpre arg2, byte arg2 metadata 1 scale 0 and 007o \
+ or 200o
+ else
+ @ez80.emit <byte 306o, arg2>
+ end if
+ else if arg2ind
+ err 'invalid indirection'
+ else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.wreg \
+ & arg2 eq arg2 element 1 & arg1 @ez80.is_reg @ez80.wreg \
+ & arg1 metadata 1 scale 0 = 040o & arg2 metadata 1 scale 1 and 004o \
+ & (arg1 metadata 1 scale 0 <> arg2 metadata 1 scale 0 \
+ | arg1 metadata 1 scale 1 = arg2 metadata 1 scale 1)
+ @ez80.emit idxpre arg1, byte arg2 metadata 1 scale 0 or 011o
+ end if
+end inst
+iterate @name, adc, sbc
+ inst @name, @arg1*, @arg2
+ if ~defined arg2
+ if arg1 @ez80.is_reg @ez80.wreg
+ @ez80.nest hl?, @arg1
+ else
+ @ez80.nest a?, @arg1
+ end if
+ else if arg1ind
+ err 'invalid indirection'
+ else if arg1 eq a?
+ if arg2ind
+ if arg2 relativeto arg2 element 1 \
+ & arg2 @ez80.is_reg @ez80.wreg \
+ & arg2 metadata 1 scale 0 = 040o
+ @ez80.emit idxpre arg2, byte 176o + % shl 4, idxoff arg2
+ end if
+ else if arg2 eq arg2 element 1 & arg2 @ez80.is_reg @ez80.breg \
+ & arg2 metadata 1 scale 1 and 001o
+ @ez80.emit idxpre arg2, byte arg2 metadata 1 scale 0 and 007o \
+ or 170o + % shl 4
+ else
+ @ez80.emit <byte 276o + % shl 4, arg2>
+ end if
+ else if arg2ind
+ err 'invalid indirection'
+ else if arg1 eq hl? & arg2 eq arg2 element 1 \
+ & arg2 @ez80.is_reg @ez80.wreg \
+ & arg2 metadata 1 scale 1 and 002o
+ @ez80.emit <byte 355o, arg2 metadata 1 scale 0 + 122o - % shl 3>
+ end if
+ end inst
+end iterate
+iterate <@name, @opc*>, \
+ sub, 220o, \
+ and, 240o, \
+ xor, 250o, \
+ or, 260o, \
+ cp, 270o
+ inst @name, @arg1*, @arg2
+ if ~defined arg2
+ if arg1ind
+ if arg1 relativeto arg1 element 1 \
+ & arg1 @ez80.is_reg @ez80.wreg \
+ & arg1 metadata 1 scale 0 = 040o
+ @ez80.emit idxpre arg1, byte @opc or 006o, idxoff arg1
+ end if
+ else if arg1 relativeto arg1 element 1 \
+ & arg1 @ez80.is_reg @ez80.breg \
+ & arg1 metadata 1 scale 1 and 001o
+ @ez80.emit idxpre arg1, byte arg1 metadata 1 scale 0 and 007o \
+ or @opc
+ else
+ @ez80.emit <byte @opc or 106o, arg1>
+ end if
+ else if arg1ind
+ err 'invalid indirection'
+ else if arg1 eq a?
+ @ez80.nest @name? @arg2
+ end if
+ end inst
+end iterate
+inst tst, @arg1*, @arg2
+ if ~defined arg2
+ if arg1ind
+ if arg1 eq hl?
+ @ez80.emit <byte 355o, 064o>
+ end if
+ else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \
+ & arg1 metadata 1 scale 1 = 003o
+ @ez80.emit <byte 355o, \
+ arg1 metadata 1 scale 0 shl 3 and 070o or 004o>
+ else
+ @ez80.emit <byte 355o, 144o, arg1>
+ end if
+ else if arg1ind
+ err 'invalid indirection'
+ else if arg1 eq a?
+ @ez80.nest tst? @arg2
+ end if
+end inst
+
+inst ret, @cond
+ if ~defined cond
+ @ez80.emit byte 311o
+ else if condind
+ err 'invalid indirection'
+ else if cond eq cond element 1 & cond @ez80.is_reg @ez80.breg \
+ & cond metadata 1 scale 0 and 007o = 001o
+ @ez80.emit byte cond metadata 1 scale 0 and 070o or 300o
+ end if
+end inst
+iterate @name, pop, push
+ inst @name, @reg*&
+ while defined reg + regind
+ if regind
+ err 'invalid indirection'
+ else if reg eq reg element 1 & reg @ez80.is_reg @ez80.wreg \
+ & reg metadata 1 scale 1 and 001o
+ @ez80.emit idxpre reg, \
+ byte reg metadata 1 scale 0 + 275o + % shl 2
+ else if `@name = 'push'
+ @ez80.nest pea? reg
+ else
+ err 'invalid argument'
+ end if
+ restore reg, regind
+ end while
+ end inst
+end iterate
+
+inst jp, @arg1*, @arg2
+ if ~defined arg2
+ if ~arg1ind
+ @ez80.emit byte 303o, word arg1
+ else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.wreg \
+ & arg1 metadata 1 scale 0 = 040o
+ @ez80.emit idxpre arg1, byte 351o
+ end if
+ else if arg1ind | arg2ind
+ err 'invalid indirection'
+ else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \
+ & arg1 metadata 1 scale 0 and 007o = 001o
+ @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 302o, word arg2
+ end if
+end inst
+inst call, @arg1*, @arg2
+ if arg1ind | arg2ind
+ err 'invalid indirection'
+ else if ~defined arg2
+ @ez80.emit byte 315o, word arg1
+ else if arg1 eq arg1 element 1 & arg1 @ez80.is_reg @ez80.breg \
+ & arg1 metadata 1 scale 0 and 007o = 001o
+ @ez80.emit byte arg1 metadata 1 scale 0 and 070o or 304o, word arg2
+ end if
+end inst
+inst rst, @addr*
+ if addrind
+ err 'invalid indirection'
+ else if addr = addr and 070o
+ @ez80.emit byte addr or 307o
+ else
+ err 'invalid rst target'
+ end if
+end inst
+
+iterate <@name, @opc*>, \
+ rlc, 000o, \
+ rrc, 010o, \
+ rl, 020o, \
+ rr, 030o, \
+ sla, 040o, \
+ sra, 050o, \
+ srl, 070o
+ inst @name, @reg*
+ if `@name = 'rl' & ~defined @ez80.pre & ~elementsof reg
+ rb long? * reg
+ define noerr
+ else if regind
+ if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \
+ & reg metadata 1 scale 0 = 040o
+ @ez80.emit idxpre reg, byte 313o, idxoff reg, byte @opc or 006o
+ end if
+ else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \
+ & reg metadata 1 scale 1 = 003o
+ @ez80.emit <byte 313o, reg metadata 1 scale 0 and 007o or @opc>
+ end if
+ end inst
+end iterate
+iterate @name, bit, res, set
+ inst @name, @bit, @reg*
+ if bitind
+ err 'invalid indirection'
+ else if regind
+ if reg relativeto reg element 1 & reg @ez80.is_reg @ez80.wreg \
+ & reg metadata 1 scale 0 = 040o
+ @ez80.emit idxpre reg, byte 313o, idxoff bit shr 3 + reg, \
+ byte bit shl 3 and 070o or % shl 6 or 006o
+ end if
+ else if reg eq reg element 1
+ if reg @ez80.is_reg @ez80.breg & reg metadata 1 scale 1 = 003o \
+ & bit = bit and 007o
+ @ez80.emit <byte 313o, reg metadata 1 scale 0 and 007o \
+ or % shl 6 or bit shl 3>
+ else if reg @ez80.is_reg @ez80.wreg \
+ & reg metadata 1 scale 1 = 007o & bit = bit and 017o
+ @ez80.emit <byte 313o, bit shl 3 and 070o or % shl 6 \
+ or reg metadata 1 scale 0 shr 3 \
+ or 001o and not bit shr 3>
+ end if
+ end if
+ end inst
+end iterate
+
+inst out, @port, @reg*
+ if ~portind
+ err 'missing indirection'
+ else if regind
+ err 'invalid indirection'
+ else if port eq bc? | port eq c?
+ if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \
+ & reg metadata 1 scale 1 = 003o
+ @ez80.emit <byte 355o, reg metadata 1 scale 0 shl 3 and 070o \
+ or 101o>
+ else if ~reg
+ @ez80.emit <byte 355o, 161o>
+ end if
+ else if reg eq a?
+ @ez80.emit <byte 323o, port>
+ end if
+end inst
+inst in, @reg*, @port
+ if ~defined port
+ @ez80.nest in? f?, @reg
+ else if regind
+ err 'invalid indirection'
+ else if ~portind
+ err 'missing indirection'
+ else if port eq bc? | port eq c? & reg eq reg element 1 \
+ & reg @ez80.is_reg @ez80.breg & reg metadata 1 scale 1 and 002o
+ @ez80.emit <byte 355o, reg metadata 1 scale 0 shl 3 and 070o \
+ or 100o>
+ else if reg eq a?
+ @ez80.emit <byte 333o, port>
+ end if
+end inst
+inst in0, @reg*, @port
+ if ~defined port
+ @ez80.nest in0? f?, @reg
+ else if regind
+ err 'invalid indirection'
+ else if ~portind
+ err 'missing indirection'
+ else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \
+ & reg metadata 1 scale 1 and 002o
+ @ez80.emit <byte 355o, reg metadata 1 scale 0 shl 3 and 070o \
+ or 000o, port>
+ end if
+end inst
+inst out0, @port, @reg*
+ if ~portind
+ err 'missing indirection'
+ else if regind
+ err 'invalid indirection'
+ else if reg eq reg element 1 & reg @ez80.is_reg @ez80.breg \
+ & reg metadata 1 scale 1 = 003o
+ @ez80.emit <byte 355o, reg metadata 1 scale 0 shl 3 and 070o \
+ or 001o, port>
+ end if
+end inst
+inst tstio, @src*
+ if srcind
+ err 'invalid indirection'
+ else
+ @ez80.emit <byte 355o, 164o, src>
+ end if
+end inst
+
+inst lea, @dst, @src*
+ if dstind | srcind
+ err 'invalid indirection'
+ else if dst eq dst element 1 & src relativeto src element 1 \
+ & dst @ez80.is_reg @ez80.wreg & src @ez80.is_reg @ez80.wreg \
+ & dst metadata 1 scale 0 <> 060o & src metadata 1 scale 1 > 300o
+ local opc
+ if dst metadata 1 scale 1 and 002o
+ opc = src metadata 1 scale 1 shr 5 and 001o \
+ or dst metadata 1 scale 0 or 002o
+ else if dst relativeto src
+ opc = dst metadata 1 scale 1 shr 5 and 001o or 062o
+ else
+ opc = dst metadata 1 scale 1 shr 5 and 001o or 124o
+ end if
+ @ez80.emit <byte 355o, opc>, offset src scale 0
+ end if
+end inst
+inst pea, @src*
+ if srcind
+ err 'invalid indirection'
+ else if src relativeto src element 1 & src @ez80.is_reg @ez80.wreg \
+ & src metadata 1 scale 1 > 300o
+ @ez80.emit <byte 355o, src metadata 1 scale 1 shr 5 and 001o + 145o>, \
+ offset src scale 0
+ end if
+end inst
+
+inst im, @mode*
+ if modeind
+ err 'invalid indirection'
+ else if mode = 0
+ @ez80.emit <byte 355o, 106o>
+ else if mode = 1
+ @ez80.emit <byte 355o, 126o>
+ else if mode = 2
+ @ez80.emit <byte 355o, 136o>
+ else
+ err 'invalid mode'
+ end if
+end inst
+
+inst mlt, @reg*
+ if regind
+ err 'invalid indirection'
+ else if reg eq reg element 1 & reg @ez80.is_reg @ez80.wreg \
+ & reg metadata 1 scale 1 and 002o
+ @ez80.emit <byte 355o, reg metadata 1 scale 0 or 114o>
+ end if
+end inst
+
+purge inst
+purge end?.inst
diff --git a/frontends/calculator/CEdev/include/fasmg-ez80/ld.fasmg b/frontends/calculator/CEdev/include/fasmg-ez80/ld.fasmg index e7bdbf8..3c3e168 100644 --- a/frontends/calculator/CEdev/include/fasmg-ez80/ld.fasmg +++ b/frontends/calculator/CEdev/include/fasmg-ez80/ld.fasmg @@ -1,759 +1,759 @@ -assert "\"" = '"' ; check for patched fasmg -include 'tiformat.inc' -define ez80 ez80 -namespace ez80 - include 'ez80.inc' -end namespace -macro ?! $ : $ , \ - $@ : $@ , \ - $$ : $$ , \ - and : and , \ - assert : assert , \ - at : at , \ - break : break , \ - define : define , \ - defined : defined , \ - dup : dup , \ - else : else , \ - emit : emit , \ - end : end , \ - equ : equ , \ - err : err , \ - esc : esc , \ - ez80 : ez80 , \ - from : from , \ - if : if , \ - include : include , \ - irpv : irpv , \ - iterate : iterate , \ - label : label , \ - lengthof : lengthof , \ - load : load , \ - local : local , \ - macro : macro , \ - match : match , \ - mod : mod , \ - namespace: namespace, \ - not : not , \ - or : or , \ - purge : purge , \ - rb : rb , \ - repeat : repeat , \ - restore : restore , \ - restruc : restruc , \ - rawmatch : rawmatch , \ - segment : segment , \ - shl : shl , \ - shr : shr , \ - store : store , \ - struc : struc , \ - used : used , \ - virtual : virtual , \ - while : while , \ - xor : xor - local global, debug, files, segments, hex, output - global equ - segments equ - restore global, segments - - macro files.libs.parse file, offset, isused, anyused* - local private - namespace private - macro library?! name, version* - end if - if anyused - emit 1: $C0, name, 0, version - end if - if 0 - end macro - iterate each, export, export_pointer - macro each?! function* - end if - namespace ez80 - if used global._#function - isused = 1 - global._#function := $ + %-1 - jp offset - virtual - local name - emit 1: '_', `function - load name: $ - $$ from $$ - global equ name = global._#function - end virtual - end if - offset = offset + word + @ez80.il - end namespace - if 0 - end macro - end iterate - if 0 - esc include! file - end if - end namespace - end macro - macro files.libs.handle file, isused* - local offset, anyused - offset = 0 - files.libs.parse file, offset, isused, anyused - anyused := isused - end macro - - macro files.srcs.check file, isused* - local private - namespace private - iterate name, DEF, GLOBAL, PUBLIC, XDEF - iterate style, name, .name - macro style?! symbols*& - end if - iterate symbol, symbols - if used global.symbol - isused = 1 - end if - end iterate - if 0 - end macro - end iterate - end iterate - if 0 - esc include! file - end if - end namespace - end macro - macro files.srcs.parse file* - local private - namespace private - virtual segments.code.area - ?$ equ $ - ?XOR? equ xor - ?AND? equ and - ?OR? equ or - ?SHL? equ shl - ?SHR? equ shr - ?NOT? equ not - iterate name, LIST, NEWPAGE, NOLIST, PAGE - macro name? - end macro - end iterate - iterate name, CPU, TITLE - macro name? arg* - end macro - end iterate - iterate name, COPY, INCLUDE - macro name?! path* - include path - end macro - end iterate - iterate name, EXTERN, EXTERNAL, REF, XREF - macro name? symbols*& - match list : space, symbols - iterate symbol, list - symbol := global.symbol - end iterate - else - iterate symbol, symbols - symbol := global.symbol - end iterate - end match - end macro - end iterate - iterate name, DEF, GLOBAL, PUBLIC, XDEF - macro name? symbols*& - iterate symbol, symbols - global.symbol := symbol - virtual - local name - emit 1: `symbol - load name: $ - $$ from $$ - global equ name = global.symbol - end virtual - end iterate - end macro - end iterate - struc (symbol) EQU? expr* - local error - if ~defined error & defined symbol | error - err 'Symbol "', `symbol, '" already defined' - error = 1 - else - error = 0 - end if - ?symbol = expr - end struc - iterate name, VAR, SET - struc (symbol) name? expr* - ?symbol = expr - end struc - end iterate - macro DS? count - local c - c = count - rb c - end macro - struc DS? count - .: DS? count - end struc - iterate <def,blk,size*>, B,B,1, W,W,2, W24,P,3, L,L,4 - macro D#def? vals*& - local v - iterate val, vals - v = val - emit size: v - end iterate - end macro - macro BLK#blk? count*, init - local c, i - c = count - match, init - emit size: c dup ? - else - i = init - emit size: c dup i - end match - end macro - iterate name, D#def, BLK#blk - struc name? args& - .: name? args - end struc - end iterate - end iterate - iterate <name,alias*>, TRIO,DW24, DF,DL - macro name? vals*& - alias? vals - end macro - struc name? args& - .: name? args - end struc - end iterate - macro ALIGN? val* - local v - v = val - rb v-1 - ($ + v-1) mod v - end macro - macro SEGMENT? name* - segment name - end macro - macro ASSUME? expr* - namespace ez80 - assume? expr - end namespace - end macro - iterate register, B, NZ, Z, NC, C, PO, PE, P, M, D, E, \ - H, IXH, IYH, L, IXL, IYL, F, A, I, R, \ - MB, BC, DE, HL, IX, IY, SP, AF, AF' - register? := ez80.register? - end iterate - iterate suffix, , .s?, .l?, .is?, .il?, .sis?, .sil?, .lis?, .lil? - irpv name, ez80.@ez80.oplist - rawmatch rawname, name - define rawname rawname - macro rawname#suffix args& - namespace ez80 - name#suffix args - end namespace - end macro - end rawmatch - end irpv - macro LD? d, s* - namespace ez80 - @ez80.classify dst, dstind, d - @ez80.classify src, srcind, s - if ~dstind & dst eq dst element 1 & dst @ez80.is_reg @ez80.wreg \ - & dst metadata 1 scale 1 and 001o & ~srcind \ - & src relativeto src element 1 & src @ez80.is_reg @ez80.wreg - if src metadata 1 scale 1 = 007o - PUSH? s - POP? d - else - LEA? d, s - end if - else - LD? d, s - end if - end namespace - end macro - macro JR?#suffix args& - namespace ez80 - jq?#suffix args - end namespace - end macro - end iterate - iterate <name,carry>, UEXT,<OR? A?,A>, SEXT,RLA - macro name? reg* - carry? - SBC? reg, reg - end macro - end iterate - macro COMMENT?! delim*& - end match - local inside - inside = 0 - macro ?! line& - local length, text - length = 0 - if inside - length = lengthof `line - text = `line - else if `line = 'end match' - inside = 1 - length = lengthof `delim - 1 - text = `delim shr 8 - end if - repeat length - if ~text xor `delim and $FF - purge ? - break - end if - text = text shr 8 - end repeat - end macro - end macro - - if defined debug - debug.enabled = 0 - debug.startAddr = $ - iterate name, ALIAS, BASE, DEFINE, ENDREC, SPACE, TAG - macro name? str1* - if debug.enabled - virtual debug - debug.uleb128 debug.name - debug.string str1 - end virtual - end if - end macro - end iterate - iterate name, BEGFUNC, ENDFUNC - macro name? str1, num1, str2* - if debug.enabled - local line, addr - line = num1 - addr = $ - virtual debug - debug.uleb128 debug.name - debug.string str1, str2 - debug.uleb128 line - debug.line, addr - debug.addr - end virtual - debug.line = line - debug.addr = addr - end if - end macro - end iterate - macro BEGREC? str1, num1* - if debug.enabled - virtual debug - debug.uleb128 debug.BEGREC - debug.string str1 - debug.uleb128 num1 - end virtual - end if - end macro - iterate <name,signed>, CLASS,u, DIM,u, LENGTH,u, REG,u, SIZE,u, TYPE,s, VALUE,s - macro name? num1* - if debug.enabled - virtual debug - debug.uleb128 debug.name - debug.signed#leb128 num1 - end virtual - end if - end macro - end iterate - macro DEBUG? str1* - virtual debug - debug.uleb128 debug.FILE, lengthof debug.source - emit 1: debug.source - debug.uleb128 debug.startAddr - debug.addr, debug.DEBUG - debug.string str1 - end virtual - debug.enabled = 1 - debug.line = 0 - debug.addr = debug.startAddr - end macro - macro END?! - end if - if debug.enabled - local addr - segment code - addr = $ - virtual debug - debug.uleb128 debug.END, addr - debug.addr - end virtual - debug.addr = addr - end if - if 0 - end macro - macro ENDEF? - if debug.enabled - virtual debug - debug.uleb128 debug.ENDEF - end virtual - end if - end macro - macro FILE? str1* - debug.source = str1 - end macro - macro LINE? num1* - local line, addr - line = num1 - addr = $ - if line <> debug.line | addr <> debug.addr & debug.enabled - virtual debug - debug.uleb128 debug.LINE, line - debug.line, addr - debug.addr - end virtual - debug.line = line - debug.addr = addr - end if - end macro - else - iterate name, ALIAS, BASE, BEGFUNC, BEGREC, CLASS, DEBUG, \ - DEFINE, DIM, ENDEF, ENDFUNC, ENDREC, FILE, \ - LENGTH, LINE, REG, SIZE, SPACE, TAG, TYPE, VALUE - macro name? args& - end macro - end iterate - macro END?! - end if - if 0 - end macro - end if - - struc ? def::& - . def - end struc - macro ? line& - match .rest, line - rest - else match first= .rest, line - first rest - else - line - end match - end macro - if 1 - include file - end if - purge ? - restruc ? - end virtual - end namespace - end macro - macro files.srcs.handle file, isused* - if ~isused - files.srcs.check file, isused - end if - if isused - files.srcs.parse file - end if - end macro - - macro symbol? args*& - iterate arg, args - rawmatch symbol == value, arg - namespace segments - global.symbol := value - virtual - local name - emit 1: `symbol - load name: $ - $$ from $$ - global equ = name global.symbol - end virtual - end namespace - else - 'Syntax error in symbol arguments' - end rawmatch - end iterate - end macro - - iterate name, srcs, libs - macro files.name.add file, used* - local isused - rawmatch rawused, used - namespace segments - isused = rawused - end namespace - end rawmatch - if `file and $FF = "'" - files.name equ file, isused - else - files.name equ `file, isused - end if - end macro - macro name? args*& - local require - iterate arg, args - match file= =used? =if?= used, arg - files.name.add file, used - else match file= =used?, arg - files.name.add file, 1 - else - files.name.add arg, 0 - end match - end iterate - end macro - end iterate - - macro locate? args*& - iterate arg, args - rawmatch name =at? location, arg - segments equ segments.name? - namespace segments - name? := `name - name.base? := location - end namespace - else - err 'Syntax error in locate argument' - end rawmatch - end iterate - end macro - macro range? args*& - iterate arg, args - rawmatch name lower : upper, arg - locate name at lower - namespace segments - name.high? := upper - end namespace - else - err 'Syntax error in range arguments' - end rawmatch - end iterate - end macro - macro order?: args*& - match first =, second =, rest, args - order first, second - order second, rest - else match first =, second, args - locate second at first.base + first.length - else - err 'Not enough order arguments' - end match - end macro - macro merge? args*& - match name == list, args - order list - iterate segment, list - locate name at segment.base - indx %% - namespace segments - name.top? := segment.base + segment.length - if defined segment.high - name.high? := segment.high - end if - end namespace - break - end iterate - else - err 'Syntax error in merge arguments' - end match - end macro - - macro hex value*, leading: '0', digits: 6 - local val, zero, digit, char - emit 1: ' ' - val = value - zero = leading - repeat digits - digit = (val shr ((%% - %) shl 2)) and 0Fh - if digit < 10 - char = '0' + digit - else - char = 'A' + digit - 10 - end if - if digit - zero = '0' - else if % <> %% - char = zero - end if - emit 1: char - end repeat - end macro - - macro map? - local longest, name - postpone ? - virtual as 'map' - longest = lengthof "Segment" - irpv segment, segments - if longest < lengthof segment - longest = lengthof segment - end if - end irpv - emit 1: "Segment", longest - lengthof "Segment" + 1 dup ' ', "Base Top High Length", 10, longest dup '-', 4 dup " ------", '-', 10 - irpv segment, segments - namespace segment - if longest < lengthof segment - longest = lengthof segment - end if - emit 1: segment, longest - lengthof segment dup ' ' - hex base - hex top - if defined high - hex high - else - emit 1: 7 dup ' ' - end if - hex length, ' ' - emit 1: 'h', 10 - end namespace - end irpv - match any, global - longest = lengthof "Label" - irpv symbol, global - match name == value, symbol - if longest < lengthof name - longest = lengthof name - end if - end match - end irpv - emit 1: 10, "Label", longest - lengthof "Label" + 3 dup ' ', "Value", 10, longest dup '-', 3 dup ' ', 6 dup '-', 10 - irpv symbol, global - match name == value, symbol - emit 1: name, longest - lengthof name + 1 dup ' ', '=' - hex value - emit 1: 10 - end match - end irpv - end match - end virtual - end postpone - end macro - macro dbg? - virtual as 'dbg' - debug:: - end virtual - namespace debug - virtual at 0 - iterate name, EOF, ALIAS, BASE, BEGFUNC, BEGREC, CLASS, DEBUG, DEFINE, \ - DIM, END, ENDEF, ENDFUNC, ENDREC, FILE, LENGTH, LINE, \ - REG, SIZE, SPACE, STRINGS, TAG, TYPE, VALUE - name rb 1 - end iterate - end virtual - line = 0 - addr = 0 - macro uleb128 values*& - iterate value, values - local val - val = value - assert val >= 0 - while val shr 7 > 0 - emit 1: val and 07Fh or 080h - val = val shr 7 - end while - emit 1: val - end iterate - end macro - macro sleb128 values*& - iterate value, values - local val - val = value - while val shr 6 <> 0 & val shr 6 <> -1 - emit 1: val and 07Fh or 080h - val = val shr 7 - end while - emit 1: val and 07Fh - end iterate - end macro - restore strings - macro string values*& - iterate value, values - local count, unfound - count = 0 - unfound = 1 - irpv each, debug.strings - if each = value - unfound = 0 - debug.uleb128 % - break - end if - count = %% - end irpv - if unfound - debug.uleb128 count + 1 - debug.strings =: value - end if - end iterate - end macro - end namespace - end macro - - macro segment name* - end virtual - virtual segments.name.area - end macro - - if ~defined segments - err 'No segments defined' - else - restore output.base, output.top ; forbid forward reference - irpv segment, segments - namespace segment - virtual at base - area?:: - end virtual - if ~defined output.base | output.base > base & ~defined high - output.base = base - end if - end namespace - end irpv - irpv file, files.srcs - files = 0 - files.srcs.handle file - end irpv - if ~defined files - err 'Please pass the input files with -i\'srcs "file1" [if require1], "file2" [if require2], ...\'' - end if - irpv file, files.libs - virtual segments.libs.area - files.libs.handle file - end virtual - end irpv - - if defined debug - virtual debug - if defined debug.strings - debug.uleb128 debug.STRINGS - irpv string, debug.strings - if % = 1 - debug.uleb128 %% - end if - debug.uleb128 lengthof string - emit 1: string - end irpv - end if - debug.uleb128 debug.EOF - end virtual - end if - - irpv segment, segments - namespace segment - virtual area - top? := $ - length? := $ - $$ - initlen? := $@ - $$ - end virtual - if ~defined high - if ~defined output.top | output.top < top - output.top = top - end if - else if top > high - repeat 1, len: length, over: top - high, max: high - base - err 'Segment ', segment, ' is ', `len, ' bytes, ', \ - `over, ' bytes larger than the maximum of ', \ - `max, ' bytes' - end repeat - end if - end namespace - end irpv - org output.base - rb output.top - $ - postpone ? - irpv segment, segments - namespace segment - if ~defined high - load output: initlen from area: base - store output: initlen at base - end if - end namespace - end irpv - end postpone - end if - purge ? -end macro +assert "\"" = '"' ; check for patched fasmg
+include 'tiformat.inc'
+define ez80 ez80
+namespace ez80
+ include 'ez80.inc'
+end namespace
+macro ?! $ : $ , \
+ $@ : $@ , \
+ $$ : $$ , \
+ and : and , \
+ assert : assert , \
+ at : at , \
+ break : break , \
+ define : define , \
+ defined : defined , \
+ dup : dup , \
+ else : else , \
+ emit : emit , \
+ end : end , \
+ equ : equ , \
+ err : err , \
+ esc : esc , \
+ ez80 : ez80 , \
+ from : from , \
+ if : if , \
+ include : include , \
+ irpv : irpv , \
+ iterate : iterate , \
+ label : label , \
+ lengthof : lengthof , \
+ load : load , \
+ local : local , \
+ macro : macro , \
+ match : match , \
+ mod : mod , \
+ namespace: namespace, \
+ not : not , \
+ or : or , \
+ purge : purge , \
+ rb : rb , \
+ repeat : repeat , \
+ restore : restore , \
+ restruc : restruc , \
+ rawmatch : rawmatch , \
+ segment : segment , \
+ shl : shl , \
+ shr : shr , \
+ store : store , \
+ struc : struc , \
+ used : used , \
+ virtual : virtual , \
+ while : while , \
+ xor : xor
+ local global, debug, files, segments, hex, output
+ global equ
+ segments equ
+ restore global, segments
+
+ macro files.libs.parse file, offset, isused, anyused*
+ local private
+ namespace private
+ macro library?! name, version*
+ end if
+ if anyused
+ emit 1: $C0, name, 0, version
+ end if
+ if 0
+ end macro
+ iterate each, export, export_pointer
+ macro each?! function*
+ end if
+ namespace ez80
+ if used global._#function
+ isused = 1
+ global._#function := $ + %-1
+ jp offset
+ virtual
+ local name
+ emit 1: '_', `function
+ load name: $ - $$ from $$
+ global equ name = global._#function
+ end virtual
+ end if
+ offset = offset + word + @ez80.il
+ end namespace
+ if 0
+ end macro
+ end iterate
+ if 0
+ esc include! file
+ end if
+ end namespace
+ end macro
+ macro files.libs.handle file, isused*
+ local offset, anyused
+ offset = 0
+ files.libs.parse file, offset, isused, anyused
+ anyused := isused
+ end macro
+
+ macro files.srcs.check file, isused*
+ local private
+ namespace private
+ iterate name, DEF, GLOBAL, PUBLIC, XDEF
+ iterate style, name, .name
+ macro style?! symbols*&
+ end if
+ iterate symbol, symbols
+ if used global.symbol
+ isused = 1
+ end if
+ end iterate
+ if 0
+ end macro
+ end iterate
+ end iterate
+ if 0
+ esc include! file
+ end if
+ end namespace
+ end macro
+ macro files.srcs.parse file*
+ local private
+ namespace private
+ virtual segments.code.area
+ ?$ equ $
+ ?XOR? equ xor
+ ?AND? equ and
+ ?OR? equ or
+ ?SHL? equ shl
+ ?SHR? equ shr
+ ?NOT? equ not
+ iterate name, LIST, NEWPAGE, NOLIST, PAGE
+ macro name?
+ end macro
+ end iterate
+ iterate name, CPU, TITLE
+ macro name? arg*
+ end macro
+ end iterate
+ iterate name, COPY, INCLUDE
+ macro name?! path*
+ include path
+ end macro
+ end iterate
+ iterate name, EXTERN, EXTERNAL, REF, XREF
+ macro name? symbols*&
+ match list : space, symbols
+ iterate symbol, list
+ symbol := global.symbol
+ end iterate
+ else
+ iterate symbol, symbols
+ symbol := global.symbol
+ end iterate
+ end match
+ end macro
+ end iterate
+ iterate name, DEF, GLOBAL, PUBLIC, XDEF
+ macro name? symbols*&
+ iterate symbol, symbols
+ global.symbol := symbol
+ virtual
+ local name
+ emit 1: `symbol
+ load name: $ - $$ from $$
+ global equ name = global.symbol
+ end virtual
+ end iterate
+ end macro
+ end iterate
+ struc (symbol) EQU? expr*
+ local error
+ if ~defined error & defined symbol | error
+ err 'Symbol "', `symbol, '" already defined'
+ error = 1
+ else
+ error = 0
+ end if
+ ?symbol = expr
+ end struc
+ iterate name, VAR, SET
+ struc (symbol) name? expr*
+ ?symbol = expr
+ end struc
+ end iterate
+ macro DS? count
+ local c
+ c = count
+ rb c
+ end macro
+ struc DS? count
+ .: DS? count
+ end struc
+ iterate <def,blk,size*>, B,B,1, W,W,2, W24,P,3, L,L,4
+ macro D#def? vals*&
+ local v
+ iterate val, vals
+ v = val
+ emit size: v
+ end iterate
+ end macro
+ macro BLK#blk? count*, init
+ local c, i
+ c = count
+ match, init
+ emit size: c dup ?
+ else
+ i = init
+ emit size: c dup i
+ end match
+ end macro
+ iterate name, D#def, BLK#blk
+ struc name? args&
+ .: name? args
+ end struc
+ end iterate
+ end iterate
+ iterate <name,alias*>, TRIO,DW24, DF,DL
+ macro name? vals*&
+ alias? vals
+ end macro
+ struc name? args&
+ .: name? args
+ end struc
+ end iterate
+ macro ALIGN? val*
+ local v
+ v = val
+ rb v-1 - ($ + v-1) mod v
+ end macro
+ macro SEGMENT? name*
+ segment name
+ end macro
+ macro ASSUME? expr*
+ namespace ez80
+ assume? expr
+ end namespace
+ end macro
+ iterate register, B, NZ, Z, NC, C, PO, PE, P, M, D, E, \
+ H, IXH, IYH, L, IXL, IYL, F, A, I, R, \
+ MB, BC, DE, HL, IX, IY, SP, AF, AF'
+ register? := ez80.register?
+ end iterate
+ iterate suffix, , .s?, .l?, .is?, .il?, .sis?, .sil?, .lis?, .lil?
+ irpv name, ez80.@ez80.oplist
+ rawmatch rawname, name
+ define rawname rawname
+ macro rawname#suffix args&
+ namespace ez80
+ name#suffix args
+ end namespace
+ end macro
+ end rawmatch
+ end irpv
+ macro LD? d, s*
+ namespace ez80
+ @ez80.classify dst, dstind, d
+ @ez80.classify src, srcind, s
+ if ~dstind & dst eq dst element 1 & dst @ez80.is_reg @ez80.wreg \
+ & dst metadata 1 scale 1 and 001o & ~srcind \
+ & src relativeto src element 1 & src @ez80.is_reg @ez80.wreg
+ if src metadata 1 scale 1 = 007o
+ PUSH? s
+ POP? d
+ else
+ LEA? d, s
+ end if
+ else
+ LD? d, s
+ end if
+ end namespace
+ end macro
+ macro JR?#suffix args&
+ namespace ez80
+ jq?#suffix args
+ end namespace
+ end macro
+ end iterate
+ iterate <name,carry>, UEXT,<OR? A?,A>, SEXT,RLA
+ macro name? reg*
+ carry?
+ SBC? reg, reg
+ end macro
+ end iterate
+ macro COMMENT?! delim*&
+ end match
+ local inside
+ inside = 0
+ macro ?! line&
+ local length, text
+ length = 0
+ if inside
+ length = lengthof `line
+ text = `line
+ else if `line = 'end match'
+ inside = 1
+ length = lengthof `delim - 1
+ text = `delim shr 8
+ end if
+ repeat length
+ if ~text xor `delim and $FF
+ purge ?
+ break
+ end if
+ text = text shr 8
+ end repeat
+ end macro
+ end macro
+
+ if defined debug
+ debug.enabled = 0
+ debug.startAddr = $
+ iterate name, ALIAS, BASE, DEFINE, ENDREC, SPACE, TAG
+ macro name? str1*
+ if debug.enabled
+ virtual debug
+ debug.uleb128 debug.name
+ debug.string str1
+ end virtual
+ end if
+ end macro
+ end iterate
+ iterate name, BEGFUNC, ENDFUNC
+ macro name? str1, num1, str2*
+ if debug.enabled
+ local line, addr
+ line = num1
+ addr = $
+ virtual debug
+ debug.uleb128 debug.name
+ debug.string str1, str2
+ debug.uleb128 line - debug.line, addr - debug.addr
+ end virtual
+ debug.line = line
+ debug.addr = addr
+ end if
+ end macro
+ end iterate
+ macro BEGREC? str1, num1*
+ if debug.enabled
+ virtual debug
+ debug.uleb128 debug.BEGREC
+ debug.string str1
+ debug.uleb128 num1
+ end virtual
+ end if
+ end macro
+ iterate <name,signed>, CLASS,u, DIM,u, LENGTH,u, REG,u, SIZE,u, TYPE,s, VALUE,s
+ macro name? num1*
+ if debug.enabled
+ virtual debug
+ debug.uleb128 debug.name
+ debug.signed#leb128 num1
+ end virtual
+ end if
+ end macro
+ end iterate
+ macro DEBUG? str1*
+ virtual debug
+ debug.uleb128 debug.FILE, lengthof debug.source
+ emit 1: debug.source
+ debug.uleb128 debug.startAddr - debug.addr, debug.DEBUG
+ debug.string str1
+ end virtual
+ debug.enabled = 1
+ debug.line = 0
+ debug.addr = debug.startAddr
+ end macro
+ macro END?!
+ end if
+ if debug.enabled
+ local addr
+ segment code
+ addr = $
+ virtual debug
+ debug.uleb128 debug.END, addr - debug.addr
+ end virtual
+ debug.addr = addr
+ end if
+ if 0
+ end macro
+ macro ENDEF?
+ if debug.enabled
+ virtual debug
+ debug.uleb128 debug.ENDEF
+ end virtual
+ end if
+ end macro
+ macro FILE? str1*
+ debug.source = str1
+ end macro
+ macro LINE? num1*
+ local line, addr
+ line = num1
+ addr = $
+ if line <> debug.line | addr <> debug.addr & debug.enabled
+ virtual debug
+ debug.uleb128 debug.LINE, line - debug.line, addr - debug.addr
+ end virtual
+ debug.line = line
+ debug.addr = addr
+ end if
+ end macro
+ else
+ iterate name, ALIAS, BASE, BEGFUNC, BEGREC, CLASS, DEBUG, \
+ DEFINE, DIM, ENDEF, ENDFUNC, ENDREC, FILE, \
+ LENGTH, LINE, REG, SIZE, SPACE, TAG, TYPE, VALUE
+ macro name? args&
+ end macro
+ end iterate
+ macro END?!
+ end if
+ if 0
+ end macro
+ end if
+
+ struc ? def::&
+ . def
+ end struc
+ macro ? line&
+ match .rest, line
+ rest
+ else match first= .rest, line
+ first rest
+ else
+ line
+ end match
+ end macro
+ if 1
+ include file
+ end if
+ purge ?
+ restruc ?
+ end virtual
+ end namespace
+ end macro
+ macro files.srcs.handle file, isused*
+ if ~isused
+ files.srcs.check file, isused
+ end if
+ if isused
+ files.srcs.parse file
+ end if
+ end macro
+
+ macro symbol? args*&
+ iterate arg, args
+ rawmatch symbol == value, arg
+ namespace segments
+ global.symbol := value
+ virtual
+ local name
+ emit 1: `symbol
+ load name: $ - $$ from $$
+ global equ = name global.symbol
+ end virtual
+ end namespace
+ else
+ 'Syntax error in symbol arguments'
+ end rawmatch
+ end iterate
+ end macro
+
+ iterate name, srcs, libs
+ macro files.name.add file, used*
+ local isused
+ rawmatch rawused, used
+ namespace segments
+ isused = rawused
+ end namespace
+ end rawmatch
+ if `file and $FF = "'"
+ files.name equ file, isused
+ else
+ files.name equ `file, isused
+ end if
+ end macro
+ macro name? args*&
+ local require
+ iterate arg, args
+ match file= =used? =if?= used, arg
+ files.name.add file, used
+ else match file= =used?, arg
+ files.name.add file, 1
+ else
+ files.name.add arg, 0
+ end match
+ end iterate
+ end macro
+ end iterate
+
+ macro locate? args*&
+ iterate arg, args
+ rawmatch name =at? location, arg
+ segments equ segments.name?
+ namespace segments
+ name? := `name
+ name.base? := location
+ end namespace
+ else
+ err 'Syntax error in locate argument'
+ end rawmatch
+ end iterate
+ end macro
+ macro range? args*&
+ iterate arg, args
+ rawmatch name lower : upper, arg
+ locate name at lower
+ namespace segments
+ name.high? := upper
+ end namespace
+ else
+ err 'Syntax error in range arguments'
+ end rawmatch
+ end iterate
+ end macro
+ macro order?: args*&
+ match first =, second =, rest, args
+ order first, second
+ order second, rest
+ else match first =, second, args
+ locate second at first.base + first.length
+ else
+ err 'Not enough order arguments'
+ end match
+ end macro
+ macro merge? args*&
+ match name == list, args
+ order list
+ iterate segment, list
+ locate name at segment.base
+ indx %%
+ namespace segments
+ name.top? := segment.base + segment.length
+ if defined segment.high
+ name.high? := segment.high
+ end if
+ end namespace
+ break
+ end iterate
+ else
+ err 'Syntax error in merge arguments'
+ end match
+ end macro
+
+ macro hex value*, leading: '0', digits: 6
+ local val, zero, digit, char
+ emit 1: ' '
+ val = value
+ zero = leading
+ repeat digits
+ digit = (val shr ((%% - %) shl 2)) and 0Fh
+ if digit < 10
+ char = '0' + digit
+ else
+ char = 'A' + digit - 10
+ end if
+ if digit
+ zero = '0'
+ else if % <> %%
+ char = zero
+ end if
+ emit 1: char
+ end repeat
+ end macro
+
+ macro map?
+ local longest, name
+ postpone ?
+ virtual as 'map'
+ longest = lengthof "Segment"
+ irpv segment, segments
+ if longest < lengthof segment
+ longest = lengthof segment
+ end if
+ end irpv
+ emit 1: "Segment", longest - lengthof "Segment" + 1 dup ' ', "Base Top High Length", 10, longest dup '-', 4 dup " ------", '-', 10
+ irpv segment, segments
+ namespace segment
+ if longest < lengthof segment
+ longest = lengthof segment
+ end if
+ emit 1: segment, longest - lengthof segment dup ' '
+ hex base
+ hex top
+ if defined high
+ hex high
+ else
+ emit 1: 7 dup ' '
+ end if
+ hex length, ' '
+ emit 1: 'h', 10
+ end namespace
+ end irpv
+ match any, global
+ longest = lengthof "Label"
+ irpv symbol, global
+ match name == value, symbol
+ if longest < lengthof name
+ longest = lengthof name
+ end if
+ end match
+ end irpv
+ emit 1: 10, "Label", longest - lengthof "Label" + 3 dup ' ', "Value", 10, longest dup '-', 3 dup ' ', 6 dup '-', 10
+ irpv symbol, global
+ match name == value, symbol
+ emit 1: name, longest - lengthof name + 1 dup ' ', '='
+ hex value
+ emit 1: 10
+ end match
+ end irpv
+ end match
+ end virtual
+ end postpone
+ end macro
+ macro dbg?
+ virtual as 'dbg'
+ debug::
+ end virtual
+ namespace debug
+ virtual at 0
+ iterate name, EOF, ALIAS, BASE, BEGFUNC, BEGREC, CLASS, DEBUG, DEFINE, \
+ DIM, END, ENDEF, ENDFUNC, ENDREC, FILE, LENGTH, LINE, \
+ REG, SIZE, SPACE, STRINGS, TAG, TYPE, VALUE
+ name rb 1
+ end iterate
+ end virtual
+ line = 0
+ addr = 0
+ macro uleb128 values*&
+ iterate value, values
+ local val
+ val = value
+ assert val >= 0
+ while val shr 7 > 0
+ emit 1: val and 07Fh or 080h
+ val = val shr 7
+ end while
+ emit 1: val
+ end iterate
+ end macro
+ macro sleb128 values*&
+ iterate value, values
+ local val
+ val = value
+ while val shr 6 <> 0 & val shr 6 <> -1
+ emit 1: val and 07Fh or 080h
+ val = val shr 7
+ end while
+ emit 1: val and 07Fh
+ end iterate
+ end macro
+ restore strings
+ macro string values*&
+ iterate value, values
+ local count, unfound
+ count = 0
+ unfound = 1
+ irpv each, debug.strings
+ if each = value
+ unfound = 0
+ debug.uleb128 %
+ break
+ end if
+ count = %%
+ end irpv
+ if unfound
+ debug.uleb128 count + 1
+ debug.strings =: value
+ end if
+ end iterate
+ end macro
+ end namespace
+ end macro
+
+ macro segment name*
+ end virtual
+ virtual segments.name.area
+ end macro
+
+ if ~defined segments
+ err 'No segments defined'
+ else
+ restore output.base, output.top ; forbid forward reference
+ irpv segment, segments
+ namespace segment
+ virtual at base
+ area?::
+ end virtual
+ if ~defined output.base | output.base > base & ~defined high
+ output.base = base
+ end if
+ end namespace
+ end irpv
+ irpv file, files.srcs
+ files = 0
+ files.srcs.handle file
+ end irpv
+ if ~defined files
+ err 'Please pass the input files with -i\'srcs "file1" [if require1], "file2" [if require2], ...\''
+ end if
+ irpv file, files.libs
+ virtual segments.libs.area
+ files.libs.handle file
+ end virtual
+ end irpv
+
+ if defined debug
+ virtual debug
+ if defined debug.strings
+ debug.uleb128 debug.STRINGS
+ irpv string, debug.strings
+ if % = 1
+ debug.uleb128 %%
+ end if
+ debug.uleb128 lengthof string
+ emit 1: string
+ end irpv
+ end if
+ debug.uleb128 debug.EOF
+ end virtual
+ end if
+
+ irpv segment, segments
+ namespace segment
+ virtual area
+ top? := $
+ length? := $ - $$
+ initlen? := $@ - $$
+ end virtual
+ if ~defined high
+ if ~defined output.top | output.top < top
+ output.top = top
+ end if
+ else if top > high
+ repeat 1, len: length, over: top - high, max: high - base
+ err 'Segment ', segment, ' is ', `len, ' bytes, ', \
+ `over, ' bytes larger than the maximum of ', \
+ `max, ' bytes'
+ end repeat
+ end if
+ end namespace
+ end irpv
+ org output.base
+ rb output.top - $
+ postpone ?
+ irpv segment, segments
+ namespace segment
+ if ~defined high
+ load output: initlen from area: base
+ store output: initlen at base
+ end if
+ end namespace
+ end irpv
+ end postpone
+ end if
+ purge ?
+end macro
diff --git a/frontends/calculator/CEdev/include/fasmg-ez80/ti84pceg.inc b/frontends/calculator/CEdev/include/fasmg-ez80/ti84pceg.inc index 73b7fc1..8dac20d 100644 --- a/frontends/calculator/CEdev/include/fasmg-ez80/ti84pceg.inc +++ b/frontends/calculator/CEdev/include/fasmg-ez80/ti84pceg.inc @@ -1,61 +1,61 @@ -macro ?! - ; assign needs to be local so that it is only - ; defined once (no purge!) so that it can be - ; forward referenced so that it can recurse - local assign - macro assign: name*, expr& - match left =% right, expr - assign name, left mod right - else match left =| right, expr - assign name, left or right - else match left =& right, expr - assign name, left and right - else match left =^ right, expr - assign name, left xor right - else match left =<=< right, expr - assign name, left shl right - else match left =>=> right, expr - assign name, left shr right - else match left =~ right, expr - assign name, left not right - else match =~ right, expr - assign name, not right - else - name? := expr - end match - end macro - struc (name) equ? expr& - assign name, expr - end struc - macro Ld args& - match =equ? expr, args - assign name, expr - end match - end macro - purge ? -end macro - -macro .list? -end macro -macro .nolist? -end macro -macro #define? name -end macro -macro #ifdef? name -end macro -macro #ifndef? name -end macro -macro #endif? -end macro - -element anovaf_vars? -include 'ti84pce.inc' - -restruc equ? -purge Ld -purge .list? -purge .nolist? -purge #define? -purge #ifdef? -purge #ifndef? -purge #endif? +macro ?!
+ ; assign needs to be local so that it is only
+ ; defined once (no purge!) so that it can be
+ ; forward referenced so that it can recurse
+ local assign
+ macro assign: name*, expr&
+ match left =% right, expr
+ assign name, left mod right
+ else match left =| right, expr
+ assign name, left or right
+ else match left =& right, expr
+ assign name, left and right
+ else match left =^ right, expr
+ assign name, left xor right
+ else match left =<=< right, expr
+ assign name, left shl right
+ else match left =>=> right, expr
+ assign name, left shr right
+ else match left =~ right, expr
+ assign name, left not right
+ else match =~ right, expr
+ assign name, not right
+ else
+ name? := expr
+ end match
+ end macro
+ struc (name) equ? expr&
+ assign name, expr
+ end struc
+ macro Ld args&
+ match =equ? expr, args
+ assign name, expr
+ end match
+ end macro
+ purge ?
+end macro
+
+macro .list?
+end macro
+macro .nolist?
+end macro
+macro #define? name
+end macro
+macro #ifdef? name
+end macro
+macro #ifndef? name
+end macro
+macro #endif?
+end macro
+
+element anovaf_vars?
+include 'ti84pce.inc'
+
+restruc equ?
+purge Ld
+purge .list?
+purge .nolist?
+purge #define?
+purge #ifdef?
+purge #ifndef?
+purge #endif?
diff --git a/frontends/calculator/CEdev/include/fasmg-ez80/tiformat.inc b/frontends/calculator/CEdev/include/fasmg-ez80/tiformat.inc index 23ec697..88faa36 100644 --- a/frontends/calculator/CEdev/include/fasmg-ez80/tiformat.inc +++ b/frontends/calculator/CEdev/include/fasmg-ez80/tiformat.inc @@ -1,105 +1,105 @@ -macro format?.ti? clause& - local all, checkloc, checksum, cplx, data, exec, flag, head, name, process, prot, temp, type, ext, var - macro process: setting - match first rest, setting - process first - process rest - else match =ARCHIVED?, setting - flag = flag or 1 shl 7 - else match =EXECUTABLE?, setting - define exec - else match =PROTECTED?, setting - type = 6 - define prot - else match =REAL?, setting - type = 0 - ext = '8xn' - else match =LIST?, setting - if defined cplx - type = 13 - else - type = 2 - end if - ext = '8xl' - else match =MATRIX?, setting - type = 2 - ext = '8xm' - else match =EQUATION?, setting - type = 3 - ext = '8xy' - else match =STRING?, setting - type = 4 - ext = '8xs' - else match =PROGRAM?, setting - if defined prot - type = 6 - else - type = 5 - end if - ext = '8xp' - else match =PICTURE?, setting - type = 7 - ext = '8ci' - else match =GDB?, setting - type = 1 - ext = '8xd' - else match =COMPLEX?, setting - type = 12 - define cplx - ext = '8xc' - else match =APPVAR?, setting - type = 21 - ext = '8xv' - else match =GROUP?, setting - type = 23 - ext = '8xg' - else match =IMAGE?, setting - type = 26 - ext = '8ca' - else if setting eqtype 'name' - name = setting - else if setting eqtype 0 - type = setting - ext = '8x' - end if - end macro - name = 'A' - type = 6 - ext = '8xp' - flag = 0 - process clause - format binary as ext - assert ~$% & 'Unexpected data before format directive' - dq '**TI83F*' - db 26, 10, 0 - rb 42 - dw sizeof all - label all: checkloc - $% - dw sizeof head, sizeof data - label head: data - $ - db type - dq name - db 0, flag - dw sizeof data - label data: checkloc - $% - dw sizeof var - label var: checkloc - $% - if defined exec - dw 07BEFh - org 0D1A881h - else - org 0 - end if - postpone - label checkloc at $% - end postpone - postpone ? - assert checkloc = $% & 'Unexpected postpone before format directive' - checksum = 0 - repeat sizeof all - load temp: byte from: all + %-1 - checksum = (checksum + temp) and 0FFFFh - end repeat - dw checksum - end postpone -end macro +macro format?.ti? clause&
+ local all, checkloc, checksum, cplx, data, exec, flag, head, name, process, prot, temp, type, ext, var
+ macro process: setting
+ match first rest, setting
+ process first
+ process rest
+ else match =ARCHIVED?, setting
+ flag = flag or 1 shl 7
+ else match =EXECUTABLE?, setting
+ define exec
+ else match =PROTECTED?, setting
+ type = 6
+ define prot
+ else match =REAL?, setting
+ type = 0
+ ext = '8xn'
+ else match =LIST?, setting
+ if defined cplx
+ type = 13
+ else
+ type = 2
+ end if
+ ext = '8xl'
+ else match =MATRIX?, setting
+ type = 2
+ ext = '8xm'
+ else match =EQUATION?, setting
+ type = 3
+ ext = '8xy'
+ else match =STRING?, setting
+ type = 4
+ ext = '8xs'
+ else match =PROGRAM?, setting
+ if defined prot
+ type = 6
+ else
+ type = 5
+ end if
+ ext = '8xp'
+ else match =PICTURE?, setting
+ type = 7
+ ext = '8ci'
+ else match =GDB?, setting
+ type = 1
+ ext = '8xd'
+ else match =COMPLEX?, setting
+ type = 12
+ define cplx
+ ext = '8xc'
+ else match =APPVAR?, setting
+ type = 21
+ ext = '8xv'
+ else match =GROUP?, setting
+ type = 23
+ ext = '8xg'
+ else match =IMAGE?, setting
+ type = 26
+ ext = '8ca'
+ else if setting eqtype 'name'
+ name = setting
+ else if setting eqtype 0
+ type = setting
+ ext = '8x'
+ end if
+ end macro
+ name = 'A'
+ type = 6
+ ext = '8xp'
+ flag = 0
+ process clause
+ format binary as ext
+ assert ~$% & 'Unexpected data before format directive'
+ dq '**TI83F*'
+ db 26, 10, 0
+ rb 42
+ dw sizeof all
+ label all: checkloc - $%
+ dw sizeof head, sizeof data
+ label head: data - $
+ db type
+ dq name
+ db 0, flag
+ dw sizeof data
+ label data: checkloc - $%
+ dw sizeof var
+ label var: checkloc - $%
+ if defined exec
+ dw 07BEFh
+ org 0D1A881h
+ else
+ org 0
+ end if
+ postpone
+ label checkloc at $%
+ end postpone
+ postpone ?
+ assert checkloc = $% & 'Unexpected postpone before format directive'
+ checksum = 0
+ repeat sizeof all
+ load temp: byte from: all + %-1
+ checksum = (checksum + temp) and 0FFFFh
+ end repeat
+ dw checksum
+ end postpone
+end macro
diff --git a/frontends/calculator/CEdev/include/fileioc.h b/frontends/calculator/CEdev/include/fileioc.h index e703143..cdce463 100644 --- a/frontends/calculator/CEdev/include/fileioc.h +++ b/frontends/calculator/CEdev/include/fileioc.h @@ -1,509 +1,509 @@ -/** - * @file - * @author Matt "MateoConLechuga" Waltz - * @brief Implements variable reading and writing routines - */ - -#ifndef H_FILEIOC -#define H_FILEIOC - -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> -#include <stdbool.h> -#include <stdio.h> -#include <tice.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* Varible and flag definitions */ -#define TI_PRGM_TYPE (0x05) -#define TI_PPRGM_TYPE (0x06) -#define TI_TPRGM_TYPE (0x16) -#define TI_APPVAR_TYPE (0x15) -#define TI_REAL_TYPE (0x00) -#define TI_CPLX_TYPE (0x0C) -#define TI_MATRIX_TYPE (0x02) -#define TI_STRING_TYPE (0x04) -#define TI_EQU_TYPE (0x03) -#define TI_REAL_LIST_TYPE (0x01) -#define TI_CPLX_LIST_TYPE (0x0D) - -#ifndef EOF -#define EOF (-1) -#endif - -/** - * @brief Variable slot type - */ -typedef uint8_t ti_var_t; - -/** - * Closes all open slots - * @warning Call before you use any variable functions - */ -void ti_CloseAll(void); - -/** - * Opens a file - * - * An AppVar is used as default file storage - * @param name Name of file to open - * @param mode - * "r" - Opens a file for reading. The file must exist. Keeps file in archive if in archive. <br> - * "w" - Creates an empty file for writing. Overwrites file if already exists. <br> - * "a" - Appends to a file. Writing operations, append data at the end of the file. The file is created if it does not exist. <br> - * "r+" - Opens a file to update both reading and writing. The file must exist. Moves file from archive to RAM if in archive. <br> - * "w+" - Creates an empty file for both reading and writing. Overwrites file if already exists. <br> - * "a+" - Opens a file for reading and appending. Moves file from archive to RAM if in archive. Created if it does not exist. - * @returns Slot variable - * @note If there isn't enough memory to create the variable, or a slot isn't open, zero (0) is returned - */ -ti_var_t ti_Open(const char *name, const char *mode); - -/** - * Opens a variable - * - * Can open any type of program or appvar variable - * @param varname Name of variable to open - * @param mode - * "r" - Opens a file for reading. The file must exist. Keeps file in archive if in archive. <br> - * "w" - Creates an empty file for writing. Overwrites file if already exists. <br> - * "a" - Appends to a file. Writing operations, append data at the end of the file. The file is created if it does not exist. <br> - * "r+" - Opens a file to update both reading and writing. The file must exist. Moves file from archive to RAM if in archive. <br> - * "w+" - Creates an empty file for both reading and writing. Overwrites file if already exists. <br> - * "a+" - Opens a file for reading and appending. Moves file from archive to RAM if in archive. Created if it does not exist. - * @param type Specifies the type of variable to open - * @returns Slot variable - * @note If there isn't enough memory to create the variable, or a slot isn't open, zero (0) is returned - */ -ti_var_t ti_OpenVar(const char *varname, const char *mode, uint8_t type); - -/** - * Frees an open variable slot - * @returns Zero if closing failed - */ -int ti_Close(const ti_var_t slot); - -/** - * Returns the name of the file(s) that contains the string as the first part of the variable; - * which can then be used with ti_Open and other functions - * - * seach_pos should be set to NULL to begin a search, and is updated with each call - * - * @code - * char *var_name; - * uint8_t *search_pos = NULL; - * while((var_name = ti_Detect(&search_pos, "my_data")) != NULL) { - * ...do something with the name or search_pos... - * } - * @endcode - * @param curr_search_posistion Current offset in the VAT - * @param detection_string String to search for (NULL to search for all) - * @note If the return value is NULL, there are no more variables to find - */ -char *ti_Detect(void **curr_search_posistion, const char *detection_string); - -/** - * Returns the name of the file(s) that contains the string as the first part of the variable; - * which can then be used with ti_OpenVar and other functions - * - * seach_pos should be set to NULL to begin a search, and is updated with each call - * - * @code - * char *var_name; - * uint8_t *search_pos = NULL; - * while((var_name = ti_DetectVar(&search_pos, "my_data", TI_PRGM_TYPE)) != NULL) { - * ...do something with the name or search_pos... - * } - * @endcode - * @param curr_search_posistion Current offset in the VAT - * @param detection_string String to search for (NULL to search for all) - * @param var_type Type of variable to detect - * @note If the return value is NULL, there are no more variables to find - */ -char *ti_DetectVar(void **curr_search_posistion, const char *detection_string, uint8_t var_type); - -/** - * Returns the name of the file(s) that contains the string as the first part of the variable; - * which can then be used with ti_OpenVar and other functions - * - * seach_pos should be set to NULL to begin a search, and is updated with each call - * - * @code - * char *var_name; - * uint8_t *search_pos = NULL; - * uint8_t type; - * while((var_name = ti_DetectVar(&search_pos, "my_data", &type)) != NULL) { - * if (type == TI_PRGM_TYPE || type == TI_PPRGM_TYPE) { - * ...do something with the name or search_pos... - * } - * } - * @endcode - * @param curr_search_posistion Current offset in the VAT - * @param detection_string String to search for (NULL to search for all) - * @param var_type Type of variable found - * @note If the return value is NULL, there are no more variables to find - */ -char *ti_DetectAny(void **curr_search_posistion, const char *detection_string, uint8_t *var_type); - -/** - * Writes to the current variable slot - * - * @param data Pointer to data to write - * @param size Size (in bytes) of a single data chunk - * @param count Number of data chunks to write to the variable slot - * @param slot Variable slot to write the data to - * @returns The number of chunks written (should be equal to count) - */ -size_t ti_Write(const void *data, size_t size, size_t count, const ti_var_t slot); - -/** - * Reads from the current variable pointer - * - * @param data Pointer to data to read into - * @param size Size (in bytes) of a single data chunk - * @param count Number of data chunks to read from the variable slot - * @param slot Variable slot to read the data from - * @returns The number of chunks read (should be equal to count) - */ -size_t ti_Read(const void *data, size_t size, size_t count, const ti_var_t slot); - -/** - * Writes a character directly into the slot data pointer, and increments the offset - * - * @param c Character to write - * @param slot Variable slot to put the character to - * @returns The input c is returned if no error - * @returns 'EOF' if current offset is larger than file size, or memory isn't large enough - */ -int ti_PutC(const char c, const ti_var_t slot); - -/** - * Pulls a character directly from the slot data pointer, and increments the offset - * - * @param slot Variable slot to get the character from - * @returns 1 byte character at the current variable offset - * @returns 'EOF' if current offset is larger than file size - */ -int ti_GetC(const ti_var_t slot); - -/** - * Seeks to an offset - * - * @param offset Number of bytes to offest from (can be negative) - * @param origin - * SEEK_SET (0) - Seek from beginning of file <br> - * SEEK_CUR (1) - Seek from current offset in file <br> - * SEEK_END (2) - Seek from end of file - * @param slot Variable slot seeking in - * @returns 'EOF' on seek failure - */ -int ti_Seek(int offset, unsigned int origin, const ti_var_t slot); - -/** - * Seeks to the start of the given variable - * - * Basically an ti_Seek(0, SEEK_SET, slot); - * @param slot Variable slot to rewind - * @returns 'EOF' on rewind failure - */ -int ti_Rewind(const ti_var_t slot); - -/** - * Gets the offset in a slot - * - * @param slot Slot to test - * @returns The value of the current slot offset - */ -uint16_t ti_Tell(const ti_var_t slot); - -/** - * Gets the size of a slot - * - * @param slot Slot to test - * @returns The size of the slot variable - */ -uint16_t ti_GetSize(const ti_var_t slot); - -/** - * Resizes the slot variable - * - * @param slot Slot to resize - * @param new_size New size of slot - * @returns Resized size on success, 0 on failure, or -1 if the slot cannot be opened - * @note The variable offset is set to the beginning of the file - */ -int ti_Resize(size_t new_size, const ti_var_t slot); - -/** - * Tests if a slot is in the archive - * - * @param slot Slot to test - * @returns Zero (0) if the slot is not in the archive - */ -int ti_IsArchived(const ti_var_t slot); - -/** - * Sends the variable into either the archive or RAM if needed - * - * @param archived - * True - Send to Archive <br> - * False - Send to RAM - * @param slot Slot to send - * @returns Zero if the operation fails from not enough memory or another error - */ -int ti_SetArchiveStatus(bool archived, const ti_var_t slot); - -/** - * Deletes an AppVar - * - * @param name Name of AppVar to delete - * @returns 0 if failed - */ -int ti_Delete(const char *name); - -/** - * Deletes a variable given the name and type - * - * @param varname Name of variable to delete - * @param type Type of variable to delete - * @returns 0 if failed - */ -int ti_DeleteVar(const char *varname, const uint8_t type); - -/** - * Gets the string used for displaying a TI token - * - * @param length_of_string Pointer to variable to hold length of resulting string (Can be NULL if you don't care) - * @param length_of_token Pointer to variable to hold length of the token, used for determining the next read location (Can be NULL if you don't care) - * @param read_pointer Address of pointer to data to read - * @note read_pointer is updated to the next token, depending on if it is 1 or 2 bytes in length - */ -char *ti_GetTokenString(void **read_pointer, uint8_t *length_of_token, unsigned int *length_of_string); - -/** - * Gets a pointer to the data located at the current posistion in the slot; - * Good way for fast reading of data - * @param slot Variable slot to get pointer of - * @returns Pointer to variable data - */ -void *ti_GetDataPtr(const ti_var_t slot); - -/** - * Gets the VAT location of the slot - * - * @param slot Variable slot to get VAT location of - * @returns VAT location of variable - */ -void *ti_GetVATPtr(const ti_var_t slot); - -/** - * Gets the variable name of an already opened slot - * - * @param slot Variable slot to get name of - * @param name Buffer to store name in, generally at least 10 bytes including null terminator. - * @returns None - */ -void ti_GetName(char *name, const ti_var_t slot); - -/** - * Renames a file - * - * @param old Old name of file - * @param new New name of file - * @returns 0 if success, 1 if file already exists, 2 any other error occurs. - * @warning It is potentially hazardous to rename an open file. Be sure to close the open file before renaming, - */ -uint8_t ti_Rename(const char *old, const char *new); - -/** - * Renames a variable - * - * @param old Old name of variable - * @param new New name of variable - * @param type Type of variable to rename - * @returns 0 if success, 1 if variable already exists, 2 any other error occurs. - * @warning It is potentially hazardous to rename an open variable. Be sure to close the open variable before renaming, - */ -uint8_t ti_RenameVar(const char *old, const char *new, const uint8_t type); - -/** - * Sets a variable - * - * @param var_type Type of variable to set - * @param name Pointer to name of variable - * @param data Pointer to data to set - * @returns 0 if success - */ -uint8_t ti_SetVar(const ti_var_t var_type, const char *name, void *data); - -/** - * Stores a variable to another variable - * - * @param var_type_to Type of variable to store to - * @param to Pointer to data to store to - * @param var_type_from Type of variable to get from - * @param from Pointer to data to get from - * @returns 0 if success - */ -uint8_t ti_StoVar(const ti_var_t var_type_to, void *to, const ti_var_t var_type_from, void *from); - -/** - * Recalls a variable - * - * @param var_type Type of variable to recall - * @param var_name Pointer to name of variable to recall - * @param data_struct Address of pointer to variable structure - * @returns 0 if success - * @note data_struct is set to the variable's data - */ -uint8_t ti_RclVar(const uint8_t var_type, const char *var_name, void **data_struct); - -/** - * Allocates space for a real variable - * @returns Pointer to variable - */ -#define ti_MallocReal() ((real_t*)malloc(sizeof(real_t))) - -/** - * Allocates space for a complex variable - * @returns Pointer to variable - */ -#define ti_MallocCplx() ((cplx_t*)malloc(sizeof(cplx_t))) - -/** - * Allocates space for a string variable - * @param len Length of string - * @returns Pointer to variable - */ -#define ti_MallocString(len) ti_AllocString((len), ((void*)malloc)) - -/** - * Allocates space for a list variable - * @param dim Dimension of list - * @returns Pointer to variable - */ -#define ti_MallocList(dim) ti_AllocList((dim), ((void*)malloc)) - -/** - * Allocates space for a matrix variable - * @param rows Rows in matrix - * @param cols Columns in matrix - * @returns Pointer to variable - */ -#define ti_MallocMatrix(rows, cols) ti_AllocMatrix((rows), (cols), ((void*)malloc)) - -/** - * Allocates space for a complex list variable - * @param dim Dimension of complex list - * @returns Pointer to variable - */ -#define ti_MallocCplxList(dim) ti_AllocCplxList((dim), ((void*)malloc)) - -/** - * Allocates space for an equation variable - * @param len Length of equation variable - * @returns Pointer to variable - */ -#define ti_MallocEqu(len) ti_AllocEqu((len), ((void*)malloc)) - -string_t *ti_AllocString(unsigned len, void (*malloc_routine)(size_t)); -list_t *ti_AllocList(unsigned dim, void (*malloc_routine)(size_t)); -matrix_t *ti_AllocMatrix(uint8_t rows, uint8_t cols, void (*malloc_routine)(size_t)); -cplx_list_t *ti_AllocCplxList(unsigned dim, void (*malloc_routine)(size_t)); -equ_t *ti_AllocEqu(unsigned len, void (*malloc_routine)(size_t)); - -/* Some more definitions using Ans */ -#define TI_ANS_TYPE (0x00) -#define ti_Ans ("\x72\0") - -/* Some string definitions */ -#define ti_Str1 ("\xAA\x0\0") -#define ti_Str2 ("\xAA\x1\0") -#define ti_Str3 ("\xAA\x2\0") -#define ti_Str4 ("\xAA\x3\0") -#define ti_Str5 ("\xAA\x4\0") -#define ti_Str6 ("\xAA\x5\0") -#define ti_Str7 ("\xAA\x6\0") -#define ti_Str8 ("\xAA\x7\0") -#define ti_Str0 ("\xAA\x8\0") -#define ti_StrT ('\xAA') - -/* Some equation definitions */ -#define ti_Y1 ("\x5E\x10\0") -#define ti_Y2 ("\x5E\x11\0") -#define ti_Y3 ("\x5E\x12\0") -#define ti_Y4 ("\x5E\x13\0") -#define ti_Y5 ("\x5E\x14\0") -#define ti_Y6 ("\x5E\x15\0") -#define ti_Y7 ("\x5E\x16\0") -#define ti_Y8 ("\x5E\x17\0") -#define ti_Y9 ("\x5E\x18\0") -#define ti_Y0 ("\x5E\x19\0") -#define ti_EquT ('\x5E') - -/* Some real and complex defines */ -#define ti_A ("\x41\0\0") -#define ti_B ("\x42\0\0") -#define ti_C ("\x43\0\0") -#define ti_D ("\x44\0\0") -#define ti_E ("\x45\0\0") -#define ti_F ("\x46\0\0") -#define ti_G ("\x47\0\0") -#define ti_H ("\x48\0\0") -#define ti_I ("\x49\0\0") -#define ti_J ("\x4A\0\0") -#define ti_K ("\x4B\0\0") -#define ti_L ("\x4C\0\0") -#define ti_M ("\x4D\0\0") -#define ti_N ("\x4E\0\0") -#define ti_O ("\x4F\0\0") -#define ti_P ("\x50\0\0") -#define ti_Q ("\x51\0\0") -#define ti_R ("\x52\0\0") -#define ti_S ("\x53\0\0") -#define ti_T ("\x54\0\0") -#define ti_U ("\x55\0\0") -#define ti_V ("\x56\0\0") -#define ti_W ("\x57\0\0") -#define ti_X ("\x58\0\0") -#define ti_Y ("\x59\0\0") -#define ti_Z ("\x60\0\0") -#define ti_Theta ("\x61\0\0") - -/* Some matrix defines */ -#define ti_MatA ("\x5C\x0\0") -#define ti_MatB ("\x5C\x1\0") -#define ti_MatC ("\x5C\x2\0") -#define ti_MatD ("\x5C\x3\0") -#define ti_MatE ("\x5C\x4\0") -#define ti_MatF ("\x5C\x5\0") -#define ti_MatG ("\x5C\x6\0") -#define ti_MatH ("\x5C\x7\0") -#define ti_MatI ("\x5C\x8\0") -#define ti_MatJ ("\x5C\x9\0") -#define ti_MatT ('\x5C') - -/* Some list defines */ -#define ti_L1 ("\x5D\x0\0") -#define ti_L2 ("\x5D\x1\0") -#define ti_L3 ("\x5D\x2\0") -#define ti_L4 ("\x5D\x3\0") -#define ti_L5 ("\x5D\x4\0") -#define ti_L6 ("\x5D\x5\0") -#define ti_LT ('\x5D') - -/* Compatibility defines */ -#define ti_Program TI_PRGM_TYPE -#define ti_ProtectedProgram TI_PPRGM_TYPE -#define ti_TempProgram TI_TPRGM_TYPE -#define ti_AppVar TI_APPVAR_TYPE - -#ifdef __cplusplus -} -#endif - -#endif +/**
+ * @file
+ * @author Matt "MateoConLechuga" Waltz
+ * @brief Implements variable reading and writing routines
+ */
+
+#ifndef H_FILEIOC
+#define H_FILEIOC
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <tice.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Varible and flag definitions */
+#define TI_PRGM_TYPE (0x05)
+#define TI_PPRGM_TYPE (0x06)
+#define TI_TPRGM_TYPE (0x16)
+#define TI_APPVAR_TYPE (0x15)
+#define TI_REAL_TYPE (0x00)
+#define TI_CPLX_TYPE (0x0C)
+#define TI_MATRIX_TYPE (0x02)
+#define TI_STRING_TYPE (0x04)
+#define TI_EQU_TYPE (0x03)
+#define TI_REAL_LIST_TYPE (0x01)
+#define TI_CPLX_LIST_TYPE (0x0D)
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+/**
+ * @brief Variable slot type
+ */
+typedef uint8_t ti_var_t;
+
+/**
+ * Closes all open slots
+ * @warning Call before you use any variable functions
+ */
+void ti_CloseAll(void);
+
+/**
+ * Opens a file
+ *
+ * An AppVar is used as default file storage
+ * @param name Name of file to open
+ * @param mode
+ * "r" - Opens a file for reading. The file must exist. Keeps file in archive if in archive. <br>
+ * "w" - Creates an empty file for writing. Overwrites file if already exists. <br>
+ * "a" - Appends to a file. Writing operations, append data at the end of the file. The file is created if it does not exist. <br>
+ * "r+" - Opens a file to update both reading and writing. The file must exist. Moves file from archive to RAM if in archive. <br>
+ * "w+" - Creates an empty file for both reading and writing. Overwrites file if already exists. <br>
+ * "a+" - Opens a file for reading and appending. Moves file from archive to RAM if in archive. Created if it does not exist.
+ * @returns Slot variable
+ * @note If there isn't enough memory to create the variable, or a slot isn't open, zero (0) is returned
+ */
+ti_var_t ti_Open(const char *name, const char *mode);
+
+/**
+ * Opens a variable
+ *
+ * Can open any type of program or appvar variable
+ * @param varname Name of variable to open
+ * @param mode
+ * "r" - Opens a file for reading. The file must exist. Keeps file in archive if in archive. <br>
+ * "w" - Creates an empty file for writing. Overwrites file if already exists. <br>
+ * "a" - Appends to a file. Writing operations, append data at the end of the file. The file is created if it does not exist. <br>
+ * "r+" - Opens a file to update both reading and writing. The file must exist. Moves file from archive to RAM if in archive. <br>
+ * "w+" - Creates an empty file for both reading and writing. Overwrites file if already exists. <br>
+ * "a+" - Opens a file for reading and appending. Moves file from archive to RAM if in archive. Created if it does not exist.
+ * @param type Specifies the type of variable to open
+ * @returns Slot variable
+ * @note If there isn't enough memory to create the variable, or a slot isn't open, zero (0) is returned
+ */
+ti_var_t ti_OpenVar(const char *varname, const char *mode, uint8_t type);
+
+/**
+ * Frees an open variable slot
+ * @returns Zero if closing failed
+ */
+int ti_Close(const ti_var_t slot);
+
+/**
+ * Returns the name of the file(s) that contains the string as the first part of the variable;
+ * which can then be used with ti_Open and other functions
+ *
+ * seach_pos should be set to NULL to begin a search, and is updated with each call
+ *
+ * @code
+ * char *var_name;
+ * uint8_t *search_pos = NULL;
+ * while((var_name = ti_Detect(&search_pos, "my_data")) != NULL) {
+ * ...do something with the name or search_pos...
+ * }
+ * @endcode
+ * @param curr_search_posistion Current offset in the VAT
+ * @param detection_string String to search for (NULL to search for all)
+ * @note If the return value is NULL, there are no more variables to find
+ */
+char *ti_Detect(void **curr_search_posistion, const char *detection_string);
+
+/**
+ * Returns the name of the file(s) that contains the string as the first part of the variable;
+ * which can then be used with ti_OpenVar and other functions
+ *
+ * seach_pos should be set to NULL to begin a search, and is updated with each call
+ *
+ * @code
+ * char *var_name;
+ * uint8_t *search_pos = NULL;
+ * while((var_name = ti_DetectVar(&search_pos, "my_data", TI_PRGM_TYPE)) != NULL) {
+ * ...do something with the name or search_pos...
+ * }
+ * @endcode
+ * @param curr_search_posistion Current offset in the VAT
+ * @param detection_string String to search for (NULL to search for all)
+ * @param var_type Type of variable to detect
+ * @note If the return value is NULL, there are no more variables to find
+ */
+char *ti_DetectVar(void **curr_search_posistion, const char *detection_string, uint8_t var_type);
+
+/**
+ * Returns the name of the file(s) that contains the string as the first part of the variable;
+ * which can then be used with ti_OpenVar and other functions
+ *
+ * seach_pos should be set to NULL to begin a search, and is updated with each call
+ *
+ * @code
+ * char *var_name;
+ * uint8_t *search_pos = NULL;
+ * uint8_t type;
+ * while((var_name = ti_DetectVar(&search_pos, "my_data", &type)) != NULL) {
+ * if (type == TI_PRGM_TYPE || type == TI_PPRGM_TYPE) {
+ * ...do something with the name or search_pos...
+ * }
+ * }
+ * @endcode
+ * @param curr_search_posistion Current offset in the VAT
+ * @param detection_string String to search for (NULL to search for all)
+ * @param var_type Type of variable found
+ * @note If the return value is NULL, there are no more variables to find
+ */
+char *ti_DetectAny(void **curr_search_posistion, const char *detection_string, uint8_t *var_type);
+
+/**
+ * Writes to the current variable slot
+ *
+ * @param data Pointer to data to write
+ * @param size Size (in bytes) of a single data chunk
+ * @param count Number of data chunks to write to the variable slot
+ * @param slot Variable slot to write the data to
+ * @returns The number of chunks written (should be equal to count)
+ */
+size_t ti_Write(const void *data, size_t size, size_t count, const ti_var_t slot);
+
+/**
+ * Reads from the current variable pointer
+ *
+ * @param data Pointer to data to read into
+ * @param size Size (in bytes) of a single data chunk
+ * @param count Number of data chunks to read from the variable slot
+ * @param slot Variable slot to read the data from
+ * @returns The number of chunks read (should be equal to count)
+ */
+size_t ti_Read(const void *data, size_t size, size_t count, const ti_var_t slot);
+
+/**
+ * Writes a character directly into the slot data pointer, and increments the offset
+ *
+ * @param c Character to write
+ * @param slot Variable slot to put the character to
+ * @returns The input c is returned if no error
+ * @returns 'EOF' if current offset is larger than file size, or memory isn't large enough
+ */
+int ti_PutC(const char c, const ti_var_t slot);
+
+/**
+ * Pulls a character directly from the slot data pointer, and increments the offset
+ *
+ * @param slot Variable slot to get the character from
+ * @returns 1 byte character at the current variable offset
+ * @returns 'EOF' if current offset is larger than file size
+ */
+int ti_GetC(const ti_var_t slot);
+
+/**
+ * Seeks to an offset
+ *
+ * @param offset Number of bytes to offest from (can be negative)
+ * @param origin
+ * SEEK_SET (0) - Seek from beginning of file <br>
+ * SEEK_CUR (1) - Seek from current offset in file <br>
+ * SEEK_END (2) - Seek from end of file
+ * @param slot Variable slot seeking in
+ * @returns 'EOF' on seek failure
+ */
+int ti_Seek(int offset, unsigned int origin, const ti_var_t slot);
+
+/**
+ * Seeks to the start of the given variable
+ *
+ * Basically an ti_Seek(0, SEEK_SET, slot);
+ * @param slot Variable slot to rewind
+ * @returns 'EOF' on rewind failure
+ */
+int ti_Rewind(const ti_var_t slot);
+
+/**
+ * Gets the offset in a slot
+ *
+ * @param slot Slot to test
+ * @returns The value of the current slot offset
+ */
+uint16_t ti_Tell(const ti_var_t slot);
+
+/**
+ * Gets the size of a slot
+ *
+ * @param slot Slot to test
+ * @returns The size of the slot variable
+ */
+uint16_t ti_GetSize(const ti_var_t slot);
+
+/**
+ * Resizes the slot variable
+ *
+ * @param slot Slot to resize
+ * @param new_size New size of slot
+ * @returns Resized size on success, 0 on failure, or -1 if the slot cannot be opened
+ * @note The variable offset is set to the beginning of the file
+ */
+int ti_Resize(size_t new_size, const ti_var_t slot);
+
+/**
+ * Tests if a slot is in the archive
+ *
+ * @param slot Slot to test
+ * @returns Zero (0) if the slot is not in the archive
+ */
+int ti_IsArchived(const ti_var_t slot);
+
+/**
+ * Sends the variable into either the archive or RAM if needed
+ *
+ * @param archived
+ * True - Send to Archive <br>
+ * False - Send to RAM
+ * @param slot Slot to send
+ * @returns Zero if the operation fails from not enough memory or another error
+ */
+int ti_SetArchiveStatus(bool archived, const ti_var_t slot);
+
+/**
+ * Deletes an AppVar
+ *
+ * @param name Name of AppVar to delete
+ * @returns 0 if failed
+ */
+int ti_Delete(const char *name);
+
+/**
+ * Deletes a variable given the name and type
+ *
+ * @param varname Name of variable to delete
+ * @param type Type of variable to delete
+ * @returns 0 if failed
+ */
+int ti_DeleteVar(const char *varname, const uint8_t type);
+
+/**
+ * Gets the string used for displaying a TI token
+ *
+ * @param length_of_string Pointer to variable to hold length of resulting string (Can be NULL if you don't care)
+ * @param length_of_token Pointer to variable to hold length of the token, used for determining the next read location (Can be NULL if you don't care)
+ * @param read_pointer Address of pointer to data to read
+ * @note read_pointer is updated to the next token, depending on if it is 1 or 2 bytes in length
+ */
+char *ti_GetTokenString(void **read_pointer, uint8_t *length_of_token, unsigned int *length_of_string);
+
+/**
+ * Gets a pointer to the data located at the current posistion in the slot;
+ * Good way for fast reading of data
+ * @param slot Variable slot to get pointer of
+ * @returns Pointer to variable data
+ */
+void *ti_GetDataPtr(const ti_var_t slot);
+
+/**
+ * Gets the VAT location of the slot
+ *
+ * @param slot Variable slot to get VAT location of
+ * @returns VAT location of variable
+ */
+void *ti_GetVATPtr(const ti_var_t slot);
+
+/**
+ * Gets the variable name of an already opened slot
+ *
+ * @param slot Variable slot to get name of
+ * @param name Buffer to store name in, generally at least 10 bytes including null terminator.
+ * @returns None
+ */
+void ti_GetName(char *name, const ti_var_t slot);
+
+/**
+ * Renames a file
+ *
+ * @param old Old name of file
+ * @param new New name of file
+ * @returns 0 if success, 1 if file already exists, 2 any other error occurs.
+ * @warning It is potentially hazardous to rename an open file. Be sure to close the open file before renaming,
+ */
+uint8_t ti_Rename(const char *old, const char *new);
+
+/**
+ * Renames a variable
+ *
+ * @param old Old name of variable
+ * @param new New name of variable
+ * @param type Type of variable to rename
+ * @returns 0 if success, 1 if variable already exists, 2 any other error occurs.
+ * @warning It is potentially hazardous to rename an open variable. Be sure to close the open variable before renaming,
+ */
+uint8_t ti_RenameVar(const char *old, const char *new, const uint8_t type);
+
+/**
+ * Sets a variable
+ *
+ * @param var_type Type of variable to set
+ * @param name Pointer to name of variable
+ * @param data Pointer to data to set
+ * @returns 0 if success
+ */
+uint8_t ti_SetVar(const ti_var_t var_type, const char *name, void *data);
+
+/**
+ * Stores a variable to another variable
+ *
+ * @param var_type_to Type of variable to store to
+ * @param to Pointer to data to store to
+ * @param var_type_from Type of variable to get from
+ * @param from Pointer to data to get from
+ * @returns 0 if success
+ */
+uint8_t ti_StoVar(const ti_var_t var_type_to, void *to, const ti_var_t var_type_from, void *from);
+
+/**
+ * Recalls a variable
+ *
+ * @param var_type Type of variable to recall
+ * @param var_name Pointer to name of variable to recall
+ * @param data_struct Address of pointer to variable structure
+ * @returns 0 if success
+ * @note data_struct is set to the variable's data
+ */
+uint8_t ti_RclVar(const uint8_t var_type, const char *var_name, void **data_struct);
+
+/**
+ * Allocates space for a real variable
+ * @returns Pointer to variable
+ */
+#define ti_MallocReal() ((real_t*)malloc(sizeof(real_t)))
+
+/**
+ * Allocates space for a complex variable
+ * @returns Pointer to variable
+ */
+#define ti_MallocCplx() ((cplx_t*)malloc(sizeof(cplx_t)))
+
+/**
+ * Allocates space for a string variable
+ * @param len Length of string
+ * @returns Pointer to variable
+ */
+#define ti_MallocString(len) ti_AllocString((len), ((void*)malloc))
+
+/**
+ * Allocates space for a list variable
+ * @param dim Dimension of list
+ * @returns Pointer to variable
+ */
+#define ti_MallocList(dim) ti_AllocList((dim), ((void*)malloc))
+
+/**
+ * Allocates space for a matrix variable
+ * @param rows Rows in matrix
+ * @param cols Columns in matrix
+ * @returns Pointer to variable
+ */
+#define ti_MallocMatrix(rows, cols) ti_AllocMatrix((rows), (cols), ((void*)malloc))
+
+/**
+ * Allocates space for a complex list variable
+ * @param dim Dimension of complex list
+ * @returns Pointer to variable
+ */
+#define ti_MallocCplxList(dim) ti_AllocCplxList((dim), ((void*)malloc))
+
+/**
+ * Allocates space for an equation variable
+ * @param len Length of equation variable
+ * @returns Pointer to variable
+ */
+#define ti_MallocEqu(len) ti_AllocEqu((len), ((void*)malloc))
+
+string_t *ti_AllocString(unsigned len, void (*malloc_routine)(size_t));
+list_t *ti_AllocList(unsigned dim, void (*malloc_routine)(size_t));
+matrix_t *ti_AllocMatrix(uint8_t rows, uint8_t cols, void (*malloc_routine)(size_t));
+cplx_list_t *ti_AllocCplxList(unsigned dim, void (*malloc_routine)(size_t));
+equ_t *ti_AllocEqu(unsigned len, void (*malloc_routine)(size_t));
+
+/* Some more definitions using Ans */
+#define TI_ANS_TYPE (0x00)
+#define ti_Ans ("\x72\0")
+
+/* Some string definitions */
+#define ti_Str1 ("\xAA\x0\0")
+#define ti_Str2 ("\xAA\x1\0")
+#define ti_Str3 ("\xAA\x2\0")
+#define ti_Str4 ("\xAA\x3\0")
+#define ti_Str5 ("\xAA\x4\0")
+#define ti_Str6 ("\xAA\x5\0")
+#define ti_Str7 ("\xAA\x6\0")
+#define ti_Str8 ("\xAA\x7\0")
+#define ti_Str0 ("\xAA\x8\0")
+#define ti_StrT ('\xAA')
+
+/* Some equation definitions */
+#define ti_Y1 ("\x5E\x10\0")
+#define ti_Y2 ("\x5E\x11\0")
+#define ti_Y3 ("\x5E\x12\0")
+#define ti_Y4 ("\x5E\x13\0")
+#define ti_Y5 ("\x5E\x14\0")
+#define ti_Y6 ("\x5E\x15\0")
+#define ti_Y7 ("\x5E\x16\0")
+#define ti_Y8 ("\x5E\x17\0")
+#define ti_Y9 ("\x5E\x18\0")
+#define ti_Y0 ("\x5E\x19\0")
+#define ti_EquT ('\x5E')
+
+/* Some real and complex defines */
+#define ti_A ("\x41\0\0")
+#define ti_B ("\x42\0\0")
+#define ti_C ("\x43\0\0")
+#define ti_D ("\x44\0\0")
+#define ti_E ("\x45\0\0")
+#define ti_F ("\x46\0\0")
+#define ti_G ("\x47\0\0")
+#define ti_H ("\x48\0\0")
+#define ti_I ("\x49\0\0")
+#define ti_J ("\x4A\0\0")
+#define ti_K ("\x4B\0\0")
+#define ti_L ("\x4C\0\0")
+#define ti_M ("\x4D\0\0")
+#define ti_N ("\x4E\0\0")
+#define ti_O ("\x4F\0\0")
+#define ti_P ("\x50\0\0")
+#define ti_Q ("\x51\0\0")
+#define ti_R ("\x52\0\0")
+#define ti_S ("\x53\0\0")
+#define ti_T ("\x54\0\0")
+#define ti_U ("\x55\0\0")
+#define ti_V ("\x56\0\0")
+#define ti_W ("\x57\0\0")
+#define ti_X ("\x58\0\0")
+#define ti_Y ("\x59\0\0")
+#define ti_Z ("\x60\0\0")
+#define ti_Theta ("\x61\0\0")
+
+/* Some matrix defines */
+#define ti_MatA ("\x5C\x0\0")
+#define ti_MatB ("\x5C\x1\0")
+#define ti_MatC ("\x5C\x2\0")
+#define ti_MatD ("\x5C\x3\0")
+#define ti_MatE ("\x5C\x4\0")
+#define ti_MatF ("\x5C\x5\0")
+#define ti_MatG ("\x5C\x6\0")
+#define ti_MatH ("\x5C\x7\0")
+#define ti_MatI ("\x5C\x8\0")
+#define ti_MatJ ("\x5C\x9\0")
+#define ti_MatT ('\x5C')
+
+/* Some list defines */
+#define ti_L1 ("\x5D\x0\0")
+#define ti_L2 ("\x5D\x1\0")
+#define ti_L3 ("\x5D\x2\0")
+#define ti_L4 ("\x5D\x3\0")
+#define ti_L5 ("\x5D\x4\0")
+#define ti_L6 ("\x5D\x5\0")
+#define ti_LT ('\x5D')
+
+/* Compatibility defines */
+#define ti_Program TI_PRGM_TYPE
+#define ti_ProtectedProgram TI_PPRGM_TYPE
+#define ti_TempProgram TI_TPRGM_TYPE
+#define ti_AppVar TI_APPVAR_TYPE
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/float.h b/frontends/calculator/CEdev/include/float.h index bd022b2..ea526e8 100644 --- a/frontends/calculator/CEdev/include/float.h +++ b/frontends/calculator/CEdev/include/float.h @@ -1,75 +1,75 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef FLOAT_H -#define FLOAT_H - -#define FLT_RADIX 2 /* radix of exponent representation */ - -#define FLT_ROUNDS 0 /* addition rounds to nearest */ - -/* number of base-FLT_RADIX digits in the mantissa */ - -#define FLT_MANT_DIG 24 -#define DBL_MANT_DIG FLT_MANT_DIG -#define LDBL_MANT_DIG FLT_MANT_DIG - -/* number of decimal digits of precision */ - -#define FLT_DIG 6 -#define DBL_DIG FLT_DIG -#define LDBL_DIG FLT_DIG - -/* minimum negative integer such that FLT_RADIX raised to that */ -/* power approximates a positive floating point number in the */ -/* range of representable values. */ - -#define FLT_MIN_EXP -125 -#define DBL_MIN_EXP FLT_MIN_EXP -#define LDBL_MIN_EXP FLT_MIN_EXP - -/* maximum integer such that FLT_RADIX raised to that power */ -/* approximates a floating point number in the range of */ -/* representable numbers. */ - -#define FLT_MAX_EXP 128 -#define DBL_MAX_EXP FLT_MAX_EXP -#define LDBL_MAX_EXP FLT_MAX_EXP - -/* maximum integer such that 10 raised to that power */ -/* approximates a floating point number in the range of */ -/* representable value ((int)log10(FLT_MAX),etc) */ - -#define FLT_MAX_10_EXP +38 -#define DBL_MAX_10_EXP FLT_MAX_10_EXP -#define LDBL_MAX_10_EXP FLT_MAX_10_EXP - -/* minimum negative integer such that 10 raised to that power */ -/* approximates a positive floating point number in the range */ -/* of representable values ((int)log10(FLT_MIN),etc.) */ - -#define FLT_MIN_10_EXP -37 -#define DBL_MIN_10_EXP FLT_MIN_10_EXP -#define LDBL_MIN_10_EXP FLT_MIN_10_EXP - -/* maximum representable floating point numbers */ - -#define FLT_MAX 3.40282347E+38 -#define DBL_MAX FLT_MAX -#define LDBL_MAX FLT_MAX - -/* minimum positive number x such that 1.0 + x != 1.0 (b ^ (1-p)) */ - -#define FLT_EPSILON 1.19209290E-07 -#define DBL_EPSILON FLT_EPSILON -#define LDBL_EPSILON FLT_EPSILON - -/* minimum representable positive floating point numbers */ - -#define FLT_MIN 1.17549435E-38 -#define DBL_MIN FLT_MIN -#define LDBL_MIN FLT_MIN - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef FLOAT_H
+#define FLOAT_H
+
+#define FLT_RADIX 2 /* radix of exponent representation */
+
+#define FLT_ROUNDS 0 /* addition rounds to nearest */
+
+/* number of base-FLT_RADIX digits in the mantissa */
+
+#define FLT_MANT_DIG 24
+#define DBL_MANT_DIG FLT_MANT_DIG
+#define LDBL_MANT_DIG FLT_MANT_DIG
+
+/* number of decimal digits of precision */
+
+#define FLT_DIG 6
+#define DBL_DIG FLT_DIG
+#define LDBL_DIG FLT_DIG
+
+/* minimum negative integer such that FLT_RADIX raised to that */
+/* power approximates a positive floating point number in the */
+/* range of representable values. */
+
+#define FLT_MIN_EXP -125
+#define DBL_MIN_EXP FLT_MIN_EXP
+#define LDBL_MIN_EXP FLT_MIN_EXP
+
+/* maximum integer such that FLT_RADIX raised to that power */
+/* approximates a floating point number in the range of */
+/* representable numbers. */
+
+#define FLT_MAX_EXP 128
+#define DBL_MAX_EXP FLT_MAX_EXP
+#define LDBL_MAX_EXP FLT_MAX_EXP
+
+/* maximum integer such that 10 raised to that power */
+/* approximates a floating point number in the range of */
+/* representable value ((int)log10(FLT_MAX),etc) */
+
+#define FLT_MAX_10_EXP +38
+#define DBL_MAX_10_EXP FLT_MAX_10_EXP
+#define LDBL_MAX_10_EXP FLT_MAX_10_EXP
+
+/* minimum negative integer such that 10 raised to that power */
+/* approximates a positive floating point number in the range */
+/* of representable values ((int)log10(FLT_MIN),etc.) */
+
+#define FLT_MIN_10_EXP -37
+#define DBL_MIN_10_EXP FLT_MIN_10_EXP
+#define LDBL_MIN_10_EXP FLT_MIN_10_EXP
+
+/* maximum representable floating point numbers */
+
+#define FLT_MAX 3.40282347E+38
+#define DBL_MAX FLT_MAX
+#define LDBL_MAX FLT_MAX
+
+/* minimum positive number x such that 1.0 + x != 1.0 (b ^ (1-p)) */
+
+#define FLT_EPSILON 1.19209290E-07
+#define DBL_EPSILON FLT_EPSILON
+#define LDBL_EPSILON FLT_EPSILON
+
+/* minimum representable positive floating point numbers */
+
+#define FLT_MIN 1.17549435E-38
+#define DBL_MIN FLT_MIN
+#define LDBL_MIN FLT_MIN
+
+#endif
diff --git a/frontends/calculator/CEdev/include/format.h b/frontends/calculator/CEdev/include/format.h index 52a0e80..16186bf 100644 --- a/frontends/calculator/CEdev/include/format.h +++ b/frontends/calculator/CEdev/include/format.h @@ -1,109 +1,109 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef FORMAT_H -#define FORMAT_H - -#include <stdarg.h> -#include <stdio.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _PTR_ -#define _PTR_ * -#endif - -/* Note: 24 bits times log(2) is 7.224 decimal digits. - We only need 14 if and when we support doubles. <THH> */ -#define MAXDIGITS 10 -#define MINEXP -4 -#define DEFAULT_PRECISION 6 - -/* format status codes */ -#define FMT_OK 0 -#define FMT_ERR 1 -#define FMT_PASS_THRU 2 - -/* format flags */ -#define FMT_FLAG_MINUS 0x01 -#define FMT_FLAG_PLUS 0x02 -#define FMT_FLAG_SPACE 0x04 -#define FMT_FLAG_POUND 0x08 -#define FMT_FLAG_IGNORE 0x10 // scanf only. -#define FMT_FLAG_PRECISION 0x10 // Only needed for %s, as 0 is valid precision -#define FMT_FLAG_UPPERCASE 0x20 // Added. <THH> -#define FMT_FLAG_PAD_ZERO 0x40 -#define FMT_FLAG_STRIP 0x80 // Output only. <THH> -#define FMT_FLAG_SET 0x80 // Input only; maybe not needed if - // set_begin != 0 is used instead. <THH> - -/* structures and defines for format routines */ -/* NOTE: Some fields in this structure, and the bits in flags, are */ -/* known to the optimizer, If you change this, check out the */ -/* optimizer code in genprintf.c . */ - -struct fmt_type { - unsigned char status; /* status, OK, ERR, or PASS_THRU */ - unsigned char flags; /* flags bit mask */ - char size; /* size character h,l or L */ - char chr; /* pass thru character */ - char type; /* type of argument d,i,o,u,x ... */ - char field_width; /* field width */ - char precision; /* precision */ - char _PTR_ set_begin; /* pointer to first char in set */ - char _PTR_ set_end; /* pointer to last char in set */ - unsigned char pad_whole; - unsigned char pad_pre_fract; - unsigned char pad_post_fract; - char _PTR_ pad_at; - }; - -/* info flags */ -#define FLT_INFO_SIGN (1<<0) -#define FLT_INFO_INF (1<<1) -#define FLT_INFO_NAN (1<<2) - -/* Note: using char to represent the (decimal) exponent only works for - 4-byte floats. If we choose to support 8-byte doubles, then this must - be increased. <THH> */ -struct flt_info { - unsigned char flags; /* 1=sign, 2=inf, 4=nan */ - char exp; /* (signed) exponent (base 10) */ - unsigned char digits[MAXDIGITS]; /* max significant digits */ -}; - -extern struct fmt_type __print_fmt; -extern char __print_buff[]; -extern unsigned char __print_len; -extern char __print_leading_char; // Initial +, -, or space for number -extern void __print_send(); - -extern void _u_stoa(short); -extern void _u_ustoa(unsigned short); -extern void _u_itoa(int); -extern void _u_uitoa(unsigned int); -extern void _u_ltoa(long); -extern void _u_ultoa(unsigned long); -extern int _u_print(char _PTR_ src,char _PTR_ fmt,va_list); -extern int _u_scan(char _PTR_ src,char _PTR_ fmt,va_list ap); -extern void _u_dtof(double); -extern void _u_dtog(double); - -extern char _PTR_ _u_pscan(char _PTR_ fmt,struct fmt_type _PTR_ str, va_list _PTR_ argp); -extern char _PTR_ _u_sscan (char _PTR_ fmt,struct fmt_type _PTR_ str); - -extern void _u_reverse(char _PTR_ s); -extern char _PTR_ _u_dtoe(double); - -extern void _u_flt_info(double,struct flt_info _PTR_); -extern void _u_flt_rnd(struct flt_info _PTR_ , char); - -#ifdef __cplusplus -} -#endif - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef FORMAT_H
+#define FORMAT_H
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _PTR_
+#define _PTR_ *
+#endif
+
+/* Note: 24 bits times log(2) is 7.224 decimal digits.
+ We only need 14 if and when we support doubles. <THH> */
+#define MAXDIGITS 10
+#define MINEXP -4
+#define DEFAULT_PRECISION 6
+
+/* format status codes */
+#define FMT_OK 0
+#define FMT_ERR 1
+#define FMT_PASS_THRU 2
+
+/* format flags */
+#define FMT_FLAG_MINUS 0x01
+#define FMT_FLAG_PLUS 0x02
+#define FMT_FLAG_SPACE 0x04
+#define FMT_FLAG_POUND 0x08
+#define FMT_FLAG_IGNORE 0x10 // scanf only.
+#define FMT_FLAG_PRECISION 0x10 // Only needed for %s, as 0 is valid precision
+#define FMT_FLAG_UPPERCASE 0x20 // Added. <THH>
+#define FMT_FLAG_PAD_ZERO 0x40
+#define FMT_FLAG_STRIP 0x80 // Output only. <THH>
+#define FMT_FLAG_SET 0x80 // Input only; maybe not needed if
+ // set_begin != 0 is used instead. <THH>
+
+/* structures and defines for format routines */
+/* NOTE: Some fields in this structure, and the bits in flags, are */
+/* known to the optimizer, If you change this, check out the */
+/* optimizer code in genprintf.c . */
+
+struct fmt_type {
+ unsigned char status; /* status, OK, ERR, or PASS_THRU */
+ unsigned char flags; /* flags bit mask */
+ char size; /* size character h,l or L */
+ char chr; /* pass thru character */
+ char type; /* type of argument d,i,o,u,x ... */
+ char field_width; /* field width */
+ char precision; /* precision */
+ char _PTR_ set_begin; /* pointer to first char in set */
+ char _PTR_ set_end; /* pointer to last char in set */
+ unsigned char pad_whole;
+ unsigned char pad_pre_fract;
+ unsigned char pad_post_fract;
+ char _PTR_ pad_at;
+ };
+
+/* info flags */
+#define FLT_INFO_SIGN (1<<0)
+#define FLT_INFO_INF (1<<1)
+#define FLT_INFO_NAN (1<<2)
+
+/* Note: using char to represent the (decimal) exponent only works for
+ 4-byte floats. If we choose to support 8-byte doubles, then this must
+ be increased. <THH> */
+struct flt_info {
+ unsigned char flags; /* 1=sign, 2=inf, 4=nan */
+ char exp; /* (signed) exponent (base 10) */
+ unsigned char digits[MAXDIGITS]; /* max significant digits */
+};
+
+extern struct fmt_type __print_fmt;
+extern char __print_buff[];
+extern unsigned char __print_len;
+extern char __print_leading_char; // Initial +, -, or space for number
+extern void __print_send();
+
+extern void _u_stoa(short);
+extern void _u_ustoa(unsigned short);
+extern void _u_itoa(int);
+extern void _u_uitoa(unsigned int);
+extern void _u_ltoa(long);
+extern void _u_ultoa(unsigned long);
+extern int _u_print(char _PTR_ src,char _PTR_ fmt,va_list);
+extern int _u_scan(char _PTR_ src,char _PTR_ fmt,va_list ap);
+extern void _u_dtof(double);
+extern void _u_dtog(double);
+
+extern char _PTR_ _u_pscan(char _PTR_ fmt,struct fmt_type _PTR_ str, va_list _PTR_ argp);
+extern char _PTR_ _u_sscan (char _PTR_ fmt,struct fmt_type _PTR_ str);
+
+extern void _u_reverse(char _PTR_ s);
+extern char _PTR_ _u_dtoe(double);
+
+extern void _u_flt_info(double,struct flt_info _PTR_);
+extern void _u_flt_rnd(struct flt_info _PTR_ , char);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/graphx.h b/frontends/calculator/CEdev/include/graphx.h index bbcf697..33e93e7 100644 --- a/frontends/calculator/CEdev/include/graphx.h +++ b/frontends/calculator/CEdev/include/graphx.h @@ -1,1514 +1,1514 @@ -/** - * @file - * @brief Contains optimized graphics operations and routines - * - * Example program template with best graphx buffer usage pattern: - * @code - * // Standard #includes omitted - * - * bool partial_redraw; - * - * // Implement us! - * void begin(); - * void end(); - * bool step(); - * void draw(); - * - * void main() { - * begin(); // No rendering allowed! - * gfx_Begin(); - * gfx_SetDrawBuffer(); // Draw to the buffer to avoid rendering artifats - * - * while (step()) { // No rendering allowed in step! - * if (partial_redraw) // Only want to redraw part of the previous frame? - * gfx_BlitScreen(); // Copy previous frame as a base for this frame - * draw(); // As little non-rendering logic as possible - * gfx_SwapDraw(); // Queue the buffered frame to be displayed - * } - * - * gfx_End(); - * end(); - * } - * @endcode - * - * @authors Matt "MateoConLechuga" Waltz - * @authors Jacob "jacobly" Young - * @authors Zachary "Runer112" Wassall - * @authors Patrick "tr1p1ea" Prendergast - * @authors "grosged" - */ - -#ifndef H_GRAPHX -#define H_GRAPHX - -#include <stdint.h> -#include <stdlib.h> -#include <stdbool.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Sprite (image) type. - * - * Whether or not a sprite includes transparency is not explicitly encoded, and - * is determined only by usage. If used with transparency, transparent pixels - * are those with a certain color index, which can be set with - * gfx_SetTransparentColor(). - * - * @attention - * Displaying a gfx_rletsprite_t (which includes transparency) is significantly - * faster than displaying a gfx_sprite_t with transparency, and should be - * preferred. However, gfx_rletsprite_t does not support transformations, such - * as flipping and rotation. Such transformations can be applied to a - * gfx_sprite_t, which can then be converted to a gfx_rletsprite_t for faster - * display using gfx_ConvertToNewRLETSprite() or gfx_ConvertToRLETSprite(). - * - * @remarks - * Create at compile-time with a tool like - * <a href="https://github.com/MattWaltz/convpng" target="_blank">convpng</a>. - * Create at runtime (with uninitialized data) with gfx_MallocSprite(), - * gfx_UninitedSprite(), or gfx_TempSprite(). - */ -typedef struct { - uint8_t width; /**< Width of the image */ - uint8_t height; /**< Height of the image */ - uint8_t data[1]; /**< Image data array */ -} gfx_sprite_t; - -/** - * @brief Sprite (image) type with RLE transparency. - * - * @attention - * Displaying a gfx_rletsprite_t (which includes transparency) is significantly - * faster than displaying a gfx_sprite_t with transparency, and should be - * preferred. However, gfx_rletsprite_t does not support transformations, such - * as flipping and rotation. Such transformations can be applied to a - * gfx_sprite_t, which can then be converted to a gfx_rletsprite_t for faster - * display using gfx_ConvertToNewRLETSprite() or gfx_ConvertToRLETSprite(). - * - * @remarks - * Create at compile-time with a tool like - * <a href="https://github.com/MattWaltz/convpng" target="_blank">convpng</a>. - */ -typedef struct { - uint8_t width; /**< Width of the image */ - uint8_t height; /**< Height of the image */ - uint8_t data[1]; /**< Image data array */ -} gfx_rletsprite_t; - -/** - * @brief A simple structure for working with 2D points - */ -typedef struct { - int x; /**< x point */ - int y; /**< y point */ -} gfx_point_t; - -/** - * @brief Stores operating modes of this library - * @see gfx_Begin - */ -typedef enum { - gfx_8bpp = 0x27 /**< Enable 8 bits per pixel mode */ -} gfx_mode_t; - -/** - * Dynamically allocates memory for a sprite. - * - * Allocates the memory with \p malloc_routine. \p width and \p height will be - * set in the allocated sprite. Returns \c NULL upon allocation failure. - * - * @note - * If not used in a dynamic context and \p width and \p height are static, - * consider statically allocating the sprite instead with gfx_UninitedSprite() - * or gfx_TempSprite(). - * - * @remarks - * If using \c malloc as the \p malloc_routine, gfx_MallocSprite() can be used - * as a shortcut. - * - * @param width sprite width - * @param height sprite height - * @param malloc_routine malloc implementation to use - * @return pointer to the allocated sprite - */ -gfx_sprite_t *gfx_AllocSprite(uint8_t width, uint8_t height, void *(*malloc_routine)(size_t)); - -/** - * Dynamically allocates memory for a sprite using \c malloc. - * - * \p width and \p height will be set in the sprite. Returns \c NULL upon - * allocation failure. - * - * @note - * If not used in a dynamic context and \p width and \p height are static, - * consider statically allocating the sprite instead with gfx_UninitedSprite() - * or gfx_TempSprite(). - * - * @param width sprite width - * @param height sprite height - * @return pointer to the allocated sprite - * @see gfx_AllocSprite - */ -#define gfx_MallocSprite(width, height) \ -gfx_AllocSprite(width, height, malloc) - -/** - * Statically allocates unitialized memory for a sprite. - * - * Declares a <tt>gfx_sprite_t *</tt> with the given \p name pointing to the - * allocated memory. \p width and \p height will \b not be set in the sprite, - * unlike gfx_TempSprite(). - * - * @warning - * If used outside of a function body, the memory will be allocated in the - * global unitialized data segment (BSS). If used inside a function body, the - * memory will be allocated on the stack. If the sprite is sufficiently large, - * usage inside a function body will overflow the stack, so it is recommended - * that this normally be used outside of a function body. - * - * @param name name of declared <tt>gfx_sprite_t *</tt> - * @param width sprite width - * @param height sprite height - * @see gfx_MallocSprite - */ -#define gfx_UninitedSprite(name, width, height) \ -uint8_t name##_data[2 + (width) * (height)]; \ -gfx_sprite_t *name = (gfx_sprite_t *)name##_data - -/** - * Statically allocates memory for a sprite. - * - * Declares a <tt>gfx_sprite_t *</tt> with the given \p name pointing to the - * allocated memory. \p width and \p height will be set in the sprite, unlike - * gfx_UninitedSprite(). - * - * @attention - * Due to \p width and \p height being set, the memory will be allocated in the - * initialized data segment. If the compiled program is not compressed, then - * this could be a serious source of bloat and gfx_UninitedSprite() should be - * preferred. - * - * @param name name of declared <tt>gfx_sprite_t *</tt> - * @param width sprite width - * @param height sprite height - * @see gfx_MallocSprite - */ -#define gfx_TempSprite(name, width, height) \ -uint8_t name##_data[2 + (width) * (height)] = { (width), (height) }; \ -gfx_sprite_t *name = (gfx_sprite_t *)name##_data - -/** - * Dynamically allocates memory for a sprite with RLE transpareny. - * - * Allocates the memory with \p malloc_routine. Returns \c NULL upon allocation - * failure. - * - * \p data_size is the maximum predicted/calculated size of the sprite data - * (excuding the width and height bytes) that will be stored in the allocated - * sprite. Sprite data size could be up to <tt>(width + 1) * height * 3 / 2</tt> - * bytes in the worst case, in which pixels horizontally alternate between - * non-transparent and transparent and each row begins with a non-transparent - * pixel. But if the average length of a horizontal transparent run is at least - * 2, then the sprite data will be no larger than <tt>(width + 1) * height</tt> - * bytes. The exact data size necessary is <tt>2 * - * num_horizontal_transparent_runs + num_non_transparent_pixels + - * num_rows_beginning_with_non_transparent_pixel - - * num_rows_ending_with_transparent_pixel</tt> bytes. - * - * @note - * If not used in a dynamic context and \p data_size is static, consider - * statically allocating the sprite instead with gfx_UninitedRLETSprite() or - * gfx_TempRLETSprite(). - * - * @remarks - * If using \c malloc as the \p malloc_routine, gfx_MallocRLETSprite() can be - * used as a shortcut. - * - * @param data_size (maximum) sprite data size - * @param malloc_routine malloc implementation to use - * @return pointer to the allocated sprite - */ -#define gfx_AllocRLETSprite(data_size, malloc_routine) \ -(gfx_rletsprite_t *)(malloc_routine)(data_size) - -/** - * Dynamically allocates memory for a sprite with RLE transparency using \c - * malloc. - * - * \p data_size is the size to allocate for sprite data; see - * gfx_AllocRLETSprite() for information. Returns \c NULL upon allocation - * failure. - * - * @note - * If not used in a dynamic context and \p data_size is static, consider - * statically allocating the sprite instead with gfx_UninitedRLETSprite() or - * gfx_TempRLETSprite(). - * - * @param data_size (maximum) sprite data size - * @return pointer to the allocated sprite - * @see gfx_AllocRLETSprite - */ -#define gfx_MallocRLETSprite(data_size) \ -gfx_AllocRLETSprite(data_size, malloc) - -/** - * Statically allocates unitialized memory for a sprite with RLE transparency. - * - * Declares a <tt>gfx_rletsprite_t *</tt> with the given \p name pointing to the - * allocated memory. \p data_size is the size to allocate for sprite data; see - * gfx_AllocRLETSprite() for information. - * - * @warning - * If used outside of a function body, the memory will be allocated in the - * global unitialized data segment (BSS). If used inside a function body, the - * memory will be allocated on the stack. If the sprite is sufficiently large, - * usage inside a function body will overflow the stack, so it is recommended - * that this normally be used outside of a function body. - * - * @param name name of declared <tt>gfx_rletsprite_t *</tt> - * @param data_size (maximum) sprite data size - * @see gfx_MallocRLETSprite - */ -#define gfx_UninitedRLETSprite(name, data_size) \ -uint8_t name##_data[2 + (data_size)]; \ -gfx_rletsprite_t *name = (gfx_rletsprite_t *)name##_data - -/** - * Initializes the graphics library setup - */ -int gfx_Begin(); - -/** - * Closes the graphics setup - * - * Restores the LCD to 16bpp prefered by the OS and clears the screen. - */ -void gfx_End(void); - -/** - * Used for accessing the lcd palette directly - * - * This consists of 256 entries, each 2 bytes in size for a total of 512 bytes - */ -#define gfx_palette \ -((uint16_t*)0xE30200) - -/** - * Array of the LCD RAM - * - * Total of 153600 bytes in size - * @see gfx_vbuffer - */ -#define gfx_vram \ -((uint8_t*)0xD40000) - -/** - * Array of the current drawing buffer - * - * Total of 76800 bytes in size - * @see gfx_vram - */ -#define gfx_vbuffer \ -(**(uint8_t(**)[240][320])0xE30014) - -/** - * @brief Defines a rectangular graphics region - * - * @see gfx_GetClipRegion - */ -typedef struct { - int xmin; /**< Minimum x coordinate */ - int ymin; /**< Minimum y coordinate */ - int xmax; /**< Maximum x coordinate */ - int ymax; /**< Maximum y coordinate */ -} gfx_region_t; - -/** - * @brief Defines tilemap structure - * - * @see gfx_Tilemap - */ -typedef struct { - uint8_t *map; /**< Pointer to indexed map array */ - gfx_sprite_t **tiles; /**< Pointer to tiles */ - uint8_t tile_height; /**< Individual tile height */ - uint8_t tile_width; /**< Individual tile width */ - uint8_t draw_height; /**< Number of tiles per row to draw */ - uint8_t draw_width; /**< Number of tile per column to draw */ - uint8_t type_width; /**< Tile type height @see gfx_tilemap_type_t */ - uint8_t type_height; /**< Tile type width @see gfx_tilemap_type_t */ - uint8_t height; /**< Total number of rows in the tilemap */ - uint8_t width; /**< Total number of columns in the tilemap */ - uint8_t y_loc; /**< Y pixel location of tilemap */ - uint24_t x_loc; /**< X pixel location to tilemap */ -} gfx_tilemap_t; - -/** - * @brief Used for defining tile types - * - * @see gfx_tilemap_t - */ -typedef enum { - gfx_tile_no_pow2 = 0, /**< Set when using non powers of 2 */ - gfx_tile_2_pixel, /**< Set when using 2 pixel tiles */ - gfx_tile_4_pixel, /**< Set when using 4 pixel tiles */ - gfx_tile_8_pixel, /**< Set when using 8 pixel tiles */ - gfx_tile_16_pixel, /**< Set when using 16 pixel tiles */ - gfx_tile_32_pixel, /**< Set when using 32 pixel tiles */ - gfx_tile_64_pixel, /**< Set when using 64 pixel tiles */ - gfx_tile_128_pixel /**< Set when using 128 pixel tiles */ -} gfx_tilemap_type_t; - -/** - * Draws a tilemap given an initialized tilemap structure - * - * @param tilemap Pointer to initialized tilemap structure - * @param x_offset Offset in pixels from the left of the tilemap - * @param y_offset Offset in pixels from the top of the tilemap - * @see gfx_tilemap_t - */ -void gfx_Tilemap(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset); - -/** - * Draws an unclipped tilemap given an initialized tilemap structure - * - * @param tilemap Pointer to initialized tilemap structure - * @param x_offset Offset in pixels from the left of the tilemap - * @param y_offset Offset in pixels from the top of the tilemap - * @see gfx_tilemap_t - */ -void gfx_Tilemap_NoClip(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset); - -/** - * Draws a transparent tilemap given an initialized tilemap structure - * - * @param tilemap Pointer to initialized tilemap structure - * @param x_offset Offset in pixels from the left of the tilemap - * @param y_offset Offset in pixels from the top of the tilemap - * @see gfx_tilemap_t - */ -void gfx_TransparentTilemap(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset); - -/** - * Draws an unclipped transparent tilemap given an initialized tilemap structure - * - * @param tilemap Pointer to initialized tilemap structure - * @param x_offset Offset in pixels from the left of the tilemap - * @param y_offset Offset in pixels from the top of the tilemap - * @see gfx_tilemap_t - */ -void gfx_TransparentTilemap_NoClip(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset); - -/** - * Gets a pointer to a particular tile given an initialized tilemap structure and pixel offsets - * - * @param tilemap Pointer to initialized tilemap structure - * @param x_offset Offset in pixels from the left of the tilemap - * @param y_offset Offset in pixels from the top of the tilemap - */ -uint8_t *gfx_TilePtr(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset); - -/** - * Sets a particular tile's value given an initialized tilemap structure and pixel offsets - * - * @param tilemap Pointer to initialized tilemap structure - * @param x_offset Offset in pixels from the left of the tilemap - * @param y_offset Offset in pixels from the top of the tilemap - * @param value Value to set tile to - */ -#define gfx_SetTile(tilemap, x_offset, y_offset, value) \ -(*(gfx_TilePtr((tilemap), (x_offset), (y_offset))) = (uint8_t)(value)) - -/** - * Gets a particular tile's value given an initialized tilemap structure and pixel offsets - * - * @param tilemap Pointer to initialized tilemap structure - * @param x_offset Offset in pixels from the left of the tilemap - * @param y_offset Offset in pixels from the top of the tilemap - */ -#define gfx_GetTile(tilemap, x_offset, y_offset) \ -(*(gfx_TilePtr((tilemap), (x_offset), (y_offset)))) - -/** - * Gets a pointer to a particular tile given an initialized tilemap structure and mapped offsets - * - * @param tilemap Pointer to initialized tilemap structure - * @param row Offset in bytes in the row - * @param col Offset in bytes in the column - */ -uint8_t *gfx_TilePtrMapped(gfx_tilemap_t *tilemap, uint8_t row, uint8_t col); - -/** - * Sets a particular tile's value given an initialized tilemap structure and mapped offsets - * - * @param tilemap Pointer to initialized tilemap structure - * @param row Offset in bytes in the row - * @param col Offset in bytes in the column - * @param value Value to set tile to - */ -#define gfx_SetTileMapped(tilemap, row, col, value) \ -(*(gfx_TilePtrMapped((tilemap), (row), (col))) = (uint8_t)(value)) - -/** - * Gets a particular tile's value given an initialized tilemap structure and mapped offsets - * - * @param tilemap Pointer to initialized tilemap structure - * @param row Offset in bytes in the row - * @param col Offset in bytes in the column - */ -#define gfx_GetTileMapped(tilemap, row, col) \ -(*(gfx_TilePtrMapped((tilemap), (row), (col)))) - -/** - * Sets the color index that drawing routines will use - * - * This applies to lines, rectangles, circles, etc - * @param index Color index to set - * @returns Previous set color index - */ -uint8_t gfx_SetColor(uint8_t index); - -/** - * Sets the transparent index that drawing routines will use - * - * This currently applies to transparent sprites, both scaled and unscaled - * @param index Transparent color index to set - * @returns The previous transparent color index - */ -uint8_t gfx_SetTransparentColor(uint8_t index); - -/** - * Sets up the default palette for the given mode - * - * @param mode Palette to use - */ -void gfx_SetDefaultPalette(gfx_mode_t mode); - -/** - * Sets entries in the palette - * - * @param palette Pointer to palette to use - * @param size Size of palette to store - * @param offset Offset in bytes to start at (Generally set to 0) - */ -void gfx_SetPalette(uint16_t *palette, uint24_t size, uint8_t offset); - -/** - * Fills the screen with a given palette index - * - * @param index Color index to fill with - */ -void gfx_FillScreen(uint8_t index); - -/** - * Implements a faster version of gfx_FillScreen(0) - * - * @see gfx_FillScreen - */ -void gfx_ZeroScreen(void); - -/** - * Sets a pixel to the global color index - * - * This is measured from the top left origin of the screen. - * Pixels are only clipped within the screen boundaries - * @param x X coordinate location - * @param y Y coordinate location - * @see gfx_SetColor - */ -void gfx_SetPixel(uint24_t x, uint8_t y); - -/** - * Gets a pixel's color index - * - * This is measured from the top left origin of the screen. - * Pixels are only clipped within the screen boundaries - * @param x X coordinate location - * @param y Y coordinate location - */ -uint8_t gfx_GetPixel(uint24_t x, uint8_t y); - -/** - * Draws a line - * - * This is measured from the top left origin of the screen. - * @param x0 First X coordinate - * @param y0 First Y coordinate - * @param x1 Second X coordinate - * @param y1 Second Y coordinate - */ -void gfx_Line(int x0, int y0, int x1, int y1); - -/** - * Draws an unclipped line - * - * This is measured from the top left origin of the screen. - * @param x0 First X coordinate - * @param y0 First Y coordinate - * @param x1 Second X coordinate - * @param y1 Second Y coordinate - */ -void gfx_Line_NoClip(uint24_t x0, uint8_t y0, uint24_t x1, uint8_t y1); - -/** - * Clips the points in a window region - * - * This is measured from the top left origin of the screen. - * @param x0 First X coordinate - * @param y0 First Y coordinate - * @param x1 Second X coordinate - * @param y1 Second Y coordinate - * @returns False if not within window, true otherwise - */ -bool gfx_CohenSutherlandClip(int *x0, int *y0, int *x1, int *y1); - -/** - * Draws a horizontal line - * - * This is measured from the top left origin of the screen. - * Performs faster than using @c gfx_Line - * @param x X coordinate - * @param y Y coordinate - * @param length Length of line - */ -void gfx_HorizLine(int x, int y, int length); - -/** - * Draws an unclipped horizontal line - * - * This is measured from the top left origin of the screen. - * Performs faster than using @c gfx_Line - * @param x X coordinate - * @param y Y coordinate - * @param length Length of line - */ -void gfx_HorizLine_NoClip(uint24_t x, uint8_t y, uint24_t length); - -/** - * Draws a vertical line - * - * This is measured from the top left origin of the screen. - * Performs faster than using @c gfx_Line - * @param x X coordinate - * @param y Y coordinate - * @param length Length of line - */ -void gfx_VertLine(int x, int y, int length); - -/** - * Draws an unclipped vertical line - * - * This is measured from the top left origin of the screen. - * Performs faster than using @c gfx_Line - * @param x X coordinate - * @param y Y coordinate - * @param length Length of line - */ -void gfx_VertLine_NoClip(uint24_t x, uint8_t y, uint24_t length); - -/** - * Draws a rectangle outline - * - * This is measured from the top left origin of the screen. - * @param x X coordinate - * @param y Y coordinate - * @param width Width of rectangle - * @param height Height of rectangle - */ -void gfx_Rectangle(int x, int y, int width, int height); - -/** - * Draws an unclipped rectangle outline - * - * This is measured from the top left origin of the screen. - * @param x X coordinate - * @param y Y coordinate - * @param width Width of rectangle - * @param height Height of rectangle - */ -void gfx_Rectangle_NoClip(uint24_t x, uint8_t y, uint24_t width, uint8_t height); - -/** - * Draws a filled rectangle - * - * This is measured from the top left origin of the screen. - * @param x X coordinate - * @param y Y coordinate - * @param width Width of rectangle - * @param height Height of rectangle - */ -void gfx_FillRectangle(int x, int y, int width, int height); - -/** - * Draws an unclipped filled rectangle - * - * This is measured from the top left origin of the screen. - * @param x X coordinate - * @param y Y coordinate - * @param width Width of rectangle - * @param height Height of rectangle - */ -void gfx_FillRectangle_NoClip(uint24_t x, uint8_t y, uint24_t width, uint8_t height); - -/** - * Draws a circle outline - * - * This is measured from the top left origin of the screen. - * @param x X coordinate - * @param y Y coordinate - * @param radius The radius of the circle - */ -void gfx_Circle(int x, int y, unsigned radius); - -/** - * Draws a filled circle - * - * This is measured from the top left origin of the screen. - * @param x X coordinate - * @param y Y coordinate - * @param radius The radius of the circle - */ -void gfx_FillCircle(int x, int y, unsigned radius); - -/** - * Draws an unclipped filled circle - * - * This is measured from the top left origin of the screen. - * @param x X coordinate - * @param y Y coordinate - * @param radius The radius of the circle - */ -void gfx_FillCircle_NoClip(uint24_t x, uint8_t y, unsigned radius); - -/** - * Draws an unclipped circle outline - * - * This is measured from the top left origin of the screen. - * @param x X coordinate - * @param y Y coordinate - * @param radius The radius of the circle - */ -#define gfx_Circle_NoClip(x, y, radius) \ -gfx_Circle((x), (y), (radius)) - -/** - * Draws a polygon outline - * - * Points are measured from the top left origin of the screen. - * @code - * int points[6] = { - * 160, 1, // (x0, y0) - * 1, 238, // (x1, y1) - * 318,238, // (x2, y2) - * }; - * num_points = 3; - * gfx_Polygon(points, num_points) - * @endcode - * @param points Pointer to x and y pairs - * @param num_points Number of x and y pairs - */ -void gfx_Polygon(int *points, unsigned num_points); - -/** - * Draws an unclipped polygon outline - * - * Points are measured from the top left origin of the screen. - * @code - * int points[6] = { - * 160, 1, // (x0, y0) - * 1, 238, // (x1, y1) - * 318,238, // (x2, y2) - * }; - * num_points = 3; - * gfx_Polygon_NoClip(points, num_points) - * @endcode - * @param points Pointer to x and y pairs - * @param num_points Number of x and y pairs - */ -void gfx_Polygon_NoClip(int *points, unsigned num_points); - -/** - * Draws a filled triangle - * - * Points are measured from the top left origin of the screen. - * @param x0 First X coordinate - * @param y0 First Y coordinate - * @param x1 Second X coordinate - * @param y1 Second Y coordinate - * @param x2 Third X coordinate - * @param y2 Third Y coordinate - */ -void gfx_FillTriangle(int x0, int y0, int x1, int y1, int x2, int y2); -void gfx_FillTriangle_NoClip(int x0, int y0, int x1, int y1, int x2, int y2); - -/** - * Forces all graphics routines draw location - * - * @param location Location routines should draw to - * @see gfx_draw_location_t - */ -void gfx_SetDraw(uint8_t location); - -/** - * @brief Different locations routines can be drawn to - */ -typedef enum { - gfx_screen = 0, /**< Screen */ - gfx_buffer /**< Buffer */ -} gfx_draw_location_t; - -/** - * Makes the subsequent GraphX drawing routines act on the buffer - */ -#define gfx_SetDrawBuffer() \ -gfx_SetDraw(gfx_buffer) - -/** - * Makes the subsequent GraphX drawing routines act on the screen - */ -#define gfx_SetDrawScreen() \ -gfx_SetDraw(gfx_screen) - -/** - * Gets current draw location - * - * @returns Location type enumeration - * @see gfx_draw_location_t - */ -uint8_t gfx_GetDraw(void); - -/** - * Swaps the roles of the screen and drawing buffers. - * - * Does not wait for the old screen buffer to finish being displayed. Instead, - * the next invocation of a graphx drawing function will block, waiting for this - * event. To block and wait explicitly, use gfx_Wait(). - * - * The LCD driver maintains its own screen buffer pointer for the duration of a - * refresh. The swap performed by this function will only be picked up at a - * point between refreshes. - * - * @remarks - * In practice, this function should be invoked immediately after finishing - * drawing a frame to the drawing buffer, and invocation of the first graphx - * drawing function for the next frame should be scheduled as late as possible - * relative to non-drawing logic. Non-drawing logic can execute during time when - * a drawing function may otherwise block. - */ -void gfx_SwapDraw(void); - -/** - * Waits for the screen buffer to finish being displayed after gfx_SwapDraw(). - * - * @remarks - * In practice, this function should not need to be invoked by user code. It - * should be invoked by custom drawing functions (as late as reasonably - * possible) before writing to the drawing buffer, gfx_vbuffer. - */ -void gfx_Wait(void); - -/** - * Copies the input buffer to the opposite buffer - * - * No clipping is performed; as it is a copy not a draw - * @param src drawing location to copy from - * @see gfx_draw_location_t - */ -void gfx_Blit(uint8_t src); - -/** - * Copies lines from the input buffer to the opposite buffer - * - * No clipping is performed; as it is a copy not a draw - * @param src drawing location to copy from - * @param y_loc Y Location to begin copying at - * @param num_lines Number of lines to copy - * @see gfx_draw_location_t - */ -void gfx_BlitLines(uint8_t src, uint8_t y_loc, uint8_t num_lines); - -/** - * Copies a rectangle from the input buffer to the opposite buffer - * - * No clipping is performed; as it is a copy not a draw - * @param src drawing location to copy from - * @param x X coordinate - * @param y Y coordinate - * @param width Width of rectangle - * @param height Height of rectangle - * @see gfx_draw_location_t - */ -void gfx_BlitRectangle(uint8_t src, uint24_t x, uint8_t y, uint24_t width, uint24_t height); - -/** - * Copies the screen to the buffer - */ -#define gfx_BlitScreen() \ -gfx_Blit(gfx_screen) - -/** - * Copies the buffer to the screen - */ -#define gfx_BlitBuffer() \ -gfx_Blit(gfx_buffer) - -/** - * Sets the scaling for text - * - * Values in the range from 1-5 are preferred. - * @param width_scale Text width scaling - * @param height_scale Text height scaling - */ -void gfx_SetTextScale(uint8_t width_scale, uint8_t height_scale); - -/** - * Prints a character - * - * Outputs a character at the current cursor position. - * @param c Character to print - * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig) - */ -void gfx_PrintChar(const char c); - -/** - * Prints a signed integer - * - * Outputs at the current cursor position. Padded with leading zeros if - * necessary to satisfy the specified minimum length. - * @param n Integer to print - * @param length Minimum number of characters to print - * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig) - * @note \c length must be between 1 and 8, inclusive - */ -void gfx_PrintInt(int n, uint8_t length); - -/** - * Prints an unsigned integer - * - * Outputs at the current cursor position. Padded with leading zeros if - * necessary to satisfy the specified minimum length. - * @param n Unsigned integer to print - * @param length Minimum number of characters to print - * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig) - * @note \c length must be between 1 and 8, inclusive - */ -void gfx_PrintUInt(unsigned int n, uint8_t length); - -/** - * Prints a string - * - * Outputs a string at the current cursor position. - * @param string Pointer to string to print - * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig) - */ -void gfx_PrintString(const char *string); - -/** - * Prints a string at coordinates - * - * Outputs a string at the supplied coordinates - * Posistion is measured from top left origin of screen. - * @param string Pointer to string to print - * @param x X coordinate - * @param y Y coordinate - * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig) - */ -void gfx_PrintStringXY(const char *string, int x, int y); - -/** - * @returns The current text cursor X position - */ -int gfx_GetTextX(void); - -/** - * @returns The current text cursor Y position - */ -int gfx_GetTextY(void); - -/** - * Sets the text cursor XY position - * - * @param x X coordinate - * @param y Y coordinate - */ -void gfx_SetTextXY(int x, int y); - -/** - * Sets the configuration for the text routines - * - * @param config Set the options for the text mode - * @see gfx_text_options_t - * @note Scaled text does not clip - */ -void gfx_SetTextConfig(uint8_t config); - -/** - * @brief Different available text modes - */ -typedef enum { - gfx_text_clip = 1, /**< Text routines will clip against the defined clip window */ - gfx_text_noclip /**< Default, text routines do not clip (much faster) */ -} gfx_text_options_t; - -/** - * Sets text foreground color - * - * @param color Color index to set - * @returns Previous text foreground color index - * @note Default text foreground color index: 0 - */ -uint8_t gfx_SetTextFGColor(uint8_t color); - -/** - * Sets text background color - * - * @param color Color index to set - * @returns Previous text background color index - * @note Default text background color index: 255 - */ -uint8_t gfx_SetTextBGColor(uint8_t color); - -/** - * Sets text transparency color - * - * @param color Color index to set - * @returns Previous text transparency color index - * @note Default text transparency color index: 255 - */ -uint8_t gfx_SetTextTransparentColor(uint8_t color); - -/** - * Draws a sprite - * - * @param sprite Pointer to initialized sprite structure - * @param x X coordinate - * @param y Y coordinate - */ -void gfx_Sprite(gfx_sprite_t *sprite, int x, int y); - -/** - * Draws an unclipped sprite - * - * @param sprite Pointer to initialized sprite structure - * @param x X coordinate - * @param y Y coordinate - */ -void gfx_Sprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y); - -/** - * Draws a transparent sprite - * - * @param sprite Pointer to initialized sprite structure - * @param x X coordinate - * @param y Y coordinate - */ -void gfx_TransparentSprite(gfx_sprite_t *sprite, int x, int y); - -/** - * Draws an unclipped transparent sprite - * - * @param sprite Pointer to initialized sprite structure - * @param x X coordinate - * @param y Y coordinate - */ -void gfx_TransparentSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y); - -/** - * Grabs the background behind a sprite - * - * This is useful for partial redraw. - * @param sprite_buffer Buffer used to store grabbed sprite - * @param x X coordinate to grab sprite - * @param y Y coordinate to grab sprite - * @returns A pointer to sprite_buffer - * @note sprite_buffer must be pointing to a large enough buffer to hold width*height number of bytes - */ -gfx_sprite_t *gfx_GetSprite(gfx_sprite_t *sprite_buffer, int x, int y); - -/** - * Grabs the background behind an unclipped sprite - * - * This is useful for partial redraw. - * @param sprite_buffer Buffer used to store grabbed sprite - * @param x X coordinate to grab sprite - * @param y Y coordinate to grab sprite - * @returns A pointer to sprite_buffer - * @note sprite_buffer must be pointing to a large enough buffer to hold width*height number of bytes - */ -#define gfx_GetSprite_NoClip(sprite_buffer, x, y) \ -gfx_GetSprite((sprite_buffer), (x), (y)) - -/** - * Scales an unclipped sprite - * - * Scaling factors must be greater than or equal to 1, and an integer factor - * @param sprite Pointer to initialized sprite structure - * @param x X coordinate - * @param y Y coordinate - * @param width_scale Width scaling factor - * @param height_scale Height scaling factor - * @note Useable with gfx_GetSprite in order to create clipped versions - */ -void gfx_ScaledSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y, uint8_t width_scale, uint8_t height_scale); - -/** - * Scales an unclipped transparent sprite - * - * Scaling factors must be greater than or equal to 1, and an integer factor - * @param sprite Pointer to initialized sprite structure - * @param x X coordinate - * @param y Y coordinate - * @param width_scale Width scaling factor - * @param height_scale Height scaling factor - * @note Useable with gfx_GetSprite in order to create clipped versions - */ -void gfx_ScaledTransparentSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y, uint8_t width_scale, uint8_t height_scale); - -/** - * Fixed Rotation with scaling fator for sprites - * - * @note A scale factor of 64 represents 100% scaling - * @warning This routine only accepts square input sprites - * @param sprite Input sprite to rotate/scale - * @param x X coordinate position - * @param x Y coordinate position - * @param angle 256 position angular integer - * @param scale Scaling factor; range is about 1% to 400% scale - * @returns The size of the sprite after scaling. This can be used for centering purposes. - */ -uint8_t gfx_RotatedScaledTransparentSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y, uint8_t angle, uint8_t scale); - -/** - * Helper macro to only perform rotation using gfx_RotatedScaledTransparentSprite_NoClip - * - * @param sprite_in Input sprite to rotate - * @param sprite_out Pointer to where rotated sprite will be stored - * @param angle 256 position angular integer - * @see gfx_RotatedScaledTransparentSprite_NoClip - */ -#define gfx_RotatedTransparentSprite_NoClip(sprite, x, y, angle) gfx_RotatedScaledTransparentSprite_NoClip(sprite, x, y, angle, 64) - -/** - * Fixed Rotation with scaling fator for sprites without transparency - * - * @note A scale factor of 64 represents 100% scaling - * @warning This routine only accepts square input sprites - * @param sprite Input sprite to rotate/scale - * @param x X coordinate position - * @param x Y coordinate position - * @param angle 256 position angular integer - * @param scale Scaling factor; range is about 1% to 400% scale - * @returns The size of the sprite after scaling. This can be used for centering purposes. - */ -uint8_t gfx_RotatedScaledSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y, uint8_t angle, uint8_t scale); - -/** - * Helper macro to only perform rotation using gfx_RotatedScaledSprite_NoClip - * - * @param sprite_in Input sprite to rotate - * @param sprite_out Pointer to where rotated sprite will be stored - * @param angle 256 position angular integer - * @see gfx_RotatedScaledTransparentSprite_NoClip - */ -#define gfx_RotatedSprite_NoClip(sprite, x, y, angle) gfx_RotatedScaledTransparentSprite_NoClip(sprite, x, y, angle, 64) - -/** - * Flips a sprite along the X axis - * - * @param sprite_in Input sprite to flip - * @param sprite_out Pointer to where flipped sprite will be stored - * @returns A pointer to sprite_out - * @note sprite_in and sprite_out cannot be the same - */ -gfx_sprite_t *gfx_FlipSpriteX(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out); - -/** - * Flips a sprite along the Y axis - * - * @param sprite_in Input sprite to flip - * @param sprite_out Pointer to where flipped sprite will be stored - * @returns A pointer to sprite_out - * @note sprite_in and sprite_out cannot be the same - */ -gfx_sprite_t *gfx_FlipSpriteY(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out); - -/** - * Rotates a sprite 90 degrees clockwise - * - * @param sprite_in Input sprite to rotate - * @param sprite_out Pointer to where rotated sprite will be stored - * @returns A pointer to sprite_out - * @note sprite_in and sprite_out cannot be the same - */ -gfx_sprite_t *gfx_RotateSpriteC(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out); - -/** - * Rotates a sprite 90 degrees counter clockwise - * - * @param sprite_in Input sprite to rotate - * @param sprite_out Pointer to where rotated sprite will be stored - * @returns A pointer to sprite_out - * @note sprite_in and sprite_out cannot be the same - */ -gfx_sprite_t *gfx_RotateSpriteCC(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out); - -/** - * Rotates a sprite 180 degrees - * - * @param sprite_in Input sprite to rotate - * @param sprite_out Pointer to where rotated sprite will be stored - * @returns A pointer to sprite_out - */ -gfx_sprite_t *gfx_RotateSpriteHalf(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out); - -/** - * Resizes a sprite to new dimensions - * - * Place new image dimensions in sprite_out; i.e. sprite_out->width = 80; sprite_out->height = 20. - * @param sprite_in Input sprite to scale - * @param sprite_out Pointer to where scaled sprite will be stored - * @returns A pointer to \p sprite_out - */ -gfx_sprite_t *gfx_ScaleSprite(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out); - -/** - * Fixed Rotation with scaling factor for sprites - * - * The output sprite is updated with the dimensions required for the implemented scaling factor. - * You must make sure that \p sprite_out has enough memory to store the needed output sprite. This can be - * found with the following formula: size = (max_scale / 64) * width * height + 2; - * - * @note A scale factor of 64 represents 100% scaling - * @warning This routine only accepts square input sprites - * @param sprite_in Input sprite to rotate/scale - * @param sprite_out Pointer to where rotated/scaled sprite will be stored - * @param angle 256 position angular integer - * @param scale Scaling factor; range is about 1% to 400% scale - * @returns A pointer to \p sprite_out - */ -gfx_sprite_t *gfx_RotateScaleSprite(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out, uint8_t angle, uint8_t scale); - -/** - * Helper macro to only perform rotation using gfx_RotateScaleSprite - * - * @param sprite_in Input sprite to rotate - * @param sprite_out Pointer to where rotated sprite will be stored - * @param angle 256 position angular integer - * @returns A pointer to \p sprite_out - * @see gfx_RotateScaleSprite - */ -#define gfx_RotateSprite(sprite_in, sprite_out, angle) gfx_RotateScaleSprite(sprite_in, sprite_out, angle, 64) - -/** - * Creates a temporary character sprite - * - * This may be useful for performing rotations and other - * operations on characters. The sprite returned is always 8x8 pixels. - * @param c Character to generate - */ -gfx_sprite_t *gfx_GetSpriteChar(char c); - -/** - * Sets the font's character data - * - * Fonts can be created manually or and exported to a C-style format using 8x8 Pixel ROM Font Editor. - * (https://www.min.at/prinz/o/software/pixelfont/#download) - * - * @param data Pointer to formated 8x8 pixel font - * @returns Pointer to previous font data - * @note Format of font data is 8 bytes horizontally aligned. - */ -uint8_t *gfx_SetFontData(uint8_t *data); - -/** - * Sets the font data for a specific character - * - * @param index Character index to modify (if using default font, values range from 0-127, custom font can have indexes 0-255) - * @param data Pointer to formated 8x8 pixel font - * @returns Pointer to current character data if \p data is NULL, otherwise a pointer to next character data - * @note Format of font data is 8 bytes horizontally aligned. - * @see gfx_SetFontData - */ -uint8_t *gfx_SetCharData(uint8_t index, uint8_t *data); - -/** - * Sets the font spacing - * - * @param spacing Pointer to array of character spacing - */ -void gfx_SetFontSpacing(uint8_t *spacing); - -/** - * Sets the height in pixels of each character - * - * The default value is 8 pixels - * @param height New font height in pixels - * @returns Previous height of font in pixels - */ -uint8_t gfx_SetFontHeight(uint8_t height); - -/** - * Sets monospaced font - * - * @param spacing Distance between characters - * @note To disable monospaced font, set to 0 - */ -void gfx_SetMonospaceFont(uint8_t spacing); - -/** - * Gets the pixel width of the given string - * - * @param string Pointer to string - * @note Takes into account monospacing flag - */ -unsigned int gfx_GetStringWidth(const char *string); - -/** - * Gets the pixel width of the given character - * - * @param c Character to get width of - * @returns Width in pixels of character - * @note Takes into account monospacing flag - */ -unsigned int gfx_GetCharWidth(const char c); - -/** - * Sets the clipping window - * - * This window is used across all clipped routines - * @param xmin Minimum x coordinate - * @param ymin Minimum y coordinate - * @param xmax Maximum x coordinate - * @param ymax Maximum y coordinate - * @note This routine is exclusive - */ -void gfx_SetClipRegion(int xmin, int ymin, int xmax, int ymax); - -/** - * Clips a region to fit within the window - * - * @returns False if offscreen, true if onscreen - */ -bool gfx_GetClipRegion(gfx_region_t *region); - -/** - * Shifts the drawing window down - * - * @param pixels Number of pixels to shift - * @note Data left over is undefined (Must be drawn over) - */ -void gfx_ShiftDown(uint8_t pixels); - -/** - * Shifts the drawing window up - * - * @param pixels Number of pixels to shift - * @note Data left over is undefined (Must be drawn over) - */ -void gfx_ShiftUp(uint8_t pixels); - -/** - * Shifts the drawing window left - * - * @param pixels Number of pixels to shift - * @note Data left over is undefined (Must be drawn over) - */ -void gfx_ShiftLeft(uint24_t pixels); - -/** - * Shifts the drawing window right - * - * @param pixels Number of pixels to shift - * @note Data left over is undefined (Must be drawn over) - */ -void gfx_ShiftRight(uint24_t pixels); - -/** - * Lightens a given 1555 color; useful for palette color conversions. - * - * @param color Original color input in 1555 format - * @param amount Amount to lighten by - * @returns Lightened color - * @note 0 returns full white, 255 returns original color - */ -uint16_t gfx_Lighten(uint16_t color, uint8_t amount); - -/** - * Darkens a given 1555 color; useful for palette color conversions. - * - * @param color Original color input in 1555 format - * @param amount Amount to darken by - * @returns Darkened color - * @note 0 returns full black, 255 returns original color - */ -uint16_t gfx_Darken(uint16_t color, uint8_t amount); - -/** - * Fills an area with a color - * - * @param x X coordinate to begin filling at - * @param y Y coordinate to begin filling at - * @param color New color to fill with - * - * @note This routine performs clipping to stay within the window, but you must ensure it starts in the window. - */ -void gfx_FloodFill(unsigned int x, uint8_t y, uint8_t color); - -/** - * Draws a sprite with RLE transparency. - * - * @param sprite sprite to draw - * @param x x-coordinate - * @param y y-coordinate - */ -void gfx_RLETSprite(gfx_rletsprite_t *sprite, int x, int y); - -/** - * Draws an unclipped sprite with RLE transparency. - * - * @param sprite sprite to draw - * @param x x-coordinate - * @param y y-coordinate - */ -void gfx_RLETSprite_NoClip(gfx_rletsprite_t *sprite, uint24_t x, uint8_t y); - -/** - * Converts a sprite with RLE transpareny to a sprite with normal transparency. - * - * Width and height will be set in the converted sprite. - * - * The transparent color index in the converted sprite is controlled by - * gfx_SetTransparentColor(). - * - * @attention - * The output sprite must have been allocated with a large enough \c data field - * to hold the converted sprite data, which will be <tt>width * height</tt> - * bytes large. - * - * @param[in] sprite_in input sprite with RLE transparency - * @param[out] sprite_out converted sprite with normal transparency - * @returns the converted sprite - * @see gfx_ConvertMallocRLETSprite - * @see gfx_ConvertToRLETSprite - */ -gfx_sprite_t *gfx_ConvertFromRLETSprite(gfx_rletsprite_t *sprite_in, gfx_sprite_t *sprite_out); - -/** - * Converts a sprite with normal transpareny to a sprite with RLE transparency. - * - * Width and height will be set in the converted sprite. - * - * The transparent color index in the input sprite is controlled by - * gfx_SetTransparentColor(). - * - * @attention - * The output sprite must have been allocated with a large enough data field to - * hold the converted sprite data; see gfx_AllocRLETSprite() for information. - * - * @note - * To avoid needing to predict the output size and risking either the prediction - * being too high and wasting space, or being too low and corrupting memory, - * gfx_ConvertMallocRLETSprite() can be used instead to allocate the exact - * amount of necessary space for the converted sprite. - * - * @param[in] sprite_in input sprite with normal transparency - * @param[out] sprite_out converted sprite with RLE transparency - * @returns the converted sprite - * @see gfx_ConvertFromRLETSprite - */ -gfx_rletsprite_t *gfx_ConvertToRLETSprite(gfx_sprite_t *sprite_in, gfx_rletsprite_t *sprite_out); - -/** - * Converts a sprite with normal transpareny to a sprite with RLE transparency, - * allocating the exact amount of necessary space for the converted sprite. - * - * Allocates the memory with \p malloc_routine. Width and height will be set in - * the converted sprite. Returns \c NULL upon allocation failure. - * - * The transparent color index in the input sprite is controlled by - * gfx_SetTransparentColor(). - * - * @remarks - * If using \c malloc as the \p malloc_routine, gfx_ConvertMallocRLETSprite() - * can be used as a shortcut. - * - * @remarks - * A gfx_sprite_t can be converted into an appropriately large, - * already-allocated gfx_rletsprite_t using gfx_ConvertToRLETSprite(). - * - * @param sprite_in input sprite with normal transparency - * @param malloc_routine malloc implementation to use - * @returns a newly allocated converted sprite with RLE transparency - * @see gfx_ConvertFromRLETSprite - */ -gfx_rletsprite_t *gfx_ConvertToNewRLETSprite(gfx_sprite_t *sprite_in, void *(*malloc_routine)(size_t)); - -/** - * Converts a sprite with normal transpareny to a sprite with RLE transparency, - * allocating the exact amount of necessary space for the converted sprite using - * \c malloc. - * - * Width and height will be set in the converted sprite. Returns \c NULL upon - * allocation failure. - * - * The transparent color index in the input sprite is controlled by - * gfx_SetTransparentColor(). - * - * @remarks - * A gfx_sprite_t can be converted into an appropriately large, - * already-allocated gfx_rletsprite_t using gfx_ConvertToRLETSprite(). - * - * @param sprite_in input sprite with normal transparency - * @param malloc_routine malloc implementation to use - * @returns a newly allocated converted sprite with RLE transparency - * @see gfx_ConvertFromRLETSprite - */ -#define gfx_ConvertMallocRLETSprite(sprite_in) \ -gfx_ConvertToNewRLETSprite(sprite_in, malloc) - -/** - * Converts an RGB value to a palette color - * - * Conversion is not 100% perfect, but is quite close - */ -#define gfx_RGBTo1555(r,g,b) \ -((uint16_t)(((uint8_t)(r) >> 3) << 10) | \ -(((uint8_t)(g) >> 3) << 5) | \ -((uint8_t)(b) >> 3)) - -/** - * Checks if we are currently in a rectangular hotspot area - */ -#define gfx_CheckRectangleHotspot(master_x, master_y, master_width, master_height, test_x, test_y, test_width, test_height) \ -(((test_x) < ((master_x) + (master_width))) && \ -(((test_x) + (test_width)) > (master_x)) && \ -((test_y) < ((master_y) + (master_height))) && \ -(((test_y) + (test_height)) > (master_y))) - -/* Color definitions (try to avoid) */ -#define gfx_black 0x00 -#define gfx_red 0xE0 -#define gfx_orange 0xE3 -#define gfx_green 0x03 -#define gfx_blue 0x10 -#define gfx_purple 0x50 -#define gfx_yellow 0xE7 -#define gfx_pink 0xF0 -#define gfx_white 0xFF - -/* Compatability defines (don't use please) */ -typedef gfx_sprite_t gfx_image_t; -#define gfx_BlitArea gfx_BlitRectangle -void gfx_LZDecompress(uint8_t *in, uint8_t *out, unsigned int in_size); - -#define gfx_lcdWidth (320) -#define gfx_lcdHeight (240) - -#ifdef __cplusplus -} -#endif - -#endif +/**
+ * @file
+ * @brief Contains optimized graphics operations and routines
+ *
+ * Example program template with best graphx buffer usage pattern:
+ * @code
+ * // Standard #includes omitted
+ *
+ * bool partial_redraw;
+ *
+ * // Implement us!
+ * void begin();
+ * void end();
+ * bool step();
+ * void draw();
+ *
+ * void main() {
+ * begin(); // No rendering allowed!
+ * gfx_Begin();
+ * gfx_SetDrawBuffer(); // Draw to the buffer to avoid rendering artifats
+ *
+ * while (step()) { // No rendering allowed in step!
+ * if (partial_redraw) // Only want to redraw part of the previous frame?
+ * gfx_BlitScreen(); // Copy previous frame as a base for this frame
+ * draw(); // As little non-rendering logic as possible
+ * gfx_SwapDraw(); // Queue the buffered frame to be displayed
+ * }
+ *
+ * gfx_End();
+ * end();
+ * }
+ * @endcode
+ *
+ * @authors Matt "MateoConLechuga" Waltz
+ * @authors Jacob "jacobly" Young
+ * @authors Zachary "Runer112" Wassall
+ * @authors Patrick "tr1p1ea" Prendergast
+ * @authors "grosged"
+ */
+
+#ifndef H_GRAPHX
+#define H_GRAPHX
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Sprite (image) type.
+ *
+ * Whether or not a sprite includes transparency is not explicitly encoded, and
+ * is determined only by usage. If used with transparency, transparent pixels
+ * are those with a certain color index, which can be set with
+ * gfx_SetTransparentColor().
+ *
+ * @attention
+ * Displaying a gfx_rletsprite_t (which includes transparency) is significantly
+ * faster than displaying a gfx_sprite_t with transparency, and should be
+ * preferred. However, gfx_rletsprite_t does not support transformations, such
+ * as flipping and rotation. Such transformations can be applied to a
+ * gfx_sprite_t, which can then be converted to a gfx_rletsprite_t for faster
+ * display using gfx_ConvertToNewRLETSprite() or gfx_ConvertToRLETSprite().
+ *
+ * @remarks
+ * Create at compile-time with a tool like
+ * <a href="https://github.com/MattWaltz/convpng" target="_blank">convpng</a>.
+ * Create at runtime (with uninitialized data) with gfx_MallocSprite(),
+ * gfx_UninitedSprite(), or gfx_TempSprite().
+ */
+typedef struct {
+ uint8_t width; /**< Width of the image */
+ uint8_t height; /**< Height of the image */
+ uint8_t data[1]; /**< Image data array */
+} gfx_sprite_t;
+
+/**
+ * @brief Sprite (image) type with RLE transparency.
+ *
+ * @attention
+ * Displaying a gfx_rletsprite_t (which includes transparency) is significantly
+ * faster than displaying a gfx_sprite_t with transparency, and should be
+ * preferred. However, gfx_rletsprite_t does not support transformations, such
+ * as flipping and rotation. Such transformations can be applied to a
+ * gfx_sprite_t, which can then be converted to a gfx_rletsprite_t for faster
+ * display using gfx_ConvertToNewRLETSprite() or gfx_ConvertToRLETSprite().
+ *
+ * @remarks
+ * Create at compile-time with a tool like
+ * <a href="https://github.com/MattWaltz/convpng" target="_blank">convpng</a>.
+ */
+typedef struct {
+ uint8_t width; /**< Width of the image */
+ uint8_t height; /**< Height of the image */
+ uint8_t data[1]; /**< Image data array */
+} gfx_rletsprite_t;
+
+/**
+ * @brief A simple structure for working with 2D points
+ */
+typedef struct {
+ int x; /**< x point */
+ int y; /**< y point */
+} gfx_point_t;
+
+/**
+ * @brief Stores operating modes of this library
+ * @see gfx_Begin
+ */
+typedef enum {
+ gfx_8bpp = 0x27 /**< Enable 8 bits per pixel mode */
+} gfx_mode_t;
+
+/**
+ * Dynamically allocates memory for a sprite.
+ *
+ * Allocates the memory with \p malloc_routine. \p width and \p height will be
+ * set in the allocated sprite. Returns \c NULL upon allocation failure.
+ *
+ * @note
+ * If not used in a dynamic context and \p width and \p height are static,
+ * consider statically allocating the sprite instead with gfx_UninitedSprite()
+ * or gfx_TempSprite().
+ *
+ * @remarks
+ * If using \c malloc as the \p malloc_routine, gfx_MallocSprite() can be used
+ * as a shortcut.
+ *
+ * @param width sprite width
+ * @param height sprite height
+ * @param malloc_routine malloc implementation to use
+ * @return pointer to the allocated sprite
+ */
+gfx_sprite_t *gfx_AllocSprite(uint8_t width, uint8_t height, void *(*malloc_routine)(size_t));
+
+/**
+ * Dynamically allocates memory for a sprite using \c malloc.
+ *
+ * \p width and \p height will be set in the sprite. Returns \c NULL upon
+ * allocation failure.
+ *
+ * @note
+ * If not used in a dynamic context and \p width and \p height are static,
+ * consider statically allocating the sprite instead with gfx_UninitedSprite()
+ * or gfx_TempSprite().
+ *
+ * @param width sprite width
+ * @param height sprite height
+ * @return pointer to the allocated sprite
+ * @see gfx_AllocSprite
+ */
+#define gfx_MallocSprite(width, height) \
+gfx_AllocSprite(width, height, malloc)
+
+/**
+ * Statically allocates unitialized memory for a sprite.
+ *
+ * Declares a <tt>gfx_sprite_t *</tt> with the given \p name pointing to the
+ * allocated memory. \p width and \p height will \b not be set in the sprite,
+ * unlike gfx_TempSprite().
+ *
+ * @warning
+ * If used outside of a function body, the memory will be allocated in the
+ * global unitialized data segment (BSS). If used inside a function body, the
+ * memory will be allocated on the stack. If the sprite is sufficiently large,
+ * usage inside a function body will overflow the stack, so it is recommended
+ * that this normally be used outside of a function body.
+ *
+ * @param name name of declared <tt>gfx_sprite_t *</tt>
+ * @param width sprite width
+ * @param height sprite height
+ * @see gfx_MallocSprite
+ */
+#define gfx_UninitedSprite(name, width, height) \
+uint8_t name##_data[2 + (width) * (height)]; \
+gfx_sprite_t *name = (gfx_sprite_t *)name##_data
+
+/**
+ * Statically allocates memory for a sprite.
+ *
+ * Declares a <tt>gfx_sprite_t *</tt> with the given \p name pointing to the
+ * allocated memory. \p width and \p height will be set in the sprite, unlike
+ * gfx_UninitedSprite().
+ *
+ * @attention
+ * Due to \p width and \p height being set, the memory will be allocated in the
+ * initialized data segment. If the compiled program is not compressed, then
+ * this could be a serious source of bloat and gfx_UninitedSprite() should be
+ * preferred.
+ *
+ * @param name name of declared <tt>gfx_sprite_t *</tt>
+ * @param width sprite width
+ * @param height sprite height
+ * @see gfx_MallocSprite
+ */
+#define gfx_TempSprite(name, width, height) \
+uint8_t name##_data[2 + (width) * (height)] = { (width), (height) }; \
+gfx_sprite_t *name = (gfx_sprite_t *)name##_data
+
+/**
+ * Dynamically allocates memory for a sprite with RLE transpareny.
+ *
+ * Allocates the memory with \p malloc_routine. Returns \c NULL upon allocation
+ * failure.
+ *
+ * \p data_size is the maximum predicted/calculated size of the sprite data
+ * (excuding the width and height bytes) that will be stored in the allocated
+ * sprite. Sprite data size could be up to <tt>(width + 1) * height * 3 / 2</tt>
+ * bytes in the worst case, in which pixels horizontally alternate between
+ * non-transparent and transparent and each row begins with a non-transparent
+ * pixel. But if the average length of a horizontal transparent run is at least
+ * 2, then the sprite data will be no larger than <tt>(width + 1) * height</tt>
+ * bytes. The exact data size necessary is <tt>2 *
+ * num_horizontal_transparent_runs + num_non_transparent_pixels +
+ * num_rows_beginning_with_non_transparent_pixel -
+ * num_rows_ending_with_transparent_pixel</tt> bytes.
+ *
+ * @note
+ * If not used in a dynamic context and \p data_size is static, consider
+ * statically allocating the sprite instead with gfx_UninitedRLETSprite() or
+ * gfx_TempRLETSprite().
+ *
+ * @remarks
+ * If using \c malloc as the \p malloc_routine, gfx_MallocRLETSprite() can be
+ * used as a shortcut.
+ *
+ * @param data_size (maximum) sprite data size
+ * @param malloc_routine malloc implementation to use
+ * @return pointer to the allocated sprite
+ */
+#define gfx_AllocRLETSprite(data_size, malloc_routine) \
+(gfx_rletsprite_t *)(malloc_routine)(data_size)
+
+/**
+ * Dynamically allocates memory for a sprite with RLE transparency using \c
+ * malloc.
+ *
+ * \p data_size is the size to allocate for sprite data; see
+ * gfx_AllocRLETSprite() for information. Returns \c NULL upon allocation
+ * failure.
+ *
+ * @note
+ * If not used in a dynamic context and \p data_size is static, consider
+ * statically allocating the sprite instead with gfx_UninitedRLETSprite() or
+ * gfx_TempRLETSprite().
+ *
+ * @param data_size (maximum) sprite data size
+ * @return pointer to the allocated sprite
+ * @see gfx_AllocRLETSprite
+ */
+#define gfx_MallocRLETSprite(data_size) \
+gfx_AllocRLETSprite(data_size, malloc)
+
+/**
+ * Statically allocates unitialized memory for a sprite with RLE transparency.
+ *
+ * Declares a <tt>gfx_rletsprite_t *</tt> with the given \p name pointing to the
+ * allocated memory. \p data_size is the size to allocate for sprite data; see
+ * gfx_AllocRLETSprite() for information.
+ *
+ * @warning
+ * If used outside of a function body, the memory will be allocated in the
+ * global unitialized data segment (BSS). If used inside a function body, the
+ * memory will be allocated on the stack. If the sprite is sufficiently large,
+ * usage inside a function body will overflow the stack, so it is recommended
+ * that this normally be used outside of a function body.
+ *
+ * @param name name of declared <tt>gfx_rletsprite_t *</tt>
+ * @param data_size (maximum) sprite data size
+ * @see gfx_MallocRLETSprite
+ */
+#define gfx_UninitedRLETSprite(name, data_size) \
+uint8_t name##_data[2 + (data_size)]; \
+gfx_rletsprite_t *name = (gfx_rletsprite_t *)name##_data
+
+/**
+ * Initializes the graphics library setup
+ */
+int gfx_Begin();
+
+/**
+ * Closes the graphics setup
+ *
+ * Restores the LCD to 16bpp prefered by the OS and clears the screen.
+ */
+void gfx_End(void);
+
+/**
+ * Used for accessing the lcd palette directly
+ *
+ * This consists of 256 entries, each 2 bytes in size for a total of 512 bytes
+ */
+#define gfx_palette \
+((uint16_t*)0xE30200)
+
+/**
+ * Array of the LCD RAM
+ *
+ * Total of 153600 bytes in size
+ * @see gfx_vbuffer
+ */
+#define gfx_vram \
+((uint8_t*)0xD40000)
+
+/**
+ * Array of the current drawing buffer
+ *
+ * Total of 76800 bytes in size
+ * @see gfx_vram
+ */
+#define gfx_vbuffer \
+(**(uint8_t(**)[240][320])0xE30014)
+
+/**
+ * @brief Defines a rectangular graphics region
+ *
+ * @see gfx_GetClipRegion
+ */
+typedef struct {
+ int xmin; /**< Minimum x coordinate */
+ int ymin; /**< Minimum y coordinate */
+ int xmax; /**< Maximum x coordinate */
+ int ymax; /**< Maximum y coordinate */
+} gfx_region_t;
+
+/**
+ * @brief Defines tilemap structure
+ *
+ * @see gfx_Tilemap
+ */
+typedef struct {
+ uint8_t *map; /**< Pointer to indexed map array */
+ gfx_sprite_t **tiles; /**< Pointer to tiles */
+ uint8_t tile_height; /**< Individual tile height */
+ uint8_t tile_width; /**< Individual tile width */
+ uint8_t draw_height; /**< Number of tiles per row to draw */
+ uint8_t draw_width; /**< Number of tile per column to draw */
+ uint8_t type_width; /**< Tile type height @see gfx_tilemap_type_t */
+ uint8_t type_height; /**< Tile type width @see gfx_tilemap_type_t */
+ uint8_t height; /**< Total number of rows in the tilemap */
+ uint8_t width; /**< Total number of columns in the tilemap */
+ uint8_t y_loc; /**< Y pixel location of tilemap */
+ uint24_t x_loc; /**< X pixel location to tilemap */
+} gfx_tilemap_t;
+
+/**
+ * @brief Used for defining tile types
+ *
+ * @see gfx_tilemap_t
+ */
+typedef enum {
+ gfx_tile_no_pow2 = 0, /**< Set when using non powers of 2 */
+ gfx_tile_2_pixel, /**< Set when using 2 pixel tiles */
+ gfx_tile_4_pixel, /**< Set when using 4 pixel tiles */
+ gfx_tile_8_pixel, /**< Set when using 8 pixel tiles */
+ gfx_tile_16_pixel, /**< Set when using 16 pixel tiles */
+ gfx_tile_32_pixel, /**< Set when using 32 pixel tiles */
+ gfx_tile_64_pixel, /**< Set when using 64 pixel tiles */
+ gfx_tile_128_pixel /**< Set when using 128 pixel tiles */
+} gfx_tilemap_type_t;
+
+/**
+ * Draws a tilemap given an initialized tilemap structure
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param x_offset Offset in pixels from the left of the tilemap
+ * @param y_offset Offset in pixels from the top of the tilemap
+ * @see gfx_tilemap_t
+ */
+void gfx_Tilemap(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset);
+
+/**
+ * Draws an unclipped tilemap given an initialized tilemap structure
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param x_offset Offset in pixels from the left of the tilemap
+ * @param y_offset Offset in pixels from the top of the tilemap
+ * @see gfx_tilemap_t
+ */
+void gfx_Tilemap_NoClip(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset);
+
+/**
+ * Draws a transparent tilemap given an initialized tilemap structure
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param x_offset Offset in pixels from the left of the tilemap
+ * @param y_offset Offset in pixels from the top of the tilemap
+ * @see gfx_tilemap_t
+ */
+void gfx_TransparentTilemap(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset);
+
+/**
+ * Draws an unclipped transparent tilemap given an initialized tilemap structure
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param x_offset Offset in pixels from the left of the tilemap
+ * @param y_offset Offset in pixels from the top of the tilemap
+ * @see gfx_tilemap_t
+ */
+void gfx_TransparentTilemap_NoClip(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset);
+
+/**
+ * Gets a pointer to a particular tile given an initialized tilemap structure and pixel offsets
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param x_offset Offset in pixels from the left of the tilemap
+ * @param y_offset Offset in pixels from the top of the tilemap
+ */
+uint8_t *gfx_TilePtr(gfx_tilemap_t *tilemap, uint24_t x_offset, uint24_t y_offset);
+
+/**
+ * Sets a particular tile's value given an initialized tilemap structure and pixel offsets
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param x_offset Offset in pixels from the left of the tilemap
+ * @param y_offset Offset in pixels from the top of the tilemap
+ * @param value Value to set tile to
+ */
+#define gfx_SetTile(tilemap, x_offset, y_offset, value) \
+(*(gfx_TilePtr((tilemap), (x_offset), (y_offset))) = (uint8_t)(value))
+
+/**
+ * Gets a particular tile's value given an initialized tilemap structure and pixel offsets
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param x_offset Offset in pixels from the left of the tilemap
+ * @param y_offset Offset in pixels from the top of the tilemap
+ */
+#define gfx_GetTile(tilemap, x_offset, y_offset) \
+(*(gfx_TilePtr((tilemap), (x_offset), (y_offset))))
+
+/**
+ * Gets a pointer to a particular tile given an initialized tilemap structure and mapped offsets
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param row Offset in bytes in the row
+ * @param col Offset in bytes in the column
+ */
+uint8_t *gfx_TilePtrMapped(gfx_tilemap_t *tilemap, uint8_t row, uint8_t col);
+
+/**
+ * Sets a particular tile's value given an initialized tilemap structure and mapped offsets
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param row Offset in bytes in the row
+ * @param col Offset in bytes in the column
+ * @param value Value to set tile to
+ */
+#define gfx_SetTileMapped(tilemap, row, col, value) \
+(*(gfx_TilePtrMapped((tilemap), (row), (col))) = (uint8_t)(value))
+
+/**
+ * Gets a particular tile's value given an initialized tilemap structure and mapped offsets
+ *
+ * @param tilemap Pointer to initialized tilemap structure
+ * @param row Offset in bytes in the row
+ * @param col Offset in bytes in the column
+ */
+#define gfx_GetTileMapped(tilemap, row, col) \
+(*(gfx_TilePtrMapped((tilemap), (row), (col))))
+
+/**
+ * Sets the color index that drawing routines will use
+ *
+ * This applies to lines, rectangles, circles, etc
+ * @param index Color index to set
+ * @returns Previous set color index
+ */
+uint8_t gfx_SetColor(uint8_t index);
+
+/**
+ * Sets the transparent index that drawing routines will use
+ *
+ * This currently applies to transparent sprites, both scaled and unscaled
+ * @param index Transparent color index to set
+ * @returns The previous transparent color index
+ */
+uint8_t gfx_SetTransparentColor(uint8_t index);
+
+/**
+ * Sets up the default palette for the given mode
+ *
+ * @param mode Palette to use
+ */
+void gfx_SetDefaultPalette(gfx_mode_t mode);
+
+/**
+ * Sets entries in the palette
+ *
+ * @param palette Pointer to palette to use
+ * @param size Size of palette to store
+ * @param offset Offset in bytes to start at (Generally set to 0)
+ */
+void gfx_SetPalette(uint16_t *palette, uint24_t size, uint8_t offset);
+
+/**
+ * Fills the screen with a given palette index
+ *
+ * @param index Color index to fill with
+ */
+void gfx_FillScreen(uint8_t index);
+
+/**
+ * Implements a faster version of gfx_FillScreen(0)
+ *
+ * @see gfx_FillScreen
+ */
+void gfx_ZeroScreen(void);
+
+/**
+ * Sets a pixel to the global color index
+ *
+ * This is measured from the top left origin of the screen.
+ * Pixels are only clipped within the screen boundaries
+ * @param x X coordinate location
+ * @param y Y coordinate location
+ * @see gfx_SetColor
+ */
+void gfx_SetPixel(uint24_t x, uint8_t y);
+
+/**
+ * Gets a pixel's color index
+ *
+ * This is measured from the top left origin of the screen.
+ * Pixels are only clipped within the screen boundaries
+ * @param x X coordinate location
+ * @param y Y coordinate location
+ */
+uint8_t gfx_GetPixel(uint24_t x, uint8_t y);
+
+/**
+ * Draws a line
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x0 First X coordinate
+ * @param y0 First Y coordinate
+ * @param x1 Second X coordinate
+ * @param y1 Second Y coordinate
+ */
+void gfx_Line(int x0, int y0, int x1, int y1);
+
+/**
+ * Draws an unclipped line
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x0 First X coordinate
+ * @param y0 First Y coordinate
+ * @param x1 Second X coordinate
+ * @param y1 Second Y coordinate
+ */
+void gfx_Line_NoClip(uint24_t x0, uint8_t y0, uint24_t x1, uint8_t y1);
+
+/**
+ * Clips the points in a window region
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x0 First X coordinate
+ * @param y0 First Y coordinate
+ * @param x1 Second X coordinate
+ * @param y1 Second Y coordinate
+ * @returns False if not within window, true otherwise
+ */
+bool gfx_CohenSutherlandClip(int *x0, int *y0, int *x1, int *y1);
+
+/**
+ * Draws a horizontal line
+ *
+ * This is measured from the top left origin of the screen.
+ * Performs faster than using @c gfx_Line
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param length Length of line
+ */
+void gfx_HorizLine(int x, int y, int length);
+
+/**
+ * Draws an unclipped horizontal line
+ *
+ * This is measured from the top left origin of the screen.
+ * Performs faster than using @c gfx_Line
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param length Length of line
+ */
+void gfx_HorizLine_NoClip(uint24_t x, uint8_t y, uint24_t length);
+
+/**
+ * Draws a vertical line
+ *
+ * This is measured from the top left origin of the screen.
+ * Performs faster than using @c gfx_Line
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param length Length of line
+ */
+void gfx_VertLine(int x, int y, int length);
+
+/**
+ * Draws an unclipped vertical line
+ *
+ * This is measured from the top left origin of the screen.
+ * Performs faster than using @c gfx_Line
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param length Length of line
+ */
+void gfx_VertLine_NoClip(uint24_t x, uint8_t y, uint24_t length);
+
+/**
+ * Draws a rectangle outline
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param width Width of rectangle
+ * @param height Height of rectangle
+ */
+void gfx_Rectangle(int x, int y, int width, int height);
+
+/**
+ * Draws an unclipped rectangle outline
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param width Width of rectangle
+ * @param height Height of rectangle
+ */
+void gfx_Rectangle_NoClip(uint24_t x, uint8_t y, uint24_t width, uint8_t height);
+
+/**
+ * Draws a filled rectangle
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param width Width of rectangle
+ * @param height Height of rectangle
+ */
+void gfx_FillRectangle(int x, int y, int width, int height);
+
+/**
+ * Draws an unclipped filled rectangle
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param width Width of rectangle
+ * @param height Height of rectangle
+ */
+void gfx_FillRectangle_NoClip(uint24_t x, uint8_t y, uint24_t width, uint8_t height);
+
+/**
+ * Draws a circle outline
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param radius The radius of the circle
+ */
+void gfx_Circle(int x, int y, unsigned radius);
+
+/**
+ * Draws a filled circle
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param radius The radius of the circle
+ */
+void gfx_FillCircle(int x, int y, unsigned radius);
+
+/**
+ * Draws an unclipped filled circle
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param radius The radius of the circle
+ */
+void gfx_FillCircle_NoClip(uint24_t x, uint8_t y, unsigned radius);
+
+/**
+ * Draws an unclipped circle outline
+ *
+ * This is measured from the top left origin of the screen.
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param radius The radius of the circle
+ */
+#define gfx_Circle_NoClip(x, y, radius) \
+gfx_Circle((x), (y), (radius))
+
+/**
+ * Draws a polygon outline
+ *
+ * Points are measured from the top left origin of the screen.
+ * @code
+ * int points[6] = {
+ * 160, 1, // (x0, y0)
+ * 1, 238, // (x1, y1)
+ * 318,238, // (x2, y2)
+ * };
+ * num_points = 3;
+ * gfx_Polygon(points, num_points)
+ * @endcode
+ * @param points Pointer to x and y pairs
+ * @param num_points Number of x and y pairs
+ */
+void gfx_Polygon(int *points, unsigned num_points);
+
+/**
+ * Draws an unclipped polygon outline
+ *
+ * Points are measured from the top left origin of the screen.
+ * @code
+ * int points[6] = {
+ * 160, 1, // (x0, y0)
+ * 1, 238, // (x1, y1)
+ * 318,238, // (x2, y2)
+ * };
+ * num_points = 3;
+ * gfx_Polygon_NoClip(points, num_points)
+ * @endcode
+ * @param points Pointer to x and y pairs
+ * @param num_points Number of x and y pairs
+ */
+void gfx_Polygon_NoClip(int *points, unsigned num_points);
+
+/**
+ * Draws a filled triangle
+ *
+ * Points are measured from the top left origin of the screen.
+ * @param x0 First X coordinate
+ * @param y0 First Y coordinate
+ * @param x1 Second X coordinate
+ * @param y1 Second Y coordinate
+ * @param x2 Third X coordinate
+ * @param y2 Third Y coordinate
+ */
+void gfx_FillTriangle(int x0, int y0, int x1, int y1, int x2, int y2);
+void gfx_FillTriangle_NoClip(int x0, int y0, int x1, int y1, int x2, int y2);
+
+/**
+ * Forces all graphics routines draw location
+ *
+ * @param location Location routines should draw to
+ * @see gfx_draw_location_t
+ */
+void gfx_SetDraw(uint8_t location);
+
+/**
+ * @brief Different locations routines can be drawn to
+ */
+typedef enum {
+ gfx_screen = 0, /**< Screen */
+ gfx_buffer /**< Buffer */
+} gfx_draw_location_t;
+
+/**
+ * Makes the subsequent GraphX drawing routines act on the buffer
+ */
+#define gfx_SetDrawBuffer() \
+gfx_SetDraw(gfx_buffer)
+
+/**
+ * Makes the subsequent GraphX drawing routines act on the screen
+ */
+#define gfx_SetDrawScreen() \
+gfx_SetDraw(gfx_screen)
+
+/**
+ * Gets current draw location
+ *
+ * @returns Location type enumeration
+ * @see gfx_draw_location_t
+ */
+uint8_t gfx_GetDraw(void);
+
+/**
+ * Swaps the roles of the screen and drawing buffers.
+ *
+ * Does not wait for the old screen buffer to finish being displayed. Instead,
+ * the next invocation of a graphx drawing function will block, waiting for this
+ * event. To block and wait explicitly, use gfx_Wait().
+ *
+ * The LCD driver maintains its own screen buffer pointer for the duration of a
+ * refresh. The swap performed by this function will only be picked up at a
+ * point between refreshes.
+ *
+ * @remarks
+ * In practice, this function should be invoked immediately after finishing
+ * drawing a frame to the drawing buffer, and invocation of the first graphx
+ * drawing function for the next frame should be scheduled as late as possible
+ * relative to non-drawing logic. Non-drawing logic can execute during time when
+ * a drawing function may otherwise block.
+ */
+void gfx_SwapDraw(void);
+
+/**
+ * Waits for the screen buffer to finish being displayed after gfx_SwapDraw().
+ *
+ * @remarks
+ * In practice, this function should not need to be invoked by user code. It
+ * should be invoked by custom drawing functions (as late as reasonably
+ * possible) before writing to the drawing buffer, gfx_vbuffer.
+ */
+void gfx_Wait(void);
+
+/**
+ * Copies the input buffer to the opposite buffer
+ *
+ * No clipping is performed; as it is a copy not a draw
+ * @param src drawing location to copy from
+ * @see gfx_draw_location_t
+ */
+void gfx_Blit(uint8_t src);
+
+/**
+ * Copies lines from the input buffer to the opposite buffer
+ *
+ * No clipping is performed; as it is a copy not a draw
+ * @param src drawing location to copy from
+ * @param y_loc Y Location to begin copying at
+ * @param num_lines Number of lines to copy
+ * @see gfx_draw_location_t
+ */
+void gfx_BlitLines(uint8_t src, uint8_t y_loc, uint8_t num_lines);
+
+/**
+ * Copies a rectangle from the input buffer to the opposite buffer
+ *
+ * No clipping is performed; as it is a copy not a draw
+ * @param src drawing location to copy from
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param width Width of rectangle
+ * @param height Height of rectangle
+ * @see gfx_draw_location_t
+ */
+void gfx_BlitRectangle(uint8_t src, uint24_t x, uint8_t y, uint24_t width, uint24_t height);
+
+/**
+ * Copies the screen to the buffer
+ */
+#define gfx_BlitScreen() \
+gfx_Blit(gfx_screen)
+
+/**
+ * Copies the buffer to the screen
+ */
+#define gfx_BlitBuffer() \
+gfx_Blit(gfx_buffer)
+
+/**
+ * Sets the scaling for text
+ *
+ * Values in the range from 1-5 are preferred.
+ * @param width_scale Text width scaling
+ * @param height_scale Text height scaling
+ */
+void gfx_SetTextScale(uint8_t width_scale, uint8_t height_scale);
+
+/**
+ * Prints a character
+ *
+ * Outputs a character at the current cursor position.
+ * @param c Character to print
+ * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig)
+ */
+void gfx_PrintChar(const char c);
+
+/**
+ * Prints a signed integer
+ *
+ * Outputs at the current cursor position. Padded with leading zeros if
+ * necessary to satisfy the specified minimum length.
+ * @param n Integer to print
+ * @param length Minimum number of characters to print
+ * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig)
+ * @note \c length must be between 1 and 8, inclusive
+ */
+void gfx_PrintInt(int n, uint8_t length);
+
+/**
+ * Prints an unsigned integer
+ *
+ * Outputs at the current cursor position. Padded with leading zeros if
+ * necessary to satisfy the specified minimum length.
+ * @param n Unsigned integer to print
+ * @param length Minimum number of characters to print
+ * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig)
+ * @note \c length must be between 1 and 8, inclusive
+ */
+void gfx_PrintUInt(unsigned int n, uint8_t length);
+
+/**
+ * Prints a string
+ *
+ * Outputs a string at the current cursor position.
+ * @param string Pointer to string to print
+ * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig)
+ */
+void gfx_PrintString(const char *string);
+
+/**
+ * Prints a string at coordinates
+ *
+ * Outputs a string at the supplied coordinates
+ * Posistion is measured from top left origin of screen.
+ * @param string Pointer to string to print
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @note By default, no text clipping is performed (configurable with gfx_SetTextConfig)
+ */
+void gfx_PrintStringXY(const char *string, int x, int y);
+
+/**
+ * @returns The current text cursor X position
+ */
+int gfx_GetTextX(void);
+
+/**
+ * @returns The current text cursor Y position
+ */
+int gfx_GetTextY(void);
+
+/**
+ * Sets the text cursor XY position
+ *
+ * @param x X coordinate
+ * @param y Y coordinate
+ */
+void gfx_SetTextXY(int x, int y);
+
+/**
+ * Sets the configuration for the text routines
+ *
+ * @param config Set the options for the text mode
+ * @see gfx_text_options_t
+ * @note Scaled text does not clip
+ */
+void gfx_SetTextConfig(uint8_t config);
+
+/**
+ * @brief Different available text modes
+ */
+typedef enum {
+ gfx_text_clip = 1, /**< Text routines will clip against the defined clip window */
+ gfx_text_noclip /**< Default, text routines do not clip (much faster) */
+} gfx_text_options_t;
+
+/**
+ * Sets text foreground color
+ *
+ * @param color Color index to set
+ * @returns Previous text foreground color index
+ * @note Default text foreground color index: 0
+ */
+uint8_t gfx_SetTextFGColor(uint8_t color);
+
+/**
+ * Sets text background color
+ *
+ * @param color Color index to set
+ * @returns Previous text background color index
+ * @note Default text background color index: 255
+ */
+uint8_t gfx_SetTextBGColor(uint8_t color);
+
+/**
+ * Sets text transparency color
+ *
+ * @param color Color index to set
+ * @returns Previous text transparency color index
+ * @note Default text transparency color index: 255
+ */
+uint8_t gfx_SetTextTransparentColor(uint8_t color);
+
+/**
+ * Draws a sprite
+ *
+ * @param sprite Pointer to initialized sprite structure
+ * @param x X coordinate
+ * @param y Y coordinate
+ */
+void gfx_Sprite(gfx_sprite_t *sprite, int x, int y);
+
+/**
+ * Draws an unclipped sprite
+ *
+ * @param sprite Pointer to initialized sprite structure
+ * @param x X coordinate
+ * @param y Y coordinate
+ */
+void gfx_Sprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y);
+
+/**
+ * Draws a transparent sprite
+ *
+ * @param sprite Pointer to initialized sprite structure
+ * @param x X coordinate
+ * @param y Y coordinate
+ */
+void gfx_TransparentSprite(gfx_sprite_t *sprite, int x, int y);
+
+/**
+ * Draws an unclipped transparent sprite
+ *
+ * @param sprite Pointer to initialized sprite structure
+ * @param x X coordinate
+ * @param y Y coordinate
+ */
+void gfx_TransparentSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y);
+
+/**
+ * Grabs the background behind a sprite
+ *
+ * This is useful for partial redraw.
+ * @param sprite_buffer Buffer used to store grabbed sprite
+ * @param x X coordinate to grab sprite
+ * @param y Y coordinate to grab sprite
+ * @returns A pointer to sprite_buffer
+ * @note sprite_buffer must be pointing to a large enough buffer to hold width*height number of bytes
+ */
+gfx_sprite_t *gfx_GetSprite(gfx_sprite_t *sprite_buffer, int x, int y);
+
+/**
+ * Grabs the background behind an unclipped sprite
+ *
+ * This is useful for partial redraw.
+ * @param sprite_buffer Buffer used to store grabbed sprite
+ * @param x X coordinate to grab sprite
+ * @param y Y coordinate to grab sprite
+ * @returns A pointer to sprite_buffer
+ * @note sprite_buffer must be pointing to a large enough buffer to hold width*height number of bytes
+ */
+#define gfx_GetSprite_NoClip(sprite_buffer, x, y) \
+gfx_GetSprite((sprite_buffer), (x), (y))
+
+/**
+ * Scales an unclipped sprite
+ *
+ * Scaling factors must be greater than or equal to 1, and an integer factor
+ * @param sprite Pointer to initialized sprite structure
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param width_scale Width scaling factor
+ * @param height_scale Height scaling factor
+ * @note Useable with gfx_GetSprite in order to create clipped versions
+ */
+void gfx_ScaledSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y, uint8_t width_scale, uint8_t height_scale);
+
+/**
+ * Scales an unclipped transparent sprite
+ *
+ * Scaling factors must be greater than or equal to 1, and an integer factor
+ * @param sprite Pointer to initialized sprite structure
+ * @param x X coordinate
+ * @param y Y coordinate
+ * @param width_scale Width scaling factor
+ * @param height_scale Height scaling factor
+ * @note Useable with gfx_GetSprite in order to create clipped versions
+ */
+void gfx_ScaledTransparentSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y, uint8_t width_scale, uint8_t height_scale);
+
+/**
+ * Fixed Rotation with scaling fator for sprites
+ *
+ * @note A scale factor of 64 represents 100% scaling
+ * @warning This routine only accepts square input sprites
+ * @param sprite Input sprite to rotate/scale
+ * @param x X coordinate position
+ * @param x Y coordinate position
+ * @param angle 256 position angular integer
+ * @param scale Scaling factor; range is about 1% to 400% scale
+ * @returns The size of the sprite after scaling. This can be used for centering purposes.
+ */
+uint8_t gfx_RotatedScaledTransparentSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y, uint8_t angle, uint8_t scale);
+
+/**
+ * Helper macro to only perform rotation using gfx_RotatedScaledTransparentSprite_NoClip
+ *
+ * @param sprite_in Input sprite to rotate
+ * @param sprite_out Pointer to where rotated sprite will be stored
+ * @param angle 256 position angular integer
+ * @see gfx_RotatedScaledTransparentSprite_NoClip
+ */
+#define gfx_RotatedTransparentSprite_NoClip(sprite, x, y, angle) gfx_RotatedScaledTransparentSprite_NoClip(sprite, x, y, angle, 64)
+
+/**
+ * Fixed Rotation with scaling fator for sprites without transparency
+ *
+ * @note A scale factor of 64 represents 100% scaling
+ * @warning This routine only accepts square input sprites
+ * @param sprite Input sprite to rotate/scale
+ * @param x X coordinate position
+ * @param x Y coordinate position
+ * @param angle 256 position angular integer
+ * @param scale Scaling factor; range is about 1% to 400% scale
+ * @returns The size of the sprite after scaling. This can be used for centering purposes.
+ */
+uint8_t gfx_RotatedScaledSprite_NoClip(gfx_sprite_t *sprite, uint24_t x, uint8_t y, uint8_t angle, uint8_t scale);
+
+/**
+ * Helper macro to only perform rotation using gfx_RotatedScaledSprite_NoClip
+ *
+ * @param sprite_in Input sprite to rotate
+ * @param sprite_out Pointer to where rotated sprite will be stored
+ * @param angle 256 position angular integer
+ * @see gfx_RotatedScaledTransparentSprite_NoClip
+ */
+#define gfx_RotatedSprite_NoClip(sprite, x, y, angle) gfx_RotatedScaledTransparentSprite_NoClip(sprite, x, y, angle, 64)
+
+/**
+ * Flips a sprite along the X axis
+ *
+ * @param sprite_in Input sprite to flip
+ * @param sprite_out Pointer to where flipped sprite will be stored
+ * @returns A pointer to sprite_out
+ * @note sprite_in and sprite_out cannot be the same
+ */
+gfx_sprite_t *gfx_FlipSpriteX(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out);
+
+/**
+ * Flips a sprite along the Y axis
+ *
+ * @param sprite_in Input sprite to flip
+ * @param sprite_out Pointer to where flipped sprite will be stored
+ * @returns A pointer to sprite_out
+ * @note sprite_in and sprite_out cannot be the same
+ */
+gfx_sprite_t *gfx_FlipSpriteY(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out);
+
+/**
+ * Rotates a sprite 90 degrees clockwise
+ *
+ * @param sprite_in Input sprite to rotate
+ * @param sprite_out Pointer to where rotated sprite will be stored
+ * @returns A pointer to sprite_out
+ * @note sprite_in and sprite_out cannot be the same
+ */
+gfx_sprite_t *gfx_RotateSpriteC(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out);
+
+/**
+ * Rotates a sprite 90 degrees counter clockwise
+ *
+ * @param sprite_in Input sprite to rotate
+ * @param sprite_out Pointer to where rotated sprite will be stored
+ * @returns A pointer to sprite_out
+ * @note sprite_in and sprite_out cannot be the same
+ */
+gfx_sprite_t *gfx_RotateSpriteCC(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out);
+
+/**
+ * Rotates a sprite 180 degrees
+ *
+ * @param sprite_in Input sprite to rotate
+ * @param sprite_out Pointer to where rotated sprite will be stored
+ * @returns A pointer to sprite_out
+ */
+gfx_sprite_t *gfx_RotateSpriteHalf(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out);
+
+/**
+ * Resizes a sprite to new dimensions
+ *
+ * Place new image dimensions in sprite_out; i.e. sprite_out->width = 80; sprite_out->height = 20.
+ * @param sprite_in Input sprite to scale
+ * @param sprite_out Pointer to where scaled sprite will be stored
+ * @returns A pointer to \p sprite_out
+ */
+gfx_sprite_t *gfx_ScaleSprite(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out);
+
+/**
+ * Fixed Rotation with scaling factor for sprites
+ *
+ * The output sprite is updated with the dimensions required for the implemented scaling factor.
+ * You must make sure that \p sprite_out has enough memory to store the needed output sprite. This can be
+ * found with the following formula: size = (max_scale / 64) * width * height + 2;
+ *
+ * @note A scale factor of 64 represents 100% scaling
+ * @warning This routine only accepts square input sprites
+ * @param sprite_in Input sprite to rotate/scale
+ * @param sprite_out Pointer to where rotated/scaled sprite will be stored
+ * @param angle 256 position angular integer
+ * @param scale Scaling factor; range is about 1% to 400% scale
+ * @returns A pointer to \p sprite_out
+ */
+gfx_sprite_t *gfx_RotateScaleSprite(gfx_sprite_t *sprite_in, gfx_sprite_t *sprite_out, uint8_t angle, uint8_t scale);
+
+/**
+ * Helper macro to only perform rotation using gfx_RotateScaleSprite
+ *
+ * @param sprite_in Input sprite to rotate
+ * @param sprite_out Pointer to where rotated sprite will be stored
+ * @param angle 256 position angular integer
+ * @returns A pointer to \p sprite_out
+ * @see gfx_RotateScaleSprite
+ */
+#define gfx_RotateSprite(sprite_in, sprite_out, angle) gfx_RotateScaleSprite(sprite_in, sprite_out, angle, 64)
+
+/**
+ * Creates a temporary character sprite
+ *
+ * This may be useful for performing rotations and other
+ * operations on characters. The sprite returned is always 8x8 pixels.
+ * @param c Character to generate
+ */
+gfx_sprite_t *gfx_GetSpriteChar(char c);
+
+/**
+ * Sets the font's character data
+ *
+ * Fonts can be created manually or and exported to a C-style format using 8x8 Pixel ROM Font Editor.
+ * (https://www.min.at/prinz/o/software/pixelfont/#download)
+ *
+ * @param data Pointer to formated 8x8 pixel font
+ * @returns Pointer to previous font data
+ * @note Format of font data is 8 bytes horizontally aligned.
+ */
+uint8_t *gfx_SetFontData(uint8_t *data);
+
+/**
+ * Sets the font data for a specific character
+ *
+ * @param index Character index to modify (if using default font, values range from 0-127, custom font can have indexes 0-255)
+ * @param data Pointer to formated 8x8 pixel font
+ * @returns Pointer to current character data if \p data is NULL, otherwise a pointer to next character data
+ * @note Format of font data is 8 bytes horizontally aligned.
+ * @see gfx_SetFontData
+ */
+uint8_t *gfx_SetCharData(uint8_t index, uint8_t *data);
+
+/**
+ * Sets the font spacing
+ *
+ * @param spacing Pointer to array of character spacing
+ */
+void gfx_SetFontSpacing(uint8_t *spacing);
+
+/**
+ * Sets the height in pixels of each character
+ *
+ * The default value is 8 pixels
+ * @param height New font height in pixels
+ * @returns Previous height of font in pixels
+ */
+uint8_t gfx_SetFontHeight(uint8_t height);
+
+/**
+ * Sets monospaced font
+ *
+ * @param spacing Distance between characters
+ * @note To disable monospaced font, set to 0
+ */
+void gfx_SetMonospaceFont(uint8_t spacing);
+
+/**
+ * Gets the pixel width of the given string
+ *
+ * @param string Pointer to string
+ * @note Takes into account monospacing flag
+ */
+unsigned int gfx_GetStringWidth(const char *string);
+
+/**
+ * Gets the pixel width of the given character
+ *
+ * @param c Character to get width of
+ * @returns Width in pixels of character
+ * @note Takes into account monospacing flag
+ */
+unsigned int gfx_GetCharWidth(const char c);
+
+/**
+ * Sets the clipping window
+ *
+ * This window is used across all clipped routines
+ * @param xmin Minimum x coordinate
+ * @param ymin Minimum y coordinate
+ * @param xmax Maximum x coordinate
+ * @param ymax Maximum y coordinate
+ * @note This routine is exclusive
+ */
+void gfx_SetClipRegion(int xmin, int ymin, int xmax, int ymax);
+
+/**
+ * Clips a region to fit within the window
+ *
+ * @returns False if offscreen, true if onscreen
+ */
+bool gfx_GetClipRegion(gfx_region_t *region);
+
+/**
+ * Shifts the drawing window down
+ *
+ * @param pixels Number of pixels to shift
+ * @note Data left over is undefined (Must be drawn over)
+ */
+void gfx_ShiftDown(uint8_t pixels);
+
+/**
+ * Shifts the drawing window up
+ *
+ * @param pixels Number of pixels to shift
+ * @note Data left over is undefined (Must be drawn over)
+ */
+void gfx_ShiftUp(uint8_t pixels);
+
+/**
+ * Shifts the drawing window left
+ *
+ * @param pixels Number of pixels to shift
+ * @note Data left over is undefined (Must be drawn over)
+ */
+void gfx_ShiftLeft(uint24_t pixels);
+
+/**
+ * Shifts the drawing window right
+ *
+ * @param pixels Number of pixels to shift
+ * @note Data left over is undefined (Must be drawn over)
+ */
+void gfx_ShiftRight(uint24_t pixels);
+
+/**
+ * Lightens a given 1555 color; useful for palette color conversions.
+ *
+ * @param color Original color input in 1555 format
+ * @param amount Amount to lighten by
+ * @returns Lightened color
+ * @note 0 returns full white, 255 returns original color
+ */
+uint16_t gfx_Lighten(uint16_t color, uint8_t amount);
+
+/**
+ * Darkens a given 1555 color; useful for palette color conversions.
+ *
+ * @param color Original color input in 1555 format
+ * @param amount Amount to darken by
+ * @returns Darkened color
+ * @note 0 returns full black, 255 returns original color
+ */
+uint16_t gfx_Darken(uint16_t color, uint8_t amount);
+
+/**
+ * Fills an area with a color
+ *
+ * @param x X coordinate to begin filling at
+ * @param y Y coordinate to begin filling at
+ * @param color New color to fill with
+ *
+ * @note This routine performs clipping to stay within the window, but you must ensure it starts in the window.
+ */
+void gfx_FloodFill(unsigned int x, uint8_t y, uint8_t color);
+
+/**
+ * Draws a sprite with RLE transparency.
+ *
+ * @param sprite sprite to draw
+ * @param x x-coordinate
+ * @param y y-coordinate
+ */
+void gfx_RLETSprite(gfx_rletsprite_t *sprite, int x, int y);
+
+/**
+ * Draws an unclipped sprite with RLE transparency.
+ *
+ * @param sprite sprite to draw
+ * @param x x-coordinate
+ * @param y y-coordinate
+ */
+void gfx_RLETSprite_NoClip(gfx_rletsprite_t *sprite, uint24_t x, uint8_t y);
+
+/**
+ * Converts a sprite with RLE transpareny to a sprite with normal transparency.
+ *
+ * Width and height will be set in the converted sprite.
+ *
+ * The transparent color index in the converted sprite is controlled by
+ * gfx_SetTransparentColor().
+ *
+ * @attention
+ * The output sprite must have been allocated with a large enough \c data field
+ * to hold the converted sprite data, which will be <tt>width * height</tt>
+ * bytes large.
+ *
+ * @param[in] sprite_in input sprite with RLE transparency
+ * @param[out] sprite_out converted sprite with normal transparency
+ * @returns the converted sprite
+ * @see gfx_ConvertMallocRLETSprite
+ * @see gfx_ConvertToRLETSprite
+ */
+gfx_sprite_t *gfx_ConvertFromRLETSprite(gfx_rletsprite_t *sprite_in, gfx_sprite_t *sprite_out);
+
+/**
+ * Converts a sprite with normal transpareny to a sprite with RLE transparency.
+ *
+ * Width and height will be set in the converted sprite.
+ *
+ * The transparent color index in the input sprite is controlled by
+ * gfx_SetTransparentColor().
+ *
+ * @attention
+ * The output sprite must have been allocated with a large enough data field to
+ * hold the converted sprite data; see gfx_AllocRLETSprite() for information.
+ *
+ * @note
+ * To avoid needing to predict the output size and risking either the prediction
+ * being too high and wasting space, or being too low and corrupting memory,
+ * gfx_ConvertMallocRLETSprite() can be used instead to allocate the exact
+ * amount of necessary space for the converted sprite.
+ *
+ * @param[in] sprite_in input sprite with normal transparency
+ * @param[out] sprite_out converted sprite with RLE transparency
+ * @returns the converted sprite
+ * @see gfx_ConvertFromRLETSprite
+ */
+gfx_rletsprite_t *gfx_ConvertToRLETSprite(gfx_sprite_t *sprite_in, gfx_rletsprite_t *sprite_out);
+
+/**
+ * Converts a sprite with normal transpareny to a sprite with RLE transparency,
+ * allocating the exact amount of necessary space for the converted sprite.
+ *
+ * Allocates the memory with \p malloc_routine. Width and height will be set in
+ * the converted sprite. Returns \c NULL upon allocation failure.
+ *
+ * The transparent color index in the input sprite is controlled by
+ * gfx_SetTransparentColor().
+ *
+ * @remarks
+ * If using \c malloc as the \p malloc_routine, gfx_ConvertMallocRLETSprite()
+ * can be used as a shortcut.
+ *
+ * @remarks
+ * A gfx_sprite_t can be converted into an appropriately large,
+ * already-allocated gfx_rletsprite_t using gfx_ConvertToRLETSprite().
+ *
+ * @param sprite_in input sprite with normal transparency
+ * @param malloc_routine malloc implementation to use
+ * @returns a newly allocated converted sprite with RLE transparency
+ * @see gfx_ConvertFromRLETSprite
+ */
+gfx_rletsprite_t *gfx_ConvertToNewRLETSprite(gfx_sprite_t *sprite_in, void *(*malloc_routine)(size_t));
+
+/**
+ * Converts a sprite with normal transpareny to a sprite with RLE transparency,
+ * allocating the exact amount of necessary space for the converted sprite using
+ * \c malloc.
+ *
+ * Width and height will be set in the converted sprite. Returns \c NULL upon
+ * allocation failure.
+ *
+ * The transparent color index in the input sprite is controlled by
+ * gfx_SetTransparentColor().
+ *
+ * @remarks
+ * A gfx_sprite_t can be converted into an appropriately large,
+ * already-allocated gfx_rletsprite_t using gfx_ConvertToRLETSprite().
+ *
+ * @param sprite_in input sprite with normal transparency
+ * @param malloc_routine malloc implementation to use
+ * @returns a newly allocated converted sprite with RLE transparency
+ * @see gfx_ConvertFromRLETSprite
+ */
+#define gfx_ConvertMallocRLETSprite(sprite_in) \
+gfx_ConvertToNewRLETSprite(sprite_in, malloc)
+
+/**
+ * Converts an RGB value to a palette color
+ *
+ * Conversion is not 100% perfect, but is quite close
+ */
+#define gfx_RGBTo1555(r,g,b) \
+((uint16_t)(((uint8_t)(r) >> 3) << 10) | \
+(((uint8_t)(g) >> 3) << 5) | \
+((uint8_t)(b) >> 3))
+
+/**
+ * Checks if we are currently in a rectangular hotspot area
+ */
+#define gfx_CheckRectangleHotspot(master_x, master_y, master_width, master_height, test_x, test_y, test_width, test_height) \
+(((test_x) < ((master_x) + (master_width))) && \
+(((test_x) + (test_width)) > (master_x)) && \
+((test_y) < ((master_y) + (master_height))) && \
+(((test_y) + (test_height)) > (master_y)))
+
+/* Color definitions (try to avoid) */
+#define gfx_black 0x00
+#define gfx_red 0xE0
+#define gfx_orange 0xE3
+#define gfx_green 0x03
+#define gfx_blue 0x10
+#define gfx_purple 0x50
+#define gfx_yellow 0xE7
+#define gfx_pink 0xF0
+#define gfx_white 0xFF
+
+/* Compatability defines (don't use please) */
+typedef gfx_sprite_t gfx_image_t;
+#define gfx_BlitArea gfx_BlitRectangle
+void gfx_LZDecompress(uint8_t *in, uint8_t *out, unsigned int in_size);
+
+#define gfx_lcdWidth (320)
+#define gfx_lcdHeight (240)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/intce.h b/frontends/calculator/CEdev/include/intce.h index 1184c29..dd27a31 100644 --- a/frontends/calculator/CEdev/include/intce.h +++ b/frontends/calculator/CEdev/include/intce.h @@ -1,93 +1,93 @@ -/** - * @file - * @authors Matt "MateoConLechuga" Waltz - * @authors Jacob "jacobly" Young - * @brief Interrupt configuring and setting - */ - -#ifndef INTCE_H -#define INTCE_H - -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Enable global interrupts - */ -#define int_Enable() \ -asm("ei") - -/** - * @brief Diasble global interrupts - */ -#define int_Disable() \ -asm("di") - -/** - * @brief Blocking wait for an interrupt to trigger - */ -#define int_Wait() \ -asm("halt") - -#ifdef FORCE_INTERRUPTS -#warning TI has removed custom interrupt support on CE models with hardware revision >= I. Please check that this is acceptable. - -/** - * Initizalize to use custom interrupts - * @note Saves status of current interrupt state - * @warning TI has removed custom interrupt support on CE models with hardware revision >= I. - */ -void int_Initialize(void); - -/** - * Resets interrupts back to the OS expected values - * @warning Must have called int_Initialize before using - * @warning TI has removed custom interrupt support on CE models with hardware revision >= I. - */ -void int_Reset(void); - -/** - * Sets up an interrupt vector given an ISR - * @param ivect Interrupt vector to set - * @param handler Handler to interrupt service routine - * @warning TI has removed custom interrupt support on CE models with hardware revision >= I. - */ -void int_SetVector(uint8_t ivect, void (*handler)(void)); - -#endif - -#define ON_IVECT 0 /**< [on] key interrupt source */ -#define TIMER1_IVECT 1 /**< Timer 1 interrupt source */ -#define TIMER2_IVECT 2 /**< Timer 2 interrupt source */ -#define TIMER3_IVECT 3 /**< Timer 3 interrupt source */ -#define TIMEROS_IVECT 4 /**< Timer OS interrupt source */ -#define KEYBOARD_IVECT 10 /**< Keyboard interrupt source */ -#define LCD_IVECT 11 /**< LCD interrupt source */ -#define RTC_IVECT 12 /**< Real Time Clock interrupt source */ -#define USB_IVECT 13 /**< USB interrupt source */ - -#define INT_ON 1<<ON_IVECT /**< [on] key interrupt source mask */ -#define INT_TIMER1 1<<TIMER1_IVECT /**< Timer 1 interrupt source mask */ -#define INT_TIMER2 1<<TIMER2_IVECT /**< Timer 2 interrupt source mask */ -#define INT_TIMER3 1<<TIMER3_IVECT /**< Timer 3 interrupt source mask */ -#define INT_TIMEROS 1<<TIMEROS_IVECT /**< Timer OS interrupt source mask */ -#define INT_KEYBOARD 1<<KEYBOARD_IVECT /**< Keyboard interrupt source mask */ -#define INT_LCD 1<<LCD_IVECT /**< LCD interrupt source mask */ -#define INT_RTC 1<<RTC_IVECT /**< Real Time Clock interrupt source mask */ -#define INT_USB 1<<USB_IVECT /**< USB interrupt source mask */ - -#define int_RawStatus (*(volatile uint24_t*)0x0F00000) /**< State of interrupt signals */ -#define int_MaskedStatus (*(volatile uint24_t*)0x0F00014) /**< Masked state of interrupt signals */ -#define int_EnableConfig (*(uint24_t*)0x0F00004) /**< Enabled interrupt signals */ -#define int_LatchConfig (*(uint24_t*)0x0F0000C) /**< Latchable interrupt signals */ -#define int_InvertConfig (*(uint24_t*)0x0F00010) /**< Invertable interrupt signals */ -#define int_Acknowledge (*(uint24_t*)0x0F00008) /**< Acknowledge interrupt signals */ - -#ifdef __cplusplus -} -#endif - -#endif +/**
+ * @file
+ * @authors Matt "MateoConLechuga" Waltz
+ * @authors Jacob "jacobly" Young
+ * @brief Interrupt configuring and setting
+ */
+
+#ifndef INTCE_H
+#define INTCE_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Enable global interrupts
+ */
+#define int_Enable() \
+asm("ei")
+
+/**
+ * @brief Diasble global interrupts
+ */
+#define int_Disable() \
+asm("di")
+
+/**
+ * @brief Blocking wait for an interrupt to trigger
+ */
+#define int_Wait() \
+asm("halt")
+
+#ifdef FORCE_INTERRUPTS
+#warning TI has removed custom interrupt support on CE models with hardware revision >= I. Please check that this is acceptable.
+
+/**
+ * Initizalize to use custom interrupts
+ * @note Saves status of current interrupt state
+ * @warning TI has removed custom interrupt support on CE models with hardware revision >= I.
+ */
+void int_Initialize(void);
+
+/**
+ * Resets interrupts back to the OS expected values
+ * @warning Must have called int_Initialize before using
+ * @warning TI has removed custom interrupt support on CE models with hardware revision >= I.
+ */
+void int_Reset(void);
+
+/**
+ * Sets up an interrupt vector given an ISR
+ * @param ivect Interrupt vector to set
+ * @param handler Handler to interrupt service routine
+ * @warning TI has removed custom interrupt support on CE models with hardware revision >= I.
+ */
+void int_SetVector(uint8_t ivect, void (*handler)(void));
+
+#endif
+
+#define ON_IVECT 0 /**< [on] key interrupt source */
+#define TIMER1_IVECT 1 /**< Timer 1 interrupt source */
+#define TIMER2_IVECT 2 /**< Timer 2 interrupt source */
+#define TIMER3_IVECT 3 /**< Timer 3 interrupt source */
+#define TIMEROS_IVECT 4 /**< Timer OS interrupt source */
+#define KEYBOARD_IVECT 10 /**< Keyboard interrupt source */
+#define LCD_IVECT 11 /**< LCD interrupt source */
+#define RTC_IVECT 12 /**< Real Time Clock interrupt source */
+#define USB_IVECT 13 /**< USB interrupt source */
+
+#define INT_ON 1<<ON_IVECT /**< [on] key interrupt source mask */
+#define INT_TIMER1 1<<TIMER1_IVECT /**< Timer 1 interrupt source mask */
+#define INT_TIMER2 1<<TIMER2_IVECT /**< Timer 2 interrupt source mask */
+#define INT_TIMER3 1<<TIMER3_IVECT /**< Timer 3 interrupt source mask */
+#define INT_TIMEROS 1<<TIMEROS_IVECT /**< Timer OS interrupt source mask */
+#define INT_KEYBOARD 1<<KEYBOARD_IVECT /**< Keyboard interrupt source mask */
+#define INT_LCD 1<<LCD_IVECT /**< LCD interrupt source mask */
+#define INT_RTC 1<<RTC_IVECT /**< Real Time Clock interrupt source mask */
+#define INT_USB 1<<USB_IVECT /**< USB interrupt source mask */
+
+#define int_RawStatus (*(volatile uint24_t*)0x0F00000) /**< State of interrupt signals */
+#define int_MaskedStatus (*(volatile uint24_t*)0x0F00014) /**< Masked state of interrupt signals */
+#define int_EnableConfig (*(uint24_t*)0x0F00004) /**< Enabled interrupt signals */
+#define int_LatchConfig (*(uint24_t*)0x0F0000C) /**< Latchable interrupt signals */
+#define int_InvertConfig (*(uint24_t*)0x0F00010) /**< Invertable interrupt signals */
+#define int_Acknowledge (*(uint24_t*)0x0F00008) /**< Acknowledge interrupt signals */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/iso646.h b/frontends/calculator/CEdev/include/iso646.h index d8e83a5..8127c05 100644 --- a/frontends/calculator/CEdev/include/iso646.h +++ b/frontends/calculator/CEdev/include/iso646.h @@ -1,18 +1,18 @@ -#ifndef __ISO646_H -#define __ISO646_H - -#ifndef __cplusplus -#define and && -#define and_eq &= -#define bitand & -#define bitor | -#define compl ~ -#define not ! -#define not_eq != -#define or || -#define or_eq |= -#define xor ^ -#define xor_eq ^= -#endif - +#ifndef __ISO646_H
+#define __ISO646_H
+
+#ifndef __cplusplus
+#define and &&
+#define and_eq &=
+#define bitand &
+#define bitor |
+#define compl ~
+#define not !
+#define not_eq !=
+#define or ||
+#define or_eq |=
+#define xor ^
+#define xor_eq ^=
+#endif
+
#endif
\ No newline at end of file diff --git a/frontends/calculator/CEdev/include/keypadc.h b/frontends/calculator/CEdev/include/keypadc.h index 1b92f1c..db77bf3 100644 --- a/frontends/calculator/CEdev/include/keypadc.h +++ b/frontends/calculator/CEdev/include/keypadc.h @@ -1,255 +1,255 @@ -/** - * @file - * @authors Matt "MateoConLechuga" Waltz - * @authors Shaun "Methsoft" McFall - * @brief Simple direct input keypad library - */ - -#ifndef H_KEYPADC -#define H_KEYPADC - -#include <stdint.h> -#include <stdbool.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef uint8_t kb_key_t; ///< Normal key type -typedef uint16_t kb_lkey_t; ///< Long key type - -/** - * Scans the keyboard to update data values - * @note Disables interrupts - */ -void kb_Scan(void); - -/** - * Scans the given keyboard row and returns the row value - * @param row Row to scan - * @note Disables interrupts - */ -kb_key_t kb_ScanGroup(uint8_t row); - -/** - * Scans the keyboard quickly to tell if any key was pressed - * @note Disables interrupts - */ -uint8_t kb_AnyKey(void); - -/** - * Resets the keyboard - * @note Only use if you modify keyboard timers or number of rows - */ -void kb_Reset(void); - -/** - * @brief Sets the keypad scanning mode - * @see kb_scan_mode_t - */ -#define kb_SetMode(mode) \ -(kb_Config = ((kb_Config & ~3)|(mode))) - -/** - * @brief Gets the keypad scanning mode - * @see kb_scan_mode_t - */ -#define kb_GetMode() \ -(kb_Config & 3) - -/** - * Different available scanning modes - */ -typedef enum { - MODE_0_IDLE = 0, /**< Keypad scanning is idle */ - MODE_1_INDISCRIMINATE, /**< Indiscriminate key detection. Data registers are invalid, but whenever any key is pressed, interrupt KB_MODE_1_PRESS is set (and cannot be cleared until the key is released). */ - MODE_2_SINGLE, /**< Single scan. The keypad is scanned once, and then the mode returns to MODE_0_IDLE. */ - MODE_3_CONTINUOUS /**< Continuous scan. When scanning completes, it just starts over again after a delay. */ -} kb_scan_mode_t; - -#define kb_EnableInt \ -(*(uint8_t*)0xF5000C) /**< Enabled keypad interrupt signals */ -#define kb_IntAcknowledge \ -(*(volatile uint8_t*)0xF50008) /**< Acknowledege keypad interrupt signals */ -#define kb_IntStatus \ -(*(volatile uint8_t*)0xF50008) /**< Status of keypad interrupt signals */ -#define kb_Config \ -(*(uint8_t*)0xF50000) /**< Configuration of keypad controller */ - -/** - * Keypad Data registers - * - * | Offset | Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 | - * | -------| ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | - * | 1 | kb_Graph | kb_Trace | kb_Zoom | kb_Window | kb_Yequ | kb_2nd | kb_Mode | kb_Del | - * | 2 | | kb_Sto | kb_Ln | kb_Log | kb_Square | kb_Recip | kb_Math | kb_Alpha | - * | 3 | kb_0 | kb_1 | kb_4 | kb_7 | kb_Comma | kb_Sin | kb_Apps | kb_GraphVar| - * | 4 | kb_DecPnt | kb_2 | kb_5 | kb_8 | kb_LParen | kb_Cos | kb_Prgm | kb_Stat | - * | 5 | kb_Chs | kb_3 | kb_6 | kb_9 | kb_RParen | kb_Tan | kb_Vars | | - * | 6 | kb_Enter | kb_Add | kb_Sub | kb_Mul | kb_Div | kb_Power | kb_Clear | | - * | 7 | kb_Down | kb_Left | kb_Right | kb_Up | | | | | - * - * These data registers can be indexed just like an array. For example, if you want to check the status of the '2nd' key: - * @code - * if (kb_Data[1] & kb_2nd) { - * ... - * } - * @endcode - */ -#define kb_Data \ -(uint8_t)((uint16_t*)0xF50010) - -/** - * Different available interrupt signals - */ -typedef enum { - KB_SCAN_COMPLETE = 1, /**< Interrupt set when keypad is done scanning */ - KB_DATA_CHANGED = 2, /**< Interrupt set when data is changed on a press or a release */ - KB_MODE_1_PRESS = 4 /**< Interrupt set when a key is pressed in MODE_1_INDISCRIMINATE */ -} kb_int_signal_t; - -/* Keyboard group 1 */ -#define kb_Graph 1<<0 -#define kb_Trace 1<<1 -#define kb_Zoom 1<<2 -#define kb_Window 1<<3 -#define kb_Yequ 1<<4 -#define kb_2nd 1<<5 -#define kb_Mode 1<<6 -#define kb_Del 1<<7 - -/* Keyboard group 2 */ -#define kb_Sto 1<<1 -#define kb_Ln 1<<2 -#define kb_Log 1<<3 -#define kb_Square 1<<4 -#define kb_Recip 1<<5 -#define kb_Math 1<<6 -#define kb_Alpha 1<<7 - -/* Keyboard group 3 */ -#define kb_0 1<<0 -#define kb_1 1<<1 -#define kb_4 1<<2 -#define kb_7 1<<3 -#define kb_Comma 1<<4 -#define kb_Sin 1<<5 -#define kb_Apps 1<<6 -#define kb_GraphVar 1<<7 - -/* Keyboard group 4 */ -#define kb_DecPnt 1<<0 -#define kb_2 1<<1 -#define kb_5 1<<2 -#define kb_8 1<<3 -#define kb_LParen 1<<4 -#define kb_Cos 1<<5 -#define kb_Prgm 1<<6 -#define kb_Stat 1<<7 - -/* Keyboard group 5 */ -#define kb_Chs 1<<0 -#define kb_3 1<<1 -#define kb_6 1<<2 -#define kb_9 1<<3 -#define kb_RParen 1<<4 -#define kb_Tan 1<<5 -#define kb_Vars 1<<6 - -/* Keyboard group 6 */ -#define kb_Enter 1<<0 -#define kb_Add 1<<1 -#define kb_Sub 1<<2 -#define kb_Mul 1<<3 -#define kb_Div 1<<4 -#define kb_Power 1<<5 -#define kb_Clear 1<<6 - -/* Keyboard group 7 */ -#define kb_Down 1<<0 -#define kb_Left 1<<1 -#define kb_Right 1<<2 -#define kb_Up 1<<3 - -/* Keyboard group 1 */ -#define kb_KeyGraph (kb_lkey_t)(1 << 8 | 1<<0) -#define kb_KeyTrace (kb_lkey_t)(1 << 8 | 1<<1) -#define kb_KeyZoom (kb_lkey_t)(1 << 8 | 1<<2) -#define kb_KeyWindow (kb_lkey_t)(1 << 8 | 1<<3) -#define kb_KeyYequ (kb_lkey_t)(1 << 8 | 1<<4) -#define kb_Key2nd (kb_lkey_t)(1 << 8 | 1<<5) -#define kb_KeyMode (kb_lkey_t)(1 << 8 | 1<<6) -#define kb_KeyDel (kb_lkey_t)(1 << 8 | 1<<7) - -/* Keyboard group 2 */ -#define kb_KeyStore (kb_lkey_t)(2 << 8 | 1<<1) -#define kb_KeyLn (kb_lkey_t)(2 << 8 | 1<<2) -#define kb_KeyLog (kb_lkey_t)(2 << 8 | 1<<3) -#define kb_KeySquare (kb_lkey_t)(2 << 8 | 1<<4) -#define kb_KeyRecip (kb_lkey_t)(2 << 8 | 1<<5) -#define kb_KeyMath (kb_lkey_t)(2 << 8 | 1<<6) -#define kb_KeyAlpha (kb_lkey_t)(2 << 8 | 1<<7) - -/* Keyboard group 3 */ -#define kb_Key0 (kb_lkey_t)(3 << 8 | 1<<0) -#define kb_Key1 (kb_lkey_t)(3 << 8 | 1<<1) -#define kb_Key4 (kb_lkey_t)(3 << 8 | 1<<2) -#define kb_Key7 (kb_lkey_t)(3 << 8 | 1<<3) -#define kb_KeyComma (kb_lkey_t)(3 << 8 | 1<<4) -#define kb_KeySin (kb_lkey_t)(3 << 8 | 1<<5) -#define kb_KeyApps (kb_lkey_t)(3 << 8 | 1<<6) -#define kb_KeyGraphVar (kb_lkey_t)(3 << 8 | 1<<7) - -/* Keyboard group 4 */ -#define kb_KeyDecPnt (kb_lkey_t)(4 << 8 | 1<<0) -#define kb_Key2 (kb_lkey_t)(4 << 8 | 1<<1) -#define kb_Key5 (kb_lkey_t)(4 << 8 | 1<<2) -#define kb_Key8 (kb_lkey_t)(4 << 8 | 1<<3) -#define kb_KeyLParen (kb_lkey_t)(4 << 8 | 1<<4) -#define kb_KeyCos (kb_lkey_t)(4 << 8 | 1<<5) -#define kb_KeyPrgm (kb_lkey_t)(4 << 8 | 1<<6) -#define kb_KeyStat (kb_lkey_t)(4 << 8 | 1<<7) - -/* Keyboard group 5 */ -#define kb_KeyChs (kb_lkey_t)(5 << 8 | 1<<0) -#define kb_Key3 (kb_lkey_t)(5 << 8 | 1<<1) -#define kb_Key6 (kb_lkey_t)(5 << 8 | 1<<2) -#define kb_Key9 (kb_lkey_t)(5 << 8 | 1<<3) -#define kb_KeyRParen (kb_lkey_t)(5 << 8 | 1<<4) -#define kb_KeyTan (kb_lkey_t)(5 << 8 | 1<<5) -#define kb_KeyVars (kb_lkey_t)(5 << 8 | 1<<6) - -/* Keyboard group 6 */ -#define kb_KeyEnter (kb_lkey_t)(6 << 8 | 1<<0) -#define kb_KeyAdd (kb_lkey_t)(6 << 8 | 1<<1) -#define kb_KeySub (kb_lkey_t)(6 << 8 | 1<<2) -#define kb_KeyMul (kb_lkey_t)(6 << 8 | 1<<3) -#define kb_KeyDiv (kb_lkey_t)(6 << 8 | 1<<4) -#define kb_KeyPower (kb_lkey_t)(6 << 8 | 1<<5) -#define kb_KeyClear (kb_lkey_t)(6 << 8 | 1<<6) - -/* Keyboard group 7 */ -#define kb_KeyDown (kb_lkey_t)(7 << 8 | 1<<0) -#define kb_KeyLeft (kb_lkey_t)(7 << 8 | 1<<1) -#define kb_KeyRight (kb_lkey_t)(7 << 8 | 1<<2) -#define kb_KeyUp (kb_lkey_t)(7 << 8 | 1<<3) - -/* Compatibility defines */ -#define kb_DataArray ((uint16_t*)0xF50010) -#define kb_dataArray ((uint16_t*)0xF50010) -#define kb_Store 1<<1 -#define kb_KeyPgrm kb_KeyPrgm -#define kb_group_0 0 -#define kb_group_1 1 -#define kb_group_2 2 -#define kb_group_3 3 -#define kb_group_4 4 -#define kb_group_5 5 -#define kb_group_6 6 -#define kb_group_7 7 - -#ifdef __cplusplus -} -#endif - -#endif +/**
+ * @file
+ * @authors Matt "MateoConLechuga" Waltz
+ * @authors Shaun "Methsoft" McFall
+ * @brief Simple direct input keypad library
+ */
+
+#ifndef H_KEYPADC
+#define H_KEYPADC
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef uint8_t kb_key_t; ///< Normal key type
+typedef uint16_t kb_lkey_t; ///< Long key type
+
+/**
+ * Scans the keyboard to update data values
+ * @note Disables interrupts
+ */
+void kb_Scan(void);
+
+/**
+ * Scans the given keyboard row and returns the row value
+ * @param row Row to scan
+ * @note Disables interrupts
+ */
+kb_key_t kb_ScanGroup(uint8_t row);
+
+/**
+ * Scans the keyboard quickly to tell if any key was pressed
+ * @note Disables interrupts
+ */
+uint8_t kb_AnyKey(void);
+
+/**
+ * Resets the keyboard
+ * @note Only use if you modify keyboard timers or number of rows
+ */
+void kb_Reset(void);
+
+/**
+ * @brief Sets the keypad scanning mode
+ * @see kb_scan_mode_t
+ */
+#define kb_SetMode(mode) \
+(kb_Config = ((kb_Config & ~3)|(mode)))
+
+/**
+ * @brief Gets the keypad scanning mode
+ * @see kb_scan_mode_t
+ */
+#define kb_GetMode() \
+(kb_Config & 3)
+
+/**
+ * Different available scanning modes
+ */
+typedef enum {
+ MODE_0_IDLE = 0, /**< Keypad scanning is idle */
+ MODE_1_INDISCRIMINATE, /**< Indiscriminate key detection. Data registers are invalid, but whenever any key is pressed, interrupt KB_MODE_1_PRESS is set (and cannot be cleared until the key is released). */
+ MODE_2_SINGLE, /**< Single scan. The keypad is scanned once, and then the mode returns to MODE_0_IDLE. */
+ MODE_3_CONTINUOUS /**< Continuous scan. When scanning completes, it just starts over again after a delay. */
+} kb_scan_mode_t;
+
+#define kb_EnableInt \
+(*(uint8_t*)0xF5000C) /**< Enabled keypad interrupt signals */
+#define kb_IntAcknowledge \
+(*(volatile uint8_t*)0xF50008) /**< Acknowledege keypad interrupt signals */
+#define kb_IntStatus \
+(*(volatile uint8_t*)0xF50008) /**< Status of keypad interrupt signals */
+#define kb_Config \
+(*(uint8_t*)0xF50000) /**< Configuration of keypad controller */
+
+/**
+ * Keypad Data registers
+ *
+ * | Offset | Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 |
+ * | -------| ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- |
+ * | 1 | kb_Graph | kb_Trace | kb_Zoom | kb_Window | kb_Yequ | kb_2nd | kb_Mode | kb_Del |
+ * | 2 | | kb_Sto | kb_Ln | kb_Log | kb_Square | kb_Recip | kb_Math | kb_Alpha |
+ * | 3 | kb_0 | kb_1 | kb_4 | kb_7 | kb_Comma | kb_Sin | kb_Apps | kb_GraphVar|
+ * | 4 | kb_DecPnt | kb_2 | kb_5 | kb_8 | kb_LParen | kb_Cos | kb_Prgm | kb_Stat |
+ * | 5 | kb_Chs | kb_3 | kb_6 | kb_9 | kb_RParen | kb_Tan | kb_Vars | |
+ * | 6 | kb_Enter | kb_Add | kb_Sub | kb_Mul | kb_Div | kb_Power | kb_Clear | |
+ * | 7 | kb_Down | kb_Left | kb_Right | kb_Up | | | | |
+ *
+ * These data registers can be indexed just like an array. For example, if you want to check the status of the '2nd' key:
+ * @code
+ * if (kb_Data[1] & kb_2nd) {
+ * ...
+ * }
+ * @endcode
+ */
+#define kb_Data \
+(uint8_t)((uint16_t*)0xF50010)
+
+/**
+ * Different available interrupt signals
+ */
+typedef enum {
+ KB_SCAN_COMPLETE = 1, /**< Interrupt set when keypad is done scanning */
+ KB_DATA_CHANGED = 2, /**< Interrupt set when data is changed on a press or a release */
+ KB_MODE_1_PRESS = 4 /**< Interrupt set when a key is pressed in MODE_1_INDISCRIMINATE */
+} kb_int_signal_t;
+
+/* Keyboard group 1 */
+#define kb_Graph 1<<0
+#define kb_Trace 1<<1
+#define kb_Zoom 1<<2
+#define kb_Window 1<<3
+#define kb_Yequ 1<<4
+#define kb_2nd 1<<5
+#define kb_Mode 1<<6
+#define kb_Del 1<<7
+
+/* Keyboard group 2 */
+#define kb_Sto 1<<1
+#define kb_Ln 1<<2
+#define kb_Log 1<<3
+#define kb_Square 1<<4
+#define kb_Recip 1<<5
+#define kb_Math 1<<6
+#define kb_Alpha 1<<7
+
+/* Keyboard group 3 */
+#define kb_0 1<<0
+#define kb_1 1<<1
+#define kb_4 1<<2
+#define kb_7 1<<3
+#define kb_Comma 1<<4
+#define kb_Sin 1<<5
+#define kb_Apps 1<<6
+#define kb_GraphVar 1<<7
+
+/* Keyboard group 4 */
+#define kb_DecPnt 1<<0
+#define kb_2 1<<1
+#define kb_5 1<<2
+#define kb_8 1<<3
+#define kb_LParen 1<<4
+#define kb_Cos 1<<5
+#define kb_Prgm 1<<6
+#define kb_Stat 1<<7
+
+/* Keyboard group 5 */
+#define kb_Chs 1<<0
+#define kb_3 1<<1
+#define kb_6 1<<2
+#define kb_9 1<<3
+#define kb_RParen 1<<4
+#define kb_Tan 1<<5
+#define kb_Vars 1<<6
+
+/* Keyboard group 6 */
+#define kb_Enter 1<<0
+#define kb_Add 1<<1
+#define kb_Sub 1<<2
+#define kb_Mul 1<<3
+#define kb_Div 1<<4
+#define kb_Power 1<<5
+#define kb_Clear 1<<6
+
+/* Keyboard group 7 */
+#define kb_Down 1<<0
+#define kb_Left 1<<1
+#define kb_Right 1<<2
+#define kb_Up 1<<3
+
+/* Keyboard group 1 */
+#define kb_KeyGraph (kb_lkey_t)(1 << 8 | 1<<0)
+#define kb_KeyTrace (kb_lkey_t)(1 << 8 | 1<<1)
+#define kb_KeyZoom (kb_lkey_t)(1 << 8 | 1<<2)
+#define kb_KeyWindow (kb_lkey_t)(1 << 8 | 1<<3)
+#define kb_KeyYequ (kb_lkey_t)(1 << 8 | 1<<4)
+#define kb_Key2nd (kb_lkey_t)(1 << 8 | 1<<5)
+#define kb_KeyMode (kb_lkey_t)(1 << 8 | 1<<6)
+#define kb_KeyDel (kb_lkey_t)(1 << 8 | 1<<7)
+
+/* Keyboard group 2 */
+#define kb_KeyStore (kb_lkey_t)(2 << 8 | 1<<1)
+#define kb_KeyLn (kb_lkey_t)(2 << 8 | 1<<2)
+#define kb_KeyLog (kb_lkey_t)(2 << 8 | 1<<3)
+#define kb_KeySquare (kb_lkey_t)(2 << 8 | 1<<4)
+#define kb_KeyRecip (kb_lkey_t)(2 << 8 | 1<<5)
+#define kb_KeyMath (kb_lkey_t)(2 << 8 | 1<<6)
+#define kb_KeyAlpha (kb_lkey_t)(2 << 8 | 1<<7)
+
+/* Keyboard group 3 */
+#define kb_Key0 (kb_lkey_t)(3 << 8 | 1<<0)
+#define kb_Key1 (kb_lkey_t)(3 << 8 | 1<<1)
+#define kb_Key4 (kb_lkey_t)(3 << 8 | 1<<2)
+#define kb_Key7 (kb_lkey_t)(3 << 8 | 1<<3)
+#define kb_KeyComma (kb_lkey_t)(3 << 8 | 1<<4)
+#define kb_KeySin (kb_lkey_t)(3 << 8 | 1<<5)
+#define kb_KeyApps (kb_lkey_t)(3 << 8 | 1<<6)
+#define kb_KeyGraphVar (kb_lkey_t)(3 << 8 | 1<<7)
+
+/* Keyboard group 4 */
+#define kb_KeyDecPnt (kb_lkey_t)(4 << 8 | 1<<0)
+#define kb_Key2 (kb_lkey_t)(4 << 8 | 1<<1)
+#define kb_Key5 (kb_lkey_t)(4 << 8 | 1<<2)
+#define kb_Key8 (kb_lkey_t)(4 << 8 | 1<<3)
+#define kb_KeyLParen (kb_lkey_t)(4 << 8 | 1<<4)
+#define kb_KeyCos (kb_lkey_t)(4 << 8 | 1<<5)
+#define kb_KeyPrgm (kb_lkey_t)(4 << 8 | 1<<6)
+#define kb_KeyStat (kb_lkey_t)(4 << 8 | 1<<7)
+
+/* Keyboard group 5 */
+#define kb_KeyChs (kb_lkey_t)(5 << 8 | 1<<0)
+#define kb_Key3 (kb_lkey_t)(5 << 8 | 1<<1)
+#define kb_Key6 (kb_lkey_t)(5 << 8 | 1<<2)
+#define kb_Key9 (kb_lkey_t)(5 << 8 | 1<<3)
+#define kb_KeyRParen (kb_lkey_t)(5 << 8 | 1<<4)
+#define kb_KeyTan (kb_lkey_t)(5 << 8 | 1<<5)
+#define kb_KeyVars (kb_lkey_t)(5 << 8 | 1<<6)
+
+/* Keyboard group 6 */
+#define kb_KeyEnter (kb_lkey_t)(6 << 8 | 1<<0)
+#define kb_KeyAdd (kb_lkey_t)(6 << 8 | 1<<1)
+#define kb_KeySub (kb_lkey_t)(6 << 8 | 1<<2)
+#define kb_KeyMul (kb_lkey_t)(6 << 8 | 1<<3)
+#define kb_KeyDiv (kb_lkey_t)(6 << 8 | 1<<4)
+#define kb_KeyPower (kb_lkey_t)(6 << 8 | 1<<5)
+#define kb_KeyClear (kb_lkey_t)(6 << 8 | 1<<6)
+
+/* Keyboard group 7 */
+#define kb_KeyDown (kb_lkey_t)(7 << 8 | 1<<0)
+#define kb_KeyLeft (kb_lkey_t)(7 << 8 | 1<<1)
+#define kb_KeyRight (kb_lkey_t)(7 << 8 | 1<<2)
+#define kb_KeyUp (kb_lkey_t)(7 << 8 | 1<<3)
+
+/* Compatibility defines */
+#define kb_DataArray ((uint16_t*)0xF50010)
+#define kb_dataArray ((uint16_t*)0xF50010)
+#define kb_Store 1<<1
+#define kb_KeyPgrm kb_KeyPrgm
+#define kb_group_0 0
+#define kb_group_1 1
+#define kb_group_2 2
+#define kb_group_3 3
+#define kb_group_4 4
+#define kb_group_5 5
+#define kb_group_6 6
+#define kb_group_7 7
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/lib/ce/fileioc.h b/frontends/calculator/CEdev/include/lib/ce/fileioc.h index 8bb6ee4..b29714c 100644 --- a/frontends/calculator/CEdev/include/lib/ce/fileioc.h +++ b/frontends/calculator/CEdev/include/lib/ce/fileioc.h @@ -1,2 +1,2 @@ -#warning You are using a deprecated lib include path. Simply use #include <fileioc.h> instead -#include <fileioc.h> +#warning You are using a deprecated lib include path. Simply use #include <fileioc.h> instead
+#include <fileioc.h>
diff --git a/frontends/calculator/CEdev/include/lib/ce/graphx.h b/frontends/calculator/CEdev/include/lib/ce/graphx.h index 9a1343c..45534b0 100644 --- a/frontends/calculator/CEdev/include/lib/ce/graphx.h +++ b/frontends/calculator/CEdev/include/lib/ce/graphx.h @@ -1,2 +1,2 @@ -#warning You are using a deprecated lib include path. Simply use #include <graphx.h> instead -#include <graphx.h> +#warning You are using a deprecated lib include path. Simply use #include <graphx.h> instead
+#include <graphx.h>
diff --git a/frontends/calculator/CEdev/include/lib/ce/keypadc.h b/frontends/calculator/CEdev/include/lib/ce/keypadc.h index 7c2fd66..b17fd8e 100644 --- a/frontends/calculator/CEdev/include/lib/ce/keypadc.h +++ b/frontends/calculator/CEdev/include/lib/ce/keypadc.h @@ -1,2 +1,2 @@ -#warning You are using a deprecated lib include path. Simply use #include <keypadc.h> instead -#include <keypadc.h> +#warning You are using a deprecated lib include path. Simply use #include <keypadc.h> instead
+#include <keypadc.h>
diff --git a/frontends/calculator/CEdev/include/limits.h b/frontends/calculator/CEdev/include/limits.h index 2dbdab8..8d4a333 100644 --- a/frontends/calculator/CEdev/include/limits.h +++ b/frontends/calculator/CEdev/include/limits.h @@ -1,35 +1,35 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef LIMITS_H -#define LIMITS_H - -#define CHAR_BIT 8 /* number of bits in byte */ -#define SCHAR_MAX 127 /* max value for signed char */ -#define SCHAR_MIN (-127-1) /* min value for signed char */ -#define UCHAR_MAX 0xFF /* max value for unsigned char */ -#ifdef __UNSIGNED_CHARS__ -#define CHAR_MAX UCHAR_MAX /* max value for char */ -#define CHAR_MIN 0 /* Min value for char */ -#else -#define CHAR_MAX SCHAR_MAX /* max value for char */ -#define CHAR_MIN SCHAR_MIN /* Min value for char */ -#endif - -#define SHRT_MAX 32767 /* max value for short int */ -#define SHRT_MIN (-32767-1) /* min value for short int */ -#define USHRT_MAX 0xFFFF /* max value for unsigned short */ - -#define INT_MAX 8388607 /* max value for int */ -#define INT_MIN (-8388607 - 1) /* min value for int */ -#define UINT_MAX 0xFFFFFF /* max value for unsigned int */ - -#define LONG_MAX 2147483647L /* max value for long int */ -#define LONG_MIN (-2147483647L - 1) /* min value for long int */ -#define ULONG_MAX 0xFFFFFFFFUL /* max value for unsigned long */ - -#define MB_LEN_MAX 1 /* max multibyte char length */ - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef LIMITS_H
+#define LIMITS_H
+
+#define CHAR_BIT 8 /* number of bits in byte */
+#define SCHAR_MAX 127 /* max value for signed char */
+#define SCHAR_MIN (-127-1) /* min value for signed char */
+#define UCHAR_MAX 0xFF /* max value for unsigned char */
+#ifdef __UNSIGNED_CHARS__
+#define CHAR_MAX UCHAR_MAX /* max value for char */
+#define CHAR_MIN 0 /* Min value for char */
+#else
+#define CHAR_MAX SCHAR_MAX /* max value for char */
+#define CHAR_MIN SCHAR_MIN /* Min value for char */
+#endif
+
+#define SHRT_MAX 32767 /* max value for short int */
+#define SHRT_MIN (-32767-1) /* min value for short int */
+#define USHRT_MAX 0xFFFF /* max value for unsigned short */
+
+#define INT_MAX 8388607 /* max value for int */
+#define INT_MIN (-8388607 - 1) /* min value for int */
+#define UINT_MAX 0xFFFFFF /* max value for unsigned int */
+
+#define LONG_MAX 2147483647L /* max value for long int */
+#define LONG_MIN (-2147483647L - 1) /* min value for long int */
+#define ULONG_MAX 0xFFFFFFFFUL /* max value for unsigned long */
+
+#define MB_LEN_MAX 1 /* max multibyte char length */
+
+#endif
diff --git a/frontends/calculator/CEdev/include/math.h b/frontends/calculator/CEdev/include/math.h index 3225311..1360e45 100644 --- a/frontends/calculator/CEdev/include/math.h +++ b/frontends/calculator/CEdev/include/math.h @@ -1,67 +1,67 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef MATH_H -#define MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern double _huge_val; -#define HUGE_VAL _huge_val /* overflow error */ - -#define M_E 2.71828182845904523536 /* e */ -#define M_LOG2E 1.44269504088896340736 /* log2(e) */ -#define M_LOG10E 0.434294481903251827651 /* log10(e) */ -#define M_LN2 0.693147180559945309417 /* ln(2) */ -#define M_LN10 2.30258509299404568402 /* ln(10) */ -#define M_PI 3.14159265358979323846 /* pi */ -#define M_PI_2 1.57079632679489661923 /* pi/2 */ -#define M_PI_4 0.785398163397448309616 /* pi/4 */ -#define M_1_PI 0.318309886183790671538 /* 1/pi */ -#define M_2_PI 0.636619772367581343076 /* 2/pi */ -#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ -#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ -#define M_SQRT1_2 0.707106781186547524401 /* 1/sqrt(2) */ -#define M_LOG_2M_PI 1.83787706640934548 /* log2(M_PI) */ - -double acos(double x); -double asin(double x); -double atan(double x); -double atan2(double y,double x); -double cos(double x); -double sin(double x); -double tan(double x); -double cosh(double x); -double sinh(double x); -double tanh(double x); -double exp(double x); -double ldexp(double x, int exp); -double log(double x); -double log10(double x); -double pow(double x,double y); -double sqrt(double x); -double ceil(double x); -double floor(double x); -double fabs(double x); -double fmod(double x, double y); -double round(double x); - -double frexp(double value, int *exp); -double modf(double value, double *iptr); - -int isinf(double n); -int isnan(double n); -int finite(double n); - -double tgamma(double x); -double log2(double x); - -#ifdef __cplusplus -} -#endif - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef MATH_H
+#define MATH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern double _huge_val;
+#define HUGE_VAL _huge_val /* overflow error */
+
+#define M_E 2.71828182845904523536 /* e */
+#define M_LOG2E 1.44269504088896340736 /* log2(e) */
+#define M_LOG10E 0.434294481903251827651 /* log10(e) */
+#define M_LN2 0.693147180559945309417 /* ln(2) */
+#define M_LN10 2.30258509299404568402 /* ln(10) */
+#define M_PI 3.14159265358979323846 /* pi */
+#define M_PI_2 1.57079632679489661923 /* pi/2 */
+#define M_PI_4 0.785398163397448309616 /* pi/4 */
+#define M_1_PI 0.318309886183790671538 /* 1/pi */
+#define M_2_PI 0.636619772367581343076 /* 2/pi */
+#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
+#define M_SQRT1_2 0.707106781186547524401 /* 1/sqrt(2) */
+#define M_LOG_2M_PI 1.83787706640934548 /* log2(M_PI) */
+
+double acos(double x);
+double asin(double x);
+double atan(double x);
+double atan2(double y,double x);
+double cos(double x);
+double sin(double x);
+double tan(double x);
+double cosh(double x);
+double sinh(double x);
+double tanh(double x);
+double exp(double x);
+double ldexp(double x, int exp);
+double log(double x);
+double log10(double x);
+double pow(double x,double y);
+double sqrt(double x);
+double ceil(double x);
+double floor(double x);
+double fabs(double x);
+double fmod(double x, double y);
+double round(double x);
+
+double frexp(double value, int *exp);
+double modf(double value, double *iptr);
+
+int isinf(double n);
+int isnan(double n);
+int finite(double n);
+
+double tgamma(double x);
+double log2(double x);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/setjmp.h b/frontends/calculator/CEdev/include/setjmp.h index 3858118..e8376c5 100644 --- a/frontends/calculator/CEdev/include/setjmp.h +++ b/frontends/calculator/CEdev/include/setjmp.h @@ -1,21 +1,21 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - */ -#ifndef __SETJMP_H -#define __SETJMP_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef unsigned char jmp_buf[12]; - -int setjmp(jmp_buf env); -void longjmp(jmp_buf env, int val); - -#ifdef __cplusplus -} -#endif - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ */
+#ifndef __SETJMP_H
+#define __SETJMP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef unsigned char jmp_buf[12];
+
+int setjmp(jmp_buf env);
+void longjmp(jmp_buf env, int val);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/stdarg.h b/frontends/calculator/CEdev/include/stdarg.h index 2938417..b794bdb 100644 --- a/frontends/calculator/CEdev/include/stdarg.h +++ b/frontends/calculator/CEdev/include/stdarg.h @@ -1,15 +1,15 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - */ -#ifndef STDARG_H -#define STDARG_H - -typedef char * va_list; -#define _INTSIZEOF(n) (sizeof(n) + sizeof(int)-1-((sizeof(n)-1)%sizeof(int))) - -#define va_start(ap, parm) (ap = (char *)&parm + _INTSIZEOF(parm)) -#define va_arg(ap,type) (*(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type))) -#define va_end(ap) - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ */
+#ifndef STDARG_H
+#define STDARG_H
+
+typedef char * va_list;
+#define _INTSIZEOF(n) (sizeof(n) + sizeof(int)-1-((sizeof(n)-1)%sizeof(int)))
+
+#define va_start(ap, parm) (ap = (char *)&parm + _INTSIZEOF(parm))
+#define va_arg(ap,type) (*(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)))
+#define va_end(ap)
+
+#endif
diff --git a/frontends/calculator/CEdev/include/stdbool.h b/frontends/calculator/CEdev/include/stdbool.h index 0681e78..c6c20fd 100644 --- a/frontends/calculator/CEdev/include/stdbool.h +++ b/frontends/calculator/CEdev/include/stdbool.h @@ -1,23 +1,23 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef STDBOOL_H -#define STDBOOL_H - -#ifndef __bool_true_false_are_defined -#define __bool_true_false_are_defined - -#ifndef __cplusplus - -typedef unsigned char bool; - -#define _Bool bool -#define false 0 -#define true 1 - -#endif - -#endif -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef STDBOOL_H
+#define STDBOOL_H
+
+#ifndef __bool_true_false_are_defined
+#define __bool_true_false_are_defined
+
+#ifndef __cplusplus
+
+typedef unsigned char bool;
+
+#define _Bool bool
+#define false 0
+#define true 1
+
+#endif
+
+#endif
+#endif
diff --git a/frontends/calculator/CEdev/include/stddef.h b/frontends/calculator/CEdev/include/stddef.h index 1f277b7..e436fcb 100644 --- a/frontends/calculator/CEdev/include/stddef.h +++ b/frontends/calculator/CEdev/include/stddef.h @@ -1,28 +1,28 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef STDDEF_H -#define STDDEF_H - -#ifndef SIZE_T_DEFINED -#define SIZE_T_DEFINED -typedef unsigned int size_t; -#endif - -#ifndef NULL -#define NULL ((void *)0) -#endif -#define offsetof(type,member) ((size_t) &((type*)0)->member) - -typedef int ptrdiff_t; - -#ifndef __cplusplus -#ifndef WCHAR_T_DEFINED -#define WCHAR_T_DEFINED -typedef unsigned short wchar_t; -#endif -#endif - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef STDDEF_H
+#define STDDEF_H
+
+#ifndef SIZE_T_DEFINED
+#define SIZE_T_DEFINED
+typedef unsigned int size_t;
+#endif
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+#define offsetof(type,member) ((size_t) &((type*)0)->member)
+
+typedef int ptrdiff_t;
+
+#ifndef __cplusplus
+#ifndef WCHAR_T_DEFINED
+#define WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#endif
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/stdint.h b/frontends/calculator/CEdev/include/stdint.h index 5e48f60..c1fbe17 100644 --- a/frontends/calculator/CEdev/include/stdint.h +++ b/frontends/calculator/CEdev/include/stdint.h @@ -1,19 +1,19 @@ -#ifndef __STDINT_H -#define __STDINT_H - -typedef signed char int8_t; -typedef unsigned char uint8_t; - -typedef signed short int16_t; -typedef unsigned short uint16_t; - -typedef signed int int24_t; -typedef unsigned int uint24_t; - -typedef signed long int32_t; -typedef unsigned long uint32_t; - -typedef int24_t intptr_t; -typedef uint24_t uintptr_t; - -#endif +#ifndef __STDINT_H
+#define __STDINT_H
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+
+typedef signed short int16_t;
+typedef unsigned short uint16_t;
+
+typedef signed int int24_t;
+typedef unsigned int uint24_t;
+
+typedef signed long int32_t;
+typedef unsigned long uint32_t;
+
+typedef int24_t intptr_t;
+typedef uint24_t uintptr_t;
+
+#endif
diff --git a/frontends/calculator/CEdev/include/stdio.h b/frontends/calculator/CEdev/include/stdio.h index 27de9cc..1d35443 100644 --- a/frontends/calculator/CEdev/include/stdio.h +++ b/frontends/calculator/CEdev/include/stdio.h @@ -1,66 +1,66 @@ -#ifndef STDIO_H -#define STDIO_H - -#include <stdarg.h> -#include <format.h> -#include <fileioc.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define FILENAME_MAX 9 -#define SYS_OPEN 5 /* max open files */ -#define FOPEN_MAX 5 - -#define SEEK_CUR 1 -#define SEEK_END 2 -#define SEEK_SET 0 - -/* ANSI prototypes */ -#ifndef SIZE_T_DEFINED -#define SIZE_T_DEFINED -typedef unsigned int size_t; -#endif - -#ifndef NULL -#define NULL ((void *)0) -#endif - -#ifndef EOF -#define EOF (-1) /* end of file */ -#endif - -typedef struct __stdio_file { - unsigned char slot; -} FILE; - -extern FILE __stdio_files[FOPEN_MAX]; - -int sprintf(char *s, const char *format, ...); -int vprintf(const char *format, va_list arg); -int vsprintf(char *s, const char *format, va_list arg); - -/* stdio.h functions implemented using FILEIOC */ -int remove(const char *filename); -int fgetc(FILE *stream); -int fputc(int c, FILE *stream); -char *fgets(char *str, int num, FILE *stream); -int fputs(const char *str, FILE *stream); -size_t fread(void *ptr, size_t size, size_t count, FILE *stream); -size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); -int fseek(FILE *stream, long int offset, int origin); -long int ftell(FILE *stream); -int fclose(FILE *stream); -FILE *fopen(const char *filename, const char *mode); -int feof(FILE *stream); -#define ferror(stream) (0) -#define fflush(ignore) ((void)0) -#define rewind(stream) ti_Rewind(stream->slot) -#define fcloseall() ti_CloseAll() - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef STDIO_H
+#define STDIO_H
+
+#include <stdarg.h>
+#include <format.h>
+#include <fileioc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FILENAME_MAX 9
+#define SYS_OPEN 5 /* max open files */
+#define FOPEN_MAX 5
+
+#define SEEK_CUR 1
+#define SEEK_END 2
+#define SEEK_SET 0
+
+/* ANSI prototypes */
+#ifndef SIZE_T_DEFINED
+#define SIZE_T_DEFINED
+typedef unsigned int size_t;
+#endif
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+#ifndef EOF
+#define EOF (-1) /* end of file */
+#endif
+
+typedef struct __stdio_file {
+ unsigned char slot;
+} FILE;
+
+extern FILE __stdio_files[FOPEN_MAX];
+
+int sprintf(char *s, const char *format, ...);
+int vprintf(const char *format, va_list arg);
+int vsprintf(char *s, const char *format, va_list arg);
+
+/* stdio.h functions implemented using FILEIOC */
+int remove(const char *filename);
+int fgetc(FILE *stream);
+int fputc(int c, FILE *stream);
+char *fgets(char *str, int num, FILE *stream);
+int fputs(const char *str, FILE *stream);
+size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
+size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
+int fseek(FILE *stream, long int offset, int origin);
+long int ftell(FILE *stream);
+int fclose(FILE *stream);
+FILE *fopen(const char *filename, const char *mode);
+int feof(FILE *stream);
+#define ferror(stream) (0)
+#define fflush(ignore) ((void)0)
+#define rewind(stream) ti_Rewind(stream->slot)
+#define fcloseall() ti_CloseAll()
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/stdlib.h b/frontends/calculator/CEdev/include/stdlib.h index b45077a..cef8c10 100644 --- a/frontends/calculator/CEdev/include/stdlib.h +++ b/frontends/calculator/CEdev/include/stdlib.h @@ -1,102 +1,102 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef STDLIB_H -#define STDLIB_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - -typedef int onexit_t; - -#ifndef __cplusplus -#ifndef WCHAR_T_DEFINED -#define WCHAR_T_DEFINED -typedef unsigned short wchar_t; -#endif -#endif - -typedef struct { - int quot; - int rem; -} div_t; - -typedef struct { - long quot; - long rem; -} ldiv_t; - -/* Heap packet header for malloc */ - -typedef char __align; /* alignment type */ -union header { - struct { - union header *ptr; /* next free block */ - unsigned int size; /* size of block */ - } s; - __align x; -}; -typedef union header _HEADER; - -#define EDOM 4 /* domain error */ -#define ERANGE 5 /* range error */ -extern double _huge_val; -#define HUGE_VAL _huge_val /* overflow error */ - -#define RAND_MAX 8388607 /* maximum value returned by rand() */ - -#ifndef SIZE_T_DEFINED -#define SIZE_T_DEFINED -typedef unsigned int size_t; -#endif -#define HEADER _HEADER -#define allocp _allocp -#define NALLOC 50 - -#ifndef NULL -#define NULL ((void *)0) -#endif - -/* Dynamic memory functions */ -void *calloc(size_t, size_t); -void *malloc(size_t); -void *realloc(void *, size_t); -void free(void *); - -/* Character and string functions */ -double atof(char * nptr); -int atoi(char * nptr); -long atol(char * nptr); -double strtod(char * nptr,char ** endptr); -long strtol(char *nptr,char ** endptr,int base); -unsigned long strtoul(char *nptr,char ** endptr,int base); - -/* Random routines */ -void srand(unsigned int seed); -int rand(void); - -/* Binary search and quicksort */ -void *bsearch(void * key,void * base, size_t nmemb, size_t size, int (*compar)(void * ,void * )); -void qsort(void * base,size_t nmemb,size_t size, int (*compar)(void * ,void * )); - -/* Exit and abort */ -void abort(void); -void exit(int status); - -/* Absolutes and division */ -int abs(int j); -long labs(long j); -div_t div(int numer,int denom); -ldiv_t ldiv(long numer, long denom); - -#ifdef __cplusplus -} -#endif - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef STDLIB_H
+#define STDLIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+
+typedef int onexit_t;
+
+#ifndef __cplusplus
+#ifndef WCHAR_T_DEFINED
+#define WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#endif
+#endif
+
+typedef struct {
+ int quot;
+ int rem;
+} div_t;
+
+typedef struct {
+ long quot;
+ long rem;
+} ldiv_t;
+
+/* Heap packet header for malloc */
+
+typedef char __align; /* alignment type */
+union header {
+ struct {
+ union header *ptr; /* next free block */
+ unsigned int size; /* size of block */
+ } s;
+ __align x;
+};
+typedef union header _HEADER;
+
+#define EDOM 4 /* domain error */
+#define ERANGE 5 /* range error */
+extern double _huge_val;
+#define HUGE_VAL _huge_val /* overflow error */
+
+#define RAND_MAX 8388607 /* maximum value returned by rand() */
+
+#ifndef SIZE_T_DEFINED
+#define SIZE_T_DEFINED
+typedef unsigned int size_t;
+#endif
+#define HEADER _HEADER
+#define allocp _allocp
+#define NALLOC 50
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+/* Dynamic memory functions */
+void *calloc(size_t, size_t);
+void *malloc(size_t);
+void *realloc(void *, size_t);
+void free(void *);
+
+/* Character and string functions */
+double atof(char * nptr);
+int atoi(char * nptr);
+long atol(char * nptr);
+double strtod(char * nptr,char ** endptr);
+long strtol(char *nptr,char ** endptr,int base);
+unsigned long strtoul(char *nptr,char ** endptr,int base);
+
+/* Random routines */
+void srand(unsigned int seed);
+int rand(void);
+
+/* Binary search and quicksort */
+void *bsearch(void * key,void * base, size_t nmemb, size_t size, int (*compar)(void * ,void * ));
+void qsort(void * base,size_t nmemb,size_t size, int (*compar)(void * ,void * ));
+
+/* Exit and abort */
+void abort(void);
+void exit(int status);
+
+/* Absolutes and division */
+int abs(int j);
+long labs(long j);
+div_t div(int numer,int denom);
+ldiv_t ldiv(long numer, long denom);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/string.h b/frontends/calculator/CEdev/include/string.h index 762eef7..760cfc5 100644 --- a/frontends/calculator/CEdev/include/string.h +++ b/frontends/calculator/CEdev/include/string.h @@ -1,49 +1,49 @@ -/* - * Copyright (C) 1999-2008 by Zilog, Inc. - * All Rights Reserved - * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform - */ -#ifndef STRING_H -#define STRING_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef SIZE_T_DEFINED -#define SIZE_T_DEFINED -typedef unsigned int size_t; -#endif - -void *memcpy(void *, const void *, size_t); -void *memchr(const void *, int, size_t); -void *memset(void *, int, size_t); -void *memmove(void *, const void *, size_t); -int memcmp(const void *, const void *, size_t); - -char *strcpy(char *, const char *); -char *strncpy(char *, const char *, size_t); -char *strcat(char *, const char *); -char *strncat(char *, const char *, size_t); -char *strchr(const char *, int); -char *strpbrk(const char *, const char *); -char *strrchr(const char *, int); -char *strstr(const char *, const char *); -char *strtok(char *, const char *); -char *strerror(int errnum); -char *strdup(const char *); -char *strndup(const char *, size_t n); -size_t strcspn(const char *, const char *); -size_t strspn(const char *, const char *); -size_t strlen(const char *); -size_t strnlen(const char *, size_t); -int strcmp(const char *, const char *); -int strncmp(const char *, const char *, size_t); -int strcasecmp(const char *, const char *); -int strncasecmp(const char *, const char *, size_t); - -#ifdef __cplusplus -} -#endif - -#endif +/*
+ * Copyright (C) 1999-2008 by Zilog, Inc.
+ * All Rights Reserved
+ * Modified by Matt "MateoConLechuga" Waltz for TI84+CE platform
+ */
+#ifndef STRING_H
+#define STRING_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SIZE_T_DEFINED
+#define SIZE_T_DEFINED
+typedef unsigned int size_t;
+#endif
+
+void *memcpy(void *, const void *, size_t);
+void *memchr(const void *, int, size_t);
+void *memset(void *, int, size_t);
+void *memmove(void *, const void *, size_t);
+int memcmp(const void *, const void *, size_t);
+
+char *strcpy(char *, const char *);
+char *strncpy(char *, const char *, size_t);
+char *strcat(char *, const char *);
+char *strncat(char *, const char *, size_t);
+char *strchr(const char *, int);
+char *strpbrk(const char *, const char *);
+char *strrchr(const char *, int);
+char *strstr(const char *, const char *);
+char *strtok(char *, const char *);
+char *strerror(int errnum);
+char *strdup(const char *);
+char *strndup(const char *, size_t n);
+size_t strcspn(const char *, const char *);
+size_t strspn(const char *, const char *);
+size_t strlen(const char *);
+size_t strnlen(const char *, size_t);
+int strcmp(const char *, const char *);
+int strncmp(const char *, const char *, size_t);
+int strcasecmp(const char *, const char *);
+int strncasecmp(const char *, const char *, size_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/tice.h b/frontends/calculator/CEdev/include/tice.h index b572c79..1ace792 100644 --- a/frontends/calculator/CEdev/include/tice.h +++ b/frontends/calculator/CEdev/include/tice.h @@ -1,2082 +1,2082 @@ -/** - * @file - * @authors Matt "MateoConLechuga" Waltz - * @authors Jacob "jacobly" Young - * @brief Core CE define file - */ - -#ifndef H_TICE -#define H_TICE - -#include <stdbool.h> -#include <stdint.h> -#include <stddef.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Hardware & custom macros/functions - */ - -/** - * Returns a pseudo-random 32-bit integer. - * - * @return the random integer - */ -uint32_t random(void); - -/** - * Seeds the pseudo-random number generator used by random() and rand() with the - * value seed. - * - * @param seed the seed value - */ -void srandom(uint32_t seed); - -/** - * Returns a pseudo-random integer in the range of \p min to \p max (inclusive). - */ -#define randInt(min, max) \ -((unsigned)random() % ((max) - (min) + 1) + (min)) - -/** - * Delays for a number of milliseconds. - * <p> - * Counts time spent while interrupted. Assumes a CPU clock speed of 48MHz. - * - * @param msec number of milliseconds - */ -void delay(uint16_t msec); - -/** - * "Atomically" loads from a volatile 32-bit value. - * - * @remarks - * The hardware does not provide a mechanism to truly atomically load from a - * 32-bit value. This "atomic" load is implemented by non-atomically reading the - * value twice and retrying if the values read differ. - * - * @attention - * If the maximum period between two value changes is 1us or less (assuming a - * CPU clock speed of 48MHz), then this function may never complete. For - * instance, the counter of a timer ticking at 1MHz or more should not be read - * using this function. In such a case of a purely increasing or decreasing - * value, atomic_load_increasing_32() or atomic_load_decreasing_32() may be - * appropriate instead. - * - * @param p pointer to 32-bit value - */ -uint32_t atomic_load_32(volatile uint32_t *p); - -/** - * "Atomically" loads from a volatile, increasing 32-bit value. - * - * @remarks - * The hardware does not provide a mechanism to truly atomically load from a - * 32-bit value. This "atomic" load is implemented by temporarily disabling - * interrupts while non-atomically reading the value twice and then returning - * the lesser of the two values read. - * - * @attention - * If the minimum period between two value changes is 5us or less and the - * value's maximum rate of change over a 5us period exceeds 256 (assuming a CPU - * clock speed of 48MHz), then the value returned may be incorrect. Of relevant - * note may be the fact that a 48MHz counter does not exceed this limit. - * - * @param p pointer to 32-bit value - */ -uint32_t atomic_load_increasing_32(volatile uint32_t *p); - -/** - * "Atomically" loads from a volatile, decreasing 32-bit value. - * - * @remarks - * The hardware does not provide a mechanism to truly atomically load from a - * 32-bit value. This "atomic" load is implemented by temporarily disabling - * interrupts while non-atomically reading the value twice and then returning - * the greater of the two values read. - * - * @attention - * If the minimum period between two value changes is 5us or less and the - * value's maximum rate of change over a 5us period exceeds 256 (assuming a CPU - * clock speed of 48MHz), then the value returned may be incorrect. Of relevant - * note may be the fact that a 48MHz counter does not exceed this limit. - * - * @param p pointer to 32-bit value - */ -uint32_t atomic_load_decreasing_32(volatile uint32_t *p); - -/** - * Gets a combination of the RTC time; useful for srand() - */ -#define rtc_Time() (*(volatile uint32_t*)0xF30044) - -/* RTC definitions */ -#define RTC_UNFREEZE (1<<7) -#define RTC_FREEZE (0<<7) -#define RTC_LOAD (1<<6) -#define RTC_ENABLE ((1<<0)|(RTC_UNFREEZE)) -#define RTC_DISABLE (0<<0) - -/* RTC registers */ -#define rtc_Seconds (*(volatile uint8_t*)0xF30000) -#define rtc_Minutes (*(volatile uint8_t*)0xF30004) -#define rtc_Hours (*(volatile uint8_t*)0xF30008) -#define rtc_Days (*(volatile uint16_t*)0xF3000C) -#define rtc_AlarmSeconds (*(uint8_t*)0xF30010) -#define rtc_AlarmMinutes (*(uint8_t*)0xF30014) -#define rtc_AlarmHours (*(uint8_t*)0xF30018) -#define rtc_Control (*(uint8_t*)0xF30020) -#define rtc_LoadSeconds (*(uint8_t*)0xF30024) -#define rtc_LoadMinutes (*(uint8_t*)0xF30028) -#define rtc_LoadHours (*(uint8_t*)0xF3002C) -#define rtc_LoadDays (*(uint16_t*)0xF30030) -#define rtc_IntStatus (*(volatile uint8_t*)0xF30034) -#define rtc_IntAcknowledge (*(volatile uint8_t*)0xF30034) -#define rtc_IsBusy() (rtc_Control & RTC_LOAD) - -/* RTC interrupt masks */ -#define RTC_ALARM_INT_SOURCE (1<<5) -#define RTC_DAY_INT_SOURCE (1<<4) -#define RTC_HR_INT_SOURCE (1<<3) -#define RTC_MIN_INT_SOURCE (1<<2) -#define RTC_SEC_INT_SOURCE (1<<1) - -/* RTC interrupt statuses */ -#define RTC_LOAD_INT (1<<5) -#define RTC_ALARM_INT (1<<4) -#define RTC_DAY_INT (1<<3) -#define RTC_HR_INT (1<<2) -#define RTC_MIN_INT (1<<1) -#define RTC_SEC_INT (1<<0) -#define RTC_INT_MASK (RTC_SEC_INT | RTC_MIN_INT | RTC_HR_INT | RTC_DAY_INT | RTC_ALARM_INT | RTC_LOAD_INT) - -/* Whole bunch of useful timer functions */ -#define TIMER1_ENABLE (1<<0) /* Enables Timer 1 */ -#define TIMER1_DISABLE (0<<0) /* Disables Timer 1 */ -#define TIMER1_32K (1<<1) /* Use the 32K clock for timer 1 */ -#define TIMER1_CPU (0<<1) /* Use the CPU clock rate for timer 1 */ -#define TIMER1_0INT (1<<2) /* Enable an interrupt when 0 is reached for the timer 1 */ -#define TIMER1_NOINT (0<<2) /* Disable interrupts for the timer 1 */ -#define TIMER1_UP (1<<9) /* Timer 1 counts up */ -#define TIMER1_DOWN (0<<9) /* Timer 1 counts down */ - -#define TIMER2_ENABLE (1<<3) /* Enables Timer 2 */ -#define TIMER2_DISABLE (0<<3) /* Disables Timer 2 */ -#define TIMER2_32K (1<<4) /* Use the 32K clock for timer 2 */ -#define TIMER2_CPU (0<<4) /* Use the CPU clock rate for timer 2 */ -#define TIMER2_0INT (1<<5) /* Enable an interrupt when 0 is reached for the timer 2 */ -#define TIMER2_NOINT (0<<5) /* Disable interrupts for the timer 2 */ -#define TIMER2_UP (1<<10) /* Timer 2 counts up */ -#define TIMER2_DOWN (0<<10) /* Timer 2 counts down */ - -#define TIMER3_ENABLE (1<<6) /* Enables Timer 3 */ -#define TIMER3_DISABLE (0<<6) /* Disables Timer 3 */ -#define TIMER3_32K (1<<7) /* Use the 32K clock for timer 3 */ -#define TIMER3_CPU (0<<7) /* Use the CPU clock rate for timer 3 */ -#define TIMER3_0INT (1<<8) /* Enable an interrupt when 0 is reached for the timer 3 */ -#define TIMER3_NOINT (0<<8) /* Disable interrupts for the timer 3 */ -#define TIMER3_UP (1<<11) /* Timer 3 counts up */ -#define TIMER3_DOWN (0<<11) /* Timer 3 counts down */ - -/* These defines can be used to check the status of the timer */ -#define TIMER1_MATCH1 (1<<0) /* Timer 1 hit the first match value */ -#define TIMER1_MATCH2 (1<<1) /* Timer 1 hit the second match value */ -#define TIMER1_RELOADED (1<<2) /* Timer 1 was reloaded (Needs TIMER1_0INT enabled) */ - -#define TIMER2_MATCH1 (1<<3) /* Timer 2 hit the first match value */ -#define TIMER2_MATCH2 (1<<4) /* Timer 2 hit the second match value */ -#define TIMER2_RELOADED (1<<5) /* Timer 2 was reloaded (Needs TIMER2_0INT enabled) */ - -#define TIMER3_MATCH1 (1<<6) /* Timer 3 hit the first match value */ -#define TIMER3_MATCH2 (1<<7) /* Timer 3 hit the second match value */ -#define TIMER3_RELOADED (1<<8) /* Timer 3 was reloaded (Needs TIMER3_0INT enabled) */ - -/* Timer registers */ -#define timer_1_Counter (*(volatile uint32_t*)0xF20000) -#define timer_1_ReloadValue (*(uint32_t*)0xF20004) -#define timer_1_MatchValue_1 (*(uint32_t*)0xF20008) -#define timer_1_MatchValue_2 (*(uint32_t*)0xF2000C) -#define timer_2_Counter (*(volatile uint32_t*)0xF20010) -#define timer_2_ReloadValue (*(uint32_t*)0xF20014) -#define timer_2_MatchValue_1 (*(uint32_t*)0xF20018) -#define timer_2_MatchValue_2 (*(uint32_t*)0xF2001C) -#define timer_3_Counter (*(volatile uint32_t*)0xF20020) -#define timer_3_ReloadValue (*(uint32_t*)0xF20024) -#define timer_3_MatchValue_1 (*(uint32_t*)0xF20028) -#define timer_3_MatchValue_2 (*(uint32_t*)0xF2002C) -#define timer_Control (*(uint16_t*)0xF20030) -#define timer_IntStatus (*(volatile uint16_t*)0xF20034) -#define timer_IntAcknowledge (*(volatile uint16_t*)0xF20034) -#define timer_EnableInt (*(uint16_t*)0xF20038) - -/* LCD defines */ -#define lcd_BacklightLevel (*(uint8_t*)0xF60024) -#define lcd_Timing0 (*(uint32_t*)0xE30000) -#define lcd_Timing1 (*(uint32_t*)0xE30004) -#define lcd_Timing2 (*(uint32_t*)0xE30008) -#define lcd_Timing3 (*(uint24_t*)0xE3000C) -#define lcd_UpBase (*(uint32_t*)0xE30010) -#define lcd_LpBase (*(uint32_t*)0xE30014) -#define lcd_Control (*(uint24_t*)0xE30018) -#define lcd_EnableInt (*(uint8_t*)0xE3001C) -#define lcd_IntStatus (*(uint8_t*)0xE30020) -#define lcd_IntStatusMasked (*(uint8_t*)0xE30024) -#define lcd_IntAcknowledge (*(volatile uint8_t*)0xE30028) -#define lcd_UpBaseCurr (*(volatile uint32_t*)0xE3002C) -#define lcd_LpBaseCurr (*(volatile uint32_t*)0xE30030) -#define lcd_Palette ((uint16_t*)0xE30200) -#define lcd_Ram ((uint16_t*)0xD40000) - -/** - * Width of LCD in pixels - */ -#define LCD_WIDTH \ -(320) - -/** - * Height of LCD in pixels - */ -#define LCD_HEIGHT \ -(240) - -/** - * Total number of pixels in LCD - */ -#define LCD_SIZE \ -(LCD_WIDTH*LCD_HEIGHT*2) - -/** - * @brief Structure of real variable type - */ -typedef struct { int8_t sign, exp; uint8_t mant[7]; } real_t; -/** - * @brief Structure of complex variable type - */ -typedef struct { real_t real, imag; } cplx_t; -/** - * @brief Structure of list variable type - */ -typedef struct { uint16_t dim; real_t items[1]; } list_t; -/** - * @brief Structure of complex list variable type - */ -typedef struct { uint16_t dim; cplx_t items[1]; } cplx_list_t; -/** - * @brief Structure of matrix variable type - */ -typedef struct { uint8_t cols, rows; real_t items[1]; } matrix_t; -/** - * @brief Structure of string variable type - */ -typedef struct { uint16_t len; char data[1]; } string_t; -/** - * @brief Structure of equation variable type - */ -typedef struct { uint16_t len; char data[1]; } equ_t; -/** - * @brief Structure of miscellaneous variable type - */ -typedef struct { uint16_t size; uint8_t data[1]; } var_t; - -/** - * Gets an element from a matrix - * - * @param matrix Structure of matrix - * @param row Row in matrix - * @param col Column in matrix - * @returns real_t containing element data - */ -#define matrix_element(matrix, row, col) ((matrix)->items[(row)+(col)*(matrix)->rows]) - -/** - * Resets the OS homescreen; accounts for split screen - */ -#define os_ClrHome() do { _OS(asm_ClrLCD); _OS(asm_HomeUp); _OS(asm_DrawStatusBar); } while (0) - -/** - * Resets the OS homescreen fully - */ -#define os_ClrHomeFull() do { _OS(asm_ClrLCDFull); _OS(asm_HomeUp); _OS(asm_DrawStatusBar); } while (0) - -/* - * Bootcode functions - */ - -/** - * Sets the calculator's date - * - * Performs checks to ensure date is within range - * @param day Day to set - * @param month Month to set - * @param year Year to set - */ -void boot_SetDate(uint8_t day, uint8_t month, uint16_t year); - -/** - * Gets the calculator's date - * - * @param day Pointer to variable to store day - * @param month Pointer to variable to store month - * @param year Pointer to variable to store year - */ -void boot_GetDate(uint8_t *day, uint8_t *month, uint16_t *year); - -/** - * Sets the calculator's time - * - * Performs checks to ensure time is within range - * @param seconds Seconds to set - * @param minutes Minutes to set - * @param hours Hours to set - */ -void boot_SetTime(uint8_t seconds, uint8_t minutes, uint8_t hours); - -/** - * Gets the calculator's time - * - * @param seconds Pointer to variable to store seconds - * @param minutes Pointer to variable to store minutes - * @param hours Pointer to variable to store hours - */ -void boot_GetTime(uint8_t *seconds, uint8_t *minutes, uint8_t *hours); - -/** - * Checks if past noon - * - * @returns True if past noon - */ -bool boot_IsAfterNoon(void); - -/** - * @returns Bootcode version major - */ -uint8_t boot_GetBootMajorVer(void); - -/** - * @returns Bootcode version minor - */ -uint8_t boot_GetBootMinorVer(void); - -/** - * @returns Hardware version - */ -uint8_t boot_GetHardwareVer(void); - -/** - * Turns all of VRAM into 0xFF (white) - */ -void boot_ClearVRAM(void); - -/** - * Checks if the [on] key was pressed - * - * @returns True is returned if [on] key was pressed - */ -bool boot_CheckOnPressed(void); - -/** - * Basically a reimplemented form of printf that prints to some debugging device - * - * @param string String to send to debug device - */ -void boot_DebugPrintf(const char *string); - -/** - * Turns off the calculator (probably not a good idea to use) - */ -void boot_TurnOff(void); - -/** - * Inserts a new line at the current cursor posistion on the homescreen - * Does not scroll. - */ -void boot_NewLine(void); - -/** - * @returns Current battery status - */ -uint8_t boot_GetBatteryStatus(void); - -/** - * Waits for ~10 ms - */ -void boot_WaitShort(void); - -/* - * OS Routines - */ - -/** - * Inserts a new line at the current cursor posistion on the homescreen - * Does scroll. - */ -void os_NewLine(void); - -/** - * Disables the OS cursor - */ -void os_DisableCursor(void); - -/** - * Enables the OS cursor - */ -void os_EnableCursor(void); - -/** - * Sets the foreground color used to draw text on the graphscreen - * @param color 565 BGR color to set text foreground to - */ -void os_SetDrawFGColor(uint24_t color); - -/** - * Gets the foreground color used to draw text on the graphscreen - * @returns 565 BGR color of text foreground - */ -uint24_t os_GetDrawFGColor(void); - -/** - * Sets the background color used to draw text on the graphscreen - * @param color 565 BGR color to set text background to - */ -void os_SetDrawBGColor(uint24_t color); - -/** - * Gets the background color used to draw text on the graphscreen - * - * @returns 565 BGR color of text nackground - * @warning Only useable in OS 5.2 and above; use at your own risk - */ -uint24_t os_GetDrawBGColor(void); - -/** - * Set the cursor posistion used on the homescreen - * - * @param curRow The row aligned offset - * @param curCol The column aligned offset - */ -void os_SetCursorPos(uint8_t curRow, uint8_t curCol); - -/** - * Gets the cursor posistion used on the homescreen - * - * @param curRow Pointer to store the row aligned offset - * @param curCol Pointer to store the column aligned offset - */ -void os_GetCursorPos(unsigned int *curRow, unsigned int *curCol); - -/** - * Selects the font to use when drawing on the graphscreen - * - * @param id - * 0: small font <br> - * 1: large monospace font - */ -void os_FontSelect(char id); - -/** - * Gets the font to use when drawing on the graphscreen - * - * @returns - * 0: small font <br> - * 1: large monospace font - */ -uint24_t os_FontGetID(void); - -/** - * @param string String to get pixel width of - * @returns The width of a string in the variable-width format - */ -uint24_t os_FontGetWidth(const char *string); - -/** - * @returns The height of the font characters - */ -uint24_t os_FontGetHeight(void); - -/** - * Draws text using the small font to the screen - * - * @param string String to draw - * @param col Column to start drawing at - * @param row Row to start drawing at - * @returns The end column - */ -uint24_t os_FontDrawText(const char *string, uint16_t col, uint8_t row); - -/** - * Draws transparent text using the small font to the screen - * - * @param string String to draw - * @param col Column to start drawing at - * @param row Row to start drawing at - * @returns The end column - */ -uint24_t os_FontDrawTransText(const char *string, uint16_t col, uint8_t row); - -/** - * Puts some text at the current homescreen cursor location - * - * @param string Test to put on homescreen - * @returns 1 if string fits on screen, 0 otherwise - */ -uint24_t os_PutStrFull(const char *string); - -/** - * Puts some text at the current homescreen cursor location - * - * @param string Test to put on homescreen - * @returns 1 if string fits on line, 0 otherwise - */ -uint24_t os_PutStrLine(const char *string); - -/** - * Set a particular flag variable - * - * @param offset Offset to particular flag in list - * @param set Bitmask of flag to set - */ -void os_SetFlagByte(int offset, uint8_t set); - -/** - * Get a particular flag variable - * - * @param offset Offset to particular flag in list - * @returns Bitmask of flag - */ -uint8_t os_GetFlagByte(int offset); - -/** - * Get amount of free ram in order to allocate extra ram - * - * @param free Set to start of free available ram - * @returns Size of available ram - */ -size_t os_MemChk(void **free); - -/** - * Throws an OS error - * - * @param error Error code to throw - */ -void os_ThrowError(uint8_t error); - -/** - * Gets a pointer to the system stats - * - * @returns - * [3] - Hardware version <br> - * [12-13] - Boot Version Major <br> - * [14] - Boot Version Minor <br> - * [15-16] - Boot Version Build <br> - * [28-37] - Calc ID (From certificate if exists) <br> - * [38-39] - Appears to be localization language - */ -void *os_GetSystemStats(void); - -/** - * This function can return twice (like setjmp). - * First return always happens with a return value of 0. - * Second return only happens if an error occurs before os_PopErrorHandler is called, - * with the errNo as the return value. - * - * @code - * int errno = os_PushErrorHandler(); - * if (errno) { - * // handle error, but no longer under the protection of the error handler so do not call os_PopErrorHandler() - * } else { - * // run some code that may error - * os_PopErrorHandler(); - * } - * @endcode - * - * @param routine Error handling routine - * @see os_PopErrorHandler - */ -int os_PushErrorHandler(void); - -/** - * Restores stack state after a call to os_PushErrorHandler. Must be called with stack in the same state - * as it was when os_PushErrorHandler returned with 0, and should not be called along the error path. - * - * @see os_PushErrorHandler - */ -void os_PopErrorHandler(void); - -/** - * @returns A pointer to symtable of the OS - */ -void *os_GetSymTablePtr(void); - -/** - * Creates an AppVar - * - * @param name Pointer to name of AppVar to create - * @param size Size of AppVar to create - * @returns A pointer to the AppVar data - * @note Returns NULL if creation failed for some reason, otherwise a pointer to the size bytes - */ -var_t *os_CreateAppVar(const char *name, uint16_t size); - -/** - * Returns next entry or NULL if no more entries, pass os_GetSymTablePtr() as first entry - */ -void *os_NextSymEntry(void *entry, uint24_t *type, uint24_t *nameLength, char *name, void **data); - -/** - * Locates a symbol in the symtable - * - * @param type Type of symbol to find - * @param name Pointer to name of symbol to find - * @param entry Can be NULL if you don't care - * @param data Can be NULL if you don't care - * @returns If file exists, returns 1 and sets entry and data, otherwise returns 0. - */ -int os_ChkFindSym(uint8_t type, const char *name, void **entry, void **data); - -/** - * Gets the Ans variable - * - * @param type This is set to the current variable type in ANS - * @returns Pointer to the data - * @note Returns NULL if Ans doesn't exist or type is NULL - */ -void *os_RclAns(uint8_t *type); - -/** - * Copies a real_t type - * - * @param src Pointer to original real_t - * @returns Copied real_t - */ -real_t os_RealCopy(const real_t *src); - -/* Unary operations used to interact with the OS math functions */ -real_t os_RealAcosRad(const real_t *arg); -real_t os_RealAsinRad(const real_t *arg); -real_t os_RealAtanRad(const real_t *arg); -real_t os_RealCosRad(const real_t *arg); -real_t os_RealRadToDeg(const real_t *arg); -real_t os_RealExp(const real_t *arg); -real_t os_RealFloor(const real_t *arg); -real_t os_RealFrac(const real_t *arg); -real_t os_RealRoundInt(const real_t *arg); -real_t os_RealLog(const real_t *arg); -real_t os_RealNeg(const real_t *arg); -real_t os_RealDegToRad(const real_t *arg); -real_t os_RealInv(const real_t *arg); -real_t os_RealSinRad(const real_t *arg); -real_t os_RealSqrt(const real_t *arg); -real_t os_RealTanRad(const real_t *arg); -real_t os_RealInt(const real_t *arg); -cplx_t os_CplxSquare(const cplx_t *arg); - -/* Binary operations used to interact with the OS math functions */ -real_t os_RealAdd(const real_t *arg1, const real_t *arg2); -real_t os_RealDiv(const real_t *arg1, const real_t *arg2); -real_t os_RealGcd(const real_t *arg1, const real_t *arg2); -real_t os_RealLcm(const real_t *arg1, const real_t *arg2); -real_t os_RealMax(const real_t *arg1, const real_t *arg2); -real_t os_RealMin(const real_t *arg1, const real_t *arg2); -real_t os_RealMul(const real_t *arg1, const real_t *arg2); -real_t os_RealNcr(const real_t *total, const real_t *num); -real_t os_RealNpr(const real_t *total, const real_t *num); -real_t os_RealPow(const real_t *base, const real_t *exp); -real_t os_RealRandInt(const real_t *min, const real_t *max); -real_t os_RealMod(const real_t *arg1, const real_t *arg2); -real_t os_RealSub(const real_t *arg1, const real_t *arg2); - -/** - * Rounds a real_t - * - * @note digits must be in the range 0 - 9 - */ -real_t os_RealRound(const real_t *arg, char digits); - -/** - * Compares two real_t - * - * @returns -1, 0, or 1 depending on the comparison - */ -int os_RealCompare(const real_t *arg1, const real_t *arg2); - -/** - * Converts a real_t to an integer - * @note Saturates on overflow - */ -int24_t os_RealToInt24(const real_t *arg); - -/** - * Converts an integer to a real_t - * @note Saturates on overflow - */ -real_t os_Int24ToReal(int24_t arg); - -/** - * Converts a real_t to a float - * @note Saturates on overflow - */ -float os_RealToFloat(const real_t *arg); - -/** - * Converts an float to a real_t - * @note Saturates on overflow - */ -real_t os_FloatToReal(float arg); - -/** This converts a ti-float to a ti-ascii string. - * - * @param result Zero terminated string copied to this address - * @param arg Real to convert - * @param maxLength - * <=0: use default max length (14) <br> - * >0: max length of result, minimum of 6 - * @param mode: - * 0: Use current mode for everything (digits ignored) <br> - * 1: Normal mode <br> - * 2: Sci mode <br> - * 3: Eng mode <br> - * >4: Use current Normal/Sci/Eng mode (digits still used) <br> - * @param digits - * -1: Float mode <br> - * 0-9: Fix # mode <br> - * @returns Length of result - */ -int os_RealToStr(char *result, const real_t *arg, int8_t maxLength, uint8_t mode, int8_t digits); - -/** - * This converts a ti-ascii string to a ti-float. - * - * String format regexp: / *[-\032+]?[0-9]*(\.[0-9]*)?([eE\033][-\032+]?[0-9]*)?/ - * @param string TI-ascii string to convert - * @param end If non-null, pointer to end of parsed number is stored here - * @returns resulting TI-float; on exponent overflow this is +-9.9999999999999e99 - */ -real_t os_StrToReal(const char *string, char **end); - -/** - * High 8 is unsigned offset, low 8 is bits to test - */ -int os_TestFlagBits(uint16_t offset_pattern); -void os_SetFlagBits(int16_t offset_pattern); -void os_ResetFlagBits(int16_t offset_pattern); - -/** - * Custom implementation input routine for use in conjunction with the TIOS. - * It is HIGHLY recommended you implement your own routine, this routine has - * some quirks. It is good enough for getting basic input however. - * - * @param string Input prompt string to be displayed to the user - * @param buf Storage location to store input string - * @param bufsize Available storage size for input string. -1 for null termination. - * @returns None - */ -void os_GetStringInput(char *string, char *buf, size_t bufsize); - -/** - * Gets a key from the OS - * - * @returns Key code - * @returns Extended key code in high byte - */ -uint16_t os_GetKey(void); - -/** - * Disable text buffering on the homescreen. C programs use this area by default for the BSS / Heap. - */ -void os_DisableHomeTextBuffer(void); - -/** - * Enables text buffering on the homescreen. C programs use this area by default for the BSS / Heap. - */ -void os_EnableHomeTextBuffer(void); - -/** - * @brief Scan code type - */ -typedef uint8_t sk_key_t; - -/** - * Performs an OS call to get the keypad scan code - * - * You can also use this function to get input from the user as a string like this: - * @code - * const char *chars = "\0\0\0\0\0\0\0\0\0\0\"WRMH\0\0?[VQLG\0\0:ZUPKFC\0 YTOJEB\0\0XSNIDA\0\0\0\0\0\0\0\0"; - * uint8_t key, i = 0; - * char buffer[50]; - * - * while((key = os_GetCSC()) != sk_Enter) { - * if(chars[key]) { - * buffer[i++] = chars[key]; - * } - * } - * @endcode - * Feel free to modify the string to suit your needs. - * @returns Key scan code - */ -sk_key_t os_GetCSC(void); - -/** - * Runs the calulator at 6 MHz - */ -void boot_Set6MHzMode(void); - -/** - * Runs the calulator at 48 MHz - */ -void boot_Set48MHzMode(void); - -/** - * Runs the calulator at 6 MHz (saves interrupt status) - */ -void boot_Set6MHzModeI(void); - -/** - * Runs the calulator at 48 MHz (saves interrupt status) - */ -void boot_Set48MHzModeI(void); - -/** - * Executes the assembly routine _ForceCmdNoChar - */ -void os_ForceCmdNoChar(void); - -/** - * Use this function to call assembly functions in the OS and Bootcode - * i.e. _OS( asm_ArcChk ); - */ -void _OS(void (*function)(void)); - -/** - * Assembly routine to scroll homescreen up - */ -void asm_MoveUp(void); - -/** - * Assembly routine to scroll homescreen down - */ -void asm_MoveDown(void); - -/** - * Assembly routine to move row and column posistion to (0,0) - */ -void asm_HomeUp(void); - -/** - * Assembly routine to turn on the Run Indicator - */ -void asm_RunIndicOn(void); - -/** - * Assembly routine to turn off the Run Indicator - */ -void asm_RunIndicOff(void); - -/** - * Assembly routine to turn off APD - */ -void asm_DisableAPD(void); - -/** - * Assembly routine to turn on APD - */ -void asm_EnableAPD(void); - -/** - * Assembly routine checks the amount of free archive - */ -void asm_ArcChk(void); - -/** - * Assembly routine to clear the homescreen lcd - */ -void asm_ClrLCDFull(void); - -/** - * Assembly routine to clear the homescreen lcd. - * Accounts for split screen - */ -void asm_ClrLCD(void); - -/** - * Assembly routine to redraw the status bar - */ -void asm_DrawStatusBar(void); - -/** - * Invalidate and clear stat variables - */ -void asm_DelRes(void); - -/** - * Invalidate and clear text shadow area - */ -void asm_ClrTxtShd(void); - -/** - * Colors used by the OS - */ -typedef enum { - OS_COLOR_BLUE = 10, - OS_COLOR_RED, - OS_COLOR_BLACK, - OS_COLOR_MAGENTA, - OS_COLOR_GREEN, - OS_COLOR_ORANGE, - OS_COLOR_BROWN, - OS_COLOR_NAVY, - OS_COLOR_LTBLUE, - OS_COLOR_YELLOW, - OS_COLOR_WHITE, - OS_COLOR_LTGRAY, - OS_COLOR_MEDGRAY, - OS_COLOR_GRAY, - OS_COLOR_DARKGRAY -} os_colors_t; - -#define os_RamStart ((uint8_t*)0xD00000) -#define os_Flags ((uint8_t*)0xD00080) -#define os_TextFlags (*(uint8_t*)0xD00080) -#define os_ApdFlags (*(uint8_t*)0xD00088) -#define os_RclFlags (*(uint8_t*)0xD0008E) - -#define os_AppData ((uint8_t*)0xD00429) - -#define os_KbdScanCode (*(uint8_t*)0xD00587) -#define os_KbdLGSC (*(uint8_t*)0xD00588) -#define os_KbdPSC (*(uint8_t*)0xD00589) -#define os_KbdWUR (*(uint8_t*)0xD0058A) -#define os_KbdDebncCnt (*(uint8_t*)0xD0058B) -#define os_KbdKey (*(uint8_t*)0xD0058C) -#define os_KbdGetKy (*(uint8_t*)0xD0058D) -#define os_KeyExtend (*(uint8_t*)0xD0058E) -#define os_Brightness (*(uint8_t*)0xD0058F) -#define os_ApdSubTimer (*(uint8_t*)0xD00590) -#define os_ApdTimer (*(uint8_t*)0xD00591) -#define os_CurRow (*(uint8_t*)0xD00595) -#define os_CurCol (*(uint8_t*)0xD00596) - -#define os_OP1 ((uint8_t*)0xD005F8) -#define os_OP2 ((uint8_t*)0xD00603) -#define os_OP3 ((uint8_t*)0xD0060E) -#define os_OP4 ((uint8_t*)0xD00619) -#define os_OP5 ((uint8_t*)0xD00624) -#define os_OP6 ((uint8_t*)0xD0062F) -#define os_OP7 ((uint8_t*)0xD0063A) - -#define os_ProgToEdit ((char*)0xD0065B) -#define os_NameBuff ((char*)0xD00663) - -#define os_TextShadow ((uint8_t*)0xD006C0) /**< Text buffer 260 bytes */ - -#define os_PromptRow (*(uint8_t*)0xD00800) -#define os_PromptCol (*(uint8_t*)0xD00801) -#define os_PromptIns (*(uint8_t*)0xD00802) -#define os_PromptShift (*(uint8_t*)0xD00803) -#define os_PromptRet (*(uint8_t*)0xD00804) -#define os_PromptValid (*(uint8_t*)0xD00807) - -#define os_PenCol (*(uint24_t*)0xD008D2) /**< Small font column location */ -#define os_PenRow (*(uint8_t*)0xD008D5) /**< Small font row location */ - -#define os_StatVars ((uint8_t*)0xD01191) -#define os_AsmPrgmSize (*(uint16_t*)0xD0118C) /**< Current size of executing program */ - -#define os_uXMin (*(real_t*)0xD01D61) -#define os_uXMax (*(real_t*)0xD01D6A) -#define os_uXScl (*(real_t*)0xD01D73) -#define os_uYMin (*(real_t*)0xD01D7C) -#define os_uYMax (*(real_t*)0xD01D85) -#define os_uYScl (*(real_t*)0xD01D8E) -#define os_uThetaMin (*(real_t*)0xD01D97) -#define os_uThetaMax (*(real_t*)0xD01DA0) -#define os_uThetaStep (*(real_t*)0xD01DA9) -#define os_uTmin (*(real_t*)0xD01DB2) -#define os_uTmax (*(real_t*)0xD01DBB) -#define os_uTStep (*(real_t*)0xD01DC4) -#define os_uPlotStart (*(real_t*)0xD01DCD) -#define os_unMax (*(real_t*)0xD01DD6) -#define os_uu0 (*(real_t*)0xD01DDF) -#define os_uv0 (*(real_t*)0xD01DE8) -#define os_unMin (*(real_t*)0xD01DF1) -#define os_uu02 (*(real_t*)0xD01DFA) -#define os_uv02 (*(real_t*)0xD01E03) -#define os_uw0 (*(real_t*)0xD01E0C) -#define os_uPlotStep (*(real_t*)0xD01E15) -#define os_uXres (*(real_t*)0xD01E1E) -#define os_uw02 (*(real_t*)0xD01E27) -#define os_XMin (*(real_t*)0xD01E33) -#define os_XMax (*(real_t*)0xD01E3C) -#define os_XScl (*(real_t*)0xD01E45) -#define os_YMin (*(real_t*)0xD01E4E) -#define os_YMax (*(real_t*)0xD01E57) -#define os_YScl (*(real_t*)0xD01E60) -#define os_ThetaMin (*(real_t*)0xD01E69) -#define os_ThetaMax (*(real_t*)0xD01E72) -#define os_ThetaStep (*(real_t*)0xD01E7B) -#define os_TMinPar (*(real_t*)0xD01E84) -#define os_TMaxPar (*(real_t*)0xD01E8D) -#define os_TStep (*(real_t*)0xD01E96) -#define os_PlotStart (*(real_t*)0xD01E9F) -#define os_NMax (*(real_t*)0xD01EA8) -#define os_u0 (*(real_t*)0xD01EB1) -#define os_V0 (*(real_t*)0xD01EBA) -#define os_NMin (*(real_t*)0xD01EC3) -#define os_u02 (*(real_t*)0xD01ECC) -#define os_V02 (*(real_t*)0xD01ED5) -#define os_W0 (*(real_t*)0xD01EDE) -#define os_PlotStep (*(real_t*)0xD01EE7) -#define os_XResO (*(real_t*)0xD01EF0) -#define os_W02 (*(real_t*)0xD01EF9) -#define os_un1 (*(real_t*)0xD01F02) -#define os_un2 (*(real_t*)0xD01F0B) -#define os_Vn1 (*(real_t*)0xD01F14) -#define os_Vn2 (*(real_t*)0xD01F1D) -#define os_Wn1 (*(real_t*)0xD01F26) -#define os_Wn2 (*(real_t*)0xD01F2F) -#define os_Fin_N (*(real_t*)0xD01F38) -#define os_Fin_I (*(real_t*)0xD01F41) -#define os_Fin_PV (*(real_t*)0xD01F4A) -#define os_Fin_PMT (*(real_t*)0xD01F53) -#define os_Fin_FV (*(real_t*)0xD01F5C) -#define os_Fin_PY (*(real_t*)0xD01F65) -#define os_Fin_CY (*(real_t*)0xD01F6E) -#define os_Cal_N (*(real_t*)0xD01F77) -#define os_Cal_I (*(real_t*)0xD01F80) -#define os_Cal_PV (*(real_t*)0xD01F89) -#define os_Cal_PMT (*(real_t*)0xD01F92) -#define os_Cal_FV (*(real_t*)0xD01F9B) -#define os_Cal_PY (*(real_t*)0xD01FA4) - -#define os_CmdShadow ((uint8_t*)0xD0232D) - -#define os_Y1LineType (*(uint8_t*)0xD024BF) -#define os_Y2LineType (*(uint8_t*)0xD024C0) -#define os_Y3LineType (*(uint8_t*)0xD024C1) -#define os_Y4LineType (*(uint8_t*)0xD024C2) -#define os_Y5LineType (*(uint8_t*)0xD024C3) -#define os_Y6LineType (*(uint8_t*)0xD024C4) -#define os_Y7LineType (*(uint8_t*)0xD024C5) -#define os_Y8LineType (*(uint8_t*)0xD024C6) -#define os_Y9LineType (*(uint8_t*)0xD024C7) -#define os_Y0LineType (*(uint8_t*)0xD024C8) -#define os_Para1LineType (*(uint8_t*)0xD024C9) -#define os_Para2LineType (*(uint8_t*)0xD024CA) -#define os_Para3LineType (*(uint8_t*)0xD024CB) -#define os_Para4LineType (*(uint8_t*)0xD024CC) -#define os_Para5LineType (*(uint8_t*)0xD024CD) -#define os_Para6LineType (*(uint8_t*)0xD024CE) -#define os_Polar1LineType (*(uint8_t*)0xD024CF) -#define os_Polar2LineType (*(uint8_t*)0xD024D0) -#define os_Polar3LineType (*(uint8_t*)0xD024D1) -#define os_Polar4LineType (*(uint8_t*)0xD024D2) -#define os_Polar5LineType (*(uint8_t*)0xD024D3) -#define os_Polar6LineType (*(uint8_t*)0xD024D4) -#define os_SecULineType (*(uint8_t*)0xD024D5) -#define os_SecVLineType (*(uint8_t*)0xD024D6) -#define os_SecWLineType (*(uint8_t*)0xD024D7) -#define os_Y1LineColor (*(uint8_t*)0xD024D8) -#define os_Y2LineColor (*(uint8_t*)0xD024D9) -#define os_Y3LineColor (*(uint8_t*)0xD024DA) -#define os_Y4LineColor (*(uint8_t*)0xD024DB) -#define os_Y5LineColor (*(uint8_t*)0xD024DC) -#define os_Y6LineColor (*(uint8_t*)0xD024DD) -#define os_Y7LineColor (*(uint8_t*)0xD024DE) -#define os_Y8LineColor (*(uint8_t*)0xD024DF) -#define os_Y9LineColor (*(uint8_t*)0xD024E0) -#define os_Y0LineColor (*(uint8_t*)0xD024E1) -#define os_Para1LineColor (*(uint8_t*)0xD024E2) -#define os_Para2LineColor (*(uint8_t*)0xD024E3) -#define os_Para3LineColor (*(uint8_t*)0xD024E4) -#define os_Para4LineColor (*(uint8_t*)0xD024E5) -#define os_Para5LineColor (*(uint8_t*)0xD024E6) -#define os_Para6LineColor (*(uint8_t*)0xD024E7) -#define os_Polar1LineColor (*(uint8_t*)0xD024E8) -#define os_Polar2LineColor (*(uint8_t*)0xD024E9) -#define os_Polar3LineColor (*(uint8_t*)0xD024EA) -#define os_Polar4LineColor (*(uint8_t*)0xD024EB) -#define os_Polar5LineColor (*(uint8_t*)0xD024EC) -#define os_Polar6LineColor (*(uint8_t*)0xD024ED) -#define os_SecULineColor (*(uint8_t*)0xD024EE) -#define os_SecVLineColor (*(uint8_t*)0xD024EF) -#define os_SecWLineColor (*(uint8_t*)0xD024F0) - -#define os_AppErr1 ((char*)0xD025A9) /**< String [1] for custom error */ -#define os_AppErr2 ((char*)0xD025B6) /**< String [2] for custom error */ - -#define os_CursorHookPtr (*(uint24_t*)0xD025D5) -#define os_LibraryHookPtr (*(uint24_t*)0xD025D8) -#define os_RawKeyHookPtr (*(uint24_t*)0xD025DB) -#define os_GetKeyHookPtr (*(uint24_t*)0xD025DE) -#define os_HomescreenHookPtr (*(uint24_t*)0xD025E1) -#define os_WindowHookPtr (*(uint24_t*)0xD025E4) -#define os_GraphHookPtr (*(uint24_t*)0xD025E7) -#define os_YEqualsHookPtr (*(uint24_t*)0xD025EA) -#define os_FontHookPtr (*(uint24_t*)0xD025ED) -#define os_RegraphHookPtr (*(uint24_t*)0xD025F0) -#define os_GraphicsHookPtr (*(uint24_t*)0xD025F3) -#define os_TraceHookPtr (*(uint24_t*)0xD025F6) -#define os_ParserHookPtr (*(uint24_t*)0xD025F9) -#define os_AppChangeHookPtr (*(uint24_t*)0xD025FC) -#define os_Catalog1HookPtr (*(uint24_t*)0xD025FF) -#define os_HelpHookPtr (*(uint24_t*)0xD02602) -#define os_CxRedispHookPtr (*(uint24_t*)0xD02605) -#define os_MenuHookPtr (*(uint24_t*)0xD02608) -#define os_Catalog2HookPtr (*(uint24_t*)0xD0260B) -#define os_TokenHookPtr (*(uint24_t*)0xD0260E) -#define os_LocalizeHookPtr (*(uint24_t*)0xD02611) -#define os_SilentLinkHookPtr (*(uint24_t*)0xD02614) -#define os_ActiveUSBHookPtr (*(uint24_t*)0xD0261A) - -#define os_TempFreeArc (*(uint24_t*)0xD02655) /**< Set after asm_ArcChk call */ - -#define os_TextBGcolor (*(uint16_t*)0xD02688) /**< Large font background color */ -#define os_TextFGcolor (*(uint16_t*)0xD0268A) /**< Large font foreground color */ - -#define os_DrawBGColor (*(uint16_t*)0xD026AA) /**< Small font background color */ -#define os_DrawFGColor (*(uint16_t*)0xD026AC) /**< Small font foreground color */ -#define os_DrawColorCode (*(uint8_t*)0xD026AE) - -#define os_BatteryStatus (*(uint8_t*)0xD02A86) - -#define os_GraphBGColor (*(uint16_t*)0xD02A98) /**< Graph background 565 color */ - -#define os_FillRectColor (*(uint16_t*)0xD02AC0) -#define os_StatusBarBGColor (*(uint16_t*)0xD02ACC) /**< Status bar 565 color */ - -#define os_TmpYears (*(real_t*)0xD02B01) -#define os_TmpMonths (*(real_t*)0xD02B0A) -#define os_TmpDays (*(real_t*)0xD02B13) -#define os_TmpHours (*(real_t*)0xD02B1C) -#define os_TmpMinutes (*(real_t*)0xD02B25) - -#define os_RamCode ((uint8_t*)0xD18C7C) /**< 1023 bytes free ram */ - -/* - * TI-OS Token definitions - */ - -#define tToDMS 0x01 -#define tToDEC 0x02 -#define tToAbc 0x03 -#define tStore 0x04 -#define tBoxPlot 0x05 -#define tLBrack 0x06 -#define tRBrack 0x07 -#define tLBrace 0x08 -#define tRBrace 0x09 -#define tFromRad 0x0A -#define tFromDeg 0x0B -#define tRecip 0x0C -#define tSqr 0x0D -#define tTrnspos 0x0E -#define tCube 0x0F -#define tLParen 0x10 -#define tRParen 0x11 -#define tRound 0x12 -#define tPxTst 0x13 -#define tAug 0x14 -#define tRowSwap 0x15 -#define tRowPlu 0x16 -#define tmRow 0x17 -#define tmRowPlus 0x18 -#define tMax 0x19 // 'max' -#define tMin 0x1A // 'min' -#define tRToPr 0x1B // 'R>Pr' -#define tRToPo 0x1C // 'R>Po' -#define tPToRx 0x1D // 'P>Rx' -#define tPToRy 0x1E // 'P>Ry' -#define tMedian 0x1F // 'MEDIAN' -#define tRandM 0x20 // 'randM' -#define tMean 0x21 // 'MEAN' -#define tRoot 0x22 // 'ROOT' -#define tSeries 0x23 // 'seq' -#define tFnInt 0x24 // 'fnInt' -#define tNDeriv 0x25 // 'fnIr' -#define tEvalF 0x26 -#define tFmin 0x27 -#define tFmax 0x28 -#define tSpace 0x29 // ' ' -#define tString 0x2A // '"' -#define tComma 0x2B // ',' -#define tii 0x2C // 'i' -#define tFact 0x2D // '!' -#define tCubicR 0x2E -#define tQuartR 0x2F -#define t0 0x30 -#define t1 0x31 -#define t2 0x32 -#define t3 0x33 -#define t4 0x34 -#define t5 0x35 -#define t6 0x36 -#define t7 0x37 -#define t8 0x38 -#define t9 0x39 -#define tDecPt 0x3A // '.' -#define tee 0x3B // 'e' -#define tOr 0x3C // '_or_' -#define tXor 0x3D -#define tColon 0x3E // ':' -#define tEnter 0x3F -#define tAnd 0x40 // '_and_' -#define tA 0x41 -#define tB 0x42 -#define tC 0x43 -#define tD 0x44 -#define tE 0x45 -#define tF 0x46 -#define tG 0x47 -#define tH 0x48 -#define tI 0x49 -#define tJ 0x4A -#define tK 0x4B -#define tL 0x4C -#define tM 0x4D -#define tN 0x4E -#define tO 0x4F -#define tP 0x50 -#define tQ 0x51 -#define tR 0x52 -#define tS 0x53 -#define tT 0x54 -#define tU 0x55 -#define tV 0x56 -#define tW 0x57 -#define tX 0x58 -#define tY 0x59 -#define tZ 0x5A -#define tTheta 0x5B -#define tProg 0x5F - -/* - * Mode settings tokens - */ -#define tRad 0x64 // 'Radian' -#define tDeg 0x65 // 'Degree' -#define tNormF 0x66 // 'Normal' -#define tSci 0x67 // 'Sci' -#define tEng 0x68 // 'Eng' -#define tFloat 0x69 // 'Float' -#define tFix 0x73 // 'Fix_' -#define tSplitOn 0x74 -#define tFullScreen 0x75 -#define tStndrd 0x76 // 'Func' -#define tParam 0x77 // 'Param' -#define tPolar 0x78 // 'Pol' -#define tSeqG 0x79 // ;79h -#define tAFillOn 0x7A // 'AUTO FILL ON' -#define tAFillOff 0x7B // 'AutoFill OFF' -#define tACalcOn 0x7C -#define tACalcOff 0x7D - -#define tEQ 0x6A // '=' -#define tLT 0x6B // '<' -#define tGT 0x6C // '>' -#define tLE 0x6D // LLE -#define tGE 0x6E // LGE -#define tNE 0x6F // LNE -#define tAdd 0x70 // '+' -#define tSub 0x71 // '-' -#define tAns 0x72 -#define tMul 0x82 // '*' -#define tDiv 0x83 // '/' - -#define tBoxIcon 0x7F -#define tCrossIcon 0x80 -#define tDotIcon 0x81 - -#define tTrace 0x84 // 'Trace' -#define tClDrw 0x85 // 'ClrDraw' -#define tZoomStd 0x86 // 'ZStd' -#define tZoomtrg 0x87 // 'Ztrg' -#define tZoomBox 0x88 // 'ZBOX' -#define tZoomIn 0x89 // 'ZIn' -#define tZoomOut 0x8A // 'ZOut' -#define tZoomSqr 0x8B // 'ZSqr' -#define tZoomInt 0x8C // 'ZInt' -#define tZoomPrev 0x8D // 'ZPrev' -#define tZoomDec 0x8E // 'ZDecm' -#define tZoomStat 0x8F // 'ZStat -#define tUsrZm 0x90 // 'ZRcl' -#define tPrtScrn 0x91 // 'PrtScrn' -#define tZoomSto 0x92 // 'ZSto' -#define tText 0x93 - -#define tnPr 0x94 // '_nPr_' -#define tnCr 0x95 // '_nCr_' - -// Graph Commands -#define tYOn 0x96 // 'FnOn_' -#define tYOff 0x97 // 'FnOff_' -#define tStPic 0x98 // 'StPic_' -#define tRcPic 0x99 // 'RcPic_' -#define tStoDB 0x9A // 'StGDB_' -#define tRclDB 0x9B // 'RcGDB_' -#define tLine 0x9C // 'Line' -#define tVert 0x9D // 'Vert_' -#define tPtOn 0x9E // 'PtOn' -#define tPtOff 0x9F // 'PtOff' -#define tPtChg 0xA0 // 'PtChg' -#define tPXOn 0xA1 -#define tPXOff 0xA2 -#define tPXChg 0xA3 -#define tShade 0xA4 // 'Shade' -#define tCircle 0xA5 // 'Circle' -#define tHorz 0xA6 // 'HORIZONTAL' -#define tTanLn 0xA7 // 'TanLn' -#define tDrInv 0xA8 // 'DrInv_' -#define tDrawF 0xA9 // 'DrawF_' - -// Functions with no argument -#define tRand 0xAB // 'rand' -#define tPi 0xAC // Lpi -#define tGetKey 0xAD // 'getKy' -#define tAPost 0xAE // ''' -#define tQuest 0xAF // '?' -#define tChs 0xB0 -#define tInt 0xB1 -#define tAbs 0xB2 -#define tDet 0xB3 -#define tIdent 0xB4 -#define tDim 0xB5 -#define tSum 0xB6 -#define tProd 0xB7 -#define tNot 0xB8 -#define tIPart 0xB9 -#define tFPart 0xBA - -// New 2 Byte Tokens -#define t2ByteTok 0xBB -#define tSqrt 0xBC -#define tCubRt 0xBD -#define tLn 0xBE -#define tExp 0xBF -#define tLog 0xC0 -#define tALog 0xC1 -#define tSin 0xC2 -#define tASin 0xC3 -#define tCos 0xC4 -#define tACos 0xC5 -#define tTan 0xC6 -#define tATan 0xC7 -#define tSinH 0xC8 -#define tASinH 0xC9 -#define tCoshH 0xCA -#define tACosH 0xCB -#define tTanH 0xCC -#define tATanH 0xCD - -// Some Programming Commands -#define tIf 0xCE // 'If_' -#define tThen 0xCF // 'Then_' -#define tElse 0xD0 // 'Else_' -#define tWhile 0xD1 // 'While_' -#define tRepeat 0xD2 // 'Repeat_' -#define tFor 0xD3 // 'For_' -#define tEnd 0xD4 // 'End' -#define tReturn 0xD5 // 'Return' -#define tLbl 0xD6 // 'Lbl_' -#define tGoto 0xD7 // 'Goto_' -#define tPause 0xD8 // 'Pause_' -#define tStop 0xD9 // 'Stop' -#define tISG 0xDA // 'IS>' -#define tDSL 0xDB // 'DS<' -#define tInput 0xDC // 'Input_' -#define tPrompt 0xDD // 'Prompt_' -#define tDisp 0xDE // 'Disp_' -#define tDispG 0xDF // 'DispG' -#define tOutput 0xE0 // 'Outpt' -#define tClLCD 0xE1 // 'ClLCD' -#define tConst 0xE2 // 'Fill' -#define tSortA 0xE3 // 'sortA_' -#define tSortD 0xE4 // 'sortD_' -#define tDispTab 0xE5 // 'Disp Table -#define tMenu 0xE6 // 'Menu' -#define tSendMBL 0xE7 // 'Send' -#define tGetMBL 0xE8 // 'Get' - -// Stat Plot Commands -#define tPlotOn 0xE9 // 'PLOTSON' -#define tPlotOff 0xEA // 'PLOTSOFF -#define tListName 0xEB // List Designator -#define tPlot1 0xEC -#define tPlot2 0xED -#define tPlot3 0xEE -#define tUnused01 0xEF // available? -#define tPower 0xF0 // '^' -#define tXRoot 0xF1 // LsupX,Lroot -#define tOneVar 0xF2 // 'OneVar_' -#define tTwoVar 0xF3 -#define tLR 0xF4 // 'LinR(A+BX)' -#define tLRExp 0xF5 // 'ExpR_' -#define tLRLn 0xF6 // 'LnR_' -#define tLRPwr 0xF7 // 'PwrR_' -#define tMedMed 0xF8 -#define tQuad 0xF9 -#define tClrLst 0xFA // 'Clear List' -#define tClrTbl 0xFB // 'Clear Table' -#define tHist 0xFC // 'Hist_' -#define txyLine 0xFD // 'xyline_' -#define tScatter 0xFE // 'Scatter_' -#define tLR1 0xFF // 'LINR(AX+B)' - -#define tGFormat 0x7E -// 2nd Half Of Graph Format Tokens -#define tSeq 0x00 // 'SeqG' -#define tSimulG 0x01 // 'SimulG' -#define tPolarG 0x02 // 'PolarGC' -#define tRectG 0x03 // 'RectGC' -#define tCoordOn 0x04 // 'CoordOn' -#define tCoordOff 0x05 // 'CoordOff' -#define tDrawLine 0x06 // 'DrawLine' -#define tDrawDot 0x07 // 'DrawDot' -#define tAxisOn 0x08 // 'AxesOn' -#define tAxisOff 0x09 // 'AxesOff' -#define tGridOn 0x0A // 'GridOn' -#define tGridOff 0x0B // 'GridOff' -#define tLblOn 0x0C // 'LabelOn' -#define tLblOff 0x0D // 'LabelOff' -#define tWebOn 0x0E // 'WebOn' -#define tWebOff 0x0F // 'WebOFF' -#define tuv 0x10 // U vs V -#define tvw 0x11 // V vs W -#define tuw 0x12 // U vs W - -#define tVarMat 0x5C -// 2nd Half Of User Matrix Tokens -#define tMatA 0x00 // MAT A -#define tMatB 0x01 // MAT B -#define tMatC 0x02 // MAT C -#define tMatD 0x03 // MAT D -#define tMatE 0x04 // MAT E -#define tMatF 0x05 // MAT F -#define tMatG 0x06 // MAT G -#define tMatH 0x07 // MAT H -#define tMatI 0x08 // MAT I -#define tMatJ 0x09 // MAT J - -#define tVarLst 0x5D -// 2nd Half Of User List Tokens -#define tL1 0x00 // LIST 1 -#define tL2 0x01 // LIST 2 -#define tL3 0x02 // LIST 3 -#define tL4 0x03 // LIST 4 -#define tL5 0x04 // LIST 5 -#define tL6 0x05 // LIST 6 - -#define tVarEqu 0x5E -// 2nd Half Of User Equation Tokens - -// Y Equations have bit 4 set -#define tY1 0x10 // Y1 -#define tY2 0x11 // Y2 -#define tY3 0x12 // Y3 -#define tY4 0x13 // Y4 -#define tY5 0x14 // Y5 -#define tY6 0x15 // Y6 -#define tY7 0x16 // Y7 -#define tY8 0x17 // Y8 -#define tY9 0x18 // Y9 -#define tY0 0x19 // Y0 - -// Param Equations Have Bit 5 Set -#define tX1T 0x20 // X1t -#define tY1T 0x21 // Y1t -#define tX2T 0x22 // X2t -#define tY2T 0x23 // Y2t -#define tX3T 0x24 // X3t -#define tY3T 0x25 // Y3t -#define tX4T 0x26 // X4t -#define tY4T 0x27 // Y4t -#define tX5T 0x28 // X5t -#define tY5T 0x29 // Y5t -#define tX6T 0x2A // X6t -#define tY6T 0x2B // Y6t - -// Polar Equations Have Bit 6 Set -#define tR1 0x40 // R1 -#define tR2 0x41 // R2 -#define tR3 0x42 // R3 -#define tR4 0x43 // R4 -#define tR5 0x44 // R5 -#define tR6 0x45 // R6 - -// Recursion Equations Have Bit 7 Set -#define tun 0x80 // Un -#define tvn 0x81 // Vn -#define twn 0x82 // Wn - -#define tVarPict 0x60 -// 2nd Half User Picture Tokens -#define tPic1 0x00 // PIC1 -#define tPic2 0x01 // PIC2 -#define tPic3 0x02 // PIC3 -#define tPic4 0x03 // PIC4 -#define tPic5 0x04 // PIC5 -#define tPic6 0x05 // PIC6 -#define tPic7 0x06 // PIC7 -#define tPic8 0x07 // PIC8 -#define tPic9 0x08 // PIC9 -#define tPic0 0x09 // PIC0 - -#define tVarGDB 0x61 -// 2nd Half User Graph Database Tokens -#define tGDB1 0x00 // GDB1 -#define tGDB2 0x01 // GDB2 -#define tGDB3 0x02 // GDB3 -#define tGDB4 0x03 // GDB4 -#define tGDB5 0x04 // GDB5 -#define tGDB6 0x05 // GDB6 -#define tGDB7 0x06 // GDB7 -#define tGDB8 0x07 // GDB8 -#define tGDB9 0x08 // GDB9 -#define tGDB0 0x09 // GDB0 - -#define tVarStrng 0xAA -// 2nd Half Of String Vars -#define tStr1 0x00 -#define tStr2 0x01 -#define tStr3 0x02 -#define tStr4 0x03 -#define tStr5 0x04 -#define tStr6 0x05 -#define tStr7 0x06 -#define tStr8 0x07 -#define tStr9 0x08 -#define tStr0 0x09 - -#define tVarOut 0x62 -// 2nd Half Of System Output Only Variables -#define tRegEq 0x01 // REGRESSION EQUATION -#define tStatN 0x02 // STATISTICS N -#define tXMean 0x03 // X MEAN -#define tSumX 0x04 // SUM(X) -#define tSumXSqr 0x05 // SUM(X^2) -#define tStdX 0x06 // STANDARD DEV X -#define tStdPX 0x07 // STANDARD DEV POP X -#define tMinX 0x08 // Min X VALUE -#define tMaxX 0x09 // Max X VALUE -#define tMinY 0x0A // Min Y VALUE -#define tMaxY 0x0B // Max Y VALUE -#define tYmean 0x0C // Y MEAN -#define tSumY 0x0D // SUM(Y) -#define tSumYSqr 0x0E // SUM(Y^2) -#define tStdY 0x0F // STANDARD DEV Y -#define tStdPY 0x10 // STANDARD DEV POP Y -#define tSumXY 0x11 // SUM(XY) -#define tCorr 0x12 // CORRELATION -#define tMedX 0x13 // MED(X) -#define tQ1 0x14 // 1ST QUADRANT OF X -#define tQ3 0x15 // 3RD QUADRANT OF X -#define tQuadA 0x16 // 1ST TERM OF QUAD POLY REG/ Y-INT -#define tQuadB 0x17 // 2ND TERM OF QUAD POLY REG/ SLOPE -#define tQuadC 0x18 // 3RD TERM OF QUAD POLY REG -#define tCubeD 0x19 // 4TH TERM OF CUBIC POLY REG -#define tQuartE 0x1A // 5TH TERM OF QUART POLY REG -#define tMedX1 0x1B // x1 FOR MED-MED -#define tMedX2 0x1C // x2 FOR MED-MED -#define tMedX3 0x1D // x3 FOR MED-MED -#define tMedY1 0x1E // y1 FOR MED-MED -#define tMedY2 0x1F // y2 FOR MED-MED -#define tMedY3 0x20 // y3 FOR MED-MED -#define tRecurn 0x21 // RECURSION N -#define tStatP 0x22 -#define tStatZ 0x23 -#define tStatT 0x24 -#define tStatChi 0x25 -#define tStatF 0x26 -#define tStatDF 0x27 -#define tStatPhat 0x28 -#define tStatPhat1 0x29 -#define tStatPhat2 0x2A -#define tStatMeanX1 0x2B -#define tStatStdX1 0x2C -#define tStatN1 0x2D -#define tStatMeanX2 0x2E -#define tStatStdX2 0x2F -#define tStatN2 0x30 -#define tStatStdXP 0x31 -#define tStatLower 0x32 -#define tStatUpper 0x33 -#define tStat_s 0x34 -#define tLRSqr 0x35 -#define tBRSqr 0x36 - -// These next tokens are only used to access the data -// They are display only and the user cannot access them at all -#define tF_DF 0x37 -#define tF_SS 0x38 -#define tF_MS 0x39 -#define tE_DF 0x3A -#define tE_SS 0x3B -#define tE_MS 0x3C - -#define tVarSys 0x63 -// 2nd Half Of System Input/Output Variables -#define tuXscl 0x00 -#define tuYscl 0x01 -#define tXscl 0x02 -#define tYscl 0x03 -#define tRecuru0 0x04 -#define tRecurv0 0x05 -#define tun1 0x06 -#define tvn1 0x07 -#define tuRecuru0 0x08 -#define tuRecurv0 0x09 -#define tXmin 0x0A -#define tXmax 0x0B -#define tYmin 0x0C -#define tYmax 0x0D -#define tTmin 0x0E -#define tTmax 0x0F -#define tThetaMin 0x10 -#define tThetaMax 0x11 -#define tuXmin 0x12 -#define tuXmax 0x13 -#define tuYmin 0x14 -#define tuYmax 0x15 -#define tuThetMin 0x16 -#define tuThetMax 0x17 -#define tuTmin 0x18 -#define tuTmax 0x19 -#define tTblMin 0x1A -#define tPlotStart 0x1B -#define tuPlotStart 0x1C -#define tnMax 0x1D -#define tunMax 0x1E -#define tnMin 0x1F -#define tunMin 0x20 -#define tTblStep 0x21 -#define tTStep 0x22 -#define tThetaStep 0x23 -#define tuTStep 0x24 -#define tuThetStep 0x25 -#define tDeltaX 0x26 -#define tDeltaY 0x27 -#define tXFact 0x28 -#define tYFact 0x29 -#define tTblInput 0x2A -#define tFinN 0x2B -#define tFinI 0x2C -#define tFinPV 0x2D -#define tFinPMT 0x2E -#define tFinFV 0x2F -#define tFinPY 0x30 -#define tFinCY 0x31 -#define tRecurw0 0x32 -#define tuRecurw0 0x33 -#define tPlotStep 0x34 -#define tuPlotStep 0x35 -#define tXres 0x36 -#define tuXres 0x37 -#define tRecuru02 0x38 -#define tuRecuru02 0x39 -#define tRecurv02 0x3C -#define tuRecurv02 0x3D -#define tRecurw02 0x3E -#define tuRecurw02 0x3F - -// 2nd Byte Of t2ByteTok Tokens -#define tFinNPV 0x00 -#define tFinIRR 0x01 -#define tFinBAL 0x02 -#define tFinPRN 0x03 -#define tFinINT 0x04 -#define tFinToNom 0x05 -#define tFinToEff 0x06 -#define tFinDBD 0x07 -#define tLCM 0x08 -#define tGCD 0x09 -#define tRandInt 0x0A -#define tRandBin 0x0B -#define tSubStrng 0x0C -#define tStdDev 0x0D -#define tVariance 0x0E -#define tInStrng 0x0F -#define tDNormal 0x10 -#define tInvNorm 0x11 -#define tDT 0x12 -#define tChI 0x13 -#define tDF 0x14 -#define tBINPDF 0x15 -#define tBINCDF 0x16 -#define tPOIPDF 0x17 -#define tPOICDF 0x18 -#define tGEOPDF 0x19 -#define tGEOCDF 0x1A -#define tNormalPDF 0x1B -#define tTPDF 0x1C -#define tChiPDF 0x1D -#define tFPDF 0x1E -#define tRandNorm 0x1F -#define tFinFPMT 0x20 -#define tFinFI 0x21 -#define tFinFPV 0x22 -#define tFinFN 0x23 -#define tFinFFV 0x24 -#define tConj 0x25 -#define tReal 0x26 -#define tImag 0x27 -#define tAngle 0x28 -#define tCumSum 0x29 -#define tExpr 0x2A -#define tLength 0x2B -#define tDeltaLst 0x2C -#define tRef 0x2D -#define tRRef 0x2E -#define tToRect 0x2F -#define tToPolar 0x30 -#define tConste 0x31 -#define tSinReg 0x32 -#define tLogistic 0x33 -#define tLinRegTTest 0x34 -#define tShadeNorm 0x35 -#define tShadeT 0x36 -#define tShadeChi 0x37 -#define tShadeF 0x38 -#define tMatToLst 0x39 -#define tLstToMat 0x3A -#define tZTest 0x3B -#define tTTest 0x3C -#define t2SampZTest 0x3D -#define t1PropZTest 0x3E -#define t2PropZTest 0x3F -#define tChiTest 0x40 -#define tZIntVal 0x41 -#define t2SampZInt 0x42 -#define t1PropZInt 0x43 -#define t2PropZInt 0x44 -#define tGraphStyle 0x45 -#define t2SampTTest 0x46 -#define t2SampFTest 0x47 -#define tTIntVal 0x48 -#define t2SampTInt 0x49 -#define tSetupLst 0x4A -#define tFinPMTend 0x4B -#define tFinPMTbeg 0x4C -#define tRealM 0x4D -#define tPolarM 0x4E -#define tRectM 0x4F -#define tExprOn 0x50 -#define tExprOff 0x51 -#define tClrAllLst 0x52 -#define tGetCalc 0x53 -#define tDelVar 0x54 -#define tEquToStrng 0x55 -#define tStrngToequ 0x56 -#define tDelLast 0x57 -#define tSelect 0x58 -#define tANOVA 0x59 -#define tModBox 0x5A -#define tNormProb 0x5B -#define tMGT 0x64 -#define tZFit 0x65 -#define tDiag_on 0x66 -#define tDiag_off 0x67 -#define tArchive 0x68 -#define tUnarchive 0x69 -#define tAsm 0x6A -#define tAsmComp 0x6B -#define tAsmPrgm 0x6C -#define tAsmCmp 0x6D -#define tLcapAAcute 0x6E -#define tLcapAGrave 0x6F -#define tLcapACaret 0x70 -#define tLcapADier 0x71 -#define tLaAcute 0x72 -#define tLaGrave 0x73 -#define tLaCaret 0x74 -#define tLaDier 0x75 -#define tLcapEAcute 0x76 -#define tLcapEGrave 0x77 -#define tLcapECaret 0x78 -#define tLcapEDier 0x79 -#define tLeAcute 0x7A -#define tLeGrave 0x7B -#define tLeCaret 0x7C -#define tLeDier 0x7D -#define tLcapIGrave 0x7F -#define tLcapICaret 0x80 -#define tLcapIDier 0x81 -#define tLiAcute 0x82 -#define tLiGrave 0x83 -#define tLiCaret 0x84 -#define tLiDier 0x85 -#define tLcapOAcute 0x86 -#define tLcapOGrave 0x87 -#define tLcapOCaret 0x88 -#define tLcapODier 0x89 -#define tLoAcute 0x8A -#define tLoGrave 0x8B -#define tLoCaret 0x8C -#define tLoDier 0x8D -#define tLcapUAcute 0x8E -#define tLcapUGrave 0x8F -#define tLcapUCaret 0x90 -#define tLcapUDier 0x91 -#define tLuAcute 0x92 -#define tLuGrave 0x93 -#define tLuCaret 0x94 -#define tLuDier 0x95 -#define tLcapCCed 0x96 -#define tLcCed 0x97 -#define tLcapNTilde 0x98 -#define tLnTilde 0x99 -#define tLaccent 0x9A -#define tLgrave 0x9B -#define tLdieresis 0x9C -#define tLquesDown 0x9D -#define tLexclamDown 0x9E -#define tLalpha 0x9F -#define tLbeta 0xA0 -#define tLgamma 0xA1 -#define tLcapDelta 0xA2 -#define tLdelta 0xA3 -#define tLepsilon 0xA4 -#define tLlambda 0xA5 -#define tLmu 0xA6 -#define tLpi 0xA7 -#define tLrho 0xA8 -#define tLcapSigma 0xA9 -#define tLphi 0xAB -#define tLcapOmega 0xAC -#define tLphat 0xAD -#define tLchi 0xAE -#define tLstatF 0xAF -#define tLa 0xB0 -#define tLb 0xB1 -#define tLc 0xB2 -#define tLd 0xB3 -#define tLsmalle 0xB4 -#define tLf 0xB5 -#define tLsmallg 0xB6 -#define tLh 0xB7 -#define tLi 0xB8 -#define tLj 0xB9 -#define tLk 0xBA -#define tLl 0xBC -#define tLm 0xBD -#define tLsmalln 0xBE -#define tLo 0xBF -#define tLp 0xC0 -#define tLq 0xC1 -#define tLsmallr 0xC2 -#define tLs 0xC3 -#define tLsmallt 0xC4 -#define tLu 0xC5 -#define tLv 0xC6 -#define tLw 0xC7 -#define tLx 0xC8 -#define tLy 0xC9 -#define tLz 0xCA -#define tLsigma 0xCB -#define tLtau 0xCC -#define tLcapIAcute 0xCD -#define tGarbageCollect 0xCE - -#define tExtTok 0xEF -// 2nd Byte Of tExtTok Tokens -#define tSetDate 0x00 -#define tSetTime 0x01 -#define tCheckTmr 0x02 -#define tSetDtFmt 0x03 -#define tSetTmFmt 0x04 -#define tTimeCnv 0x05 -#define tDayOfWk 0x06 -#define tGetDtStr 0x07 -#define tGetTmStr 0x08 -#define tGetDate 0x09 -#define tGetTime 0x0A -#define tStartTmr 0x0B -#define tGtDtFmt 0x0C -#define tGetTmFmt 0x0D -#define tIsClockOn 0x0E -#define tClockOff 0x0F -#define tClockOn 0x10 -#define tOpenLib 0x11 -#define tExecLib 0x12 -#define tInvT 0x13 -#define tChiSquaredTest 0x14 -#define tLinRegTInt 0x15 -#define tManualFit 0x16 -#define tZQuadrant 0x17 -#define tZFracHalf 0x18 -#define tZFracThird 0x19 -#define tZFracFourth 0x1A -#define tZFracFifth 0x1B -#define tZFracEighth 0x1C -#define tZFracTenth 0x1D -#define tFracSlash 0x2E -#define tFracMixedNum 0x2F -#define tSwapImProper 0x30 -#define tSwapFracDec 0x31 -#define tRemainder 0x32 -#define tSummationSigma 0x33 -#define tLogBase 0x34 -#define tRandIntNoRep 0x35 -#define tMathPrint 0x36 -#define tClassic 0x38 -#define tAutoAnswer 0x3B -#define tDecAnswer 0x3C -#define tFracAnswer 0x3D -#define tBlue 0x41 -#define tRed 0x42 -#define tBlack 0x43 -#define tMagenta 0x44 -#define tGreen 0x45 -#define tOrange 0x46 -#define tBrown 0x47 -#define tNavy 0x48 -#define tLtBlue 0x49 -#define tYellow 0x4A -#define tWhite 0x4B -#define tLtGray 0x4C -#define tMedGray 0x4D -#define tGray 0x4E -#define tDarkGray 0x4F -#define tGraphColor 0x65 -#define tTextColor 0x67 -#define tBackgroundOn 0x5B -#define tBackgroundOff 0x64 -#define tThin 0x74 -#define tBorderColor 0x6C -#define tAsm84CPrgm 0x68 -#define tAsm84CCmp 0x69 -#define tAsm84CeCmp 0x7B -#define tAsm84CePrgm 0x7A - -/* 2 byte extended tokens (tExtTok) present in OS 5.2 and above */ -#define tSEQn 0x8F /* 'SEQ(n)' */ -#define tSEQn1 0x90 /* 'SEQ(n+1)' */ -#define tSEQn2 0x91 /* 'SEQ(n+2)' */ -#define tLEFT 0x92 /* 'LEFT' */ -#define tCENTER 0x93 /* 'CENTER' */ -#define tRIGHT 0x94 /* 'RIGHT' */ -#define tInvBinom 0x95 /* 'invBinom(' */ -#define tWait 0x96 /* 'Wait_' */ -#define tToString 0x97 /* 'toString(' */ -#define tEval 0x98 /* 'eval(' */ - -/* - * --- TIOS System error codes --- - */ -#define OS_E_EDIT (1<<7) -#define OS_E_MASK (0x7F) -#define OS_E_OVERFLOW (1+OS_E_EDIT) -#define OS_E_DIVBY0 (2+OS_E_EDIT) -#define OS_E_SINGULARMAT (3+OS_E_EDIT) -#define OS_E_DOMAIN (4+OS_E_EDIT) -#define OS_E_INCREMENT (5+OS_E_EDIT) -#define OS_E_BREAK (6+OS_E_EDIT) -#define OS_E_NONREAL (7+OS_E_EDIT) -#define OS_E_SYNTAX (8+OS_E_EDIT) -#define OS_E_DATATYPE (9+OS_E_EDIT) -#define OS_E_ARGUMENT (10+OS_E_EDIT) -#define OS_E_DIMMISMATCH (11+OS_E_EDIT) -#define OS_E_DIMENSION (12+OS_E_EDIT) -#define OS_E_UNDEFINED (13+OS_E_EDIT) -#define OS_E_MEMORY (14+OS_E_EDIT) -#define OS_E_INVALID (15+OS_E_EDIT) -#define OS_E_ILLEGALNEST (16+OS_E_EDIT) -#define OS_E_BOUND (17+OS_E_EDIT) -#define OS_E_GRAPHRANGE (18+OS_E_EDIT) -#define OS_E_ZOOM (19+OS_E_EDIT) -#define OS_E_LABEL (20) -#define OS_E_STAT (21) -#define OS_E_SOLVER (22+OS_E_EDIT) -#define OS_E_SINGULARITY (23+OS_E_EDIT) -#define OS_E_SIGNCHANGE (24+OS_E_EDIT) -#define OS_E_ITERATIONS (25+OS_E_EDIT) -#define OS_E_BADGUESS (26+OS_E_EDIT) -#define OS_E_STATPLOT (27) -#define OS_E_TOLTOOSMALL (28+OS_E_EDIT) -#define OS_E_RESERVED (29+OS_E_EDIT) -#define OS_E_MODE (30+OS_E_EDIT) -#define OS_E_LNKERR (31+OS_E_EDIT) -#define OS_E_LNKMEMERR (32+OS_E_EDIT) -#define OS_E_LNKTRANSERR (33+OS_E_EDIT) -#define OS_E_LNKDUPERR (34+OS_E_EDIT) -#define OS_E_LNKMEMFULL (35+OS_E_EDIT) -#define OS_E_UNKNOWN (36+OS_E_EDIT) -#define OS_E_SCALE (37+OS_E_EDIT) -#define OS_E_IDNOTFOUND (38) -#define OS_E_NOMODE (39+OS_E_EDIT) -#define OS_E_VALIDATION (40) -#define OS_E_LENGTH (41+OS_E_EDIT) -#define OS_E_APPLICATION (42+OS_E_EDIT) -#define OS_E_APPERR1 (43+OS_E_EDIT) -#define OS_E_APPERR2 (44+OS_E_EDIT) -#define OS_E_EXPIREDAPP (45) -#define OS_E_BADADD (46) -#define OS_E_ARCHIVED (47+OS_E_EDIT) -#define OS_E_VERSION (48) -#define OS_E_ARCHFULL (49) -#define OS_E_VARIABLE (50+OS_E_EDIT) -#define OS_E_DUPLICATE (51+OS_E_EDIT) - -/* - * --- TI-OS os_GetCSC Scan Code Return Values --- - */ -#define sk_Down 0x01 -#define sk_Left 0x02 -#define sk_Right 0x03 -#define sk_Up 0x04 -#define sk_Enter 0x09 -#define sk_2nd 0x36 -#define sk_Clear 0x0F -#define sk_Alpha 0x30 -#define sk_Add 0x0A -#define sk_Sub 0x0B -#define sk_Mul 0x0C -#define sk_Div 0x0D -#define sk_Graph 0x31 -#define sk_Trace 0x32 -#define sk_Zoom 0x33 -#define sk_Window 0x34 -#define sk_Yequ 0x35 -#define sk_Mode 0x37 -#define sk_Del 0x38 -#define sk_Store 0x2A -#define sk_Ln 0x2B -#define sk_Log 0x2C -#define sk_Square 0x2D -#define sk_Recip 0x2E -#define sk_Math 0x2F -#define sk_0 0x21 -#define sk_1 0x22 -#define sk_4 0x23 -#define sk_7 0x24 -#define sk_2 0x1A -#define sk_5 0x1B -#define sk_8 0x1C -#define sk_3 0x12 -#define sk_6 0x13 -#define sk_9 0x14 -#define sk_Comma 0x25 -#define sk_Sin 0x26 -#define sk_Apps 0x27 -#define sk_GraphVar 0x28 -#define sk_DecPnt 0x19 -#define sk_LParen 0x1D -#define sk_Cos 0x1E -#define sk_Prgm 0x1F -#define sk_Stat 0x20 -#define sk_Chs 0x11 -#define sk_RParen 0x15 -#define sk_Tan 0x16 -#define sk_Vars 0x17 -#define sk_Power 0x0E - -/* Compatibility defines */ -#define prgm_CleanUp() -#define pgrm_CleanUp() -#define memset_fast memset - -#ifdef __cplusplus -} -#endif - -#endif +/**
+ * @file
+ * @authors Matt "MateoConLechuga" Waltz
+ * @authors Jacob "jacobly" Young
+ * @brief Core CE define file
+ */
+
+#ifndef H_TICE
+#define H_TICE
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Hardware & custom macros/functions
+ */
+
+/**
+ * Returns a pseudo-random 32-bit integer.
+ *
+ * @return the random integer
+ */
+uint32_t random(void);
+
+/**
+ * Seeds the pseudo-random number generator used by random() and rand() with the
+ * value seed.
+ *
+ * @param seed the seed value
+ */
+void srandom(uint32_t seed);
+
+/**
+ * Returns a pseudo-random integer in the range of \p min to \p max (inclusive).
+ */
+#define randInt(min, max) \
+((unsigned)random() % ((max) - (min) + 1) + (min))
+
+/**
+ * Delays for a number of milliseconds.
+ * <p>
+ * Counts time spent while interrupted. Assumes a CPU clock speed of 48MHz.
+ *
+ * @param msec number of milliseconds
+ */
+void delay(uint16_t msec);
+
+/**
+ * "Atomically" loads from a volatile 32-bit value.
+ *
+ * @remarks
+ * The hardware does not provide a mechanism to truly atomically load from a
+ * 32-bit value. This "atomic" load is implemented by non-atomically reading the
+ * value twice and retrying if the values read differ.
+ *
+ * @attention
+ * If the maximum period between two value changes is 1us or less (assuming a
+ * CPU clock speed of 48MHz), then this function may never complete. For
+ * instance, the counter of a timer ticking at 1MHz or more should not be read
+ * using this function. In such a case of a purely increasing or decreasing
+ * value, atomic_load_increasing_32() or atomic_load_decreasing_32() may be
+ * appropriate instead.
+ *
+ * @param p pointer to 32-bit value
+ */
+uint32_t atomic_load_32(volatile uint32_t *p);
+
+/**
+ * "Atomically" loads from a volatile, increasing 32-bit value.
+ *
+ * @remarks
+ * The hardware does not provide a mechanism to truly atomically load from a
+ * 32-bit value. This "atomic" load is implemented by temporarily disabling
+ * interrupts while non-atomically reading the value twice and then returning
+ * the lesser of the two values read.
+ *
+ * @attention
+ * If the minimum period between two value changes is 5us or less and the
+ * value's maximum rate of change over a 5us period exceeds 256 (assuming a CPU
+ * clock speed of 48MHz), then the value returned may be incorrect. Of relevant
+ * note may be the fact that a 48MHz counter does not exceed this limit.
+ *
+ * @param p pointer to 32-bit value
+ */
+uint32_t atomic_load_increasing_32(volatile uint32_t *p);
+
+/**
+ * "Atomically" loads from a volatile, decreasing 32-bit value.
+ *
+ * @remarks
+ * The hardware does not provide a mechanism to truly atomically load from a
+ * 32-bit value. This "atomic" load is implemented by temporarily disabling
+ * interrupts while non-atomically reading the value twice and then returning
+ * the greater of the two values read.
+ *
+ * @attention
+ * If the minimum period between two value changes is 5us or less and the
+ * value's maximum rate of change over a 5us period exceeds 256 (assuming a CPU
+ * clock speed of 48MHz), then the value returned may be incorrect. Of relevant
+ * note may be the fact that a 48MHz counter does not exceed this limit.
+ *
+ * @param p pointer to 32-bit value
+ */
+uint32_t atomic_load_decreasing_32(volatile uint32_t *p);
+
+/**
+ * Gets a combination of the RTC time; useful for srand()
+ */
+#define rtc_Time() (*(volatile uint32_t*)0xF30044)
+
+/* RTC definitions */
+#define RTC_UNFREEZE (1<<7)
+#define RTC_FREEZE (0<<7)
+#define RTC_LOAD (1<<6)
+#define RTC_ENABLE ((1<<0)|(RTC_UNFREEZE))
+#define RTC_DISABLE (0<<0)
+
+/* RTC registers */
+#define rtc_Seconds (*(volatile uint8_t*)0xF30000)
+#define rtc_Minutes (*(volatile uint8_t*)0xF30004)
+#define rtc_Hours (*(volatile uint8_t*)0xF30008)
+#define rtc_Days (*(volatile uint16_t*)0xF3000C)
+#define rtc_AlarmSeconds (*(uint8_t*)0xF30010)
+#define rtc_AlarmMinutes (*(uint8_t*)0xF30014)
+#define rtc_AlarmHours (*(uint8_t*)0xF30018)
+#define rtc_Control (*(uint8_t*)0xF30020)
+#define rtc_LoadSeconds (*(uint8_t*)0xF30024)
+#define rtc_LoadMinutes (*(uint8_t*)0xF30028)
+#define rtc_LoadHours (*(uint8_t*)0xF3002C)
+#define rtc_LoadDays (*(uint16_t*)0xF30030)
+#define rtc_IntStatus (*(volatile uint8_t*)0xF30034)
+#define rtc_IntAcknowledge (*(volatile uint8_t*)0xF30034)
+#define rtc_IsBusy() (rtc_Control & RTC_LOAD)
+
+/* RTC interrupt masks */
+#define RTC_ALARM_INT_SOURCE (1<<5)
+#define RTC_DAY_INT_SOURCE (1<<4)
+#define RTC_HR_INT_SOURCE (1<<3)
+#define RTC_MIN_INT_SOURCE (1<<2)
+#define RTC_SEC_INT_SOURCE (1<<1)
+
+/* RTC interrupt statuses */
+#define RTC_LOAD_INT (1<<5)
+#define RTC_ALARM_INT (1<<4)
+#define RTC_DAY_INT (1<<3)
+#define RTC_HR_INT (1<<2)
+#define RTC_MIN_INT (1<<1)
+#define RTC_SEC_INT (1<<0)
+#define RTC_INT_MASK (RTC_SEC_INT | RTC_MIN_INT | RTC_HR_INT | RTC_DAY_INT | RTC_ALARM_INT | RTC_LOAD_INT)
+
+/* Whole bunch of useful timer functions */
+#define TIMER1_ENABLE (1<<0) /* Enables Timer 1 */
+#define TIMER1_DISABLE (0<<0) /* Disables Timer 1 */
+#define TIMER1_32K (1<<1) /* Use the 32K clock for timer 1 */
+#define TIMER1_CPU (0<<1) /* Use the CPU clock rate for timer 1 */
+#define TIMER1_0INT (1<<2) /* Enable an interrupt when 0 is reached for the timer 1 */
+#define TIMER1_NOINT (0<<2) /* Disable interrupts for the timer 1 */
+#define TIMER1_UP (1<<9) /* Timer 1 counts up */
+#define TIMER1_DOWN (0<<9) /* Timer 1 counts down */
+
+#define TIMER2_ENABLE (1<<3) /* Enables Timer 2 */
+#define TIMER2_DISABLE (0<<3) /* Disables Timer 2 */
+#define TIMER2_32K (1<<4) /* Use the 32K clock for timer 2 */
+#define TIMER2_CPU (0<<4) /* Use the CPU clock rate for timer 2 */
+#define TIMER2_0INT (1<<5) /* Enable an interrupt when 0 is reached for the timer 2 */
+#define TIMER2_NOINT (0<<5) /* Disable interrupts for the timer 2 */
+#define TIMER2_UP (1<<10) /* Timer 2 counts up */
+#define TIMER2_DOWN (0<<10) /* Timer 2 counts down */
+
+#define TIMER3_ENABLE (1<<6) /* Enables Timer 3 */
+#define TIMER3_DISABLE (0<<6) /* Disables Timer 3 */
+#define TIMER3_32K (1<<7) /* Use the 32K clock for timer 3 */
+#define TIMER3_CPU (0<<7) /* Use the CPU clock rate for timer 3 */
+#define TIMER3_0INT (1<<8) /* Enable an interrupt when 0 is reached for the timer 3 */
+#define TIMER3_NOINT (0<<8) /* Disable interrupts for the timer 3 */
+#define TIMER3_UP (1<<11) /* Timer 3 counts up */
+#define TIMER3_DOWN (0<<11) /* Timer 3 counts down */
+
+/* These defines can be used to check the status of the timer */
+#define TIMER1_MATCH1 (1<<0) /* Timer 1 hit the first match value */
+#define TIMER1_MATCH2 (1<<1) /* Timer 1 hit the second match value */
+#define TIMER1_RELOADED (1<<2) /* Timer 1 was reloaded (Needs TIMER1_0INT enabled) */
+
+#define TIMER2_MATCH1 (1<<3) /* Timer 2 hit the first match value */
+#define TIMER2_MATCH2 (1<<4) /* Timer 2 hit the second match value */
+#define TIMER2_RELOADED (1<<5) /* Timer 2 was reloaded (Needs TIMER2_0INT enabled) */
+
+#define TIMER3_MATCH1 (1<<6) /* Timer 3 hit the first match value */
+#define TIMER3_MATCH2 (1<<7) /* Timer 3 hit the second match value */
+#define TIMER3_RELOADED (1<<8) /* Timer 3 was reloaded (Needs TIMER3_0INT enabled) */
+
+/* Timer registers */
+#define timer_1_Counter (*(volatile uint32_t*)0xF20000)
+#define timer_1_ReloadValue (*(uint32_t*)0xF20004)
+#define timer_1_MatchValue_1 (*(uint32_t*)0xF20008)
+#define timer_1_MatchValue_2 (*(uint32_t*)0xF2000C)
+#define timer_2_Counter (*(volatile uint32_t*)0xF20010)
+#define timer_2_ReloadValue (*(uint32_t*)0xF20014)
+#define timer_2_MatchValue_1 (*(uint32_t*)0xF20018)
+#define timer_2_MatchValue_2 (*(uint32_t*)0xF2001C)
+#define timer_3_Counter (*(volatile uint32_t*)0xF20020)
+#define timer_3_ReloadValue (*(uint32_t*)0xF20024)
+#define timer_3_MatchValue_1 (*(uint32_t*)0xF20028)
+#define timer_3_MatchValue_2 (*(uint32_t*)0xF2002C)
+#define timer_Control (*(uint16_t*)0xF20030)
+#define timer_IntStatus (*(volatile uint16_t*)0xF20034)
+#define timer_IntAcknowledge (*(volatile uint16_t*)0xF20034)
+#define timer_EnableInt (*(uint16_t*)0xF20038)
+
+/* LCD defines */
+#define lcd_BacklightLevel (*(uint8_t*)0xF60024)
+#define lcd_Timing0 (*(uint32_t*)0xE30000)
+#define lcd_Timing1 (*(uint32_t*)0xE30004)
+#define lcd_Timing2 (*(uint32_t*)0xE30008)
+#define lcd_Timing3 (*(uint24_t*)0xE3000C)
+#define lcd_UpBase (*(uint32_t*)0xE30010)
+#define lcd_LpBase (*(uint32_t*)0xE30014)
+#define lcd_Control (*(uint24_t*)0xE30018)
+#define lcd_EnableInt (*(uint8_t*)0xE3001C)
+#define lcd_IntStatus (*(uint8_t*)0xE30020)
+#define lcd_IntStatusMasked (*(uint8_t*)0xE30024)
+#define lcd_IntAcknowledge (*(volatile uint8_t*)0xE30028)
+#define lcd_UpBaseCurr (*(volatile uint32_t*)0xE3002C)
+#define lcd_LpBaseCurr (*(volatile uint32_t*)0xE30030)
+#define lcd_Palette ((uint16_t*)0xE30200)
+#define lcd_Ram ((uint16_t*)0xD40000)
+
+/**
+ * Width of LCD in pixels
+ */
+#define LCD_WIDTH \
+(320)
+
+/**
+ * Height of LCD in pixels
+ */
+#define LCD_HEIGHT \
+(240)
+
+/**
+ * Total number of pixels in LCD
+ */
+#define LCD_SIZE \
+(LCD_WIDTH*LCD_HEIGHT*2)
+
+/**
+ * @brief Structure of real variable type
+ */
+typedef struct { int8_t sign, exp; uint8_t mant[7]; } real_t;
+/**
+ * @brief Structure of complex variable type
+ */
+typedef struct { real_t real, imag; } cplx_t;
+/**
+ * @brief Structure of list variable type
+ */
+typedef struct { uint16_t dim; real_t items[1]; } list_t;
+/**
+ * @brief Structure of complex list variable type
+ */
+typedef struct { uint16_t dim; cplx_t items[1]; } cplx_list_t;
+/**
+ * @brief Structure of matrix variable type
+ */
+typedef struct { uint8_t cols, rows; real_t items[1]; } matrix_t;
+/**
+ * @brief Structure of string variable type
+ */
+typedef struct { uint16_t len; char data[1]; } string_t;
+/**
+ * @brief Structure of equation variable type
+ */
+typedef struct { uint16_t len; char data[1]; } equ_t;
+/**
+ * @brief Structure of miscellaneous variable type
+ */
+typedef struct { uint16_t size; uint8_t data[1]; } var_t;
+
+/**
+ * Gets an element from a matrix
+ *
+ * @param matrix Structure of matrix
+ * @param row Row in matrix
+ * @param col Column in matrix
+ * @returns real_t containing element data
+ */
+#define matrix_element(matrix, row, col) ((matrix)->items[(row)+(col)*(matrix)->rows])
+
+/**
+ * Resets the OS homescreen; accounts for split screen
+ */
+#define os_ClrHome() do { _OS(asm_ClrLCD); _OS(asm_HomeUp); _OS(asm_DrawStatusBar); } while (0)
+
+/**
+ * Resets the OS homescreen fully
+ */
+#define os_ClrHomeFull() do { _OS(asm_ClrLCDFull); _OS(asm_HomeUp); _OS(asm_DrawStatusBar); } while (0)
+
+/*
+ * Bootcode functions
+ */
+
+/**
+ * Sets the calculator's date
+ *
+ * Performs checks to ensure date is within range
+ * @param day Day to set
+ * @param month Month to set
+ * @param year Year to set
+ */
+void boot_SetDate(uint8_t day, uint8_t month, uint16_t year);
+
+/**
+ * Gets the calculator's date
+ *
+ * @param day Pointer to variable to store day
+ * @param month Pointer to variable to store month
+ * @param year Pointer to variable to store year
+ */
+void boot_GetDate(uint8_t *day, uint8_t *month, uint16_t *year);
+
+/**
+ * Sets the calculator's time
+ *
+ * Performs checks to ensure time is within range
+ * @param seconds Seconds to set
+ * @param minutes Minutes to set
+ * @param hours Hours to set
+ */
+void boot_SetTime(uint8_t seconds, uint8_t minutes, uint8_t hours);
+
+/**
+ * Gets the calculator's time
+ *
+ * @param seconds Pointer to variable to store seconds
+ * @param minutes Pointer to variable to store minutes
+ * @param hours Pointer to variable to store hours
+ */
+void boot_GetTime(uint8_t *seconds, uint8_t *minutes, uint8_t *hours);
+
+/**
+ * Checks if past noon
+ *
+ * @returns True if past noon
+ */
+bool boot_IsAfterNoon(void);
+
+/**
+ * @returns Bootcode version major
+ */
+uint8_t boot_GetBootMajorVer(void);
+
+/**
+ * @returns Bootcode version minor
+ */
+uint8_t boot_GetBootMinorVer(void);
+
+/**
+ * @returns Hardware version
+ */
+uint8_t boot_GetHardwareVer(void);
+
+/**
+ * Turns all of VRAM into 0xFF (white)
+ */
+void boot_ClearVRAM(void);
+
+/**
+ * Checks if the [on] key was pressed
+ *
+ * @returns True is returned if [on] key was pressed
+ */
+bool boot_CheckOnPressed(void);
+
+/**
+ * Basically a reimplemented form of printf that prints to some debugging device
+ *
+ * @param string String to send to debug device
+ */
+void boot_DebugPrintf(const char *string);
+
+/**
+ * Turns off the calculator (probably not a good idea to use)
+ */
+void boot_TurnOff(void);
+
+/**
+ * Inserts a new line at the current cursor posistion on the homescreen
+ * Does not scroll.
+ */
+void boot_NewLine(void);
+
+/**
+ * @returns Current battery status
+ */
+uint8_t boot_GetBatteryStatus(void);
+
+/**
+ * Waits for ~10 ms
+ */
+void boot_WaitShort(void);
+
+/*
+ * OS Routines
+ */
+
+/**
+ * Inserts a new line at the current cursor posistion on the homescreen
+ * Does scroll.
+ */
+void os_NewLine(void);
+
+/**
+ * Disables the OS cursor
+ */
+void os_DisableCursor(void);
+
+/**
+ * Enables the OS cursor
+ */
+void os_EnableCursor(void);
+
+/**
+ * Sets the foreground color used to draw text on the graphscreen
+ * @param color 565 BGR color to set text foreground to
+ */
+void os_SetDrawFGColor(uint24_t color);
+
+/**
+ * Gets the foreground color used to draw text on the graphscreen
+ * @returns 565 BGR color of text foreground
+ */
+uint24_t os_GetDrawFGColor(void);
+
+/**
+ * Sets the background color used to draw text on the graphscreen
+ * @param color 565 BGR color to set text background to
+ */
+void os_SetDrawBGColor(uint24_t color);
+
+/**
+ * Gets the background color used to draw text on the graphscreen
+ *
+ * @returns 565 BGR color of text nackground
+ * @warning Only useable in OS 5.2 and above; use at your own risk
+ */
+uint24_t os_GetDrawBGColor(void);
+
+/**
+ * Set the cursor posistion used on the homescreen
+ *
+ * @param curRow The row aligned offset
+ * @param curCol The column aligned offset
+ */
+void os_SetCursorPos(uint8_t curRow, uint8_t curCol);
+
+/**
+ * Gets the cursor posistion used on the homescreen
+ *
+ * @param curRow Pointer to store the row aligned offset
+ * @param curCol Pointer to store the column aligned offset
+ */
+void os_GetCursorPos(unsigned int *curRow, unsigned int *curCol);
+
+/**
+ * Selects the font to use when drawing on the graphscreen
+ *
+ * @param id
+ * 0: small font <br>
+ * 1: large monospace font
+ */
+void os_FontSelect(char id);
+
+/**
+ * Gets the font to use when drawing on the graphscreen
+ *
+ * @returns
+ * 0: small font <br>
+ * 1: large monospace font
+ */
+uint24_t os_FontGetID(void);
+
+/**
+ * @param string String to get pixel width of
+ * @returns The width of a string in the variable-width format
+ */
+uint24_t os_FontGetWidth(const char *string);
+
+/**
+ * @returns The height of the font characters
+ */
+uint24_t os_FontGetHeight(void);
+
+/**
+ * Draws text using the small font to the screen
+ *
+ * @param string String to draw
+ * @param col Column to start drawing at
+ * @param row Row to start drawing at
+ * @returns The end column
+ */
+uint24_t os_FontDrawText(const char *string, uint16_t col, uint8_t row);
+
+/**
+ * Draws transparent text using the small font to the screen
+ *
+ * @param string String to draw
+ * @param col Column to start drawing at
+ * @param row Row to start drawing at
+ * @returns The end column
+ */
+uint24_t os_FontDrawTransText(const char *string, uint16_t col, uint8_t row);
+
+/**
+ * Puts some text at the current homescreen cursor location
+ *
+ * @param string Test to put on homescreen
+ * @returns 1 if string fits on screen, 0 otherwise
+ */
+uint24_t os_PutStrFull(const char *string);
+
+/**
+ * Puts some text at the current homescreen cursor location
+ *
+ * @param string Test to put on homescreen
+ * @returns 1 if string fits on line, 0 otherwise
+ */
+uint24_t os_PutStrLine(const char *string);
+
+/**
+ * Set a particular flag variable
+ *
+ * @param offset Offset to particular flag in list
+ * @param set Bitmask of flag to set
+ */
+void os_SetFlagByte(int offset, uint8_t set);
+
+/**
+ * Get a particular flag variable
+ *
+ * @param offset Offset to particular flag in list
+ * @returns Bitmask of flag
+ */
+uint8_t os_GetFlagByte(int offset);
+
+/**
+ * Get amount of free ram in order to allocate extra ram
+ *
+ * @param free Set to start of free available ram
+ * @returns Size of available ram
+ */
+size_t os_MemChk(void **free);
+
+/**
+ * Throws an OS error
+ *
+ * @param error Error code to throw
+ */
+void os_ThrowError(uint8_t error);
+
+/**
+ * Gets a pointer to the system stats
+ *
+ * @returns
+ * [3] - Hardware version <br>
+ * [12-13] - Boot Version Major <br>
+ * [14] - Boot Version Minor <br>
+ * [15-16] - Boot Version Build <br>
+ * [28-37] - Calc ID (From certificate if exists) <br>
+ * [38-39] - Appears to be localization language
+ */
+void *os_GetSystemStats(void);
+
+/**
+ * This function can return twice (like setjmp).
+ * First return always happens with a return value of 0.
+ * Second return only happens if an error occurs before os_PopErrorHandler is called,
+ * with the errNo as the return value.
+ *
+ * @code
+ * int errno = os_PushErrorHandler();
+ * if (errno) {
+ * // handle error, but no longer under the protection of the error handler so do not call os_PopErrorHandler()
+ * } else {
+ * // run some code that may error
+ * os_PopErrorHandler();
+ * }
+ * @endcode
+ *
+ * @param routine Error handling routine
+ * @see os_PopErrorHandler
+ */
+int os_PushErrorHandler(void);
+
+/**
+ * Restores stack state after a call to os_PushErrorHandler. Must be called with stack in the same state
+ * as it was when os_PushErrorHandler returned with 0, and should not be called along the error path.
+ *
+ * @see os_PushErrorHandler
+ */
+void os_PopErrorHandler(void);
+
+/**
+ * @returns A pointer to symtable of the OS
+ */
+void *os_GetSymTablePtr(void);
+
+/**
+ * Creates an AppVar
+ *
+ * @param name Pointer to name of AppVar to create
+ * @param size Size of AppVar to create
+ * @returns A pointer to the AppVar data
+ * @note Returns NULL if creation failed for some reason, otherwise a pointer to the size bytes
+ */
+var_t *os_CreateAppVar(const char *name, uint16_t size);
+
+/**
+ * Returns next entry or NULL if no more entries, pass os_GetSymTablePtr() as first entry
+ */
+void *os_NextSymEntry(void *entry, uint24_t *type, uint24_t *nameLength, char *name, void **data);
+
+/**
+ * Locates a symbol in the symtable
+ *
+ * @param type Type of symbol to find
+ * @param name Pointer to name of symbol to find
+ * @param entry Can be NULL if you don't care
+ * @param data Can be NULL if you don't care
+ * @returns If file exists, returns 1 and sets entry and data, otherwise returns 0.
+ */
+int os_ChkFindSym(uint8_t type, const char *name, void **entry, void **data);
+
+/**
+ * Gets the Ans variable
+ *
+ * @param type This is set to the current variable type in ANS
+ * @returns Pointer to the data
+ * @note Returns NULL if Ans doesn't exist or type is NULL
+ */
+void *os_RclAns(uint8_t *type);
+
+/**
+ * Copies a real_t type
+ *
+ * @param src Pointer to original real_t
+ * @returns Copied real_t
+ */
+real_t os_RealCopy(const real_t *src);
+
+/* Unary operations used to interact with the OS math functions */
+real_t os_RealAcosRad(const real_t *arg);
+real_t os_RealAsinRad(const real_t *arg);
+real_t os_RealAtanRad(const real_t *arg);
+real_t os_RealCosRad(const real_t *arg);
+real_t os_RealRadToDeg(const real_t *arg);
+real_t os_RealExp(const real_t *arg);
+real_t os_RealFloor(const real_t *arg);
+real_t os_RealFrac(const real_t *arg);
+real_t os_RealRoundInt(const real_t *arg);
+real_t os_RealLog(const real_t *arg);
+real_t os_RealNeg(const real_t *arg);
+real_t os_RealDegToRad(const real_t *arg);
+real_t os_RealInv(const real_t *arg);
+real_t os_RealSinRad(const real_t *arg);
+real_t os_RealSqrt(const real_t *arg);
+real_t os_RealTanRad(const real_t *arg);
+real_t os_RealInt(const real_t *arg);
+cplx_t os_CplxSquare(const cplx_t *arg);
+
+/* Binary operations used to interact with the OS math functions */
+real_t os_RealAdd(const real_t *arg1, const real_t *arg2);
+real_t os_RealDiv(const real_t *arg1, const real_t *arg2);
+real_t os_RealGcd(const real_t *arg1, const real_t *arg2);
+real_t os_RealLcm(const real_t *arg1, const real_t *arg2);
+real_t os_RealMax(const real_t *arg1, const real_t *arg2);
+real_t os_RealMin(const real_t *arg1, const real_t *arg2);
+real_t os_RealMul(const real_t *arg1, const real_t *arg2);
+real_t os_RealNcr(const real_t *total, const real_t *num);
+real_t os_RealNpr(const real_t *total, const real_t *num);
+real_t os_RealPow(const real_t *base, const real_t *exp);
+real_t os_RealRandInt(const real_t *min, const real_t *max);
+real_t os_RealMod(const real_t *arg1, const real_t *arg2);
+real_t os_RealSub(const real_t *arg1, const real_t *arg2);
+
+/**
+ * Rounds a real_t
+ *
+ * @note digits must be in the range 0 - 9
+ */
+real_t os_RealRound(const real_t *arg, char digits);
+
+/**
+ * Compares two real_t
+ *
+ * @returns -1, 0, or 1 depending on the comparison
+ */
+int os_RealCompare(const real_t *arg1, const real_t *arg2);
+
+/**
+ * Converts a real_t to an integer
+ * @note Saturates on overflow
+ */
+int24_t os_RealToInt24(const real_t *arg);
+
+/**
+ * Converts an integer to a real_t
+ * @note Saturates on overflow
+ */
+real_t os_Int24ToReal(int24_t arg);
+
+/**
+ * Converts a real_t to a float
+ * @note Saturates on overflow
+ */
+float os_RealToFloat(const real_t *arg);
+
+/**
+ * Converts an float to a real_t
+ * @note Saturates on overflow
+ */
+real_t os_FloatToReal(float arg);
+
+/** This converts a ti-float to a ti-ascii string.
+ *
+ * @param result Zero terminated string copied to this address
+ * @param arg Real to convert
+ * @param maxLength
+ * <=0: use default max length (14) <br>
+ * >0: max length of result, minimum of 6
+ * @param mode:
+ * 0: Use current mode for everything (digits ignored) <br>
+ * 1: Normal mode <br>
+ * 2: Sci mode <br>
+ * 3: Eng mode <br>
+ * >4: Use current Normal/Sci/Eng mode (digits still used) <br>
+ * @param digits
+ * -1: Float mode <br>
+ * 0-9: Fix # mode <br>
+ * @returns Length of result
+ */
+int os_RealToStr(char *result, const real_t *arg, int8_t maxLength, uint8_t mode, int8_t digits);
+
+/**
+ * This converts a ti-ascii string to a ti-float.
+ *
+ * String format regexp: / *[-\032+]?[0-9]*(\.[0-9]*)?([eE\033][-\032+]?[0-9]*)?/
+ * @param string TI-ascii string to convert
+ * @param end If non-null, pointer to end of parsed number is stored here
+ * @returns resulting TI-float; on exponent overflow this is +-9.9999999999999e99
+ */
+real_t os_StrToReal(const char *string, char **end);
+
+/**
+ * High 8 is unsigned offset, low 8 is bits to test
+ */
+int os_TestFlagBits(uint16_t offset_pattern);
+void os_SetFlagBits(int16_t offset_pattern);
+void os_ResetFlagBits(int16_t offset_pattern);
+
+/**
+ * Custom implementation input routine for use in conjunction with the TIOS.
+ * It is HIGHLY recommended you implement your own routine, this routine has
+ * some quirks. It is good enough for getting basic input however.
+ *
+ * @param string Input prompt string to be displayed to the user
+ * @param buf Storage location to store input string
+ * @param bufsize Available storage size for input string. -1 for null termination.
+ * @returns None
+ */
+void os_GetStringInput(char *string, char *buf, size_t bufsize);
+
+/**
+ * Gets a key from the OS
+ *
+ * @returns Key code
+ * @returns Extended key code in high byte
+ */
+uint16_t os_GetKey(void);
+
+/**
+ * Disable text buffering on the homescreen. C programs use this area by default for the BSS / Heap.
+ */
+void os_DisableHomeTextBuffer(void);
+
+/**
+ * Enables text buffering on the homescreen. C programs use this area by default for the BSS / Heap.
+ */
+void os_EnableHomeTextBuffer(void);
+
+/**
+ * @brief Scan code type
+ */
+typedef uint8_t sk_key_t;
+
+/**
+ * Performs an OS call to get the keypad scan code
+ *
+ * You can also use this function to get input from the user as a string like this:
+ * @code
+ * const char *chars = "\0\0\0\0\0\0\0\0\0\0\"WRMH\0\0?[VQLG\0\0:ZUPKFC\0 YTOJEB\0\0XSNIDA\0\0\0\0\0\0\0\0";
+ * uint8_t key, i = 0;
+ * char buffer[50];
+ *
+ * while((key = os_GetCSC()) != sk_Enter) {
+ * if(chars[key]) {
+ * buffer[i++] = chars[key];
+ * }
+ * }
+ * @endcode
+ * Feel free to modify the string to suit your needs.
+ * @returns Key scan code
+ */
+sk_key_t os_GetCSC(void);
+
+/**
+ * Runs the calulator at 6 MHz
+ */
+void boot_Set6MHzMode(void);
+
+/**
+ * Runs the calulator at 48 MHz
+ */
+void boot_Set48MHzMode(void);
+
+/**
+ * Runs the calulator at 6 MHz (saves interrupt status)
+ */
+void boot_Set6MHzModeI(void);
+
+/**
+ * Runs the calulator at 48 MHz (saves interrupt status)
+ */
+void boot_Set48MHzModeI(void);
+
+/**
+ * Executes the assembly routine _ForceCmdNoChar
+ */
+void os_ForceCmdNoChar(void);
+
+/**
+ * Use this function to call assembly functions in the OS and Bootcode
+ * i.e. _OS( asm_ArcChk );
+ */
+void _OS(void (*function)(void));
+
+/**
+ * Assembly routine to scroll homescreen up
+ */
+void asm_MoveUp(void);
+
+/**
+ * Assembly routine to scroll homescreen down
+ */
+void asm_MoveDown(void);
+
+/**
+ * Assembly routine to move row and column posistion to (0,0)
+ */
+void asm_HomeUp(void);
+
+/**
+ * Assembly routine to turn on the Run Indicator
+ */
+void asm_RunIndicOn(void);
+
+/**
+ * Assembly routine to turn off the Run Indicator
+ */
+void asm_RunIndicOff(void);
+
+/**
+ * Assembly routine to turn off APD
+ */
+void asm_DisableAPD(void);
+
+/**
+ * Assembly routine to turn on APD
+ */
+void asm_EnableAPD(void);
+
+/**
+ * Assembly routine checks the amount of free archive
+ */
+void asm_ArcChk(void);
+
+/**
+ * Assembly routine to clear the homescreen lcd
+ */
+void asm_ClrLCDFull(void);
+
+/**
+ * Assembly routine to clear the homescreen lcd.
+ * Accounts for split screen
+ */
+void asm_ClrLCD(void);
+
+/**
+ * Assembly routine to redraw the status bar
+ */
+void asm_DrawStatusBar(void);
+
+/**
+ * Invalidate and clear stat variables
+ */
+void asm_DelRes(void);
+
+/**
+ * Invalidate and clear text shadow area
+ */
+void asm_ClrTxtShd(void);
+
+/**
+ * Colors used by the OS
+ */
+typedef enum {
+ OS_COLOR_BLUE = 10,
+ OS_COLOR_RED,
+ OS_COLOR_BLACK,
+ OS_COLOR_MAGENTA,
+ OS_COLOR_GREEN,
+ OS_COLOR_ORANGE,
+ OS_COLOR_BROWN,
+ OS_COLOR_NAVY,
+ OS_COLOR_LTBLUE,
+ OS_COLOR_YELLOW,
+ OS_COLOR_WHITE,
+ OS_COLOR_LTGRAY,
+ OS_COLOR_MEDGRAY,
+ OS_COLOR_GRAY,
+ OS_COLOR_DARKGRAY
+} os_colors_t;
+
+#define os_RamStart ((uint8_t*)0xD00000)
+#define os_Flags ((uint8_t*)0xD00080)
+#define os_TextFlags (*(uint8_t*)0xD00080)
+#define os_ApdFlags (*(uint8_t*)0xD00088)
+#define os_RclFlags (*(uint8_t*)0xD0008E)
+
+#define os_AppData ((uint8_t*)0xD00429)
+
+#define os_KbdScanCode (*(uint8_t*)0xD00587)
+#define os_KbdLGSC (*(uint8_t*)0xD00588)
+#define os_KbdPSC (*(uint8_t*)0xD00589)
+#define os_KbdWUR (*(uint8_t*)0xD0058A)
+#define os_KbdDebncCnt (*(uint8_t*)0xD0058B)
+#define os_KbdKey (*(uint8_t*)0xD0058C)
+#define os_KbdGetKy (*(uint8_t*)0xD0058D)
+#define os_KeyExtend (*(uint8_t*)0xD0058E)
+#define os_Brightness (*(uint8_t*)0xD0058F)
+#define os_ApdSubTimer (*(uint8_t*)0xD00590)
+#define os_ApdTimer (*(uint8_t*)0xD00591)
+#define os_CurRow (*(uint8_t*)0xD00595)
+#define os_CurCol (*(uint8_t*)0xD00596)
+
+#define os_OP1 ((uint8_t*)0xD005F8)
+#define os_OP2 ((uint8_t*)0xD00603)
+#define os_OP3 ((uint8_t*)0xD0060E)
+#define os_OP4 ((uint8_t*)0xD00619)
+#define os_OP5 ((uint8_t*)0xD00624)
+#define os_OP6 ((uint8_t*)0xD0062F)
+#define os_OP7 ((uint8_t*)0xD0063A)
+
+#define os_ProgToEdit ((char*)0xD0065B)
+#define os_NameBuff ((char*)0xD00663)
+
+#define os_TextShadow ((uint8_t*)0xD006C0) /**< Text buffer 260 bytes */
+
+#define os_PromptRow (*(uint8_t*)0xD00800)
+#define os_PromptCol (*(uint8_t*)0xD00801)
+#define os_PromptIns (*(uint8_t*)0xD00802)
+#define os_PromptShift (*(uint8_t*)0xD00803)
+#define os_PromptRet (*(uint8_t*)0xD00804)
+#define os_PromptValid (*(uint8_t*)0xD00807)
+
+#define os_PenCol (*(uint24_t*)0xD008D2) /**< Small font column location */
+#define os_PenRow (*(uint8_t*)0xD008D5) /**< Small font row location */
+
+#define os_StatVars ((uint8_t*)0xD01191)
+#define os_AsmPrgmSize (*(uint16_t*)0xD0118C) /**< Current size of executing program */
+
+#define os_uXMin (*(real_t*)0xD01D61)
+#define os_uXMax (*(real_t*)0xD01D6A)
+#define os_uXScl (*(real_t*)0xD01D73)
+#define os_uYMin (*(real_t*)0xD01D7C)
+#define os_uYMax (*(real_t*)0xD01D85)
+#define os_uYScl (*(real_t*)0xD01D8E)
+#define os_uThetaMin (*(real_t*)0xD01D97)
+#define os_uThetaMax (*(real_t*)0xD01DA0)
+#define os_uThetaStep (*(real_t*)0xD01DA9)
+#define os_uTmin (*(real_t*)0xD01DB2)
+#define os_uTmax (*(real_t*)0xD01DBB)
+#define os_uTStep (*(real_t*)0xD01DC4)
+#define os_uPlotStart (*(real_t*)0xD01DCD)
+#define os_unMax (*(real_t*)0xD01DD6)
+#define os_uu0 (*(real_t*)0xD01DDF)
+#define os_uv0 (*(real_t*)0xD01DE8)
+#define os_unMin (*(real_t*)0xD01DF1)
+#define os_uu02 (*(real_t*)0xD01DFA)
+#define os_uv02 (*(real_t*)0xD01E03)
+#define os_uw0 (*(real_t*)0xD01E0C)
+#define os_uPlotStep (*(real_t*)0xD01E15)
+#define os_uXres (*(real_t*)0xD01E1E)
+#define os_uw02 (*(real_t*)0xD01E27)
+#define os_XMin (*(real_t*)0xD01E33)
+#define os_XMax (*(real_t*)0xD01E3C)
+#define os_XScl (*(real_t*)0xD01E45)
+#define os_YMin (*(real_t*)0xD01E4E)
+#define os_YMax (*(real_t*)0xD01E57)
+#define os_YScl (*(real_t*)0xD01E60)
+#define os_ThetaMin (*(real_t*)0xD01E69)
+#define os_ThetaMax (*(real_t*)0xD01E72)
+#define os_ThetaStep (*(real_t*)0xD01E7B)
+#define os_TMinPar (*(real_t*)0xD01E84)
+#define os_TMaxPar (*(real_t*)0xD01E8D)
+#define os_TStep (*(real_t*)0xD01E96)
+#define os_PlotStart (*(real_t*)0xD01E9F)
+#define os_NMax (*(real_t*)0xD01EA8)
+#define os_u0 (*(real_t*)0xD01EB1)
+#define os_V0 (*(real_t*)0xD01EBA)
+#define os_NMin (*(real_t*)0xD01EC3)
+#define os_u02 (*(real_t*)0xD01ECC)
+#define os_V02 (*(real_t*)0xD01ED5)
+#define os_W0 (*(real_t*)0xD01EDE)
+#define os_PlotStep (*(real_t*)0xD01EE7)
+#define os_XResO (*(real_t*)0xD01EF0)
+#define os_W02 (*(real_t*)0xD01EF9)
+#define os_un1 (*(real_t*)0xD01F02)
+#define os_un2 (*(real_t*)0xD01F0B)
+#define os_Vn1 (*(real_t*)0xD01F14)
+#define os_Vn2 (*(real_t*)0xD01F1D)
+#define os_Wn1 (*(real_t*)0xD01F26)
+#define os_Wn2 (*(real_t*)0xD01F2F)
+#define os_Fin_N (*(real_t*)0xD01F38)
+#define os_Fin_I (*(real_t*)0xD01F41)
+#define os_Fin_PV (*(real_t*)0xD01F4A)
+#define os_Fin_PMT (*(real_t*)0xD01F53)
+#define os_Fin_FV (*(real_t*)0xD01F5C)
+#define os_Fin_PY (*(real_t*)0xD01F65)
+#define os_Fin_CY (*(real_t*)0xD01F6E)
+#define os_Cal_N (*(real_t*)0xD01F77)
+#define os_Cal_I (*(real_t*)0xD01F80)
+#define os_Cal_PV (*(real_t*)0xD01F89)
+#define os_Cal_PMT (*(real_t*)0xD01F92)
+#define os_Cal_FV (*(real_t*)0xD01F9B)
+#define os_Cal_PY (*(real_t*)0xD01FA4)
+
+#define os_CmdShadow ((uint8_t*)0xD0232D)
+
+#define os_Y1LineType (*(uint8_t*)0xD024BF)
+#define os_Y2LineType (*(uint8_t*)0xD024C0)
+#define os_Y3LineType (*(uint8_t*)0xD024C1)
+#define os_Y4LineType (*(uint8_t*)0xD024C2)
+#define os_Y5LineType (*(uint8_t*)0xD024C3)
+#define os_Y6LineType (*(uint8_t*)0xD024C4)
+#define os_Y7LineType (*(uint8_t*)0xD024C5)
+#define os_Y8LineType (*(uint8_t*)0xD024C6)
+#define os_Y9LineType (*(uint8_t*)0xD024C7)
+#define os_Y0LineType (*(uint8_t*)0xD024C8)
+#define os_Para1LineType (*(uint8_t*)0xD024C9)
+#define os_Para2LineType (*(uint8_t*)0xD024CA)
+#define os_Para3LineType (*(uint8_t*)0xD024CB)
+#define os_Para4LineType (*(uint8_t*)0xD024CC)
+#define os_Para5LineType (*(uint8_t*)0xD024CD)
+#define os_Para6LineType (*(uint8_t*)0xD024CE)
+#define os_Polar1LineType (*(uint8_t*)0xD024CF)
+#define os_Polar2LineType (*(uint8_t*)0xD024D0)
+#define os_Polar3LineType (*(uint8_t*)0xD024D1)
+#define os_Polar4LineType (*(uint8_t*)0xD024D2)
+#define os_Polar5LineType (*(uint8_t*)0xD024D3)
+#define os_Polar6LineType (*(uint8_t*)0xD024D4)
+#define os_SecULineType (*(uint8_t*)0xD024D5)
+#define os_SecVLineType (*(uint8_t*)0xD024D6)
+#define os_SecWLineType (*(uint8_t*)0xD024D7)
+#define os_Y1LineColor (*(uint8_t*)0xD024D8)
+#define os_Y2LineColor (*(uint8_t*)0xD024D9)
+#define os_Y3LineColor (*(uint8_t*)0xD024DA)
+#define os_Y4LineColor (*(uint8_t*)0xD024DB)
+#define os_Y5LineColor (*(uint8_t*)0xD024DC)
+#define os_Y6LineColor (*(uint8_t*)0xD024DD)
+#define os_Y7LineColor (*(uint8_t*)0xD024DE)
+#define os_Y8LineColor (*(uint8_t*)0xD024DF)
+#define os_Y9LineColor (*(uint8_t*)0xD024E0)
+#define os_Y0LineColor (*(uint8_t*)0xD024E1)
+#define os_Para1LineColor (*(uint8_t*)0xD024E2)
+#define os_Para2LineColor (*(uint8_t*)0xD024E3)
+#define os_Para3LineColor (*(uint8_t*)0xD024E4)
+#define os_Para4LineColor (*(uint8_t*)0xD024E5)
+#define os_Para5LineColor (*(uint8_t*)0xD024E6)
+#define os_Para6LineColor (*(uint8_t*)0xD024E7)
+#define os_Polar1LineColor (*(uint8_t*)0xD024E8)
+#define os_Polar2LineColor (*(uint8_t*)0xD024E9)
+#define os_Polar3LineColor (*(uint8_t*)0xD024EA)
+#define os_Polar4LineColor (*(uint8_t*)0xD024EB)
+#define os_Polar5LineColor (*(uint8_t*)0xD024EC)
+#define os_Polar6LineColor (*(uint8_t*)0xD024ED)
+#define os_SecULineColor (*(uint8_t*)0xD024EE)
+#define os_SecVLineColor (*(uint8_t*)0xD024EF)
+#define os_SecWLineColor (*(uint8_t*)0xD024F0)
+
+#define os_AppErr1 ((char*)0xD025A9) /**< String [1] for custom error */
+#define os_AppErr2 ((char*)0xD025B6) /**< String [2] for custom error */
+
+#define os_CursorHookPtr (*(uint24_t*)0xD025D5)
+#define os_LibraryHookPtr (*(uint24_t*)0xD025D8)
+#define os_RawKeyHookPtr (*(uint24_t*)0xD025DB)
+#define os_GetKeyHookPtr (*(uint24_t*)0xD025DE)
+#define os_HomescreenHookPtr (*(uint24_t*)0xD025E1)
+#define os_WindowHookPtr (*(uint24_t*)0xD025E4)
+#define os_GraphHookPtr (*(uint24_t*)0xD025E7)
+#define os_YEqualsHookPtr (*(uint24_t*)0xD025EA)
+#define os_FontHookPtr (*(uint24_t*)0xD025ED)
+#define os_RegraphHookPtr (*(uint24_t*)0xD025F0)
+#define os_GraphicsHookPtr (*(uint24_t*)0xD025F3)
+#define os_TraceHookPtr (*(uint24_t*)0xD025F6)
+#define os_ParserHookPtr (*(uint24_t*)0xD025F9)
+#define os_AppChangeHookPtr (*(uint24_t*)0xD025FC)
+#define os_Catalog1HookPtr (*(uint24_t*)0xD025FF)
+#define os_HelpHookPtr (*(uint24_t*)0xD02602)
+#define os_CxRedispHookPtr (*(uint24_t*)0xD02605)
+#define os_MenuHookPtr (*(uint24_t*)0xD02608)
+#define os_Catalog2HookPtr (*(uint24_t*)0xD0260B)
+#define os_TokenHookPtr (*(uint24_t*)0xD0260E)
+#define os_LocalizeHookPtr (*(uint24_t*)0xD02611)
+#define os_SilentLinkHookPtr (*(uint24_t*)0xD02614)
+#define os_ActiveUSBHookPtr (*(uint24_t*)0xD0261A)
+
+#define os_TempFreeArc (*(uint24_t*)0xD02655) /**< Set after asm_ArcChk call */
+
+#define os_TextBGcolor (*(uint16_t*)0xD02688) /**< Large font background color */
+#define os_TextFGcolor (*(uint16_t*)0xD0268A) /**< Large font foreground color */
+
+#define os_DrawBGColor (*(uint16_t*)0xD026AA) /**< Small font background color */
+#define os_DrawFGColor (*(uint16_t*)0xD026AC) /**< Small font foreground color */
+#define os_DrawColorCode (*(uint8_t*)0xD026AE)
+
+#define os_BatteryStatus (*(uint8_t*)0xD02A86)
+
+#define os_GraphBGColor (*(uint16_t*)0xD02A98) /**< Graph background 565 color */
+
+#define os_FillRectColor (*(uint16_t*)0xD02AC0)
+#define os_StatusBarBGColor (*(uint16_t*)0xD02ACC) /**< Status bar 565 color */
+
+#define os_TmpYears (*(real_t*)0xD02B01)
+#define os_TmpMonths (*(real_t*)0xD02B0A)
+#define os_TmpDays (*(real_t*)0xD02B13)
+#define os_TmpHours (*(real_t*)0xD02B1C)
+#define os_TmpMinutes (*(real_t*)0xD02B25)
+
+#define os_RamCode ((uint8_t*)0xD18C7C) /**< 1023 bytes free ram */
+
+/*
+ * TI-OS Token definitions
+ */
+
+#define tToDMS 0x01
+#define tToDEC 0x02
+#define tToAbc 0x03
+#define tStore 0x04
+#define tBoxPlot 0x05
+#define tLBrack 0x06
+#define tRBrack 0x07
+#define tLBrace 0x08
+#define tRBrace 0x09
+#define tFromRad 0x0A
+#define tFromDeg 0x0B
+#define tRecip 0x0C
+#define tSqr 0x0D
+#define tTrnspos 0x0E
+#define tCube 0x0F
+#define tLParen 0x10
+#define tRParen 0x11
+#define tRound 0x12
+#define tPxTst 0x13
+#define tAug 0x14
+#define tRowSwap 0x15
+#define tRowPlu 0x16
+#define tmRow 0x17
+#define tmRowPlus 0x18
+#define tMax 0x19 // 'max'
+#define tMin 0x1A // 'min'
+#define tRToPr 0x1B // 'R>Pr'
+#define tRToPo 0x1C // 'R>Po'
+#define tPToRx 0x1D // 'P>Rx'
+#define tPToRy 0x1E // 'P>Ry'
+#define tMedian 0x1F // 'MEDIAN'
+#define tRandM 0x20 // 'randM'
+#define tMean 0x21 // 'MEAN'
+#define tRoot 0x22 // 'ROOT'
+#define tSeries 0x23 // 'seq'
+#define tFnInt 0x24 // 'fnInt'
+#define tNDeriv 0x25 // 'fnIr'
+#define tEvalF 0x26
+#define tFmin 0x27
+#define tFmax 0x28
+#define tSpace 0x29 // ' '
+#define tString 0x2A // '"'
+#define tComma 0x2B // ','
+#define tii 0x2C // 'i'
+#define tFact 0x2D // '!'
+#define tCubicR 0x2E
+#define tQuartR 0x2F
+#define t0 0x30
+#define t1 0x31
+#define t2 0x32
+#define t3 0x33
+#define t4 0x34
+#define t5 0x35
+#define t6 0x36
+#define t7 0x37
+#define t8 0x38
+#define t9 0x39
+#define tDecPt 0x3A // '.'
+#define tee 0x3B // 'e'
+#define tOr 0x3C // '_or_'
+#define tXor 0x3D
+#define tColon 0x3E // ':'
+#define tEnter 0x3F
+#define tAnd 0x40 // '_and_'
+#define tA 0x41
+#define tB 0x42
+#define tC 0x43
+#define tD 0x44
+#define tE 0x45
+#define tF 0x46
+#define tG 0x47
+#define tH 0x48
+#define tI 0x49
+#define tJ 0x4A
+#define tK 0x4B
+#define tL 0x4C
+#define tM 0x4D
+#define tN 0x4E
+#define tO 0x4F
+#define tP 0x50
+#define tQ 0x51
+#define tR 0x52
+#define tS 0x53
+#define tT 0x54
+#define tU 0x55
+#define tV 0x56
+#define tW 0x57
+#define tX 0x58
+#define tY 0x59
+#define tZ 0x5A
+#define tTheta 0x5B
+#define tProg 0x5F
+
+/*
+ * Mode settings tokens
+ */
+#define tRad 0x64 // 'Radian'
+#define tDeg 0x65 // 'Degree'
+#define tNormF 0x66 // 'Normal'
+#define tSci 0x67 // 'Sci'
+#define tEng 0x68 // 'Eng'
+#define tFloat 0x69 // 'Float'
+#define tFix 0x73 // 'Fix_'
+#define tSplitOn 0x74
+#define tFullScreen 0x75
+#define tStndrd 0x76 // 'Func'
+#define tParam 0x77 // 'Param'
+#define tPolar 0x78 // 'Pol'
+#define tSeqG 0x79 // ;79h
+#define tAFillOn 0x7A // 'AUTO FILL ON'
+#define tAFillOff 0x7B // 'AutoFill OFF'
+#define tACalcOn 0x7C
+#define tACalcOff 0x7D
+
+#define tEQ 0x6A // '='
+#define tLT 0x6B // '<'
+#define tGT 0x6C // '>'
+#define tLE 0x6D // LLE
+#define tGE 0x6E // LGE
+#define tNE 0x6F // LNE
+#define tAdd 0x70 // '+'
+#define tSub 0x71 // '-'
+#define tAns 0x72
+#define tMul 0x82 // '*'
+#define tDiv 0x83 // '/'
+
+#define tBoxIcon 0x7F
+#define tCrossIcon 0x80
+#define tDotIcon 0x81
+
+#define tTrace 0x84 // 'Trace'
+#define tClDrw 0x85 // 'ClrDraw'
+#define tZoomStd 0x86 // 'ZStd'
+#define tZoomtrg 0x87 // 'Ztrg'
+#define tZoomBox 0x88 // 'ZBOX'
+#define tZoomIn 0x89 // 'ZIn'
+#define tZoomOut 0x8A // 'ZOut'
+#define tZoomSqr 0x8B // 'ZSqr'
+#define tZoomInt 0x8C // 'ZInt'
+#define tZoomPrev 0x8D // 'ZPrev'
+#define tZoomDec 0x8E // 'ZDecm'
+#define tZoomStat 0x8F // 'ZStat
+#define tUsrZm 0x90 // 'ZRcl'
+#define tPrtScrn 0x91 // 'PrtScrn'
+#define tZoomSto 0x92 // 'ZSto'
+#define tText 0x93
+
+#define tnPr 0x94 // '_nPr_'
+#define tnCr 0x95 // '_nCr_'
+
+// Graph Commands
+#define tYOn 0x96 // 'FnOn_'
+#define tYOff 0x97 // 'FnOff_'
+#define tStPic 0x98 // 'StPic_'
+#define tRcPic 0x99 // 'RcPic_'
+#define tStoDB 0x9A // 'StGDB_'
+#define tRclDB 0x9B // 'RcGDB_'
+#define tLine 0x9C // 'Line'
+#define tVert 0x9D // 'Vert_'
+#define tPtOn 0x9E // 'PtOn'
+#define tPtOff 0x9F // 'PtOff'
+#define tPtChg 0xA0 // 'PtChg'
+#define tPXOn 0xA1
+#define tPXOff 0xA2
+#define tPXChg 0xA3
+#define tShade 0xA4 // 'Shade'
+#define tCircle 0xA5 // 'Circle'
+#define tHorz 0xA6 // 'HORIZONTAL'
+#define tTanLn 0xA7 // 'TanLn'
+#define tDrInv 0xA8 // 'DrInv_'
+#define tDrawF 0xA9 // 'DrawF_'
+
+// Functions with no argument
+#define tRand 0xAB // 'rand'
+#define tPi 0xAC // Lpi
+#define tGetKey 0xAD // 'getKy'
+#define tAPost 0xAE // '''
+#define tQuest 0xAF // '?'
+#define tChs 0xB0
+#define tInt 0xB1
+#define tAbs 0xB2
+#define tDet 0xB3
+#define tIdent 0xB4
+#define tDim 0xB5
+#define tSum 0xB6
+#define tProd 0xB7
+#define tNot 0xB8
+#define tIPart 0xB9
+#define tFPart 0xBA
+
+// New 2 Byte Tokens
+#define t2ByteTok 0xBB
+#define tSqrt 0xBC
+#define tCubRt 0xBD
+#define tLn 0xBE
+#define tExp 0xBF
+#define tLog 0xC0
+#define tALog 0xC1
+#define tSin 0xC2
+#define tASin 0xC3
+#define tCos 0xC4
+#define tACos 0xC5
+#define tTan 0xC6
+#define tATan 0xC7
+#define tSinH 0xC8
+#define tASinH 0xC9
+#define tCoshH 0xCA
+#define tACosH 0xCB
+#define tTanH 0xCC
+#define tATanH 0xCD
+
+// Some Programming Commands
+#define tIf 0xCE // 'If_'
+#define tThen 0xCF // 'Then_'
+#define tElse 0xD0 // 'Else_'
+#define tWhile 0xD1 // 'While_'
+#define tRepeat 0xD2 // 'Repeat_'
+#define tFor 0xD3 // 'For_'
+#define tEnd 0xD4 // 'End'
+#define tReturn 0xD5 // 'Return'
+#define tLbl 0xD6 // 'Lbl_'
+#define tGoto 0xD7 // 'Goto_'
+#define tPause 0xD8 // 'Pause_'
+#define tStop 0xD9 // 'Stop'
+#define tISG 0xDA // 'IS>'
+#define tDSL 0xDB // 'DS<'
+#define tInput 0xDC // 'Input_'
+#define tPrompt 0xDD // 'Prompt_'
+#define tDisp 0xDE // 'Disp_'
+#define tDispG 0xDF // 'DispG'
+#define tOutput 0xE0 // 'Outpt'
+#define tClLCD 0xE1 // 'ClLCD'
+#define tConst 0xE2 // 'Fill'
+#define tSortA 0xE3 // 'sortA_'
+#define tSortD 0xE4 // 'sortD_'
+#define tDispTab 0xE5 // 'Disp Table
+#define tMenu 0xE6 // 'Menu'
+#define tSendMBL 0xE7 // 'Send'
+#define tGetMBL 0xE8 // 'Get'
+
+// Stat Plot Commands
+#define tPlotOn 0xE9 // 'PLOTSON'
+#define tPlotOff 0xEA // 'PLOTSOFF
+#define tListName 0xEB // List Designator
+#define tPlot1 0xEC
+#define tPlot2 0xED
+#define tPlot3 0xEE
+#define tUnused01 0xEF // available?
+#define tPower 0xF0 // '^'
+#define tXRoot 0xF1 // LsupX,Lroot
+#define tOneVar 0xF2 // 'OneVar_'
+#define tTwoVar 0xF3
+#define tLR 0xF4 // 'LinR(A+BX)'
+#define tLRExp 0xF5 // 'ExpR_'
+#define tLRLn 0xF6 // 'LnR_'
+#define tLRPwr 0xF7 // 'PwrR_'
+#define tMedMed 0xF8
+#define tQuad 0xF9
+#define tClrLst 0xFA // 'Clear List'
+#define tClrTbl 0xFB // 'Clear Table'
+#define tHist 0xFC // 'Hist_'
+#define txyLine 0xFD // 'xyline_'
+#define tScatter 0xFE // 'Scatter_'
+#define tLR1 0xFF // 'LINR(AX+B)'
+
+#define tGFormat 0x7E
+// 2nd Half Of Graph Format Tokens
+#define tSeq 0x00 // 'SeqG'
+#define tSimulG 0x01 // 'SimulG'
+#define tPolarG 0x02 // 'PolarGC'
+#define tRectG 0x03 // 'RectGC'
+#define tCoordOn 0x04 // 'CoordOn'
+#define tCoordOff 0x05 // 'CoordOff'
+#define tDrawLine 0x06 // 'DrawLine'
+#define tDrawDot 0x07 // 'DrawDot'
+#define tAxisOn 0x08 // 'AxesOn'
+#define tAxisOff 0x09 // 'AxesOff'
+#define tGridOn 0x0A // 'GridOn'
+#define tGridOff 0x0B // 'GridOff'
+#define tLblOn 0x0C // 'LabelOn'
+#define tLblOff 0x0D // 'LabelOff'
+#define tWebOn 0x0E // 'WebOn'
+#define tWebOff 0x0F // 'WebOFF'
+#define tuv 0x10 // U vs V
+#define tvw 0x11 // V vs W
+#define tuw 0x12 // U vs W
+
+#define tVarMat 0x5C
+// 2nd Half Of User Matrix Tokens
+#define tMatA 0x00 // MAT A
+#define tMatB 0x01 // MAT B
+#define tMatC 0x02 // MAT C
+#define tMatD 0x03 // MAT D
+#define tMatE 0x04 // MAT E
+#define tMatF 0x05 // MAT F
+#define tMatG 0x06 // MAT G
+#define tMatH 0x07 // MAT H
+#define tMatI 0x08 // MAT I
+#define tMatJ 0x09 // MAT J
+
+#define tVarLst 0x5D
+// 2nd Half Of User List Tokens
+#define tL1 0x00 // LIST 1
+#define tL2 0x01 // LIST 2
+#define tL3 0x02 // LIST 3
+#define tL4 0x03 // LIST 4
+#define tL5 0x04 // LIST 5
+#define tL6 0x05 // LIST 6
+
+#define tVarEqu 0x5E
+// 2nd Half Of User Equation Tokens
+
+// Y Equations have bit 4 set
+#define tY1 0x10 // Y1
+#define tY2 0x11 // Y2
+#define tY3 0x12 // Y3
+#define tY4 0x13 // Y4
+#define tY5 0x14 // Y5
+#define tY6 0x15 // Y6
+#define tY7 0x16 // Y7
+#define tY8 0x17 // Y8
+#define tY9 0x18 // Y9
+#define tY0 0x19 // Y0
+
+// Param Equations Have Bit 5 Set
+#define tX1T 0x20 // X1t
+#define tY1T 0x21 // Y1t
+#define tX2T 0x22 // X2t
+#define tY2T 0x23 // Y2t
+#define tX3T 0x24 // X3t
+#define tY3T 0x25 // Y3t
+#define tX4T 0x26 // X4t
+#define tY4T 0x27 // Y4t
+#define tX5T 0x28 // X5t
+#define tY5T 0x29 // Y5t
+#define tX6T 0x2A // X6t
+#define tY6T 0x2B // Y6t
+
+// Polar Equations Have Bit 6 Set
+#define tR1 0x40 // R1
+#define tR2 0x41 // R2
+#define tR3 0x42 // R3
+#define tR4 0x43 // R4
+#define tR5 0x44 // R5
+#define tR6 0x45 // R6
+
+// Recursion Equations Have Bit 7 Set
+#define tun 0x80 // Un
+#define tvn 0x81 // Vn
+#define twn 0x82 // Wn
+
+#define tVarPict 0x60
+// 2nd Half User Picture Tokens
+#define tPic1 0x00 // PIC1
+#define tPic2 0x01 // PIC2
+#define tPic3 0x02 // PIC3
+#define tPic4 0x03 // PIC4
+#define tPic5 0x04 // PIC5
+#define tPic6 0x05 // PIC6
+#define tPic7 0x06 // PIC7
+#define tPic8 0x07 // PIC8
+#define tPic9 0x08 // PIC9
+#define tPic0 0x09 // PIC0
+
+#define tVarGDB 0x61
+// 2nd Half User Graph Database Tokens
+#define tGDB1 0x00 // GDB1
+#define tGDB2 0x01 // GDB2
+#define tGDB3 0x02 // GDB3
+#define tGDB4 0x03 // GDB4
+#define tGDB5 0x04 // GDB5
+#define tGDB6 0x05 // GDB6
+#define tGDB7 0x06 // GDB7
+#define tGDB8 0x07 // GDB8
+#define tGDB9 0x08 // GDB9
+#define tGDB0 0x09 // GDB0
+
+#define tVarStrng 0xAA
+// 2nd Half Of String Vars
+#define tStr1 0x00
+#define tStr2 0x01
+#define tStr3 0x02
+#define tStr4 0x03
+#define tStr5 0x04
+#define tStr6 0x05
+#define tStr7 0x06
+#define tStr8 0x07
+#define tStr9 0x08
+#define tStr0 0x09
+
+#define tVarOut 0x62
+// 2nd Half Of System Output Only Variables
+#define tRegEq 0x01 // REGRESSION EQUATION
+#define tStatN 0x02 // STATISTICS N
+#define tXMean 0x03 // X MEAN
+#define tSumX 0x04 // SUM(X)
+#define tSumXSqr 0x05 // SUM(X^2)
+#define tStdX 0x06 // STANDARD DEV X
+#define tStdPX 0x07 // STANDARD DEV POP X
+#define tMinX 0x08 // Min X VALUE
+#define tMaxX 0x09 // Max X VALUE
+#define tMinY 0x0A // Min Y VALUE
+#define tMaxY 0x0B // Max Y VALUE
+#define tYmean 0x0C // Y MEAN
+#define tSumY 0x0D // SUM(Y)
+#define tSumYSqr 0x0E // SUM(Y^2)
+#define tStdY 0x0F // STANDARD DEV Y
+#define tStdPY 0x10 // STANDARD DEV POP Y
+#define tSumXY 0x11 // SUM(XY)
+#define tCorr 0x12 // CORRELATION
+#define tMedX 0x13 // MED(X)
+#define tQ1 0x14 // 1ST QUADRANT OF X
+#define tQ3 0x15 // 3RD QUADRANT OF X
+#define tQuadA 0x16 // 1ST TERM OF QUAD POLY REG/ Y-INT
+#define tQuadB 0x17 // 2ND TERM OF QUAD POLY REG/ SLOPE
+#define tQuadC 0x18 // 3RD TERM OF QUAD POLY REG
+#define tCubeD 0x19 // 4TH TERM OF CUBIC POLY REG
+#define tQuartE 0x1A // 5TH TERM OF QUART POLY REG
+#define tMedX1 0x1B // x1 FOR MED-MED
+#define tMedX2 0x1C // x2 FOR MED-MED
+#define tMedX3 0x1D // x3 FOR MED-MED
+#define tMedY1 0x1E // y1 FOR MED-MED
+#define tMedY2 0x1F // y2 FOR MED-MED
+#define tMedY3 0x20 // y3 FOR MED-MED
+#define tRecurn 0x21 // RECURSION N
+#define tStatP 0x22
+#define tStatZ 0x23
+#define tStatT 0x24
+#define tStatChi 0x25
+#define tStatF 0x26
+#define tStatDF 0x27
+#define tStatPhat 0x28
+#define tStatPhat1 0x29
+#define tStatPhat2 0x2A
+#define tStatMeanX1 0x2B
+#define tStatStdX1 0x2C
+#define tStatN1 0x2D
+#define tStatMeanX2 0x2E
+#define tStatStdX2 0x2F
+#define tStatN2 0x30
+#define tStatStdXP 0x31
+#define tStatLower 0x32
+#define tStatUpper 0x33
+#define tStat_s 0x34
+#define tLRSqr 0x35
+#define tBRSqr 0x36
+
+// These next tokens are only used to access the data
+// They are display only and the user cannot access them at all
+#define tF_DF 0x37
+#define tF_SS 0x38
+#define tF_MS 0x39
+#define tE_DF 0x3A
+#define tE_SS 0x3B
+#define tE_MS 0x3C
+
+#define tVarSys 0x63
+// 2nd Half Of System Input/Output Variables
+#define tuXscl 0x00
+#define tuYscl 0x01
+#define tXscl 0x02
+#define tYscl 0x03
+#define tRecuru0 0x04
+#define tRecurv0 0x05
+#define tun1 0x06
+#define tvn1 0x07
+#define tuRecuru0 0x08
+#define tuRecurv0 0x09
+#define tXmin 0x0A
+#define tXmax 0x0B
+#define tYmin 0x0C
+#define tYmax 0x0D
+#define tTmin 0x0E
+#define tTmax 0x0F
+#define tThetaMin 0x10
+#define tThetaMax 0x11
+#define tuXmin 0x12
+#define tuXmax 0x13
+#define tuYmin 0x14
+#define tuYmax 0x15
+#define tuThetMin 0x16
+#define tuThetMax 0x17
+#define tuTmin 0x18
+#define tuTmax 0x19
+#define tTblMin 0x1A
+#define tPlotStart 0x1B
+#define tuPlotStart 0x1C
+#define tnMax 0x1D
+#define tunMax 0x1E
+#define tnMin 0x1F
+#define tunMin 0x20
+#define tTblStep 0x21
+#define tTStep 0x22
+#define tThetaStep 0x23
+#define tuTStep 0x24
+#define tuThetStep 0x25
+#define tDeltaX 0x26
+#define tDeltaY 0x27
+#define tXFact 0x28
+#define tYFact 0x29
+#define tTblInput 0x2A
+#define tFinN 0x2B
+#define tFinI 0x2C
+#define tFinPV 0x2D
+#define tFinPMT 0x2E
+#define tFinFV 0x2F
+#define tFinPY 0x30
+#define tFinCY 0x31
+#define tRecurw0 0x32
+#define tuRecurw0 0x33
+#define tPlotStep 0x34
+#define tuPlotStep 0x35
+#define tXres 0x36
+#define tuXres 0x37
+#define tRecuru02 0x38
+#define tuRecuru02 0x39
+#define tRecurv02 0x3C
+#define tuRecurv02 0x3D
+#define tRecurw02 0x3E
+#define tuRecurw02 0x3F
+
+// 2nd Byte Of t2ByteTok Tokens
+#define tFinNPV 0x00
+#define tFinIRR 0x01
+#define tFinBAL 0x02
+#define tFinPRN 0x03
+#define tFinINT 0x04
+#define tFinToNom 0x05
+#define tFinToEff 0x06
+#define tFinDBD 0x07
+#define tLCM 0x08
+#define tGCD 0x09
+#define tRandInt 0x0A
+#define tRandBin 0x0B
+#define tSubStrng 0x0C
+#define tStdDev 0x0D
+#define tVariance 0x0E
+#define tInStrng 0x0F
+#define tDNormal 0x10
+#define tInvNorm 0x11
+#define tDT 0x12
+#define tChI 0x13
+#define tDF 0x14
+#define tBINPDF 0x15
+#define tBINCDF 0x16
+#define tPOIPDF 0x17
+#define tPOICDF 0x18
+#define tGEOPDF 0x19
+#define tGEOCDF 0x1A
+#define tNormalPDF 0x1B
+#define tTPDF 0x1C
+#define tChiPDF 0x1D
+#define tFPDF 0x1E
+#define tRandNorm 0x1F
+#define tFinFPMT 0x20
+#define tFinFI 0x21
+#define tFinFPV 0x22
+#define tFinFN 0x23
+#define tFinFFV 0x24
+#define tConj 0x25
+#define tReal 0x26
+#define tImag 0x27
+#define tAngle 0x28
+#define tCumSum 0x29
+#define tExpr 0x2A
+#define tLength 0x2B
+#define tDeltaLst 0x2C
+#define tRef 0x2D
+#define tRRef 0x2E
+#define tToRect 0x2F
+#define tToPolar 0x30
+#define tConste 0x31
+#define tSinReg 0x32
+#define tLogistic 0x33
+#define tLinRegTTest 0x34
+#define tShadeNorm 0x35
+#define tShadeT 0x36
+#define tShadeChi 0x37
+#define tShadeF 0x38
+#define tMatToLst 0x39
+#define tLstToMat 0x3A
+#define tZTest 0x3B
+#define tTTest 0x3C
+#define t2SampZTest 0x3D
+#define t1PropZTest 0x3E
+#define t2PropZTest 0x3F
+#define tChiTest 0x40
+#define tZIntVal 0x41
+#define t2SampZInt 0x42
+#define t1PropZInt 0x43
+#define t2PropZInt 0x44
+#define tGraphStyle 0x45
+#define t2SampTTest 0x46
+#define t2SampFTest 0x47
+#define tTIntVal 0x48
+#define t2SampTInt 0x49
+#define tSetupLst 0x4A
+#define tFinPMTend 0x4B
+#define tFinPMTbeg 0x4C
+#define tRealM 0x4D
+#define tPolarM 0x4E
+#define tRectM 0x4F
+#define tExprOn 0x50
+#define tExprOff 0x51
+#define tClrAllLst 0x52
+#define tGetCalc 0x53
+#define tDelVar 0x54
+#define tEquToStrng 0x55
+#define tStrngToequ 0x56
+#define tDelLast 0x57
+#define tSelect 0x58
+#define tANOVA 0x59
+#define tModBox 0x5A
+#define tNormProb 0x5B
+#define tMGT 0x64
+#define tZFit 0x65
+#define tDiag_on 0x66
+#define tDiag_off 0x67
+#define tArchive 0x68
+#define tUnarchive 0x69
+#define tAsm 0x6A
+#define tAsmComp 0x6B
+#define tAsmPrgm 0x6C
+#define tAsmCmp 0x6D
+#define tLcapAAcute 0x6E
+#define tLcapAGrave 0x6F
+#define tLcapACaret 0x70
+#define tLcapADier 0x71
+#define tLaAcute 0x72
+#define tLaGrave 0x73
+#define tLaCaret 0x74
+#define tLaDier 0x75
+#define tLcapEAcute 0x76
+#define tLcapEGrave 0x77
+#define tLcapECaret 0x78
+#define tLcapEDier 0x79
+#define tLeAcute 0x7A
+#define tLeGrave 0x7B
+#define tLeCaret 0x7C
+#define tLeDier 0x7D
+#define tLcapIGrave 0x7F
+#define tLcapICaret 0x80
+#define tLcapIDier 0x81
+#define tLiAcute 0x82
+#define tLiGrave 0x83
+#define tLiCaret 0x84
+#define tLiDier 0x85
+#define tLcapOAcute 0x86
+#define tLcapOGrave 0x87
+#define tLcapOCaret 0x88
+#define tLcapODier 0x89
+#define tLoAcute 0x8A
+#define tLoGrave 0x8B
+#define tLoCaret 0x8C
+#define tLoDier 0x8D
+#define tLcapUAcute 0x8E
+#define tLcapUGrave 0x8F
+#define tLcapUCaret 0x90
+#define tLcapUDier 0x91
+#define tLuAcute 0x92
+#define tLuGrave 0x93
+#define tLuCaret 0x94
+#define tLuDier 0x95
+#define tLcapCCed 0x96
+#define tLcCed 0x97
+#define tLcapNTilde 0x98
+#define tLnTilde 0x99
+#define tLaccent 0x9A
+#define tLgrave 0x9B
+#define tLdieresis 0x9C
+#define tLquesDown 0x9D
+#define tLexclamDown 0x9E
+#define tLalpha 0x9F
+#define tLbeta 0xA0
+#define tLgamma 0xA1
+#define tLcapDelta 0xA2
+#define tLdelta 0xA3
+#define tLepsilon 0xA4
+#define tLlambda 0xA5
+#define tLmu 0xA6
+#define tLpi 0xA7
+#define tLrho 0xA8
+#define tLcapSigma 0xA9
+#define tLphi 0xAB
+#define tLcapOmega 0xAC
+#define tLphat 0xAD
+#define tLchi 0xAE
+#define tLstatF 0xAF
+#define tLa 0xB0
+#define tLb 0xB1
+#define tLc 0xB2
+#define tLd 0xB3
+#define tLsmalle 0xB4
+#define tLf 0xB5
+#define tLsmallg 0xB6
+#define tLh 0xB7
+#define tLi 0xB8
+#define tLj 0xB9
+#define tLk 0xBA
+#define tLl 0xBC
+#define tLm 0xBD
+#define tLsmalln 0xBE
+#define tLo 0xBF
+#define tLp 0xC0
+#define tLq 0xC1
+#define tLsmallr 0xC2
+#define tLs 0xC3
+#define tLsmallt 0xC4
+#define tLu 0xC5
+#define tLv 0xC6
+#define tLw 0xC7
+#define tLx 0xC8
+#define tLy 0xC9
+#define tLz 0xCA
+#define tLsigma 0xCB
+#define tLtau 0xCC
+#define tLcapIAcute 0xCD
+#define tGarbageCollect 0xCE
+
+#define tExtTok 0xEF
+// 2nd Byte Of tExtTok Tokens
+#define tSetDate 0x00
+#define tSetTime 0x01
+#define tCheckTmr 0x02
+#define tSetDtFmt 0x03
+#define tSetTmFmt 0x04
+#define tTimeCnv 0x05
+#define tDayOfWk 0x06
+#define tGetDtStr 0x07
+#define tGetTmStr 0x08
+#define tGetDate 0x09
+#define tGetTime 0x0A
+#define tStartTmr 0x0B
+#define tGtDtFmt 0x0C
+#define tGetTmFmt 0x0D
+#define tIsClockOn 0x0E
+#define tClockOff 0x0F
+#define tClockOn 0x10
+#define tOpenLib 0x11
+#define tExecLib 0x12
+#define tInvT 0x13
+#define tChiSquaredTest 0x14
+#define tLinRegTInt 0x15
+#define tManualFit 0x16
+#define tZQuadrant 0x17
+#define tZFracHalf 0x18
+#define tZFracThird 0x19
+#define tZFracFourth 0x1A
+#define tZFracFifth 0x1B
+#define tZFracEighth 0x1C
+#define tZFracTenth 0x1D
+#define tFracSlash 0x2E
+#define tFracMixedNum 0x2F
+#define tSwapImProper 0x30
+#define tSwapFracDec 0x31
+#define tRemainder 0x32
+#define tSummationSigma 0x33
+#define tLogBase 0x34
+#define tRandIntNoRep 0x35
+#define tMathPrint 0x36
+#define tClassic 0x38
+#define tAutoAnswer 0x3B
+#define tDecAnswer 0x3C
+#define tFracAnswer 0x3D
+#define tBlue 0x41
+#define tRed 0x42
+#define tBlack 0x43
+#define tMagenta 0x44
+#define tGreen 0x45
+#define tOrange 0x46
+#define tBrown 0x47
+#define tNavy 0x48
+#define tLtBlue 0x49
+#define tYellow 0x4A
+#define tWhite 0x4B
+#define tLtGray 0x4C
+#define tMedGray 0x4D
+#define tGray 0x4E
+#define tDarkGray 0x4F
+#define tGraphColor 0x65
+#define tTextColor 0x67
+#define tBackgroundOn 0x5B
+#define tBackgroundOff 0x64
+#define tThin 0x74
+#define tBorderColor 0x6C
+#define tAsm84CPrgm 0x68
+#define tAsm84CCmp 0x69
+#define tAsm84CeCmp 0x7B
+#define tAsm84CePrgm 0x7A
+
+/* 2 byte extended tokens (tExtTok) present in OS 5.2 and above */
+#define tSEQn 0x8F /* 'SEQ(n)' */
+#define tSEQn1 0x90 /* 'SEQ(n+1)' */
+#define tSEQn2 0x91 /* 'SEQ(n+2)' */
+#define tLEFT 0x92 /* 'LEFT' */
+#define tCENTER 0x93 /* 'CENTER' */
+#define tRIGHT 0x94 /* 'RIGHT' */
+#define tInvBinom 0x95 /* 'invBinom(' */
+#define tWait 0x96 /* 'Wait_' */
+#define tToString 0x97 /* 'toString(' */
+#define tEval 0x98 /* 'eval(' */
+
+/*
+ * --- TIOS System error codes ---
+ */
+#define OS_E_EDIT (1<<7)
+#define OS_E_MASK (0x7F)
+#define OS_E_OVERFLOW (1+OS_E_EDIT)
+#define OS_E_DIVBY0 (2+OS_E_EDIT)
+#define OS_E_SINGULARMAT (3+OS_E_EDIT)
+#define OS_E_DOMAIN (4+OS_E_EDIT)
+#define OS_E_INCREMENT (5+OS_E_EDIT)
+#define OS_E_BREAK (6+OS_E_EDIT)
+#define OS_E_NONREAL (7+OS_E_EDIT)
+#define OS_E_SYNTAX (8+OS_E_EDIT)
+#define OS_E_DATATYPE (9+OS_E_EDIT)
+#define OS_E_ARGUMENT (10+OS_E_EDIT)
+#define OS_E_DIMMISMATCH (11+OS_E_EDIT)
+#define OS_E_DIMENSION (12+OS_E_EDIT)
+#define OS_E_UNDEFINED (13+OS_E_EDIT)
+#define OS_E_MEMORY (14+OS_E_EDIT)
+#define OS_E_INVALID (15+OS_E_EDIT)
+#define OS_E_ILLEGALNEST (16+OS_E_EDIT)
+#define OS_E_BOUND (17+OS_E_EDIT)
+#define OS_E_GRAPHRANGE (18+OS_E_EDIT)
+#define OS_E_ZOOM (19+OS_E_EDIT)
+#define OS_E_LABEL (20)
+#define OS_E_STAT (21)
+#define OS_E_SOLVER (22+OS_E_EDIT)
+#define OS_E_SINGULARITY (23+OS_E_EDIT)
+#define OS_E_SIGNCHANGE (24+OS_E_EDIT)
+#define OS_E_ITERATIONS (25+OS_E_EDIT)
+#define OS_E_BADGUESS (26+OS_E_EDIT)
+#define OS_E_STATPLOT (27)
+#define OS_E_TOLTOOSMALL (28+OS_E_EDIT)
+#define OS_E_RESERVED (29+OS_E_EDIT)
+#define OS_E_MODE (30+OS_E_EDIT)
+#define OS_E_LNKERR (31+OS_E_EDIT)
+#define OS_E_LNKMEMERR (32+OS_E_EDIT)
+#define OS_E_LNKTRANSERR (33+OS_E_EDIT)
+#define OS_E_LNKDUPERR (34+OS_E_EDIT)
+#define OS_E_LNKMEMFULL (35+OS_E_EDIT)
+#define OS_E_UNKNOWN (36+OS_E_EDIT)
+#define OS_E_SCALE (37+OS_E_EDIT)
+#define OS_E_IDNOTFOUND (38)
+#define OS_E_NOMODE (39+OS_E_EDIT)
+#define OS_E_VALIDATION (40)
+#define OS_E_LENGTH (41+OS_E_EDIT)
+#define OS_E_APPLICATION (42+OS_E_EDIT)
+#define OS_E_APPERR1 (43+OS_E_EDIT)
+#define OS_E_APPERR2 (44+OS_E_EDIT)
+#define OS_E_EXPIREDAPP (45)
+#define OS_E_BADADD (46)
+#define OS_E_ARCHIVED (47+OS_E_EDIT)
+#define OS_E_VERSION (48)
+#define OS_E_ARCHFULL (49)
+#define OS_E_VARIABLE (50+OS_E_EDIT)
+#define OS_E_DUPLICATE (51+OS_E_EDIT)
+
+/*
+ * --- TI-OS os_GetCSC Scan Code Return Values ---
+ */
+#define sk_Down 0x01
+#define sk_Left 0x02
+#define sk_Right 0x03
+#define sk_Up 0x04
+#define sk_Enter 0x09
+#define sk_2nd 0x36
+#define sk_Clear 0x0F
+#define sk_Alpha 0x30
+#define sk_Add 0x0A
+#define sk_Sub 0x0B
+#define sk_Mul 0x0C
+#define sk_Div 0x0D
+#define sk_Graph 0x31
+#define sk_Trace 0x32
+#define sk_Zoom 0x33
+#define sk_Window 0x34
+#define sk_Yequ 0x35
+#define sk_Mode 0x37
+#define sk_Del 0x38
+#define sk_Store 0x2A
+#define sk_Ln 0x2B
+#define sk_Log 0x2C
+#define sk_Square 0x2D
+#define sk_Recip 0x2E
+#define sk_Math 0x2F
+#define sk_0 0x21
+#define sk_1 0x22
+#define sk_4 0x23
+#define sk_7 0x24
+#define sk_2 0x1A
+#define sk_5 0x1B
+#define sk_8 0x1C
+#define sk_3 0x12
+#define sk_6 0x13
+#define sk_9 0x14
+#define sk_Comma 0x25
+#define sk_Sin 0x26
+#define sk_Apps 0x27
+#define sk_GraphVar 0x28
+#define sk_DecPnt 0x19
+#define sk_LParen 0x1D
+#define sk_Cos 0x1E
+#define sk_Prgm 0x1F
+#define sk_Stat 0x20
+#define sk_Chs 0x11
+#define sk_RParen 0x15
+#define sk_Tan 0x16
+#define sk_Vars 0x17
+#define sk_Power 0x0E
+
+/* Compatibility defines */
+#define prgm_CleanUp()
+#define pgrm_CleanUp()
+#define memset_fast memset
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/frontends/calculator/CEdev/include/usb.h b/frontends/calculator/CEdev/include/usb.h index 35d95d1..3bbf465 100644 --- a/frontends/calculator/CEdev/include/usb.h +++ b/frontends/calculator/CEdev/include/usb.h @@ -1,52 +1,52 @@ -/** - * @file - * @authors Matt "MateoConLechuga" Waltz - * @authors Jacob "jacobly" Young - * @brief USB communication routines - */ - -#ifndef H_USB -#define H_USB - -#include <stdint.h> -#include <stdbool.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @returns True if the usb bus line is powered, i.e. connected to a another calc - */ -bool usb_BusPowered(void); - -/** - * @returns True if the usb is self powered - */ -bool usb_SelfPowered(void); - -/** - * Resets the usb controller chip - */ -void usb_ResetChip(void); - -/** - * Disables the usb timer interrupt (timer 3) - */ -void usb_DisableTimers(void); - -/** - * Enables the usb timer interrupt (timer 3) - */ -void usb_EnableTimers(void); - -/** - * Resets the usb timer interrupt (timer 3) - */ -void usb_ResetTimers(void); - -#ifdef __cplusplus -} -#endif - -#endif +/**
+ * @file
+ * @authors Matt "MateoConLechuga" Waltz
+ * @authors Jacob "jacobly" Young
+ * @brief USB communication routines
+ */
+
+#ifndef H_USB
+#define H_USB
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @returns True if the usb bus line is powered, i.e. connected to a another calc
+ */
+bool usb_BusPowered(void);
+
+/**
+ * @returns True if the usb is self powered
+ */
+bool usb_SelfPowered(void);
+
+/**
+ * Resets the usb controller chip
+ */
+void usb_ResetChip(void);
+
+/**
+ * Disables the usb timer interrupt (timer 3)
+ */
+void usb_DisableTimers(void);
+
+/**
+ * Enables the usb timer interrupt (timer 3)
+ */
+void usb_EnableTimers(void);
+
+/**
+ * Resets the usb timer interrupt (timer 3)
+ */
+void usb_ResetTimers(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
|