//ЄюъхэшчрЄюЁ эх чэрхЄ ъюф√ ъюьрэф
//ЄюъхэшчрЄюЁ эх яюфуы ф√трхЄ тяхЁ╕ф ш эх юЄьрЄ√трхЄ эрчрф
//_asmwaseol ухэхЁшЁєхЄё т asmrdword_tokspc(), р eol т√тюфшЄё яюёых ъюьрэф√
//// imported
#include "../_sdk/str.h"
#include "../_sdk/io.h"
VAR UINT _curlnbeg
; //эюьхЁ ёЄЁюъш эр ьюьхэЄ эрўрыр Єюъхэр //фы read, emit
VAR BOOL _cmts
; //фы read, emit
CONST BOOL _isalphanum
[256];
VAR CHAR txt_low
[10];
EXTERN PCHAR _tword
; //Єхъє∙хх ёыютю
EXTERN UINT _lentword
;
//EXTERN CHAR _s0[_STRLEN]; //Єхъє∙хх ёыютю
EXTERN BOOL _waseof
;
EXTERN PBYTE _fin
;
EXTERN PBYTE _fout
;
FUNC BYTE readfin FORWARD
();
EXTERN UINT _curline
; //Єхъє∙шщ эюьхЁ ёЄЁюъш
EXTERN UINT _waseols
; //ўшёыю EOL ё яЁю°ыюую Ёрчр
EXTERN UINT _spcsize
; //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
EXTERN CHAR _cnext
;
FUNC UINT stradd FORWARD
(PCHAR s
, UINT len
, CHAR c
);
FUNC BOOL strcplow FORWARD
(PCHAR s1
, PCHAR s2
);
PROC rdchcmt FORWARD
();
PROC rdch FORWARD
();
PROC rdquotes FORWARD
(CHAR eol
);
PROC initrd FORWARD
();
CONST BYTE _ASMMAXSPC
;
PROC tokpre FORWARD
(); //чряюыэшЄ№ ЄрсышЎє ьхЄюъ
////
VAR CHAR _c1small
;
VAR CHAR _c2small
;
VAR BOOL _asmwaseof
;
VAR UINT _asmwaseols
; //ўшёыю EOL ё яЁю°ыюую Ёрчр
VAR UINT _asmspcsize
;
VAR CHAR _stokfn
[_STRLEN
]; //Єхъє∙хх ёыютю
VAR PCHAR _tokfn
; //Єхъє∙хх ёыютю
VAR UINT _lentokfn
;
VAR BYTE _temppar
;
#define _TOKLBLBUFSIZE 0x1200
VAR UINT _toklblbuffreestart
; //[1];
//VAR UINT _tokoldlblbuffreestart; //[1];
CONST UINT _TOKLBLBUFEOF
= 0xffff;
//CONST UINT _TOKLBLBUFMAXSHIFT = 0x1fb0/**(_LBLBUFSIZE-0x0100)*/; //0x3f00
#define _TOKLBLBUFMAXSHIFT (UINT)(_TOKLBLBUFSIZE-_STRLEN-10)
//todo фшэрьшўхёъш т√фхышЄ№
VAR UINT _toklblshift
[0x100];
//VAR UINT _tokoldlblshift[0x100];
VAR BYTE _toklbls
[_TOKLBLBUFSIZE
]; //0x4000
VAR BYTE _toklblhash
;
PROC rdaddwordall
() //яюфъыхшЄ№ ёыхфє■∙є■ ъюьрэфє ъ Єхъє∙хщ
{
_spcsize
= 0; //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
_waseols
= 0;
_curlnbeg
= _curline
;
IF
(_isalphanum
[(BYTE
)_cnext
] ) { //ёыютю ё ЎшЇЁюсєът√
REPEAT
{ //цф╕ь эхЎшЇЁюсєътє (EOF эх ЎшЇЁюсєътр)
IF
(_lentword
< _STRMAX
) { //т рёьх шч ъюьяшы ЄюЁр тёх ёыютр ъюЁюўх, эю эх т Ёєўэюь рёьх
_tword
[_lentword
] = _cnext
;
INC _lentword
;
};
_cnext
= (CHAR
)readfin
();
}UNTIL
(!_isalphanum
[(BYTE
)_cnext
]/** || _waseof*/ );
}ELSE
{ //ёыютю шч эхЎшЇЁюсєътхээюую ёшьтюыр - ўшЄрхь юфэє эхЎшЇЁюсєътє (шэрўх с√ эх ўшЄрыш)
//rdch(); //ўшЄрхь тё■ уЁєяяє фшхЁхчшёют + ёшьтюы ъръ юфшэ ёшьтюы
IF
(_lentword
< _STRMAX
) { //т рёьх шч ъюьяшы ЄюЁр тёх ёыютр ъюЁюўх, эю эх т Ёєўэюь рёьх
_tword
[_lentword
] = _cnext
;
INC _lentword
;
};
_cnext
= (CHAR
)readfin
();
}; //эхы№ч яюфъыхшЄ№ ¤Єю єёыютшх ъ Ўшъыє, Є.ъ. юэю фы шчэрўры№эюую cnext ш юфшэ Ёрч
goto loopgo
;
loop
: //REPEAT { //цф╕ь эхфшхЁхчшё шыш EOF
_cnext
= (CHAR
)readfin
();
loopgo
:
IF
((BYTE
)_cnext
< (BYTE
)'!') { //єёъюЁхэшх т√їюфр
INC _spcsize
; //spaces after tword
IF
((BYTE
)_cnext
== 0x0a) {
INC _curline
;
_spcsize
= 0;
INC _waseols
;
}ELSE IF
((BYTE
)_cnext
== 0x09) {
_spcsize
= _spcsize
+ 7;
};
IF
(!_waseof
) goto loop
;
};
//}UNTIL (_wasdieresis || _waseof );
_tword
[_lentword
] = '\0';
}
/**
PROC rdwordall()
//ўшЄрхь ёыютю _tword (шч ЄхъёЄр ё фшхЁхчшёрьш тьхёЄю яЁюсхыют, хэЄхЁют, Єрсєы Ўшщ)
//ёыютю чрърэўштрхЄё , ъюуфр фшхЁхчшё шыш эхЎшЇЁюсєътхээ√щ ёшьтюы (юэ яюярф╕Є т cnext, р ъєЁёюЁ т Їрщых яюёых эхую)
{
_lentword = 0; //strclear(_tword); //todo эрЁє°хэр ярЁэюёЄ№ clear..close
rdaddwordall();
}
*/
//////////////////
PROC asmtoken
(BYTE token
)
{
writebyte
(_fout
, token
);
}
PROC tokspc
()
{
//IF (!_waseol) { //уы■ъ эр ъюьрэфрї шч юфэюую ёыютр
WHILE
(_asmspcsize
> (UINT
)_ASMMAXSPC
) { //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
asmtoken
(+_TOKSPC0
+_ASMMAXSPC
);
_asmspcsize
= _asmspcsize
- (UINT
)_ASMMAXSPC
;
};
IF
(_asmspcsize
!=0) asmtoken
(+_TOKSPC0
+ (BYTE
)_asmspcsize
);
//};
}
PROC asmrdword_tokspc
() //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ ъюьрэф√ ш ўшЄрхЄ эютє■
//todo т√фртрЄ№ eol ъръ ъюьрэфє?
{
_asmwaseof
= _waseof
;
_asmwaseols
= _waseols
;
_asmspcsize
= _spcsize
; //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
IF
(_waseols
==0) tokspc
(); //ЄюъхэшчшЁєхь яЁюсхы√ яюёых яЁю°ыющ ъюьрэф√ (шэрўх юЄъырф√трхь эр яюёых eol)
//rdwordall();
_lentword
= 0/**strclear(_tword)*/; //todo эрЁє°хэр ярЁэюёЄ№ clear..close
rdaddwordall
();
_c1small
= (CHAR
)((BYTE
)(*(PCHAR
)_tword
)|0x20);
_c2small
= (CHAR
)((BYTE
)_tword
[1]|0x20);
}
PROC toktext
() //ухэхЁшЁєхЄ <text>text<endtext>
{
asmtoken
(+_TOKTEXT
);
fputs(_tword
, _fout
);
asmtoken
(+_TOKENDTEXT
);
}
//ёухэхЁшЁютрЄ№ Єюъхэ ю°шсъш ё ЄхъёЄрьш юЄё■фр фю ъюэЎр шэёЄЁєъЎшш/ёЄЁюъш (тъы■ўр _tword)
//тъы■ўр яюёыхфэ■■ ъюьрэфє т ёЄЁюъх, ъюЄюЁр ё waseol шыш ъюЄюЁр ':'
PROC tokerr
(BYTE token
)
{
asmtoken
(+_ERR
);
asmtoken
(token
);
WHILE
(+TRUE
) {
toktext
(); //ухэхЁшЁєхЄ <text>text<endtext>
IF
((_waseols
!=0)||(_waseof
)||(*(PCHAR
)_tword
==':')) BREAK
;
asmrdword_tokspc
();
}; //TODO т юфэє ёЄЁюъє
asmtoken
(+_TOKENDERR
);
asmrdword_tokspc
(); //[ЄюъхэшчшЁєхЄ ъюэхўэ√х яЁюсхы√ шыш EOL,] схЁ╕Є ёыхфє■∙є■ ъюьрэфє (яюёых шэёЄЁєъЎшш)
//todo asmfmt_err?
}
//ёухэхЁшЁютрЄ№ Єюъхэ ю°шсъш ё ЄхъёЄюь юЄё■фр фю ъюэЎр ёЄЁюъш (тъы■ўр _tword)
//шыш фю ъюэЎр ъюьрэф√???
PROC tokerrcmd
()
{
tokerr
(+_ERRCMD
); //todo ёфхырЄ№ asmcmd_err...asmfmt_err тюъЁєу?
}
PROC tokinitlblbuf
()
{
_toklblhash
= 0x00;
REPEAT
{
_toklblshift
[_toklblhash
] = _TOKLBLBUFEOF
;
INC _toklblhash
;
}UNTIL
(_toklblhash
== 0x00);
_toklblbuffreestart
= 0;
};
PROC tokcalllbl
()
{
VAR PBYTE plbl
; //ьхЄър т ЄрсышЎх чрърэўштрхЄё эєы╕ь
//VAR PBYTE pstr; //ьхЄър т ёЄЁюъх чрърэўштрхЄё эєы╕ь
//VAR BYTE cstr; //ёшьтюы шч ёЄЁюъш
//VAR BYTE clbl; //ёшьтюы шч ЄрсышЎ√ ьхЄюъ
//VAR BOOL res;
VAR UINT plbl_idx
;
VAR PBYTE calladdr
;
//res = +FALSE;
_toklblhash
= (BYTE
)hash
((PBYTE
)_tword
);
plbl_idx
= _toklblshift
[_toklblhash
];
WHILE
(plbl_idx
!= _TOKLBLBUFEOF
) { //яюър Ўхяюўър ьхЄюъ эх чръюэўшырё№
plbl
= &_toklbls
[plbl_idx
];
plbl_idx
= *(PUINT
)(plbl
);
plbl
= &plbl
[+sizeof(UINT
)/**+1*/]; //skip string size
IF
(strcp
((PCHAR
)_tword
, (PCHAR
)plbl
)) { //ьхЄър эрщфхэр
plbl
= &plbl
[10/**_lenname+1*/];
calladdr
= (PBYTE
)*(PLONG
)(plbl
); //todo PPOI
plbl
= &plbl
[+sizeof(LONG
)]; //todo POI
_temppar
= *(PBYTE
)(plbl
);
//INC plbl;
CALL
(calladdr
);
//res = +TRUE;
//BREAK;
goto e
;
};
};
tokerrcmd
(); //not found
e
: ; //RETURN res;
//asmtoken(0xfd);
}
PROC tokaddlbl1
(PCHAR txt
, PBYTE proc
, BYTE data
)
{
VAR PBYTE plbl
;
//VAR UINT freestart_idx;
//VAR UINT plbl_idx;
_toklblhash
= (BYTE
)hash
((PBYTE
)txt
);
//ьхЄъш эхЄ: яш°хь т эрўрыю Ўхяюўъш рфЁхё ъюэЎр ёЄЁрэшЎ√ ш ёючфр╕ь ьхЄъє Єрь ёю ёё√ыъющ эр ёЄрЁюх эрўрыю Ўхяюўъш
//freestart_idx = _toklblbuffreestart; //[0] //эрўрыю ётюсюфэюую ьхёЄр
//plbl_idx = _toklblbuffreestart; //[0] //freestart_idx; //єърчрЄхы№ эр эрўрыю фрээ√ї ёючфртрхьющ ьхЄъш (эрфю юс чрЄхы№эю чряюьэшЄ№!) //эрўрыю ётюсюфэюую ьхёЄр
plbl
= &_toklbls
[_toklblbuffreestart
]; //[0] [plbl_idx]; //єърчрЄхы№ эр эрўрыю ёючфртрхьющ ьхЄъш //эрўрыю ётюсюфэюую ьхёЄр
//яш°хь ьхЄъє
POKE
*(PUINT
)(plbl
) = _toklblshift
[_toklblhash
]; //ёЄрЁ√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш
_toklblshift
[_toklblhash
] = _toklblbuffreestart
; //[0] //freestart_idx; //эют√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш //эрўрыю ётюсюфэюую ьхёЄр
plbl
= &plbl
[+sizeof(UINT
)];
//POKE *(PBYTE)(plbl) = (BYTE)10/**(BYTE)_lenname*/;
//INC plbl;
strcopy
(txt
, 9/**_lenname*/, (PCHAR
)plbl
);
plbl
= &plbl
[10/**_lenname+1*/];
POKE
*(PLONG
)(plbl
) = (LONG
)proc
; //todo PPOI
plbl
= &plbl
[+sizeof(LONG
)]; //todo POI
POKE
*(PBYTE
)(plbl
) = data
;
//INC plbl;
//plbl_idx = (UINT)(plbl - _toklbls); //єърчрЄхы№ ъюэхЎ ёючфртрхьющ ьхЄъш
//_toklblshift[_toklblhash] = freestart_idx; //эют√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш
//_toklblbuflen = _toklblbuflen + plbl_idx - freestart_idx;
_toklblbuffreestart
= (UINT
)(plbl
- _toklbls
) + 1; //єърчрЄхы№ ъюэхЎ ёючфртрхьющ ьхЄъш //plbl_idx; /**[0]*/
//INC _toklblcount;
}
PROC stringdecapitalize
(PCHAR s1
, PCHAR s2
)
{
VAR CHAR c
;
loop
:
c
= *(PCHAR
)s1
;
IF
(((BYTE
)c
>=(BYTE
)'A') && ((BYTE
)c
<=(BYTE
)'Z')) {
c
= (CHAR
)((BYTE
)c
| 0x20);
};
POKE
*(PCHAR
)(s2
) = c
;
INC s1
;
INC s2
;
IF
(c
!= '\0') goto loop
;
}
PROC tokaddlbl
(PCHAR txt
, PBYTE proc
, BYTE data
)
{
tokaddlbl1
(txt
, proc
, data
);
stringdecapitalize
(txt
, txt_low
);
tokaddlbl1
(txt_low
, proc
, data
);
}
//////////////////////////////////////
//хёыш match ёЁрсюЄры, Єю _tword ё·хфрхЄё (ўшЄрхЄё ёыхфє■∙р ) ш т√тюфшЄё ёююЄтхЄёЄтє■∙шщ Єюъхэ
//хёыш эх ёЁрсюЄры, Єю _tword эх ё·хфрхЄё , ю°шсър эх т√фр╕Єё (Єюы№ъю Їыру +FALSE)
//хёыш ю°шсър, Єю ю°шсър эх т√фр╕Єё (Єюы№ъю Їыру +FALSE)
//reg ш rp ьюуєЄ тёЄЁхЄшЄ№ё т юфэющ яючшЎшш т inc,dec,[ld],[add],[adc],[sbc]
//шэрўх ышсю reg (b,c,d,e,h,l,a,hx,lx,hy,ly, эю эх i,r!), ышсю rp (bc,de,hl,sp,ix,iy, эю эх af!)
//i,r ш af юсЁрсрЄ√трЄ№ юЄфхы№эю, Є.ъ. эрфю Єюы№ъю фы эхъюЄюЁ√ї ъюьрэф, юёЄры№э√х ъюьрэф√ эх фюыцэ√ яЁютхЁ Є№ ¤Єє ю°шсъє яЁш ёрьющ ъюьяшы Ўшш
FUNC BOOL matchdirect
()
{
VAR BOOL ok
;
IF
(*(PCHAR
)_tword
=='#') {
asmtoken
(+_TOKDIRECT
);
asmrdword_tokspc
();
ok
= +TRUE
;
}ELSE ok
= +FALSE
;
RETURN ok
;
}
FUNC BOOL matchcomma
()
{
VAR BOOL ok
;
IF
(*(PCHAR
)_tword
==',') {
asmtoken
(+_TOKCOMMA
);
asmrdword_tokspc
();
ok
= +TRUE
;
}ELSE ok
= +FALSE
;
RETURN ok
;
}
FUNC BOOL matchprime
()
{
VAR BOOL ok
;
IF
(*(PCHAR
)_tword
=='\'') {
asmtoken
(+_TOKPRIMESYM
);
asmrdword_tokspc
();
ok
= +TRUE
;
}ELSE ok
= +FALSE
;
RETURN ok
;
}
FUNC BOOL matchquote
()
{
VAR BOOL ok
;
IF
(*(PCHAR
)_tword
=='\"') {
asmtoken
(+_TOKDBLQUOTESYM
);
//asmrdword_tokspc();
ok
= +TRUE
;
}ELSE ok
= +FALSE
;
RETURN ok
;
}
FUNC BOOL matchreequ
()
{
VAR BOOL ok
;
IF
( (*(PCHAR
)_tword
=='=') || ((_c1small
=='e')&&(_c2small
=='q')) ) {
asmtoken
(+_TOKEQUAL
/**'='*/);
asmrdword_tokspc
();
ok
= +TRUE
;
}ELSE ok
= +FALSE
;
RETURN ok
;
}
FUNC BOOL matchopen
()
{
VAR BOOL ok
;
IF
(*(PCHAR
)_tword
=='(') {asmtoken
(+_TOKOPEN
); asmrdword_tokspc
(); ok
= +TRUE
;
}ELSE IF
(*(PCHAR
)_tword
=='[') {asmtoken
(+_TOKOPENSQ
); asmrdword_tokspc
(); ok
= +TRUE
;
}ELSE ok
= +FALSE
;
RETURN ok
;
}
FUNC BOOL matchclose
()
{
VAR BOOL ok
;
IF
(*(PCHAR
)_tword
==')') {asmtoken
(+_TOKCLOSE
); asmrdword_tokspc
(); ok
= +TRUE
;
}ELSE IF
(*(PCHAR
)_tword
==']') {asmtoken
(+_TOKCLOSESQ
); asmrdword_tokspc
(); ok
= +TRUE
;
}ELSE ok
= +FALSE
;
RETURN ok
;
}
//////////////////////////////////////
FUNC BOOL tokexpr RECURSIVE FORWARD
();
PROC eatlabel
(BYTE token
)
{
WHILE
((_cnext
=='.')||(_cnext
=='#')) {
rdaddwordall
(); //яЁшъыхшЄ№ Єюўъє
IF
(_spcsize
==0)
IF
(_isalphanum
[(BYTE
)_cnext
]) //с√ыю isalpha
IF
(_waseols
==0)
//IF (!_waseof)
rdaddwordall
(); //яЁшъыхшЄ№ ёыхфє■∙хх ёыютю
};
asmtoken
(token
/**_TOKLABEL шыш _CMDLABEL*/);
asmtoken
(+_TOKTEXT
);
fputs(_tword
, _fout
);
asmtoken
(+_TOKENDTEXT
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
//хёыш ьхЄър с√ыр яюёыхфэшь ёыютюь т ёЄЁюъх, Єюуфр ¤Єющ ЄюъхэшчрЎшхщ ь√ чрс√ыш с√ яЁю хэЄхЁ (юэ ЄхяхЁ№ т _asmwaseol)
}
PROC eatval RECURSIVE
() //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
//<val>::=
//(<expr>) //т√Ёрцхэшх (т√ўшёы хЄё )
//|<num> //фхё Єшўэюх ўшёыю (яхЁхфр╕Єё Ўхышъюь)
//|<var> //ьхЄър шыш ярЁрьхЄЁ ьръЁюёр (TODO эх ёююЄтхЄёЄтєхЄ ч√ъє: Єрь ¤Єю &<var>)
//|$
//|'CHAR' //ёшьтюы№эр ъюэёЄрэЄр
//|-<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ NEG
//|+<val> //т√ўшёышЄ№ val
//|~<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ INV
//|!<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ INV(BOOL)
//|*<val> //яЁюўшЄрЄ№ ярь Є№ яю рфЁхёє (т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ PEEK)
{ //ъюьрэфр єцх яЁюўшЄрэр
VAR CHAR opsym
;
{
opsym
= *(PCHAR
)_tword
;
IF
(!_asmwaseof
) { //чр∙шЄр юЄ чрЎшъыштрэш т ъюэЎх ю°шсюўэюую Їрщыр
IF
((BYTE
)((BYTE
)opsym
- (BYTE
)'0') < 0x0a) { //<num> //т√фр╕Є <num><text>digits<endtext> //extra BYTE for C bug
asmtoken
(+_TOKNUM
);
asmtoken
(+_TOKTEXT
);
//for float:
IF
(_cnext
=='.') {
rdaddwordall
(); //яЁшъыхшЄ№ Єюўъє
rdaddwordall
(); //яЁшъыхшЄ№ фЁюсэє■ ўрёЄ№
IF
( (_tword
[_lentword
-1]=='e') && (_cnext
=='-') ) {
rdaddwordall
(); //яЁшъыхшЄ№ '-' юЄЁшЎрЄхы№эющ ¤ъёяюэхэЄ√
rdaddwordall
(); //яЁшъыхшЄ№ юЄЁшЎрЄхы№эє■ ¤ъёяюэхэЄє
};
/* asmrdword_tokspc();
fputs(_tword, _fout);
asmrdword_tokspc();*/ //todo e-12
};
fputs(_tword
, _fout
);
asmtoken
(+_TOKENDTEXT
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
//хёыш ўшёыю с√ыю яюёыхфэшь ёыютюь т ёЄЁюъх, Єюуфр ¤Єющ ЄюъхэшчрЎшхщ ь√ чрс√ыш с√ яЁю хэЄхЁ (юэ ЄхяхЁ№ т _asmwaseol)
}ELSE IF
(_isalphanum
[(BYTE
)opsym
] || (opsym
=='.') ) { //todo єсЁрЄ№ '.', хёыш чряЁхЄшЄ№ эрўшэрЄ№ ьхЄъш ё Єюўъш //с√ыю isalpha
eatlabel
(+_TOKLABEL
);
}ELSE IF
( opsym
=='$' ) {
asmtoken
(+_TOKDOLLAR
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
}ELSE IF
( opsym
=='(' ) {
asmtoken
(+_TOKOPEN
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
tokexpr
(); //ЁхъєЁёш //эр т√їюфх шч expr єцх яЁюўшЄрэр ')', эю ёыхфє■∙шщ ёшьтюы шыш ъюьрэфр эх яЁюўшЄрэ√
asmtoken
(+_TOKCLOSE
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
}ELSE IF
( opsym
=='\'' ) { //todo тёЄртшЄ№ TOK_TEXT...TOK_ENDTEXT
asmtoken
(+_TOKPRIME
);
_lentword
= 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
rdquotes
('\''/**, +FALSE*/);
toktext
(); //ухэхЁшЁєхЄ <text>text<endtext>
rdch
(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
asmtoken
(+_TOKPRIME
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
}ELSE IF
( opsym
=='-' ) {
asmtoken
(+_OPPUSH0
); asmtoken
(+_TOKMINUS
/**'-'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //ЁхъєЁёштэ√щ т√чют val
asmtoken
(+_OPSUB
);
}ELSE IF
( opsym
=='+' ) {
asmtoken
(+_OPPUSH0
); asmtoken
(+_TOKPLUS
/**'+'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //ЁхъєЁёштэ√щ т√чют val
asmtoken
(+_OPADD
);
}ELSE IF
( opsym
=='*' ) {
asmtoken
(+_OPPUSH0
); asmtoken
(+_TOKSTAR
/**'*'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //ЁхъєЁёштэ√щ т√чют val
asmtoken
(+_OPPEEK
);
}ELSE IF
( opsym
=='~' ) {
asmtoken
(+_OPPUSH0
); asmtoken
(+_TOKTILDE
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //ЁхъєЁёштэ√щ т√чют val
asmtoken
(+_OPINV
);
}ELSE IF
( opsym
=='!' ) {
asmtoken
(+_OPPUSH0
); asmtoken
(+_TOKEXCL
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //ЁхъєЁёштэ√щ т√чют val
asmtoken
(+_OPINV
); //todo BOOL
}ELSE
{ tokerr
(+_ERREXPR
);/**errstr( ">>>WRONG PREFIX " ); err( opsym ); enderr();*/ };
};
}
}
PROC eatmul
()
{
/**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken
(+_TOKSTAR
/**'*'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPMUL
);
}
PROC eatdiv
()
{
/**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken
(+_TOKSLASH
/**'/'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPDIV
);
}
PROC eatand
()
{
/**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken
(+_TOKAND
/**'&'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPAND
);
}
PROC eatandbool
()
{
/**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken
(+_TOKAND
/**'&'*/); asmtoken
(+_TOKAND
/**'&'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPAND
);
}
PROC eatmulval RECURSIVE
() //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
{ //ъюьрэфр єцх яЁюўшЄрэр
VAR CHAR opsym
;
VAR BOOL dbl
;
{
eatval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
WHILE
((!_asmwaseof
)&&(_asmwaseols
==0)) { //єцх яЁюўшЄрэр юяхЁрЎш ш яЁюсхы√-хэЄхЁ√ яюёых эх╕ (_asmwaseol - хэЄхЁ яюёых val)
opsym
=*(PCHAR
)_tword
;
dbl
= (opsym
=='&')&&(_cnext
==opsym
); //C compatibility
IF
(dbl
) asmrdword_tokspc
(); //use '&' //C compatibility
IF
(opsym
=='*') {eatmul
();
}ELSE IF
(opsym
=='/') {eatdiv
();
}ELSE IF
(opsym
=='&') {
IF
(dbl
) {eatandbool
();
}ELSE eatand
();
}ELSE BREAK
;
};
}
}
PROC eatadd
()
{
/**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken
(+_TOKPLUS
/**'+'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatmulval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPADD
);
}
PROC eatsub
()
{
/**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken
(+_TOKMINUS
/**'-'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatmulval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPSUB
);
}
PROC eator
()
{
/**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken
(+_TOKPIPE
/**'|'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatmulval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPOR
);
}
PROC eatorbool
()
{
/**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken
(+_TOKPIPE
/**'|'*/); asmtoken
(+_TOKPIPE
/**'|'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatmulval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPOR
);
}
PROC eatxor
()
{
/**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken
(+_TOKCARON
/**'^'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatmulval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPXOR
);
}
PROC eatxorbool
()
{
/**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken
(+_TOKCARON
/**'^'*/); asmtoken
(+_TOKCARON
/**'^'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatmulval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPXOR
);
}
PROC eatsumval RECURSIVE
() //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
{ //ъюьрэфр єцх яЁюўшЄрэр
VAR CHAR opsym
;
VAR BOOL dbl
;
{
eatmulval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
WHILE
((!_asmwaseof
)&&(_asmwaseols
==0)) { //єцх яЁюўшЄрэр юяхЁрЎш ш яЁюсхы√-хэЄхЁ√ яюёых эх╕ (_asmwaseol - хэЄхЁ яюёых val)
opsym
=*(PCHAR
)_tword
;
dbl
= ( (opsym
=='|')||(opsym
=='^') )&&(_cnext
==opsym
); //C compatibility
IF
(dbl
) asmrdword_tokspc
(); //use '|' or '^' //C compatibility
IF
(opsym
=='+') {eatadd
();
}ELSE IF
(opsym
=='-') {eatsub
();
}ELSE IF
(opsym
=='|') {
IF
(dbl
) {eatorbool
();
}ELSE eator
();
}ELSE IF
(opsym
=='^') {
IF
(dbl
) {eatxorbool
();
}ELSE eatxor
();
}ELSE BREAK
;
};
}
}
PROC eatshl
()
{
/**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken
(+_TOKLESS
/**'<'*/); asmtoken
(+_TOKLESS
/**'<'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPSHL
);
}
PROC eatshr
()
{
/**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken
(+_TOKMORE
/**'>'*/); asmtoken
(+_TOKMORE
/**'>'*/);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPSHR
);
}
PROC eatless
()
{
asmtoken
(+_TOKLESS
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPLESS
);
}
PROC eatlesseq
()
{
asmtoken
(+_TOKLESS
); asmtoken
(+_TOKEQUAL
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPLESSEQ
);
}
PROC eatmore
()
{
asmtoken
(+_TOKMORE
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPMORE
);
}
PROC eatmoreeq
()
{
asmtoken
(+_TOKMORE
); asmtoken
(+_TOKEQUAL
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPMOREEQ
);
}
PROC eateq
()
{
asmtoken
(+_TOKEQUAL
); asmtoken
(+_TOKEQUAL
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPEQ
);
}
PROC eatnoteq
()
{
asmtoken
(+_TOKEXCL
); asmtoken
(+_TOKEQUAL
);
asmrdword_tokspc
(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
asmtoken
(+_OPNOTEQ
);
}
FUNC BOOL tokexpr RECURSIVE
() //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
{ //ъюьрэфр єцх яЁюўшЄрэр
VAR CHAR opsym
;
VAR BOOL modified
;
VAR BOOL dbl
;
//VAR BOOL ok;
{
//ok = +TRUE;
matchdirect
(); //яЁюяєёъ '#'
eatsumval
(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш
WHILE
((!_asmwaseof
)&&(_asmwaseols
==0)) { //єцх яЁюўшЄрэр юяхЁрЎш ш яЁюсхы√-хэЄхЁ√ яюёых эх╕ (_asmwaseol - хэЄхЁ яюёых val)
opsym
= *(PCHAR
)_tword
;
modified
= (_cnext
=='=');
dbl
= (_cnext
==opsym
);
IF
(modified
||dbl
) asmrdword_tokspc
(); //use '=' or '>' or '<'
IF
(opsym
=='<') {
IF
(dbl
) {eatshl
(); //ёЄрЁюх ёфтшэєЄ№ ёЄюы№ъю Ёрч, ёъюы№ъю уырёшЄ эютюх!
}ELSE IF
(modified
) {eatlesseq
();
}ELSE
{eatless
();
};
}ELSE IF
(opsym
=='>') {
IF
(dbl
) {eatshr
(); //ёЄрЁюх ёфтшэєЄ№ ёЄюы№ъю Ёрч, ёъюы№ъю уырёшЄ эютюх!
}ELSE IF
(modified
) {eatmoreeq
();
}ELSE
{eatmore
();
};
}ELSE IF
(opsym
=='=') {eateq
();
}ELSE IF
(opsym
=='!') {eatnoteq
();
}ELSE BREAK
;
};
RETURN
+TRUE
; //ok; //todo err
}
}
FUNC BOOL tokexpr_close
() //яюёых эхую эшўхую сюы№°х эхы№ч яЁютхЁ Є№, Є.ъ. ъєЁёюЁ ьюу ёфтшэєЄ№ё
{
VAR BOOL ok
;
ok
= tokexpr
();
IF
(ok
) ok
= matchclose
();
RETURN ok
;
}
PROC asm_direct_expr_close_token
(BYTE token
)
{
//if(matchdirect()) {
IF
(tokexpr
()) {
IF
(matchclose
()) {asmtoken
(token
);
}ELSE tokerr
(+_ERRCLOSE
); //no closing bracket
}ELSE tokerr
(+_ERREXPR
); //wrong expr
//}else tokerr(_ERRPAR); //no direct
}
PROC tokcomment
()
{
asmtoken
(+_TOKCOMMENT
);
_lentword
= 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
IF
(_waseols
==0) { //юсїюф эр ёыєўрщ ъюэхўэюую ; яхЁхф ъюьрэфющ
WHILE
(_spcsize
!= 0) { //фюсртшЄ№ ё·хфхээ√х яЁюсхы√
_lentword
= stradd
(_tword
, _lentword
, ' ');
DEC _spcsize
;
};
WHILE
(_waseols
==0/**&&(!_waseof)*//**&&(_cnext!=_DIERESIS)*/) {
rdchcmt
(); //яЁюяєёърхЄ тёх хэЄхЁ√
};
};
_tword
[_lentword
] = '\0';
toktext
(); //ухэхЁшЁєхЄ <text>text<endtext>
asmtoken
(+_TOKENDCOMMENT
);
IF
((BYTE
)_cnext
< (BYTE
)'!') {
IF
(_cnext
== '\t') {
_spcsize
= _spcsize
+ 8;
}ELSE
{
INC _spcsize
;
};
rdch
(); //ўшЄрхь тё■ уЁєяяє фшхЁхчшёют + ёшьтюы ъръ юфшэ ёшьтюы
};
asmrdword_tokspc
(); //[ЄюъхэшчшЁєхЄ ъюэхўэ√х яЁюсхы√ шыш EOL,] схЁ╕Є ёыхфє■∙є■ ъюьрэфє (яюёых шэёЄЁєъЎшш)
}
PROC tokorg
()
{
asmtoken
(+_CMDORG
);
asmrdword_tokspc
(); //ё·хфрхь ъюьрэфє
IF
(tokexpr
()) {asmtoken
(+_FMTCMD
);
}ELSE tokerr
(+_ERREXPR
); //wrong expr
}
PROC tokalign
()
{
asmtoken
(+_CMDALIGN
);
asmrdword_tokspc
(); //ё·хфрхь ъюьрэфє
IF
(tokexpr
()) {asmtoken
(+_FMTCMD
);
}ELSE tokerr
(+_ERREXPR
); //wrong expr
}
/**
PROC tokpage()
{
tokerrcmd();
}
PROC tokif()
{
asmtoken(+_CMDIF);
asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
IF (tokexpr()) {asmtoken(+_FMTCMD);
}ELSE tokerr(+_ERREXPR); //wrong expr
//tokerrcmd();
}
PROC tokelse()
{
asmtoken(+_CMDELSE);
asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
//tokerrcmd();
}
PROC tokendif()
{
asmtoken(+_CMDENDIF);
asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
//tokerrcmd();
}
PROC tokdup()
{
tokerrcmd();
}
PROC tokedup()
{
tokerrcmd();
}
PROC tokmacro()
{
tokerrcmd();
}
PROC tokendm()
{
tokerrcmd();
}
*/
PROC tokexport
()
{
asmtoken
(+_CMDEXPORT
);
asmrdword_tokspc
(); //ё·хфрхь call
eatlabel
(+_TOKLABEL
);
//asmmtoken(+_TOKTEXT);
//fputs(_tword, _fout);
//asmtoken(+_TOKENDTEXT);
//asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
asmtoken
(+_FMTCMD
); //ўЄюс√ шёяюы№чютрЄ№ label
}
/**
PROC toklocal()
{
tokerrcmd();
}
PROC tokendl()
{
tokerrcmd();
}
PROC tokdisp()
{
asmtoken(+_CMDDISP);
asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
IF (tokexpr()) {asmtoken(+_FMTCMD);
}ELSE tokerr(+_ERREXPR); //wrong expr
}
PROC tokent()
{
asmtoken(+_CMDENT);
asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
asmtoken(+_FMTCMD);
}
*/
PROC tokinclude
()
{
asmtoken
(+_CMDINCLUDE
);
asmrdword_tokspc
(); //ё·хфрхь ъюьрэфє
IF
(matchquote
()) {
//asmtoken(+_OPWRSTR);
_lentword
= 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
rdquotes
('\"');
toktext
(); //ухэхЁшЁєхЄ <text>text<endtext>
rdch
(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
asmtoken
(+_TOKDBLQUOTESYM
);
asmrdword_tokspc
();
}ELSE tokerr
(+_ERREXPR
);
//asmtoken(+_FMTCMD); //todo?
}
PROC tokincbin
()
{
asmtoken
(+_CMDINCBIN
);
asmrdword_tokspc
(); //ё·хфрхь ъюьрэфє
IF
(matchquote
()) {
//asmtoken(+_OPWRSTR);
_lentword
= 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
rdquotes
('\"');
toktext
(); //ухэхЁшЁєхЄ <text>text<endtext>
rdch
(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
asmtoken
(+_TOKDBLQUOTESYM
);
asmrdword_tokspc
();
}ELSE tokerr
(+_ERREXPR
);
//todo ярЁрьхЄЁ√ (яЁюяєёъ, фышэр)
//asmtoken(+_FMTCMD); //todo?
}
PROC tokdb
()
{
asmtoken
(+_CMDDB
);
asmrdword_tokspc
(); //ё·хфрхь ъюьрэфє
REPEAT
{
IF
(matchquote
()) {
asmtoken
(+_OPWRSTR
);
_lentword
= 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
rdquotes
('\"');
toktext
(); //ухэхЁшЁєхЄ <text>text<endtext>
rdch
(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
asmtoken
(+_TOKDBLQUOTESYM
);
asmrdword_tokspc
();
}ELSE IF
(tokexpr
()) {
asmtoken
(+_OPWRVAL
);
}ELSE tokerr
(+_ERREXPR
);
}UNTIL
(!matchcomma
());
asmtoken
(+_FMTCMD
);
}
PROC tokdw
()
{
asmtoken
(+_CMDDW
);
asmrdword_tokspc
(); //ё·хфрхь ъюьрэфє
REPEAT
{
tokexpr
();
asmtoken
(+_OPWRVAL
);
}UNTIL
(!matchcomma
());
asmtoken
(+_FMTCMD
);
}
PROC tokdl
()
{
asmtoken
(+_CMDDL
);
asmrdword_tokspc
(); //ё·хфрхь ъюьрэфє
REPEAT
{
tokexpr
();
asmtoken
(+_OPWRVAL
);
}UNTIL
(!matchcomma
());
asmtoken
(+_FMTCMD
);
}
PROC tokds
()
{
asmtoken
(+_CMDDS
);
asmrdword_tokspc
(); //ё·хфрхь ъюьрэфє
tokexpr
();
WHILE
(matchcomma
()) {
tokexpr
();
};
asmtoken
(+_FMTCMD
);
}
/**
PROC tokdisplay()
{
tokerrcmd();
}
PROC tokrepeat()
{
tokerrcmd();
}
PROC tokuntil()
{
tokerrcmd();
}
PROC tokstruct()
{
tokerrcmd();
}
PROC tokendstruct()
{
tokerrcmd();
}
*/
PROC tokcolon
()
{
asmtoken
(+_TOKCOLON
);
asmrdword_tokspc
(); //ё·хфрхь ':'
}
///////////////////////
PROC tokcmd
()
{
//_asmwaseof=_waseof;
//rdword_tokspc(); //яЁюўшЄрэю т яЁхф√фє∙хщ шэёЄЁєъЎшш
//stringdecapitalize(_tword,_lentword);
IF
(*(PCHAR
)_tword
==';') {tokcomment
();
/** }ELSE IF (*(PCHAR)_tword==':') {
asmtoken(+_TOKCOLON);
asmrdword_tokspc(); //ё·хфрхь ':'
*/
}ELSE IF
(_asmspcsize
!=0) {
//tokasm(); //assembly mnemonic or directive
tokcalllbl
();
/** IF (!tokcalllbl(_tword)) {
tokerrcmd(); //wrong _tword
};*/
}ELSE
{ //<label> шыш <label>=<expr>
//asmtoken(0xff);
eatlabel
(+_CMDLABEL
); //ё·хфрхь ьхЄъє
IF
(matchreequ
()) { //<label>=<expr>
IF
(tokexpr
()) {
asmtoken
(+_FMTREEQU
);
}ELSE tokerr
(+_ERREXPR
); //wrong expr
}ELSE
//IF ((_asmwaseols!=0)||(_asmwaseof)||(*(PCHAR)_tword==':')||(*(PCHAR)_tword==';')){ //<label>
asmtoken
(+_FMTCMD
); //<label>
//}ELSE tokerrcmd(); //wrong _tword
};
//яш°хь eol ш яЁюсхы√, ъюЄюЁ√х эх чряшёрыш яЁш ўЄхэшш ъюэхўэюую ёыютр
IF
(_asmwaseols
!=0) {
WHILE
(_asmwaseols
!=0) {
asmtoken
(+_TOKEOL
);
DEC _asmwaseols
;
};
tokspc
(); //ЄюъхэшчшЁєхь яЁюсхы√ яюёых
};
}
PROC tokinit
()
{
_tokfn
= (PCHAR
)_stokfn
;
tokinitlblbuf
();
tokpre
(); //чряюыэшЄ№ ЄрсышЎє ьхЄюъ
}
PROC tokenize
(PCHAR fn
)
{
VAR UINT i
;
_fin
= nfopen
(fn
, "rb");
IF
(_fin
!= (PBYTE
)0) {
_waseof
= +FALSE
;
_curline
= 1;
initrd
();
_lentokfn
= 0;
i
= 0;
WHILE
(fn
[_lentokfn
] != '\0') {
_tokfn
[_lentokfn
] = fn
[_lentokfn
];
IF
(fn
[_lentokfn
] == '.') i
= _lentokfn
;
INC _lentokfn
;
};
//_lentokfn = strjoineol(_tokfn, 0, fn, '.'); //terminator is not copied
//_lentokfn = stradd(_tokfn, _lentokfn, '.');
_lentokfn
= i
+1; //after last dot
_lentokfn
= stradd
(_tokfn
, _lentokfn
, (CHAR
)((BYTE
)fn
[_lentokfn
]&0xdf));
_lentokfn
= stradd
(_tokfn
, _lentokfn
, '_');
_tokfn
[_lentokfn
] = '\0';
_fout
= openwrite
(_tokfn
);
_asmwaseols
= 0;
_asmwaseof
= +FALSE
;
asmrdword_tokspc
(); //ўшЄрхь яхЁтє■ ъюьрэфє
WHILE
(!_asmwaseof
) { //todo шыш endasm ('}')
tokcmd
();
};
asmtoken
(+_TOKEOF
);
fclose(_fout
); //closewrite(_fout); //closefout();
fclose(_fin
); //closefin();
};
}
PROC tokenize_end
()
{
}