'
'                 Разрешение ссылок вперед
'
SUB ExtRef
Shared LabTab$(),OrgTab%()
Shared RefLab$(),RefDisp%(),RefSize%(),OpLen%()
Shared PtrLab%,PtrRef%
Shared ErrCode%,ErrCount%
Shared PTR.OBJECT&,POBJ$,ObjectCode$,ErrMsg$,PTR.MESSG&,CommCount%
Local i%,j%,k%,d%,l%,lb%,refnot%,Lab$

refnot%=0%

for i%=1% to (PtrRef%-1%)

    S1=i%
    S2=(PtrRef%-1%)
    SS%=INT((S1/S2)*100)

    Locate 12%,27%
    Print "REFERENCES :";SS%;"%";

    Lab$=RefLab$(i%)
    lb%=len(Lab$)

    d%=RefDisp%(i%)
    k%=d%\10%       ' номер оператора
    l%=d% mod 10%   ' смещение в объектном коде

    Call Stringi(k%,POBJ$,"####")
    Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)

    '---------------ИЩЕМ МЕТКУ В ТАБЛИЦЕ МЕТОК----------------

    for j%=1% to (PtrLab%-1%)

        if mid$(LabTab$(j%),2%,lb%)=Lab$ then

           '------------ SZ=2 - заносим двухбайтовое смещение

           if RefSize%(i%)=2% then
              Call Stringi(k%,POBJ$,"####")
              Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
              mid$(ObjectCode$,l%,2%)=MKI$(OrgTab%(j%))
              Call PutVar(PTR.OBJECT&,POBJ$,ObjectCode$)
              RefSize%(i%)=0%
              EXIT FOR
           end if

           '-----------  SZ=1 - заносим однобайтовое смещение

           if RefSize%(i%)=1% then

              'qq%=0%
              'for ii%=1% to k%
              '    ObjectCode$=""
              '    Call Stringi(ii%,POBJ$,"####")
              '    Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
              '    qq%=qq%+len(ObjectCode$)
              'next ii%

              qq%=0%
              for ii%=1% to k%
                  qq%=qq%+OpLen%(ii%)
              next ii%

              qq%=-256%-qq%+OrgTab%(j%)

              if ABS(qq%) > 127% then
                 'print "LAB=";Lab$
                 ErrCode%=300%
                 ERROR 255%
              end if

              if qq% > 0% then
                 Call Stringi(k%,POBJ$,"####")
                 Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
                 mid$(ObjectCode$,l%,1%)=CHR$(qq%)
                 Call PutVar(PTR.OBJECT&,POBJ$,ObjectCode$)
              else
                 qq%=(ABS(qq%) XOR &HFF)+1%
                 Call Stringi(k%,POBJ$,"####")
                 Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
                 mid$(ObjectCode$,l%,1%)=CHR$(qq%)
                 Call PutVar(PTR.OBJECT&,POBJ$,ObjectCode$)
                 'mid$(ObjectCode$(k%),l%,1%)=CHR$(qq%)
              end if
              RefSize%(i%)=0%
              EXIT FOR

           end if

           '-----------  SZ=-2 - заносим двухбайтовое смещение

           if RefSize%(i%)=-2% then

              'qq%=0%
              'for ii%=1% to k%
              '    ObjectCode$=""
              '    Call Stringi(ii%,POBJ$,"####")
              '    Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
              '    qq%=qq%+len(ObjectCode$)
              'next ii%

              qq%=0%
              for ii%=1% to k%
                  qq%=qq%+OpLen%(ii%)
              next ii%

              qq%=-256%-qq%+OrgTab%(j%)

              Call Stringi(k%,POBJ$,"####")
              Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
              mid$(ObjectCode$,l%,2%)=MKI$(qq%)
              Call PutVar(PTR.OBJECT&,POBJ$,ObjectCode$)

              'mid$(ObjectCode$(k%),l%,2%)=MKI$(qq%)

              RefSize%(i%)=0%
              EXIT FOR

           end if

           '-----------  SZ=-1 - заносим однобайтовое смещение

           if RefSize%(i%)=-1% then

              qq%=0%
              for ii%=1% to k%
                  ObjectCode$=""
                  Call Stringi(ii%,POBJ$,"####")
                  Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
                  qq%=qq%+len(ObjectCode$)
                  'qq%=qq%+len(ObjectCode$(ii%))
              next ii%

              qq%=-256%-qq%+OrgTab%(j%)

              if ABS(qq%) > 127% then
                 'print "LAB=";Lab$
                 ErrCode%=300%
                 ERROR 255%
              end if

              if qq% > 0% then
                 Call Stringi(k%,POBJ$,"####")
                 Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
                 mid$(ObjectCode$,l%,1%)=CHR$(qq%)
                 Call PutVar(PTR.OBJECT&,POBJ$,ObjectCode$)
                 'mid$(ObjectCode$(k%),l%,1%)=CHR$(qq%)
              else
                 qq%=(ABS(qq%) XOR &HFF)+1%
                 Call Stringi(k%,POBJ$,"####")
                 Call GetVar(PTR.OBJECT&,POBJ$,ObjectCode$)
                 mid$(ObjectCode$,l%,1%)=CHR$(qq%)
                 Call PutVar(PTR.OBJECT&,POBJ$,ObjectCode$)
                 'mid$(ObjectCode$(k%),l%,1%)=CHR$(qq%)
              end if
              RefSize%(i%)=0%
              EXIT FOR

           end if

        end if

NEXT.REF:

    next j%

next i%

'------------ Проверка: Все ли ссылки разрешены --------------

for i%=1% to (PtrRef%-1%)

    if RefSize%(i%) <> 0% then
       Call Stringi(CommCount%,PMSG$,"####")
       ErrMsg$="Ссылка "+RefLab$(i%)+" не разрешена"
       Call PutVar(PTR.MESSG&,PMSG$,ErrMsg$)
       incr CommCount%
       incr refnot%
       incr ErrCount%
    end if

next i%

'if refnot% <> 0% then STOP

END SUB