free42 Custom Menus
Author: | Mitch Richling |
Updated: | 2024-11-21 16:49:06 |
Copyright 2024 Mitch Richling. All rights reserved.
Table of Contents
1. Metadata
The home for this HTML file is: https://richmit.github.io/hp42/custom.html
Files related to this document may be found on github: https://github.com/richmit/hp42
Directory contents:
src |
- | The org-mode file that generated this HTML document |
src_42s |
- | Ready to convert source listings for 42s code in this document |
docs |
- | This html document and associated PDF |
bin |
- | Importable RAW program files |
2. Introduction
The custom menu on the 42s is a wonderful thing, but it is also very limited. It's just too small!! And it is only one level deep!! So instead of simply assigning functions to the menu keys, how about assigning programs to the keys which present a hierarchical menu of functions? Coding up such programs is tedious. So this org-mode document has a Little bit of Emacs lisp that will consume a table, and generate a 42s program implementing a hierarchical menu.
The flow to create your custom CUST program:
- Evaluate the "Generic menu generator" babel block in the
hp42s-meta.org
file. This will define the functionMJR-generate-42-menu-code
- Evaluate the "For CUSTOM-type Menus" babel block in the
hp42s-meta.org
file. This will define the functionMJR-custom-x-gen
- Define your menu in the Menu Contents section.
- Evaluate the babel block in the Menu Code section below.
- Load the program on your calculator
2.1. Customizing Custom Menu Table
The first column (which I labeled Menu) describes the menu keys. Colons are used to define a menu hierarchy. For example "top:mid:thingy
" means we have a
top level menu "top
" containing a menu "mid
" containing a function/program "thingy
". Another entry like "top:thingy2
" would add a function/program
key "thingy2
"to the "top
" menu – yes menus can contain a mix of functions/programs and menus.
The only limitation on menu hierarchy depth or size comes from the use of two digit local labels in the generated code. A label is consume for each function/program and for each menu page.
The second column is the function/program name/label to call. If this is empty, then the menu name will be used. For example "SFUN:HYP:SINH
" will call the
SINH
function if no Program is specified.
The other columns of the table are not used.
3. Custom Menus
3.1. Menu Contents
Menu | Function/Program | |
---|---|---|
SFUN | https://richmit.github.io/hp42/math.html | |
MATH:POLY | https://richmit.github.io/hp42/math.html | |
MATH:FUNC | FMENU | https://richmit.github.io/hp42/pgmforfun.html |
MATH:VEC3 | https://richmit.github.io/hp42/math.html | |
MATH:NLA | https://richmit.github.io/hp42/math.html | |
BASE | https://richmit.github.io/hp42/base.html | |
PHIL | https://richmit.github.io/hp42/phil.html | |
MEAS | https://richmit.github.io/hp42/meas.html | |
DATE | DMENU | https://richmit.github.io/hp42/date.html |
CONS | https://richmit.github.io/hp42/cons.html | |
UNIT | https://richmit.github.io/hp42/unit.html | |
SIPFX | https://richmit.github.io/hp42/unit.html | |
UPROP | https://richmit.github.io/hp42/uprop.html |
3.2. Menu Code
The menu program is generated via the following bit of elisp. You must first define the MJR-generate-42-menu-code
and MJR-custom-x-gen
by evaluating the code blocks in the hp42s-meta.org
file.
(MJR-generate-42-menu-code "CUST" 0 tbl 0 1 'stay 'up 'auto #'MJR-custom-gen-lab #'MJR-custom-gen-sub)
4. Create system CUSTOM
Menu
Sometimes our carefully built in CUSTOM
menu is lost – an errant program or system memory clear. What to do? How about a program that will recreate your
CUSTOM
menu when you need it? In the table below we have the definition of our custom menu, and a bit of lisp that will write a 42s program to ASSIGN
each key.
KEY# | ASSIGNment | Only On |
---|---|---|
1 | CUST | |
2 | ||
3 | ||
4 | ||
5 | EEPFX | |
6 | ¦¦ | |
7 | VirtV | DM42 |
8 | ||
9 | ||
10 | ||
11 | ||
12 | ||
13 | SST | |
14 | SST↑ | |
15 | SST→ | |
16 | GTO | |
17 | XEQ | |
18 | VIEW | DM42 |
18 | PRV | !DM42 |
Simply evaluate the followign lisp block, and the 42s program will be created.
;; The generated code uses the existance of GrMod to guess if we are on a DM42 (princ (message "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ (ref:%s)\n" "MKCM")) (princ "@@@@ DSC: Autogenerated menu program\n") (princ "LBL \"MKCM\"\n") (princ "CLKEYS\n") (cl-loop for (da-key da-assignment da-pform) in tbl for da-assignment-fixed = (replace-regexp-in-string "¦" "|" da-assignment 't 't) for have-key = (not (zerop (length da-assignment-fixed))) when (and have-key (string-equal da-pform "DM42")) do (princ "SF 25\nRCL \"GrMod\"\nFS?C 25\n") when (and have-key (string-equal da-pform "!DM42")) do (princ "SF 25\nRCL \"GrMod\"\nFC?C 25\n") when have-key do (princ (message "ASSIGN \"%s\" TO %02d\n" da-assignment-fixed da-key)))) (princ "RTN\n")
5. SPREF
: Set some of my personal prefrences
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ (SPREF) @@@@ DSC: Set some of my personal prefrences @@@@ IN: N/A @@@@ OUT: N/A @@@@ TST: free42_3.0.2 @@@@ BUG: This sets some of *my* favorite prefrences. You might not like them. ;) @@@@ UPD: 2021-04-05 LBL "SPREF" FUNC 00 ALL @@@@ Display all digits RECT @@@@ Complex number format RAD @@@@ Angle mode CPXRES @@@@ Complex results RDX. @@@@ Use periods KEYASN @@@@ Custom menu DECM @@@@ Make sure we are in decimal mode 64 @@@@ WSIZE FS? 78 BSIGNED @@@@ Unsigned integer mode FS? 79 BWRAP @@@@ Don't wrap integers DMY @@@@ D.MY mode CLK12 @@@@ AM/PM mode 4STK @@@@ Four level stack EXITALL @@@@ Exit menus RTN
6. END
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
END