Esp32forth Update 🙜 April 9, 2022 CHANGES SINCE EARLY FEBRUARY 🙜 ⦿ Serial2 ⦿ Odds and ends ⦿ More floating point ⦿ Optimize variables/values ⦿ Goings on in the repo ⦿ Structures ⦿ Graphics SERIAL2 🙜 ⦿ Serial2.begin ⦿ Serial2.end ⦿ Serial2.available ⦿ Serial2.readBytes ⦿ Serial2.write ⦿ Serial2.flush ODDS AND ENDS 🙜 ⦿ FILL32, ?DUP ⦿ UW@, UL@ (Supplementing SW@, SL@) MORE FLOATING POINT 🙜 ⦿ FSIN, FCOS, FSINCOS, FATAN2 ⦿ F**, FLOOR, FEXP, FLN ⦿ FABS, FMIN, FMAX ⦿ FSQRT - use native OPTIMIZING CONSTANTS/VARIABLES/VALUES 🙜 ⦿ Fix duplication of DOCREATE, DODOES, DOCOL ⦿ ADDROF ⦿ Add DOCON, DOVAR, DOSET ⦿ Leverage better support for IMMEDIATE built-ins ⦿ Revise VALUE to use CONSTANT + DOSET OPTIMIZING CONSTANTS/VARIABLES (before) 🙜 ( Constants and Variables ) : constant ( n "name" -- ) create , does> @ ; : variable ( "name" -- ) create 0 , ; OPTIMIZING CONSTANTS/VARIABLES/VALUES 🙜 YV(internals, DOSET, *((cell_t *) *ip++) = tos; DROP) \ YV(internals, DOCON, DUP; tos = *(cell_t *) (w + sizeof(cell_t))) \ YV(internals, DOVAR, DUP; tos = w + sizeof(cell_t)) \ 🙜 YV(internals, DOCOL, ++rp; *rp = (cell_t) ip; ip = (cell_t *) (w + sizeof(cell_t))) \ YV(internals, DOCREATE, DUP; tos = w + sizeof(cell_t) * 2) \ YV(internals, DODOES, DUP; tos = w + sizeof(cell_t) * 2; \ ++rp; *rp = (cell_t) ip; \ ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t))) \ OPTIMIZING VALUES (before) 🙜 ( Values ) : value ( n -- ) create , does> @ ; : value-bind ( xt-val xt ) >r >body state @ if aliteral r> , else r> execute then ; : to ( n -- ) ' ['] ! value-bind ; immediate : +to ( n -- ) ' ['] +! value-bind ; immediate OPTIMIZING VALUES (after) 🙜 ( Values ) : value ( n -- ) constant ; : value-bind ( xt-val xt ) >r >body state @ if r@ ['] ! = if rdrop ['] doset , , else aliteral r> , then else r> execute then ; : to ( n -- ) ' ['] ! value-bind ; immediate : +to ( n -- ) ' ['] +! value-bind ; immediate ADDR_DOCOL -> ADDROF 🙜 #define ADDR_DOCOLON && OP_DOCOLON #define ADDR_DOCREATE && OP_DOCREATE #define ADDR_DODOES && OP_DODOES 🙜 #define ADDROF(x) (&& OP_ ## x) ADDR_DOCOL -> ADDROF 🙜 Y(VARIABLE, DUP; DUP; tos = parse(32, sp); \ create((const char *) *sp, tos, 0, ADDROF(DOVAR)); \ COMMA(0); DROPn(2)) \ Y(CONSTANT, DUP; DUP; tos = parse(32, sp); \ create((const char *) *sp, tos, 0, ADDROF(DOCON)); \ DROPn(2); COMMA(tos); DROP) \ MAKES SEE BETTER! 🙜 --> 0 value x --> : foo x 2* to x ; --> see foo : foo x 2* TO X ; POLL Is making SEE higher fidelity useful? STRUCTURES 🙜 ⦿ C libraries use structures ⦿ Padded to support alignment ⦿ Want a simple forth implementation STRUCTURES - syntax 🙜 vocabulary xbutton also xbutton definitions struct XButtonEvent i32 field ->type long field ->serial bool field ->send_event ptr field ->display win field ->window win field ->root win field ->subwindow time field ->time i32 field ->x i32 field ->y i32 field ->x_root i32 field ->y_root i32 field ->state i32 field ->button bool field ->same_screen previous definitions struct WINDCLASSA i16 field ->style ptr field ->lpfnWndProc i32 field ->cbClsExtra i32 field ->cbWndExtra ptr field ->hInstance ptr field ->hIcon ptr field ->hCursor ptr field ->hbrBackground ptr field ->lpszMenuName ptr field ->lpszClassName STRUCTURES - syntax 🙜 create foo XButtonEvent allot 123 foo ->x ! foo ->x @ . STRUCTURES - implementation 🙜 variable last-align : typer ( align sz "name" ) create , , does> dup cell+ @ last-align ! @ ; 1 1 typer i8 2 2 typer i16 4 4 typer i32 cell 8 typer i64 cell cell typer ptr long-size long-size typer long STRUCTURES - implementation 🙜 variable last-struct : struct ( "name" ) 1 0 typer latestxt >body last-struct ! ; : align-by ( a n -- a ) 1- dup >r + r> invert and ; : struct-align ( n -- ) dup last-struct @ cell+ @ max last-struct @ cell+ ! last-struct @ @ swap align-by last-struct @ ! ; : field ( n "name" ) last-align @ struct-align create last-struct @ @ , last-struct @ +! does> @ + ; POLL Useful for ESP32? GRAPHICS 🙜 ⦿ Low and Higer level graphics ⦿ Windows (GDI) and Linux (X11) support ⦿ Maybe ESP32 too? "LOW-LEVEL" INTERFACE Startup: window ( w h -- ) Drawing region: pixel ( x y -- a ) (format [b g r x]) width ( -- n ) height ( -- n ) flip ( -- ) Getting events: wait ( -- ) poll ( -- ) event ( -- n ) Event constants: IDLE RESIZED EXPOSED MOTION PRESSED RELEASED TYPED FINISHED Event info: mouse-x ( -- n ) mouse-y ( -- n ) last-key ( -- n ) last-char ( -- n ) pressed? ( k -- f ) Key/Button constants: LEFT-BUTTON MIDDLE-BUTTON RIGHT-BUTTON "HIGH-LEVEL" INTERFACE Pen: ( $rrggbb ) to color Drawing: box ( x y w h -- ) Transforms: g{ ( -- ) Preserve transform }g ( -- ) Restore transform translate ( x y -- ) scale ( nx dx ny dy -- ) viewport ( w h -- ) vertical-flip ( -- ) Use math style viewport. Conversions: screen>g ( x y -- x' y' ) Transform screen to viewport g{ 640 480 viewport ... \ draw stuff on 640x480 area 100 10 40 20 box ... }g g{ vertical-flip 2000 2000 viewport -1000 -1000 translate ... \ draw stuff in (-1000, 1000) in x, y ... }g g{ ... g{ -100 -100 translate wheel } g{ 100 -100 translate wheel } g{ -100 100 translate wheel } g{ 100 100 translate wheel } }g g{ ... g{ 1 10 1 10 scale disk } g{ 2 10 2 10 scale disk } g{ 3 10 3 10 scale disk } }g POLL Useful for ESP32? QUESTIONS? ⚘ Thank you!