Optimize variable and constant, and change color!

This commit is contained in:
Brad Nelson
2022-02-25 19:46:28 -08:00
parent 1af99d92ec
commit be64916eec
11 changed files with 60 additions and 35 deletions

View File

@ -17,10 +17,6 @@
: #! 10 parse drop drop ; immediate ( shebang for scripts ) : #! 10 parse drop drop ; immediate ( shebang for scripts )
( Now can do comments! ) ( Now can do comments! )
( Constants and Variables )
: constant ( n "name" -- ) create , does> @ ;
: variable ( "name" -- ) create 0 , ;
( Stack Baseline ) ( Stack Baseline )
sp@ constant sp0 sp@ constant sp0
rp@ constant rp0 rp@ constant rp0
@ -100,7 +96,7 @@ variable handler
' throw 'notfound ! ' throw 'notfound !
( Values ) ( Values )
: value ( n -- ) create , does> @ ; : value ( n -- ) constant ;
: value-bind ( xt-val xt ) : value-bind ( xt-val xt )
>r >body state @ if aliteral r> , else r> execute then ; >r >body state @ if aliteral r> , else r> execute then ;
: to ( n -- ) ' ['] ! value-bind ; immediate : to ( n -- ) ' ['] ! value-bind ; immediate

View File

@ -135,8 +135,6 @@ e: check-boot
out: fp0 out: fp0
out: rp0 out: rp0
out: sp0 out: sp0
out: variable
out: constant
out: #! out: #!
out: \ out: \
out: ( out: (
@ -250,6 +248,8 @@ e: check-core-opcodes
out: FIND out: FIND
out: PARSE out: PARSE
out: CREATE out: CREATE
out: VARIABLE
out: CONSTANT
out: DOES> out: DOES>
out: IMMEDIATE out: IMMEDIATE
out: : out: :

View File

@ -30,8 +30,8 @@ grf
." CHAR: " last-char . cr ." CHAR: " last-char . cr
then then
) )
0 to color 0 0 width height box 0 color! 0 0 width height box
LEFT-BUTTON pressed? if $ccccff else $ffccff then to color LEFT-BUTTON pressed? if $ccccff else $ffccff then color!
mouse-x mouse-y height heart mouse-x mouse-y height heart
flip flip
event FINISHED = until event FINISHED = until

View File

@ -14,24 +14,36 @@
( Graphics Utilities ) ( Graphics Utilities )
\ Pen: \ Pen:
\ ( n ) to color \ color! ( col -- )
\ Drawing: \ Drawing:
\ box ( x y w h -- ) \ box ( x y w h -- )
also internals also internals
grf definitions grf definitions
0 value color
internals definitions internals definitions
variable color
( Scale to be divided by $10000 )
variable sx variable sy
$10000 sx ! $10000 sy !
( Translation )
variable tx variable ty
: hline { x y w } : hline { x y w }
\ x y pixel w 1- for color over l! 4 + next drop ; \ x y pixel w 1- for color @ over l! 4 + next drop ;
x y pixel w color fill32 ; x y pixel w color @ fill32 ;
grf definitions also internals grf definitions also internals
: color! ( col -- ) color ! ;
: box { left top w h } : box { left top w h }
left sx @ * tx @ + 16 rshift to left
top sy @ * ty @ + 16 rshift to top
w sx @ * 16 rshift to w
h sy @ * 16 rshift to h
left w + top h + { right bottom } left w + top h + { right bottom }
left 0 max to left left 0 max to left
top 0 max to top top 0 max to top

View File

