Optimize variable and constant, and change color!
This commit is contained in:
@ -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
|
||||||
|
|||||||
@ -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: :
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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); \
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user