Rev 653 | Blame | Compare with Previous | Last modification | View Log | Download
;ЇюЁьрЄ ьхЄъш:;(2) рфЁхё ёыхфє■∙хщ ьхЄъш шыш _LBLBUFEOF (0xffff);[(1) фышэр шьхэш ьхЄъш (Єюы№ъю т lbltype.c)];(n) шь ьхЄъш (ASCIIZ);(1) Єшя ьхЄъш;(1) ыюъры№эюёЄ№ ьхЄъш (isloc), юс√ўэю 0;(2) рфЁхё ьхЄъш Єшяр (т lbltype.c шэфхъё ьхЄъш Єшяр т ьрёёштх _lbls);(2) ЁрчьхЁ шэЇюЁьрЎшюээюую яюы яхЁхьхээющ шыш Єшяр (1,2,4 шыш ьэюую фы ёЄЁєъЄєЁ, 0 фы ЇєэъЎшщ);_lblhash = 0x00;;REPEAT {; _lblshift[_lblhash] = _LBLBUFEOF;; INC _lblhash;;}UNTIL (_lblhash == 0x00);;_lblbuffreeidx = 0;initlblbufEXPORT initlblbufxor aLD HL,_lblshiftLD DE,_LBLBUFEOFinitlblbuf.A.LD [HL],EINC HLLD [HL],DINC HLINC aJP NZ,initlblbuf.A.LD HL,_lblsLD [_lblbuffreeidx],HLRET;тхЁэєЄ№ Єшя ьхЄъш _name ш _typeaddr;t = _T_UNKNOWN;;_lblhash = (BYTE)hash((PBYTE)_name);;plbl_idx = _lblshift[_lblhash];;WHILE (plbl_idx != _LBLBUFEOF) { //яюър Ўхяюўър ьхЄюъ эх чръюэўшырё№; plbl = &_lbls[plbl_idx];; plbl_idx = *(PUINT)(plbl);; plbl = &plbl[+sizeof(UINT)+1]; //skip string size; IF (strcp((PCHAR)_name, (PCHAR)plbl)) { //ьхЄър эрщфхэр; _typeaddr = (UINT)(plbl - _lbls); //фы чряюьшэрэш Єшяр т сєфє∙хщ яхЁхьхээющ //т C шэфхъё√, т рёьх єърчрЄхыш (ыхчєЄ т UINT); plbl = &plbl[_lenname+1];; t = *(TYPE*)(plbl);; plbl = &plbl[+sizeof(TYPE)]; //INC plbl;; _isloc = (BOOL)*(PBYTE)(plbl);; INC plbl;; IF ((t&_T_TYPE)==(TYPE)0x00) _typeaddr = *(PUINT)(plbl); //тёяюьшэрхь рфЁхё Єшяр, хёыш ¤Єю яхЁхьхээр , р эх юс· тыхэшх Єшяр; plbl = &plbl[+sizeof(UINT)];; _varsz = *(PUINT)(plbl);; break;; };;};;RETURN t;lbltypeEXPORT lbltypeLD de,[_name]xor ald h,ald l,albltype.hash0.xor ladd hl,hladd a,l ;TODO hld l,ald a,[de]inc deor ajp nz,lbltype.hash0.ld h,a;0add hl,hlLD de,_lblshiftADD HL,DEld [_lblhashaddr],hl ;for addlblLD e,[HL]INC HLLD d,[HL] ;de=first label (from hash)lbltype.A.ld a,dand einc a ;label==_LBLBUFEOF?jr z,lbltype.B. ;not foundex de,hlLD e,[HL]INC HLLD d,[HL] ;de=next labelinc hlLD [lbltype.newtypeaddr],hl ;фы чряюьшэрэш Єшяр т сєфє∙хщ яхЁхьхээющLD bc,[_name] ;delbltype.strcp0.ld a,[bc] ;s2 (name)cp [hl] ;s1 (label name)jr nz,lbltype.A.inc hlinc bcor ajp nz,lbltype.strcp0.LD a,[HL]ld c,a ;tinc hl ;+sizeof(TYPE)AND _T_TYPELD A,[HL]LD [_isloc],AINC HLLD e,[HL]INC HLLD d,[HL] ;рфЁхё Єшярinc hljr Z,lbltype.E. ;шёяюы№чєхь рфЁхё Єшярlbltype.newtypeaddr=$+1ld de,0 ;хёыш ¤Єю юс· тыхэшх Єшяр, Єю шёяюы№чєхь рфЁхё ёрьющ ьхЄъшlbltype.E.LD [_typeaddr],deLD e,[HL]INC HLLD d,[HL]LD [_varsz],deld a,c ;RETURN tretlbltype.B.LD A,_T_UNKNOWN;ld hl,_lbls+2;LD [_typeaddr],hl ;фы чряюьшэрэш Єшяр т сєфє∙хщ яхЁхьхээющRET;_lblhash = (BYTE)hash((PBYTE)_name);;plbl_idx = _lblshift[_lblhash];;WHILE (plbl_idx != _LBLBUFEOF) { //яюър Ўхяюўър ьхЄюъ эх чръюэўшырё№; plbl = &_lbls[plbl_idx];; plbl_idx = *(PUINT)(plbl);; plbl = &plbl[+sizeof(UINT)+1]; //skip string size; IF (strcp((PCHAR)_name, (PCHAR)plbl)) { //ьхЄър эрщфхэр; POKE *(PCHAR)(plbl) = '\0';; break;; };;};dellblEXPORT dellblLD de,[_name]xor ald h,ald l,adellbl.hash0.xor ladd hl,hladd a,h;lld l,ald a,[de]inc deor ajp nz,dellbl.hash0.ld h,a;0add hl,hlLD de,_lblshiftADD HL,DELD e,[HL]INC HLLD d,[HL]dellbl.A.ld a,dand einc a ;de==_LBLBUFEOF?ret zex de,hlLD e,[HL]INC HLLD d,[HL]inc hlLD [dellbl.plbl],HLLD bc,[_name]dellbl.strcp0.ld a,[bc] ;s2cp [hl] ;s1jr nz,dellbl.A.inc hlinc bcor ajp nz,dellbl.strcp0.dellbl.plbl=$+1LD [0],aRET;тч Є№ эрчтрэшх Єшяр ёЄЁєъЄєЁ√ т s (ёЁрчє яюёых lbltype);RETURN strcopy((PCHAR)&_lbls[_typeaddr], (UINT)*(PBYTE)&_lbls[_typeaddr-1], s); //from, n, to //т C шэфхъё√, т рёьх єърчрЄхыш (ыхчєЄ т UINT)gettypenameEXPORT gettypenameEXPORT gettypename.A.LD hl,[_typeaddr]gettypename.A.=$+1ld de,0 ;toxor ald b,ald c,agettypename0cp [hl]ldijp nz,gettypename0 ;bc=-lenld h,ald l,a ;0scfsbc hl,bc ;0-(-len)-1 = len-1 ;len without terminatorRET;EXPORT PROC addlbl(TYPE t, BOOL isloc, UINT varsz) //(_name);oldt = lbltype(); //(_name) //єёЄрэртыштрхЄ _isloc (хёыш эрщфхэр) ш _typeaddr (рфЁхё, хёыш эрщфхэр);IF ((oldt == _T_UNKNOWN)||isloc) { //хёыш эх с√ыю ьхЄъш шыш ыюъры№эр яютхЁї уыюсры№эющ шыш фЁєующ ыюъры№эющ (ярЁрьхЄЁр); //ьхЄъш эхЄ: яш°хь т эрўрыю Ўхяюўъш рфЁхё ъюэЎр ёЄЁрэшЎ√ ш ёючфр╕ь ьхЄъє Єрь ёю ёё√ыъющ эр ёЄрЁюх эрўрыю Ўхяюўъш; freeidx = _lblbuffreeidx; //[0] //эрўрыю ётюсюфэюую ьхёЄр; IF (freeidx < _LBLBUFMAXSHIFT) { //хёЄ№ ьхёЄю яюф ьхЄъє; plbl = &_lbls[freeidx]; //єърчрЄхы№ эр эрўрыю ёючфртрхьющ ьхЄъш; //яш°хь ьхЄъє; POKE *(PUINT)(plbl) = _lblshift[_lblhash]; //ёЄрЁ√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш; plbl = &plbl[+sizeof(UINT)];; POKE *(PBYTE)(plbl) = (BYTE)_lenname;; INC plbl;; strcopy(_name, _lenname, (PCHAR)plbl);; plbl = &plbl[_lenname+1];; POKE *(TYPE*)(plbl) = t;; plbl = &plbl[+sizeof(TYPE)]; //INC plbl;; POKE *(PBYTE)(plbl) = (BYTE)isloc;; INC plbl;; POKE *(PUINT)(plbl) = _typeaddr; //ёё√ыър эр эрчтрэшх Єшяр (фы ёЄЁєъЄєЁ√); plbl = &plbl[+sizeof(UINT)];; _varszaddr = (UINT)(plbl - _lbls); //ўЄюс√ яюЄюь ьюцэю с√ыю ьхэ Є№; POKE *(PUINT)(plbl) = varsz;; _lblbuffreeidx = (UINT)(plbl - _lbls) + +sizeof(UINT); //єърчрЄхы№ ъюэхЎ ёючфртрхьющ ьхЄъш; _lblshift[_lblhash] = freeidx; //эют√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш; }ELSE {errstr("nomem"); enderr();; };;}ELSE IF (oldt != t) {; errstr("addvar type doesn't match previous declaration:"); errstr(_name); enderr();;};addlblEXPORT addlblEXPORT addlbl.A.EXPORT addlbl.B.EXPORT addlbl.C.CALL lbltypeLD [addlbl.oldt],Aaddlbl.B.=$+1ld b,0inc bjr z,addlbl.isloconSUB _T_UNKNOWNJP nz,addlbl.D.addlbl.isloconLD HL,[_lblbuffreeidx] ;addr of free space for a labelLD DE,_lbls+_LBLBUFMAXSHIFTLD A,LSUB ELD A,HSBC A,DJP NC,addlbl.F.ex de,hl ;de=addr of space for a label_lblhashaddr=$+1LD hl,0ld a,[hl]ld [hl],e ;correct addr in hash table LSBld [de],a ;copy next label addr from hash table LSBinc hlld a,[hl]ld [hl],d ;correct addr in hash table HSBinc deld [de],a ;copy next label addr from hash table HSBinc deLD bc,[_lenname]LD HL,[_name]inc bc ;copy with terminatorldirex de,hladdlbl.A.=$+1LD [HL],0 ;tinc hlLD A,[addlbl.B.] ;islocLD [HL],AINC HLLD DE,[_typeaddr]LD [HL],EINC HLLD [HL],DINC HLLD [_varszaddr],HLaddlbl.C.=$+1LD DE,0 ;varszLD [HL],EINC HLLD [HL],DINC HLLD [_lblbuffreeidx],hlretaddlbl.F.LD HL,addlbl.H.LD [errstr.A.],HLCALL errstrjp enderraddlbl.D.LD A,[addlbl.A.] ;taddlbl.oldt=$+1SUB 0ret zLD HL,addlbl.K.LD [errstr.A.],HLCALL errstrLD HL,[_name]LD [errstr.A.],HLCALL errstrjp enderraddlbl.H.db "nomem",0addlbl.K.db "addvar type doesn't match previous declaration:",0;POKE *(PUINT)(&_lbls[addr]) = shift;setvarszEXPORT setvarszEXPORT setvarsz.A.EXPORT setvarsz.B.setvarsz.B.=$+1LD hl,0 ;shiftsetvarsz.A.=$+1LD [0],hl ;addrRET