7 extern char G_CLI_PATH[];
15 char* input_buffer[256];
17 #define STACK_SIZE 1000
18 #define RSTACK_SIZE 1000
19 #define HERE_SIZE1 0x10000
21 typedef long unsigned Cell;
23 typedef void (*proc)(void);
25 #define pp(cName) const sCell p##cName = (sCell)cName;
26 #define PP(cName) const sCell P##cName = (sCell)cName;
38 sCell * Handler = NULL;
40 Cell numericBase = 10;
42 void Co( sCell cod ){ *here++ = cod ;}
43 void Co2( sCell cod1,sCell cod2 ){Co(cod1); Co(cod2); }
44 void Co3( sCell cod1,sCell cod2,sCell cod3 ){Co2(cod1,cod2); ; Co(cod3); }
45 void Co4( sCell cod1,sCell cod2,sCell cod3,sCell cod4 ){ Co3(cod1,cod2,cod3); ; Co(cod4); }
46 void Co5( sCell cod1,sCell cod2,sCell cod3,sCell cod4,sCell cod5 )
47 { Co4(cod1,cod2,cod3,cod4); ; Co(cod5); }
48 void Co6( sCell cod1,sCell cod2,sCell cod3,sCell cod4,sCell cod5,sCell cod6 )
49 { Co5(cod1,cod2,cod3,cod4,cod5); Co(cod6); }
50 void Co7( sCell cod1,sCell cod2,sCell cod3,sCell cod4,sCell cod5,sCell cod6,sCell cod7 )
51 { Co6(cod1,cod2,cod3,cod4,cod5,cod6); Co(cod7);}
53 void Noop(
void) {} pp(Noop)
55 void DoVar(
void){ *--Stack= Tos; Tos =(sCell)ip; ip = (sCell*)*rStack++; } pp(DoVar)
56 void DoConst(
void){ *--Stack= Tos; Tos = *ip; ip = (sCell*)*rStack++; } pp(DoConst)
60 ireg =Tos; Tos=*Stack++;
61 if ( (ireg<0) ^ (pNoop<0) ) {
65 *--rStack = (sCell) ip;
72 if ( (ireg<0) ^ (pNoop<0) ) {
73 ip = (sCell*)*rStack++;
81 void Lit_(){ *--Stack = Tos; Tos = *ip++; } pp(Lit_)
82 void Lit( sCell val) {Co(~pLit_); *here++ = val; }
83 void Compile(){ *here++ = Tos; Tos = *Stack++; } pp(Compile)
84 void LitCo(){ Co(~pLit_); Compile();} pp(LitCo)
85 void Allot(){ *(sCell*)&here += Tos; Tos = *Stack++; } pp(Allot)
89 ip = (sCell*)*rStack++;
92 void Here(
void){ *--Stack = Tos; Tos = (sCell)here; } pp(Here)
103 else ip = *(sCell**)ip;
110 *--Stack = (Cell)ip+1;
111 Tos = *(
char unsigned *)ip;
112 ip = (sCell*) ((Cell)ip + Tos + 1);
113 ip = (sCell*) ( ( (Cell)ip +
sizeof(Cell) - 1 ) & (-
sizeof(Cell) ) );
117 void Dup(){ *--Stack= Tos; } pp(Dup)
118 void Drop(){ Tos = *Stack++; } pp(Drop)
119 void Nip(){ Stack++; } pp(Nip)
120 void QDup(){
if(Tos) *--Stack= Tos; } pp(QDup)
121 void Over(){ *--Stack= Tos; Tos = Stack[1]; } pp(Over)
122 void Tuck(){ sCell tt=*Stack; *Stack=Tos; *--Stack=tt; } pp(Tuck)
123 void Pick(){ Tos = Stack[Tos]; } pp(Pick)
124 void i2dup(){ *--Stack= Tos; *--Stack= Stack[1]; } pp(i2dup)
125 void i2over(){ *--Stack= Tos; *--Stack= Stack[3]; Tos= Stack[3]; } pp(i2over)
126 void i2drop(){ Stack++; Tos = *Stack++; } pp(i2drop)
127 void Swap(){ sCell tt=Tos; Tos=Stack[0]; Stack[0]=tt; } pp(Swap)
129 sCell tt=Tos; Tos=Stack[1]; Stack[1]=tt;
130 tt=Stack[0]; Stack[0]=Stack[2]; Stack[2]=tt; } pp(i2Swap)
131 void Rot(){ Cell tt=Stack[1]; Stack[1]=Stack[0]; Stack[0]=Tos; Tos=tt; } pp(Rot)
132 void Add(){ Tos += *Stack++; } pp(Add)
133 void Sub(){ Tos = -Tos; Tos += *Stack++; } pp(Sub)
134 void Negate(){ Tos = -Tos; } pp(Negate)
135 void Invert(){ Tos = ~Tos; } pp(Invert)
136 void i1Add(){ Tos++; } pp(i1Add)
137 void i1Sub(){ Tos--; } pp(i1Sub)
138 void i2Add(){ Tos +=2; } pp(i2Add)
139 void i2Sub(){ Tos -=2; } pp(i2Sub)
140 void Mul(){ Tos *= *Stack++; } pp(Mul)
141 void Div(){ sCell tt=*Stack++; Tos = tt/Tos; } pp(Div)
142 void i2Mul(){ Tos *= 2; } pp(i2Mul)
143 void i2Div(){ Tos /= 2; } pp(i2Div)
144 void Mod(){ sCell tt=*Stack++; Tos = tt%Tos; } pp(Mod)
145 void UMul(){ Tos = (Cell) Tos * (Cell) *Stack++; } pp(UMul)
146 void UDiv(){ Cell tt=*Stack++; Tos = tt/(Cell)Tos; } pp(UDiv)
147 void And(){ Tos &= *Stack++; } pp(And)
148 void AndC(){ Tos = ~Tos & *Stack++; } pp(AndC)
149 void Or(){ Tos |= *Stack++; } pp(Or)
150 void Xor(){ Tos ^= *Stack++; } pp(Xor)
151 void ARshift(){ Tos = *Stack++ >> Tos ; } pp(ARshift)
152 void Rshift(){ Tos = *(Cell*)Stack++ >> Tos ; } pp(Rshift)
153 void Lshift(){ Tos = *Stack++ << Tos ; } pp(Lshift)
156 tty_printf(
"%x ",Tos);
161 __uint8_t buffer [44];
162 __uint8_t* p = &buffer;
175 __uint8_t nn= (Tos % numericBase);
176 if(nn<10) *--p =
'0' + nn;
177 else *--p =
'A' + nn - 10 ;
178 Tos = Tos / numericBase;
189 void Load(){ Tos = *(Cell*)Tos; } pp(Load)
190 void Store(){ *(Cell*)Tos = *Stack++; Tos = *Stack++;} pp(Store)
191 void CLoad(){ Tos = (Cell)*(__uint8_t*) Tos; } pp(CLoad)
192 void CStore(){ *(__uint8_t*)Tos = (__uint8_t)*Stack++; Tos = *Stack++; } pp(CStore)
193 void CAddStore(){ *(__uint8_t*)Tos += (__uint8_t)*Stack++; Tos = *Stack++; } pp(CAddStore)
194 void CStoreA(){ *(__uint8_t*)Tos = (__uint8_t)*Stack++; } pp(CStoreA)
195 void WLoad(){ Tos = (Cell)*(__uint16_t*) Tos; } pp(WLoad)
196 void WStore(){ *(__uint16_t*)Tos = (__uint16_t)*Stack++; Tos = *Stack++; } pp(WStore)
199 __uint64_t val = ((__uint64_t)(Cell)Stack[1]<<32) + (__uint64_t)(Cell)Stack[0];
200 *(__uint64_t*)Tos = val;
201 Stack += 2 ; Tos = *Stack++;} pp(i2Store)
203 void i2Load(){ __uint64_t val = *(__uint64_t*)Tos; Tos= val; *--Stack=val>>32;} pp(i2Load)
205 void AddStore(){ *(Cell*)Tos += *Stack++; Tos = *Stack++;} pp(AddStore)
206 void Count(){ *--Stack = Tos+1; Tos = (sCell) *(
char *)Tos; } pp(Count)
207 void On(){ *(Cell*)Tos = -1; Tos = *Stack++; } pp(On)
208 void Off(){ *(Cell*)Tos = 0; Tos = *Stack++; } pp(Off)
209 void Incr(){ *(Cell*)Tos += 1; Tos = *Stack++; } pp(Incr)
210 void ZEqual(){ Tos = -(Tos==0); } pp(ZEqual)
211 void ZNEqual(){ Tos = -(Tos!=0); } pp(ZNEqual)
212 void DZEqual(){ Tos = -( (Tos | *Stack++) == 0); } pp(DZEqual)
213 void ZLess(){ Tos = -(Tos<0); } pp(ZLess)
214 void Equal(){ Tos = -(*Stack++==Tos); } pp(Equal)
215 void NEqual(){ Tos = -(*Stack++!=Tos); } pp(NEqual)
216 void Less(){ Tos = -(*Stack++<Tos); } pp(Less)
217 void Great(){ Tos = -(*Stack++>Tos); } pp(Great)
218 void ULess(){ Tos = -((Cell)*Stack++ < (Cell)Tos); } pp(ULess)
219 void UGreat(){ Tos = -((Cell)*Stack++ > (Cell)Tos); } pp(UGreat)
221 void Max(){ sCell tt = *Stack++;
if(tt>Tos) Tos=tt; } pp(Max)
222 void Min(){ sCell tt = *Stack++;
if(tt<Tos) Tos=tt; } pp(Min)
223 void i0Max(){
if(Tos<0) Tos=0; } pp(i0Max)
225 void ToR(){ *--rStack = Tos; Tos = *Stack++; } pp(ToR)
226 void RLoad(){ *--Stack = Tos; Tos = *rStack; } pp(RLoad)
227 void FromR(){ *--Stack = Tos; Tos = *rStack++; } pp(FromR)
228 void i2ToR(){ *--rStack = *Stack++; *--rStack = Tos ; Tos = *Stack++; } pp(i2ToR)
229 void i2RLoad(){ *--Stack = Tos; Tos = *rStack; *--Stack = rStack[1]; } pp(i2RLoad)
230 void i2FromR(){ *--Stack = Tos; Tos = *rStack++; *--Stack = *rStack++; } pp(i2FromR)
231 void RDrop(){ *rStack++; } pp(RDrop)
232 void RPGet(){ *--Stack = Tos; Tos = (Cell) rStack; } pp(RPGet)
233 void SPGet(){ *--Stack = Tos; Tos = (Cell) Stack ; } pp(SPGet)
234 void RPSet(){ rStack = (sCell*)Tos; Tos = *Stack++; } pp(RPSet)
235 void SPSet(){ Stack = (sCell*)(Tos+
sizeof(sCell)); Tos = Stack[-1]; } pp(SPSet)
237 void ZCount(){ *--Stack= Tos; Tos =
strlen((
char *)Tos); } pp(ZCount)
239 void Punch() {punch();} pp(Punch)
244 Tos = *Stack++; } pp(Emit)
251 void Cr() { tty_putchar(
'\n',0); } pp(Cr)
254 char * str = (
char *) *Stack;
257 for (
size_t i = 0; i < Tos; i++) {
267 void ZType() {
_tty_puts((
const char*)Tos); Tos = *Stack++;} pp(ZType)
284 void Ahead(){ Co(~pBranch); *--Stack = Tos; Tos = (sCell)here; Co(0);} pp(Ahead)
285 void If(){ Co(~pQBranch); *--Stack = Tos; Tos= (sCell)here; Co(0);} pp(If)
286 void Then(){ *(sCell**)Tos++ = here; Tos = *Stack++; } pp(Then)
287 void Else(){ Ahead(); Swap(); Then(); } pp(Else)
288 void Begin(){ *--Stack = Tos; Tos = (sCell)here; } pp(Begin)
289 void Until(){ Co(~pQBranch); *here++ = (sCell)Tos; Tos = *Stack++; } pp(Until)
290 void Again(){ Co(~pBranch); *here++ = (sCell)Tos; Tos = *Stack++; } pp(Again)
291 void While(){ If(); Swap(); } pp(While)
292 void Repeat(){ Again(); Then(); } pp(Repeat)
294 void DNegate(){ __int64_t val =
295 -(__int64_t)( ((__uint64_t)(Cell)Tos<<32) + (__uint64_t)(Cell)Stack[0] ) ;
300 void DAbs(){
if(Tos<0) DNegate(); } pp(DAbs)
303 { __uint32_t sum= ((__uint64_t)(Cell)Tos<<32) + (__uint64_t)(Cell)Stack[0] +
304 ((__uint64_t)(Cell)Stack[1]<<32) + (__uint64_t)(Cell)Stack[2];
311 { __uint64_t mul= (__uint64_t)(Cell)Tos * (__uint64_t)(Cell)Stack[0] ;
319 static void udiv(__uint32_t a,__uint32_t *b,__uint32_t *c)
331 if(ql&0x80000000)qh++;
348 udiv(Tos,Stack,&Stack[1]);
359 { Cell sz = (
sizeof (Cell) - 1 ) ;
360 char * chere = (
char *)here;
361 while( (Cell) chere & sz ) *chere++ = 0 ;
362 here = (sCell *)chere;
366 { Cell len = *Stack++;
367 __uint8_t *adr = (__uint8_t *) *Stack++;
368 while (len-- > 0) *adr++ = (__uint8_t)Tos;
374 __uint8_t *c_to = (__uint8_t *) *Stack++;
375 __uint8_t *c_from =(__uint8_t *) *Stack++;
383 __uint8_t *c_to = (__uint8_t *) *Stack++;
384 __uint8_t *c_from =(__uint8_t *) *Stack++;
386 c_to[Tos] = c_from[Tos];
390 void StrComp(
const char * s, sCell len)
391 {
char * chere = (
char *)here;
393 *chere++ = (char)len;
397 here = (sCell *)chere;
401 void StrCmp(){ StrComp((
char *) *Stack++, Tos); Tos = *Stack++; } pp(StrCmp)
403 void Tp(
const char * s) {
409 void SpSet(){ Stack = (sCell*)*Stack; } pp(SpSet)
411 sCell ForthWordlist[] = {0,0,0};
413 const Cell ContextSize = 10;
414 sCell * Context[ContextSize] = {ForthWordlist};
415 sCell * Current[] = {ForthWordlist};
421 void WordBuild (
const char * name, sCell cfa )
426 Co(** (sCell **) Current);
428 StrComp(name,
strlen(name));
431 void Smudge(){ **(sCell***) Current=Last; } pp(Smudge)
433 void Immediate(){ Last[-2] |= 1; } pp(Immediate)
435 void FthItem (
const char * name, sCell cfa ){
436 WordBuild (name, cfa );
440 sCell Header(
const char * name) {
442 *(sCell **)LastCFA = here;
443 return *(sCell *)LastCFA;
446 sCell Variable (
const char * name ) {
448 *(sCell **) LastCFA = here;
451 return *(sCell *)LastCFA;
454 sCell VVariable (
const char * name, sCell val ) {
456 *(sCell **) LastCFA = here;
459 return *(sCell *)LastCFA;
462 sCell Constant (
const char * name, sCell val ) {
464 *(sCell **) LastCFA = here;
467 return *(sCell *)LastCFA;
469 char atib[256]={
"atib atib qwerty"};
470 sCell tib[]={0,(sCell)&atib}; PP(tib)
489 *Stack= (sCell) malloc(Tos);
491 if(*Stack==0) Tos=-59;
502 sCell i2in[] = {0 , 0 }; PP(i2in)
503 sCell *v2in = (sCell *) &i2in[1];
505 sCell SourceId[] = { 0, 0 }; PP(SourceId)
508 { keyboardctl(KEYBOARD_ECHO,
true);
510 gets_max((
char *)*Stack,Tos);
511 Tos=
strlen((
char *)*Stack);
516 Cell addr,Waddr,Eaddr;
517 addr= tib[1] + *v2in;
518 Eaddr= tib[1] + ntib;
521 while ( addr<Eaddr ) {
if( *(__uint8_t*)addr >
' ')
break;
524 *v2in = addr - tib[1];
525 while ( addr<=Eaddr ) { (*v2in)++;
if( *(__uint8_t*)addr <=
' ')
break;
531 Cell addr,Waddr,Eaddr;
532 if(((__uint8_t*)tib[1])[ntib] ==
'\r' ) ntib--;
533 addr= tib[1] + *v2in;
534 Eaddr= tib[1] + ntib;
538 while ( addr<=Eaddr ) { (*v2in)++;
if(*(__uint8_t*)addr == cc )
break;
544 __uint8_t islower (__uint8_t c)
546 if ( c >=
'a' && c <=
'z' )
return 1;
552 __uint8_t toupper(__uint8_t c)
554 return islower (c) ? c -
'a' +
'A' : c;
560 Cell memcasecmp (
const void *vs1,
const void *vs2, Cell n)
563 __uint8_t
const *s1 = (__uint8_t
const *) vs1;
564 __uint8_t
const *s2 = (__uint8_t
const *) vs2;
565 for (i = 0; i < n; i++)
567 __uint8_t u1 = *s1++;
568 __uint8_t u2 = *s2++;
569 if (toupper (u1) != toupper (u2))
570 return toupper (u1) - toupper (u2);
576 Cell CCompare(
void * caddr1 , Cell len1 ,
void * caddr2 , Cell len2) {
577 if (len1 < len2)
return -1;
578 if (len1 > len2)
return 1;
582 Cell cmpResult = memcasecmp(caddr1, caddr2, len1);
584 if (cmpResult < 0)
return -1;
585 if (cmpResult > 0)
return 1;
590 char * caddr1 = (
char *) *Stack++;
591 sCell len1 = *Stack++;
592 char * caddr2 = (
char *) *Stack++;
594 if (len1 != Tos) { Tos -= len1;
return; }
596 Tos = memcasecmp(caddr1, caddr2, Tos); } pp(UCompare)
598 char *SEARCH(
char **wid,
char * word , Cell len)
599 {
char * addr= (
char *) *wid;
601 {
if(!addr)
return NULL;
602 char * caddr = addr ;
603 if( !CCompare(word, len, caddr+1, *caddr ))
605 addr = ((
char **)addr)[-1];
609 void FromName(){ Tos=((sCell *)Tos)[-3]; } pp(FromName)
611 void SearchWordList()
613 char ** addr= (
char **) Tos;
615 char * word= (
char * ) Stack[1];
617 if(!addr) { Stack+=2; Tos=0;
return; }
618 Cell * nfa= (Cell*) SEARCH(addr,word,len);
625 Tos = nfa[-2]&1 ? 1 : -1;
630 { sCell * voc= (sCell *) Context;
633 { *--Stack = Stack[1];
634 *--Stack = Stack[1]; Tos=*voc;
637 { Stack[2]=Stack[0]; Stack+=2;
646 void StateQ(){ *--Stack= Tos; Tos = State; } pp(StateQ)
648 void IMode(){ State = 0;} pp(IMode)
649 void CMode(){ State = -1;} pp(CMode)
654 sCell YDPFL[] = { pDoConst, 0 }; pp(YDPFL)
658 if(YDPFL[1] == 0)
return;
665 {
char * name = (
char * ) *Stack++ ;
670 Co(** (sCell **) Current);
675 *(sCell **)LastCFA = here;
696 char * caddr = (
char*) Stack[0];
697 if(caddr[0]==
'-') { len--; caddr++; signedFlg = -1; }
699 while(len){ --len; NumStr[len] = caddr[len]; }
700 *Stack = strtoul( NumStr, &rez, numericBase) * signedFlg;
706 CMode(); } pp( Colon)
707 void Semicolon(){ Co(~pExit); Smudge(); IMode(); } pp(Semicolon)
710 *--rStack = (sCell)Handler;
711 *--rStack = (sCell)Stack;
718 Handler = (sCell*)*rStack++;
719 *--Stack = Tos; Tos = 0;
720 ip = (sCell*)*rStack++;
723 sCell Catch[] = { 0,0 }; PP(Catch)
727 if (Handler == NULL);
729 Stack = (sCell*)*rStack++;
730 Handler = (sCell*)*rStack++;
731 ip = (sCell * ) *rStack++;
735 if (Tos == 0){ Tos = *Stack++;
return; }
744 {
if(SaveErrQ & Tos )
754 _tty_printf(
"Err=%d\n",Tos);
760 void readOnly() { *--Stack = Tos; Tos = O_READ; } pp(readOnly)
763 void readWrite() { *--Stack = Tos; Tos = O_WRITE | O_READ; } pp(readWrite)
766 void writeOnly() { *--Stack = Tos; Tos = O_WRITE ; } pp(writeOnly)
773 typedef struct FILEID {
782 Cell flen = *Stack++;
784 char * caddr = (
char*) *Stack;
786 if(caddr[1]!=
':') plen =
strlen(&G_CLI_PATH);
788 FILE* file = kcalloc(
sizeof(
FILE)+plen+flen+1, 1);
790 char * filename =&((FILEID*)file)->filename[0];
792 filename[plen+flen]=0;
794 while(flen){ --flen; filename[plen+flen] = caddr[flen]; }
796 while(plen){ --plen; filename[plen] = G_CLI_PATH[plen]; }
798 if(Tos & 0x8000 ) nvfs_create(filename, 0);
799 FSM_FILE finfo = nvfs_info(filename);
800 if (finfo.Ready == 0) {
802 qemu_err(
"Failed to open file: %s (Exists: %d)",
811 file->size = finfo.Size;
812 file->path = filename;
824 void closeFile() {
fclose((
FILE*)Tos); Tos = 0; } pp(closeFile)
830 char * buffer = (
char*) *Stack;
832 if( len > (file->size - file->pos)) len = file->size - file->pos;
833 if(!len) { *Stack=0; Tos = 0;
return; }
835 *Stack =
fread( file , 1, len, buffer);
837 if(*Stack==-1) Tos = -70;
846 if(file->pos == file->size){ Stack[1]=*Stack=Tos=0;
return;}
849 char * buffer = (
char*) Stack[1];
850 if( len > (file->size+1 - file->pos)) len = file->size+1 - file->pos;
852 *Stack =
fread( file , 1, len, buffer);
854 if(*Stack==-1){ Tos = -71;
return; }
857 while(file->size > file->pos)
859 if(buffer[len]==
'\n'){
break;}
862 if(buffer[len]==
'\r') len--;
873 char * buffer = (
char*) *Stack++;
876 Tos =
fwrite( file , len, 1, buffer);
885 file->size = *Stack++;
899 const char* filename =
"T:/filename.txt";
902 file =
fopen(filename,
"r");
904 {
fwrite(file, 5 , 1,
"bytes");
908 { tty_printf(
"fopen %s err\n",filename);
912 { tty_printf(
"touch err\n");
915 filename =
"T:/filenameq.txt";
918 file =
fopen(filename,
"r");
920 {
fwrite(file, 5 , 1,
"bytes");
924 { tty_printf(
"fopen %s err\n",filename);
928 { tty_printf(
"touch err\n");
931 tty_printf(
"Test2\n"); } pp(Test2)
941 uint8_t* buffer = kcalloc(1,
filesize + 1);
945 tty_printf(
"%s", buffer);
957 void Bye(
void) {forth_run=0;} pp(Bye)
959 const char *initScript =
960 " : 2NIP 2SWAP 2DROP ;\n"
962 " : HEX 16 BASE ! ;\n"
963 ": DECIMAL 10 BASE ! ;\n"
964 ": HEADER BUILD SMUDGE ;\n"
965 ": CONSTANT HEADER DOCONST , , ;\n"
966 ": CREATE HEADER DOVAR , ;\n"
967 ": VARIABLE CREATE 0 , ;\n"
968 ": [COMPILE] ' , ; IMMEDIATE\n"
973 ": COMPILE R> DUP @ , CELL+ >R ;\n"
974 ": CHAR PARSE-NAME DROP C@ ;\n"
975 ": [CHAR] CHAR LIT, ; IMMEDIATE\n"
976 ": ['] ' LIT, ; IMMEDIATE\n"
977 ": .( [CHAR] ) PARSE TYPE ; IMMEDIATE\n"
978 ": ( [CHAR] ) PARSE 2DROP ; IMMEDIATE\n"
979 ": SLIT, ( string -- ) COMPILE <$> $, ;\n"
980 ": \\ 10 PARSE 2DROP ; IMMEDIATE\n"
981 ": .\\ 10 PARSE TYPE cr ; IMMEDIATE\n"
982 ": .\" [CHAR] \" PARSE SLIT, COMPILE TYPE ; IMMEDIATE\n"
983 ": S\" [CHAR] \" PARSE ?STATE IF SLIT, THEN ; IMMEDIATE\n"
984 ": ABORT -1 THROW ;\n"
986 " PARSE-NAME SFIND DUP\n"
987 " 0= IF -321 THROW THEN \n"
989 " ELSE LIT, ['] COMPILE, COMPILE, THEN\n"
992 " ?STATE 0= IF >BODY ! EXIT THEN\n"
993 " >BODY LIT, POSTPONE ! ; IMMEDIATE\n"
996 "SWAP 255 AND SWAP 2DUP C! 1+ SWAP CMOVE ;\n"
997 ": DEFER@ ( xt1 -- xt2 ) >BODY @ ;\n"
998 ": VALUE CONSTANT ;\n"
999 ": (DO) ( n1 n2 ---)\n"
1001 " R> ROT ROT SWAP >R >R >R ;\n"
1002 ": (?DO) ( n1 n2 ---)\n"
1004 " OVER OVER - IF R> ROT ROT SWAP >R >R CELL+ >R \n"
1005 " ELSE DROP DROP R> @ >R\n"
1009 " POSTPONE R@ ; IMMEDIATE\n"
1010 ": z\\ 10 PARSE h. h. ; IMMEDIATE\n"
1014 " RP@ 3 CELLS + @ ;\n"
1015 "VARIABLE 'LEAVE ( --- a-addr)\n"
1017 ": (LEAVE) ( --- )\n"
1019 " R> @ R> DROP R> DROP >R ;\n"
1022 ": UNLOOP ( --- )\n"
1024 " R> R> DROP R> DROP >R ;\n"
1028 " R> R> 1+ DUP R@ = \n"
1030 " R> DROP DROP CELL+ >R\n"
1035 ": (+LOOP) ( n ---)\n"
1039 " R> SWAP R> DUP R@ - ROT ROT + DUP R@ - ROT XOR 0 < \n"
1040 " IF R> DROP DROP CELL+ >R\n"
1041 " ELSE >R @ >R THEN ;\n"
1047 " POSTPONE (DO) 'LEAVE @ HERE 0 'LEAVE ! \n"
1054 " POSTPONE (?DO) 'LEAVE @ HERE 'LEAVE ! 0 , HERE ; IMMEDIATE\n"
1061 " POSTPONE (LEAVE) HERE 'LEAVE @ , 'LEAVE ! ; IMMEDIATE\n"
1065 " BEGIN DUP WHILE DUP @ HERE ROT ! REPEAT DROP ;\n"
1067 ": LOOP ( x --- )\n"
1070 " POSTPONE (LOOP) , RESOLVE-LEAVE 'LEAVE ! ; IMMEDIATE\n"
1072 ": +LOOP ( x --- )\n"
1076 " POSTPONE (+LOOP) , RESOLVE-LEAVE 'LEAVE ! ; IMMEDIATE\n"
1078 ": (;CODE) ( --- )\n"
1081 " R> LAST @ NAME> ! ;\n"
1087 " POSTPONE (;CODE) \n"
1092 ": SET-CURRENT ( wid -- )\n"
1095 ": GET-CURRENT ( -- wid )\n"
1098 ": GET-ORDER ( -- widn ... wid1 n )\n"
1101 " BEGIN DUP @ ?DUP\n"
1104 " BEGIN R> DUP 0=\n"
1106 "R> SP@ - CELL / 1- ; \n"
1108 " HERE S\" FORTH\" $, FORTH-WORDLIST CELL+ !\n"
1110 ": VOC-NAME. ( wid -- )\n"
1111 "DUP CELL+ @ DUP IF COUNT TYPE BL EMIT DROP ELSE DROP .\" <NONAME>:\" U. THEN ;\n"
1114 "GET-ORDER .\" Context: \" \n"
1115 "0 ?DO ( DUP .) VOC-NAME. SPACE LOOP CR\n"
1116 ".\" Current: \" GET-CURRENT VOC-NAME. CR ;\n"
1118 ": SET-ORDER ( wid1 ... widn n -- )\n"
1120 "DROP FORTH-WORDLIST 1\n"
1122 "DUP CONTEXT-SIZE U> IF -49 THROW THEN\n"
1123 "DUP CELLS context + 0!\n"
1124 "0 ?DO I CELLS context + ! LOOP ;\n"
1125 "CREATE VOC-LIST FORTH-WORDLIST CELL+ CELL+ ,\n"
1127 ": FORTH FORTH-WORDLIST CONTEXT ! ;\n"
1128 ": DEFINITIONS CONTEXT @ CURRENT ! ;\n"
1130 ": WORDLIST ( -- wid )\n"
1132 " HERE VOC-LIST @ , .\" W=\" DUP H. VOC-LIST ! ;\n"
1134 ": ONLY ( -- ) -1 SET-ORDER ;\n"
1135 ": ALSO ( -- ) GET-ORDER OVER SWAP 1+ SET-ORDER ;\n"
1136 ": PREVIOUS ( -- ) GET-ORDER NIP 1- SET-ORDER ;\n"
1139 ": LATEST ( -> NFA ) CURRENT @ @ ;\n"
1141 ": VOCABULARY ( <spaces>name -- )\n"
1142 "WORDLIST CREATE DUP ,\n"
1143 "LATEST SWAP CELL+ !\n"
1144 "DOES> @ CONTEXT ! ;\n"
1145 " VARIABLE CURSTR\n"
1147 ": ->DEFER ( cfa <name> -- ) HEADER DODEFER , , ;\n"
1148 ": DEFER ( <name> -- ) ['] ABORT ->DEFER ;\n"
1152 ": FQUIT BEGIN REFILL WHILE CURSTR 1+!\n"
1153 " INTERPRET REPEAT ;\n"
1155 ": LALIGNED 3 + 3 ANDC ;\n"
1157 " 255 CONSTANT TC/L\n"
1162 "SOURCE-ID >R >IN @ >R LASTIN @ >R CURSTR @ >R CURSTR 0!\n"
1164 " TC/L ALLOCATE THROW TC/L SOURCE!\n"
1166 "['] FQUIT CATCH SAVEERR\n"
1170 "R> CURSTR ! R> LASTIN ! R> >IN ! R> TO SOURCE-ID\n"
1174 " TIB TC/L SOURCE-ID READ-LINE THROW\n"
1175 " SWAP #TIB ! 0 >IN ! CURSTR 1+!\n"
1176 " 0 SOURCE + C! ;\n"
1177 "' FREFILL0 TO FREFILL\n"
1179 "444 CONSTANT CFNAME_SIZE\n"
1180 "CREATE CURFILENAME CFNAME_SIZE 255 + 1+ ALLOT\n"
1181 "CURFILENAME CFNAME_SIZE 255 + 1+ ERASE\n"
1184 "DUP 1+ >R CURFILENAME CURFILENAME R@ + CFNAME_SIZE R> - CMOVE>\n"
1185 "CURFILENAME $! ;\n"
1188 "CURFILENAME COUNT + CURFILENAME\n"
1189 "CFNAME_SIZE CURFILENAME C@ - 255 + CMOVE ;\n"
1193 "R/O OPEN-FILE THROW\n"
1194 "DUP >R ['] INCLUDE-FILE CATCH\n"
1195 "DUP IF cr .\" in <\" CURFILENAME COUNT TYPE .\" >\" CURSTR @ . THEN CFNAME-FREE\n"
1196 "R> CLOSE-FILE DROP THROW ;\n"
1199 "SOURCE-ID >R SOURCE 2>R >IN @ >R\n"
1202 "['] INTERPRET CATCH\n"
1203 "R> >IN ! 2R> SOURCE! R> TO SOURCE-ID\n"
1206 ": FLOAD PARSE-NAME INCLUDED ;\n"
1209 "PARSE-NAME SFIND IF DROP -1 ELSE 2DROP 0 THEN ; IMMEDIATE\n"
1212 "POSTPONE [DEFINED] 0= ; IMMEDIATE\n"
1214 ": \\+ POSTPONE [UNDEFINED] IF POSTPONE \\ THEN ; IMMEDIATE\n"
1215 ": \\- POSTPONE [DEFINED] IF POSTPONE \\ THEN ; IMMEDIATE\n"
1217 ": BREAK POSTPONE EXIT POSTPONE THEN ; IMMEDIATE\n"
1219 ": PRIM? 0< ['] DUP 0< = ;\n"
1222 "DUP PRIM? IF 0 BREAK\n"
1223 "DUP @ DOCONST = ;\n"
1226 "DUP PRIM? IF 0 BREAK\n"
1229 "S\" autoexec.4th\" INCLUDED"
1232 void InitStringSet()
1233 { tib[1]=(__uint32_t)initScript;
1247 Tos = inb(PS2_STATE_REG)&1;
1252 keyboardctl(KEYBOARD_ECHO,
false);
1267 static int lgetCharRaw = 0;
1270 while(Tos==lgetCharRaw) Tos = getCharRaw() ;
1278 keyboardctl(Tos,*Stack++);
1287 static bool kmutex =
false;
1310 extern bool SHIFT,key_alt;
1321 Tos = is_lctrl_key();
1330 extern uint32_t framebuffer_height;
1332 uint32_t CursorHSize = 5;
1340 uint8_t* pixels = framebuffer_addr + (ox * (framebuffer_bpp >> 3)) + (oy+
tty_off_pos_h-3) * framebuffer_pitch;
1342 uint32_t ii = framebuffer_bpp;
1343 while(ii--) pixels[ii] ^= 255;
1345 uint32_t jj = CursorHSize;
1347 { pixels -= framebuffer_pitch;
1348 ii = framebuffer_bpp;
1349 while(ii--) pixels[ii] ^= 255;
1358 char * caddr = (
char*) *Stack;
1360 if(caddr[1]!=
':') plen =
strlen(&G_CLI_PATH);
1362 char * path = kcalloc(plen+dlen+1, 1);
1366 while(dlen){ --dlen; path[plen+dlen] = caddr[dlen]; }
1368 while(plen){ --plen; path[plen] = G_CLI_PATH[plen]; }
1370 FSM_DIR* Dir = nvfs_dir(path);
1371 Tos = -(Dir->Ready != 1) ;
1377 { Tos = (Cell)((FSM_DIR*)*Stack++)->Files[Tos].Name ;
1381 { Tos = ((FSM_DIR*)*Stack++)->Files[Tos].Type ;
1385 { Tos = (Cell)((FSM_DIR*)Tos)->Count ;
1389 { FSM_DIR* Dir = (FSM_DIR*)Tos;
1398 { cli_handler( (
char*) Tos);
1407 FthItem(
"NOOP",~pNoop );
1408 FthItem(
"+",~pAdd );
1409 FthItem(
"-",~pSub );
1410 FthItem(
"D+",~pDAdd );
1411 FthItem(
"1+",~pi1Add );
1412 FthItem(
"1-",~pi1Sub );
1413 FthItem(
"2+",~pi2Add );
1414 FthItem(
"2-",~pi2Sub );
1415 FthItem(
"INVERT",~pInvert);
1416 FthItem(
"NEGATE",~pNegate);
1417 FthItem(
"DNEGATE",~pDNegate);
1418 FthItem(
"DABS",~pDAbs);
1421 FthItem(
"2*",~pi2Mul);
1422 FthItem(
"2/",~pi2Div);
1423 FthItem(
"MOD",~pMod);
1424 FthItem(
"U*",~pUMul);
1425 FthItem(
"U/",~pUDiv);
1426 FthItem(
"UM*",~pUMMul);
1427 FthItem(
"UM/MOD",~pUMMOD);
1428 FthItem(
"/MOD",~pDIVMOD);
1429 FthItem(
"AND",~pAnd);
1430 FthItem(
"ANDC",~pAndC);
1432 FthItem(
"XOR",~pXor);
1433 FthItem(
"ARSHIFT",~pARshift);
1434 FthItem(
"RSHIFT",~pRshift);
1435 FthItem(
"LSHIFT",~pLshift);
1436 FthItem(
"DUP",~pDup );
1437 FthItem(
"CS-DUP",~pDup );
1438 FthItem(
"?DUP",~pQDup );
1439 FthItem(
"OVER",~pOver );
1440 FthItem(
"CS-OVER",~pOver );
1441 FthItem(
"TUCK",~pTuck );
1442 FthItem(
"PICK",~pPick );
1443 FthItem(
"CS-PICK",~pPick );
1444 FthItem(
"SWAP",~pSwap );
1445 FthItem(
"CS-SWAP",~pSwap );
1446 FthItem(
"2SWAP",~pi2Swap );
1447 FthItem(
"ROT",~pRot );
1448 FthItem(
"DROP",~pDrop );
1449 FthItem(
"NIP",~pNip );
1450 FthItem(
"2DROP",~pi2drop );
1451 FthItem(
"2DUP",~pi2dup );
1452 FthItem(
"2OVER",~pi2over);
1454 FthItem(
"U.",~pUDot);
1455 FthItem(
"H.",~pHDot);
1456 FthItem(
"CATCH",PCatch);
1457 FthItem(
"THROW",~pFThrow);
1458 FthItem(
"[",~pIMode); Immediate();
1459 FthItem(
"]",~pCMode);
1460 FthItem(
"@",~pLoad);
1461 FthItem(
"C@",~pCLoad);
1462 FthItem(
"C!",~pCStore);
1463 FthItem(
"C+!",~pCAddStore);
1464 FthItem(
"C!A",~pCStoreA);
1465 FthItem(
"W@",~pWLoad);
1466 FthItem(
"W!",~pWStore);
1467 FthItem(
"2!",~pi2Store);
1468 FthItem(
"2@",~pi2Load);
1469 FthItem(
"COUNT",~pCount);
1470 FthItem(
"!",~pStore);
1471 FthItem(
"+!",~pAddStore);
1472 FthItem(
"1+!",~pIncr);
1473 FthItem(
"0!",~pOff);
1474 FthItem(
"OFF",~pOff);
1476 FthItem(
"=",~pEqual);
1477 FthItem(
"<>",~pNEqual);
1478 FthItem(
"0<",~pZLess);
1479 FthItem(
"0=",~pZEqual);
1480 FthItem(
"0<>",~pZNEqual);
1481 FthItem(
"D0=",~pDZEqual);
1482 FthItem(
"<",~pLess);
1483 FthItem(
">",~pGreat);
1484 FthItem(
"U<",~pULess);
1485 FthItem(
"U>",~pUGreat);
1486 FthItem(
"MAX",~pMax);
1487 FthItem(
"MIN",~pMin);
1488 FthItem(
"0MAX",~pi0Max);
1489 FthItem(
">R",~pToR);
1490 FthItem(
"R>",~pFromR);
1491 FthItem(
"RDROP",~pRDrop);
1492 FthItem(
"R@",~pRLoad);
1493 FthItem(
"2>R",~pi2ToR);
1494 FthItem(
"2R>",~pi2FromR);
1495 FthItem(
"2R@",~pi2RLoad);
1496 FthItem(
"RP@",~pRLoad);
1497 FthItem(
"RP@",~pRPGet);
1498 FthItem(
"SP@",~pSPGet);
1499 FthItem(
"RP!",~pRPSet);
1500 FthItem(
"SP!",~pSPSet);
1501 FthItem(
",",~pCompile);
1502 FthItem(
"ALLOT",~pAllot);
1503 FthItem(
"$,",~pStrCmp);
1504 FthItem(
"<$>",~pStr);
1505 FthItem(
"EXECUTE",~pExecute);
1506 FthItem(
"SMUDGE",~pSmudge);
1507 FthItem(
"TYPE",~pType);
1508 FthItem(
"ZTYPE",~pZType);
1510 FthItem(
"SPACE",~pSpace);
1511 FthItem(
"EMIT",~pEmit);
1512 FthItem(
"PUNCH",~pPunch);
1513 FthItem(
">IN",Pi2in);
1514 FthItem(
"PARSE-NAME",~pParseName);
1515 FthItem(
"PARSE",~pParse);
1516 FthItem(
"SHEADER",~pSHeader);
1517 FthItem(
"BUILD",~pBuild);
1518 FthItem(
"SFIND",~pSFind);
1519 FthItem(
"SEARCH-WORDLIST",~pSearchWordList);
1520 FthItem(
"UCOMPARE",~pUCompare);
1521 FthItem(
"FILL",~pFill);
1522 FthItem(
"CMOVE",~pCmove);
1523 FthItem(
"CMOVE>",~pCmove_up);
1524 FthItem(
"ZCOUNT",~pZCount);
1526 FthItem(
"KEY?",~pKeyQ);
1527 FthItem(
"KEY",~pKey);
1528 sCell PKey = Header(
"KEY"); Co2(~pDoDefer,~pKey);
1530 FthItem(
"LASTKEY",~pLastKey);
1531 FthItem(
"CHLASTKEY",~pChLastKey);
1532 FthItem(
"SCANKEY",~pScanKey);
1533 FthItem(
"KEYBCTL",~pKBctl);
1534 FthItem(
"SCAN2UN",~pScan2Un);
1535 FthItem(
"CURSOR",~pCursor);
1536 Constant(
"CURSOR%",(sCell)&CursorHSize);
1539 FthItem(
"SHIFT?",~pQShift);
1540 FthItem(
"CTL?",~pQCtrl);
1541 FthItem(
"ALT?",~pQAlt);
1544 FthItem(
"TEST1",~pTest1);
1545 FthItem(
"TEST2",~pTest2);
1546 FthItem(
"TEST3",~pTest3);
1548 FthItem(
"IMMEDIATE",~pImmediate);
1549 FthItem(
":",~pColon);
1550 FthItem(
";",~pSemicolon); Immediate();
1551 FthItem(
"IF",~pIf); Immediate();
1552 FthItem(
"ELSE",~pElse); Immediate();
1553 FthItem(
"THEN",~pThen); Immediate();
1554 FthItem(
"BEGIN",~pBegin); Immediate();
1555 FthItem(
"UNTIL",~pUntil); Immediate();
1556 FthItem(
"AGAIN",~pAgain); Immediate();
1557 FthItem(
"WHILE",~pWhile); Immediate();
1558 FthItem(
"REPEAT",~pRepeat); Immediate();
1560 sCell PTrue = Constant(
"TRUE",-1);
1562 FthItem(
"EXIT",~pExit );
1563 Constant(
"STATE",(sCell) &State );
1564 FthItem(
"?STATE",~pStateQ);
1566 Constant(
"DOVAR",~pDoVar );
1567 Constant(
"DOCONST",~pDoConst );
1568 Constant(
"DODEFER",~pDoDefer );
1569 Constant(
"DP", (sCell)&here );
1570 Constant(
"LAST", (sCell)&Last );
1571 Constant(
"LASTCFA", (sCell)&LastCFA );
1572 VVariable(
"WARNING",-1);
1573 FthItem(
"HERE",~pHere);
1574 Constant(
"BL",(sCell)
' ' );
1575 sCell PCell = Constant(
"CELL",
sizeof(Cell) );
1577 FthItem(
"NAME>",~pFromName);
1578 Constant(
"BASE",(sCell)&numericBase);
1580 Header(
"'"); Co5(~pParseName,~pSFind,~pZEqual,~pFThrow,~pExit);
1582 Constant(
"STATE",(sCell) &State );
1583 sCell PHi = Header(
"HI"); Tp(
"Hello!!!"); Co(~pExit);
1584 sCell PLastin = Constant(
"LASTIN", (sCell)&Lastin );
1585 sCell PSaveErrQ = Constant(
"SAVEERR?", (sCell)&SaveErrQ );
1587 FthItem(
"SAVEERR0",~pSaveErr0);
1588 sCell PSaveErr = Header(
"SAVEERR"); Co2(~pDoDefer,~pSaveErr0);
1589 FthItem(
"PRINTERR0",~pPrintErr0);
1591 sCell PContext = Constant(
"CONTEXT",(sCell) &Context );
1592 Constant(
"CURRENT",(sCell) &Current );
1593 Constant(
"IMAGE-BEGIN",(sCell)HereArea );
1594 Constant(
"FORTH-WORDLIST",(sCell) &ForthWordlist );
1595 Constant(
"CONTEXT-SIZE",ContextSize );
1596 sCell PSP0 = VVariable(
"SP0",(sCell) &StackArea[STACK_SIZE-9] );
1598 FthItem(
"R/O",~preadOnly);
1599 FthItem(
"R/W",~preadWrite);
1600 FthItem(
"W/O",~pwriteOnly);
1602 FthItem(
"OPEN-FILE",~popenFile);
1603 FthItem(
"READ-FILE",~preadFile);
1604 FthItem(
"READ-LINE",~preadLine);
1605 FthItem(
"WRITE-FILE",~pwriteFile);
1606 FthItem(
"RESIZE-FILE",~presizeFile);
1609 FthItem(
"CLOSE-FILE",~pcloseFile);
1611 FthItem(
"OPEN-DIR",~pOpenDir);
1612 FthItem(
"DIRI2NAME",~pDirI2Name);
1613 FthItem(
"DIRI2TYPE",~pDirI2Type);
1614 FthItem(
"DIR2COUNT",~pDir2Count);
1615 FthItem(
"CLOSE-DIR",~pCloseDir);
1616 Constant(
"G_CLI_PATH",(sCell)&G_CLI_PATH);
1618 FthItem(
"ZCLI",~pZCli);
1620 FthItem(
"TIB",Ptib);
1621 sCell PATib = Constant(
"ATIB",(sCell)&atib);
1622 sCell Pntib = Constant(
"#TIB",(sCell)&ntib);
1624 FthItem(
"SOURCE",~pSource);
1625 FthItem(
"SOURCE!",~pSourceSet);
1626 FthItem(
"SOURCE-ID",PSourceId);
1628 FthItem(
"ALLOCATE",~pAllocate);
1629 FthItem(
"FREE",~pFree);
1631 Constant(
"YDP", (sCell)&YDP);
1632 Constant(
"YDP0", (sCell)&YDP0);
1633 FthItem(
"YDP_FL",~pYDPFL);
1637 FthItem(
"SETXY",~pSetXY);
1638 FthItem(
"GETXY",~pGetXY);
1642 FthItem(
"PAGE",~(Cell)clean_tty_screen );
1644 sCell PErrDO1 = Header(
"ERROR_DO1"); Co3(PSaveErr,~pPrintErr0,~pExit);
1645 sCell PErrDO = Header(
"ERROR_DO"); Co2(~pDoDefer,PErrDO1);
1647 sCell PAccept = Header(
"ACCEPT"); Co2(~pDoDefer,~pAccept);
1648 sCell PQuery = Header(
"QUERY");
1649 Co4(Ptib,~pLit_,256,PAccept);
1650 Co5(Pntib,~pStore,Pi2in,~pOff,~pExit);
1655 sCell PBye = Header(
"BYE"); Co2(~pBye,PBye);
1657 sCell PLitC = Header(
"LIT,"); Co2(~pDoDefer,~pLitCo);
1658 sCell PPre = Header(
"<PRE>"); Co2(~pDoDefer,~pNoop);
1659 sCell PFileRefill = Header(
"FREFILL"); Co2(~pDoDefer,~pNoop);
1660 sCell PQStack = Header(
"?STACK"); Co2(~pDoDefer,~pNoop);
1662 sCell PRefill = Header(
"REFILL");
1664 If(); Co2(PFileRefill,~pDup); If(); Co(PPre); Then();
1665 Else(); Co2(PQuery,PTrue);
1668 FthItem(
"SNUMBER0",~pSNumber0);
1670 sCell PSNumber = Header(
"SNUMBER"); Co2(~pDoDefer,~pSNumber0 );
1672 sCell PQSLiteral0 = Header(
"?SLITERAL0");
1674 If(); Lit(-13); Co(~pFThrow);
1675 Else(); Co(~pStateQ); If(); Co(PLitC); Then();
1679 sCell PQSLiteral = Header(
"?SLITERAL");
1680 Co2(~pDoDefer,PQSLiteral0);
1682 sCell PInterpret1 = Header(
"INTERPRET1");
1684 Co6(Pi2in,~pLoad,PLastin,~pStore,PSaveErrQ,~pOn);
1685 Co2(~pParseName,~pDup);
1686 While(); Co2(~pSFind,~pQDup);
1688 Co2(~pStateQ,~pEqual);
1689 If(); Co(~pCompile );
1690 Else(); Co(~pExecute );
1692 Else(); Co(PQSLiteral);
1693 Then(); Co(PQStack);
1695 Co2(~pi2drop,~pExit);
1697 sCell PInterpret = Header(
"INTERPRET");
1698 Co2(~pDoDefer,PInterpret1 );
1700 sCell PQuit = Header(
"QUIT");
1701 Begin(); Co(PRefill);
1702 While(); Co(PInterpret); Tp(
" ok\n>");
1703 Repeat(); Co(~pExit);
1705 sCell PWords = Header(
"WORDS");
1706 Co3(PContext,~pLoad,~pLoad);
1708 While(); Co7(~pDup,~pCount,~pType,~pSpace,PCell,~pSub,~pLoad );
1709 Repeat(); Co2(~pDrop,~pExit );
1715 Co(~pInitStringSet);
1716 Co5(~pIMode,~pLit_,PInterpret,PCatch,~pQDup );
1717 If(); Co5(PErrDO,PSP0,~pLoad,~pSPSet,~pCr ) ;
1721 Co4(PATib,~pLit_,(sCell)&tib[1],~pStore);
1722 Co5(~pIMode,~pLit_,PQuit,PCatch,PErrDO);
1723 Co4(PSP0,~pLoad,~pSPSet,~pCr ) ;
1728 uint32_t forth_sys(uint32_t argc,
char** argv) {
1732 tty_printf(
"Hello from Forth!!!\n");
1734 set_cursor_enabled(
false);
1738 SourceId[0]=~pDoConst;
1740 Catch[0] = ~pto_catch;
1741 Catch[1] = ~pfrom_catch;
1742 memset(input_buffer, 0, 256);
1744 HereArea = kcalloc(
sizeof(sCell), HERE_SIZE1);
1745 StackArea = kcalloc(
sizeof(sCell), STACK_SIZE);
1746 RStackArea = kcalloc(
sizeof(sCell), RSTACK_SIZE);
1749 Stack = &StackArea[STACK_SIZE-8] ;
1750 rStack = &RStackArea[RSTACK_SIZE-8] ;
1752 ForthWordlist[0] = 0;
1753 ForthWordlist[1] = 0;
1754 ForthWordlist[2] = 0;
1756 Context[0] = ForthWordlist;
1758 Current[0] = ForthWordlist;
1759 ireg = ~(sCell)MakeImag;
1761 _tty_printf(
"positiv\n");
1765 ((proc) (~ireg) )();
1769 *--rStack = (sCell) ip; ip = (sCell *) ireg;
1775 _tty_printf(
"negative\n");
1778 ((proc) (~ireg) )();
1782 *--rStack = (sCell) ip; ip = (sCell *) ireg;
1788 keyboardctl(KEYBOARD_ECHO,
true);
char * getCharKeyboard(int key, bool mode)
Выводит символ, в зависимости от кода полученного с клавиатуры
uint8_t kbdstatus
Статус клавиатуры
bool SHIFT
Включен ли SHIFT.
volatile int lastKey
Последний индекс клавишы
size_t filesize(const char *Path)
[FileIO] Возвращает размер указанного файла
bool touch(const char *Path)
[FileIO] Создает файл
size_t strlen(const char *str)
Возращает длину строки
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
bool isUTF(char c)
Проверяет, является ли символ формата UTF-8.
void drawRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color)
Рисуем залитый прямоугольник
void fclose(FILE *stream)
Закончить работу с файлом
size_t fwrite(FILE *stream, size_t size, size_t count, const void *ptr)
Запись файла
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
int fsize(FILE *stream)
Получение размера файла в байтах
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Структура файла. Требуется для работы с VFS.
bool mutex_get(mutex_t *mutex, bool wait)
Получить мьютекс
void mutex_release(mutex_t *mutex)
Получить ближайщий свободный блок
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
uint32_t getPosY()
Получение позиции по y.
uint32_t tty_off_pos_h
...
uint32_t getPosX()
Получение позиции по x.
uint32_t tty_bg_color
Текущий задний фон
void _tty_putchar(char c, char c1)
Вывод одного символа
void _tty_puts(const char str[])
Вывод строки
uint32_t tty_pos_y
Позиция на экране по Y.
uint32_t tty_text_color
Текущий цвет шрифта
uint32_t tty_pos_x
Позиция на экране по X.