@ -14,7 +14,9 @@
#define JMPW goto **(void **) w #define JMPW goto **(void **) w
#define NEXT w = *ip++; JMPW #define NEXT w = *ip++; JMPW
#define ADDR_DOCOLON && OP_DOCOLON #define ADDR_DOCOL && OP_DOCOL
#define ADDR_DOCON && OP_DOCON
#define ADDR_DOVAR && OP_DOVAR
#define ADDR_DOCREATE && OP_DOCREATE #define ADDR_DOCREATE && OP_DOCREATE
#define ADDR_DODOES && OP_DODOES #define ADDR_DODOES && OP_DODOES
@ -43,7 +45,9 @@ static cell_t *forth_run(cell_t *init_rp) {
EXTRA_OPCODE_LIST EXTRA_OPCODE_LIST
OPCODE_LIST OPCODE_LIST
#undef XV #undef XV
OP_DOCOLON: ++rp; *rp = (cell_t) ip; ip = (cell_t *) (w + sizeof(cell_t)); NEXT; OP_DOCOL: ++rp; *rp = (cell_t) ip; ip = (cell_t *) (w + sizeof(cell_t)); NEXT;
OP_DOCON: DUP; tos = *(cell_t *) (w + sizeof(cell_t)); NEXT;
OP_DOVAR: DUP; tos = w + sizeof(cell_t); NEXT;
OP_DOCREATE: DUP; tos = w + sizeof(cell_t) * 2; NEXT; OP_DOCREATE: DUP; tos = w + sizeof(cell_t) * 2; NEXT;
OP_DODOES: DUP; tos = w + sizeof(cell_t) * 2; OP_DODOES: DUP; tos = w + sizeof(cell_t) * 2;
++rp; *rp = (cell_t) ip; ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t)); NEXT; ++rp; *rp = (cell_t) ip; ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t)); NEXT;

View File

@ -43,7 +43,8 @@ typedef uintptr_t ucell_t;
#define TOLINK(xt) (((cell_t *) (xt)) - 2) #define TOLINK(xt) (((cell_t *) (xt)) - 2)
#define TONAME(xt) ((*TOFLAGS(xt) & BUILTIN_MARK) ? (*(char **) TOLINK(xt)) \ #define TONAME(xt) ((*TOFLAGS(xt) & BUILTIN_MARK) ? (*(char **) TOLINK(xt)) \
: (((char *) TOLINK(xt)) - CELL_ALIGNED(*TONAMELEN(xt)))) : (((char *) TOLINK(xt)) - CELL_ALIGNED(*TONAMELEN(xt))))
#define TOBODY(xt) (((cell_t *) xt) + ((void *) *((cell_t *) xt) == ADDR_DOCOLON ? 1 : 2)) #define TOBODY(xt) (((cell_t *) xt) + ((void *) *((cell_t *) xt) == ADDR_DOCREATE || \
(void *) *((cell_t *) xt) == ADDR_DODOES ? 2 : 1))
#define DOIMMEDIATE() *TOFLAGS(*g_sys.current) |= IMMEDIATE #define DOIMMEDIATE() *TOFLAGS(*g_sys.current) |= IMMEDIATE
#define UNSMUDGE() *TOFLAGS(*g_sys.current) &= ~SMUDGE; finish() #define UNSMUDGE() *TOFLAGS(*g_sys.current) &= ~SMUDGE; finish()
@ -122,12 +123,18 @@ typedef struct {
Y(CREATE, DUP; DUP; tos = parse(32, sp); \ Y(CREATE, DUP; DUP; tos = parse(32, sp); \
create((const char *) *sp, tos, 0, ADDR_DOCREATE); \ create((const char *) *sp, tos, 0, ADDR_DOCREATE); \
COMMA(0); DROPn(2)) \ COMMA(0); DROPn(2)) \
Y(VARIABLE, DUP; DUP; tos = parse(32, sp); \
create((const char *) *sp, tos, 0, ADDR_DOVAR); \
COMMA(0); DROPn(2)) \
Y(CONSTANT, DUP; DUP; tos = parse(32, sp); \
create((const char *) *sp, tos, 0, ADDR_DOCON); \
DROPn(2); COMMA(tos); DROP) \
X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \ X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \
Y(IMMEDIATE, DOIMMEDIATE()) \ Y(IMMEDIATE, DOIMMEDIATE()) \
XV(internals, "'SYS", SYS, DUP; tos = (cell_t) &g_sys) \ XV(internals, "'SYS", SYS, DUP; tos = (cell_t) &g_sys) \
YV(internals, YIELD, PARK; return rp) \ YV(internals, YIELD, PARK; return rp) \
X(":", COLON, DUP; DUP; tos = parse(32, sp); \ X(":", COLON, DUP; DUP; tos = parse(32, sp); \
create((const char *) *sp, tos, SMUDGE, ADDR_DOCOLON); \ create((const char *) *sp, tos, SMUDGE, ADDR_DOCOL); \
g_sys.state = -1; --sp; DROP) \ g_sys.state = -1; --sp; DROP) \
YV(internals, EVALUATE1, DUP; float *tfp = fp; \ YV(internals, EVALUATE1, DUP; float *tfp = fp; \
sp = evaluate1(sp, &tfp); \ sp = evaluate1(sp, &tfp); \

View File

@ -72,22 +72,22 @@ create arrow-table
: draw-one { e } e ->kind @ { kind } : draw-one { e } e ->kind @ { kind }
HEART-GOAL kind = if HEART-GOAL kind = if
$ff0000 128 random dup 8 lshift + + to color $ff0000 128 random dup 8 lshift + + color!
e ->x @ 100 / e ->y @ 100 / e ->step @ heart e ->x @ 100 / e ->y @ 100 / e ->step @ heart
exit exit
then then
FIRE kind = if FIRE kind = if
$222222 to color $222222 color!
e ->x @ 100 / 4 - e ->y @ 100 / 4 - 8 8 box e ->x @ 100 / 4 - e ->y @ 100 / 4 - 8 8 box
exit exit
then then
SPARK kind = if SPARK kind = if
$ff7700 128 random 8 lshift + to color $ff7700 128 random 8 lshift + color!
e ->x @ 100 / 4 - e ->y @ 100 / 4 - 8 8 box e ->x @ 100 / 4 - e ->y @ 100 / 4 - 8 8 box
exit exit
then then
ARROW kind = if ARROW kind = if
$ffff00 256 random + to color $ffff00 256 random + color!
39 for 39 for
e ->x @ 100 / e ->vx @ i 200 */ + i arrow-- 2/ - e ->x @ 100 / e ->vx @ i 200 */ + i arrow-- 2/ -
e ->y @ 100 / e ->vy @ i 200 */ + i arrow-- 2/ - e ->y @ 100 / e ->vy @ i 200 */ + i arrow-- 2/ -
@ -99,16 +99,16 @@ create arrow-table
: volcano : volcano
height 2/ for height 2/ for
$334400 i 100 height */ + to color $334400 i 100 height */ + color!
width 2/ i 2/ - i height 2/ + i height 8 / + 1 box width 2/ i 2/ - i height 2/ + i height 8 / + 1 box
next next
0 to color 0 color!
width 2/ height 2/ width 2/ height 2/
height 8 / 20 box height 8 / 20 box
; ;
: draw : draw
$003300 to color 0 0 width height box $003300 color! 0 0 width height box
volcano volcano
entity-count 0 ?do i entity draw-one loop entity-count 0 ?do i entity draw-one loop
flip flip

View File

@ -21,8 +21,8 @@
X("CALL", CALL, sp = Call(sp|0, tos|0) | 0; DROP) \ X("CALL", CALL, sp = Call(sp|0, tos|0) | 0; DROP) \
enum { enum {
OP_DOCOLON = 0, OP_DOCOL = 0,
OP_DOCREATE = 1, OP_DOVAR = 1,
OP_DODOES = 2, OP_DODOES = 2,
#define XV(flags, name, op, code) OP_ ## op, #define XV(flags, name, op, code) OP_ ## op,
PLATFORM_OPCODE_LIST PLATFORM_OPCODE_LIST

View File

@ -58,8 +58,8 @@ cases = ReplaceAll(cases, 'g_sys.state', 'i32[(i32[g_sys>>2] + (3 * 4))>>2]');
cases = ReplaceAll(cases, 'g_sys.DOLIT_XT', 'i32[(i32[g_sys>>2] + (10 * 4))>>2]|0'); cases = ReplaceAll(cases, 'g_sys.DOLIT_XT', 'i32[(i32[g_sys>>2] + (10 * 4))>>2]|0');
cases = ReplaceAll(cases, 'g_sys.DOEXIT_XT', 'i32[(i32[g_sys>>2] + (11 * 4))>>2]|0'); cases = ReplaceAll(cases, 'g_sys.DOEXIT_XT', 'i32[(i32[g_sys>>2] + (11 * 4))>>2]|0');
cases = ReplaceAll(cases, '&g_sys', 'g_sys'); cases = ReplaceAll(cases, '&g_sys', 'g_sys');
cases = ReplaceAll(cases, '&& OP_DOCOLON', '0'); cases = ReplaceAll(cases, '&& OP_DOCOL', '0');
cases = ReplaceAll(cases, '&& OP_DOCREATE', '1'); cases = ReplaceAll(cases, '&& OP_DOVAR', '1');
cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode'); cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode');
cases = ReplaceAll(cases, 'SSMOD_FUNC', ''); cases = ReplaceAll(cases, 'SSMOD_FUNC', '');
// Keep Together vvv // Keep Together vvv

View File

@ -200,12 +200,12 @@ function VM(stdlib, foreign, heap) {
ir = u8[w]|0; ir = u8[w]|0;
log(ir|0); log(ir|0);
switch (ir&0xff) { switch (ir&0xff) {
case 0: // OP_DOCOLON case 0: // OP_DOCOL
rp = (rp + 4) | 0; rp = (rp + 4) | 0;
i32[rp>>2] = ip; i32[rp>>2] = ip;
ip = (w + 4) | 0; ip = (w + 4) | 0;
break; break;
case 1: // OP_DOCREATE case 1: // OP_DOVAR
sp = (sp + 4) | 0; sp = (sp + 4) | 0;
i32[sp>>2] = tos; i32[sp>>2] = tos;
tos = (w + 8) | 0; // 4 * 2 tos = (w + 8) | 0; // 4 * 2

View File

@ -14,12 +14,16 @@
#define NEXT goto next #define NEXT goto next
#define JMPW goto work #define JMPW goto work
#define ADDR_DOCOLON ((void *) OP_DOCOLON) #define ADDR_DOCOL ((void *) OP_DOCOL)
#define ADDR_DOCON ((void *) OP_DOCON)
#define ADDR_DOVAR ((void *) OP_DOVAR)
#define ADDR_DOCREATE ((void *) OP_DOCREATE) #define ADDR_DOCREATE ((void *) OP_DOCREATE)
#define ADDR_DODOES ((void *) OP_DODOES) #define ADDR_DODOES ((void *) OP_DODOES)
enum { enum {
OP_DOCOLON = 0, OP_DOCOL = 0,
OP_DOCON,
OP_DOVAR,
OP_DOCREATE, OP_DOCREATE,
OP_DODOES, OP_DODOES,
#define XV(flags, name, op, code) OP_ ## op, #define XV(flags, name, op, code) OP_ ## op,
@ -59,7 +63,9 @@ work:
EXTRA_OPCODE_LIST EXTRA_OPCODE_LIST
OPCODE_LIST OPCODE_LIST
#undef XV #undef XV
case OP_DOCOLON: ++rp; *rp = (cell_t) ip; ip = (cell_t *) (w + sizeof(cell_t)); NEXT; case OP_DOCOL: ++rp; *rp = (cell_t) ip; ip = (cell_t *) (w + sizeof(cell_t)); NEXT;
case OP_DOCON: DUP; tos = *(cell_t *) (w + sizeof(cell_t)); NEXT;
case OP_DOVAR: DUP; tos = w + sizeof(cell_t); NEXT;
case OP_DOCREATE: DUP; tos = w + sizeof(cell_t) * 2; NEXT; case OP_DOCREATE: DUP; tos = w + sizeof(cell_t) * 2; NEXT;
case OP_DODOES: DUP; tos = w + sizeof(cell_t) * 2; case OP_DODOES: DUP; tos = w + sizeof(cell_t) * 2;
++rp; *rp = (cell_t) ip; ++rp; *rp = (cell_t) ip;