home *** CD-ROM | disk | FTP | other *** search
/ Super Net 1 / SUPERNET_1.iso / PC / OTROS / MSDOS / PKTDRVR / PDTST217.ZIP / PDCLKSRC / TBLBUILD.ASM < prev    next >
Encoding:
Assembly Source File  |  1994-04-07  |  32.6 KB  |  1,813 lines

  1. ;========================================================================
  2.  
  3. ; Copyright (C) 1991-94 by Jan.Engvald@ldc.lu.se, see file COPYING.
  4.  
  5.  
  6.  
  7. ;************************************************************************
  8. ;*        TblDisplay 
  9. ;************************************************************************
  10.  
  11. TblDisplay    proc    near
  12.         assume    ds:code_s
  13.         push    cs
  14.         pop    es
  15.         mov    ah,2Ch            ; get time
  16.         int    21h
  17.         mov    di,offset TblTime
  18.         mov    si,di
  19.         cld
  20.         mov    al,ch
  21.         cbw
  22.         stosw
  23.         mov    al,cl
  24.         cbw
  25.         stosw
  26.         mov    al,dh
  27.         cbw
  28.  
  29.         cmp    ax,[di]         ; new second yet?
  30.         jne    TblNewTime
  31.         ret
  32.  
  33.   TblNewTime:
  34.         stosw
  35.  
  36.         mov    ch,':'
  37.         mov    cl,3
  38.         mov    di,offset MsgTblTime
  39.         call    PutNumsD2F0         ; put time of day
  40.  
  41.         mov    ax,TblSeen
  42.         mov    dx,TblSeen+2
  43.         mov    di,offset MsgTblSeen
  44.         mov    PutNumFiller,' '
  45.         mov    PutMinDigits,10
  46.         call    PutBigNum        ; put ARP broadcasts seen
  47.  
  48.         mov    dx,offset MsgTblDispl
  49.         call    DosPr$
  50.         ret
  51. TblDisplay    endp
  52.  
  53.  
  54.  
  55. if HOPCHK
  56.  
  57. ;************************************************************************
  58. ;*        HopDisplay
  59. ;************************************************************************
  60.  
  61. HopDisplay    proc    near
  62. ;        xor    bx,bx            ; clear hop tab index
  63.         mov    bx,HopBx
  64.  
  65.   HopDspNewLine:
  66.         mov    ax,bx
  67.         mul    k20
  68.         mov    di,offset HopTabDsp
  69.         add    di,ax
  70.         push    di            ; save beg of line
  71.  
  72.         mov    ax,bx
  73.         shr    ax,1
  74.         shr    ax,1
  75.         mov    PutMinDigits,2
  76.         call    PutNumFb        ; put hop count
  77.         mov    al,':'
  78.         stosb
  79.  
  80.         test    word ptr HopTabStat[bx],08 ; already handled line nr?
  81.         jnz    HopDspLinDone
  82.         cmp    bx,HopBxMax
  83.         ja    HopDspLinDone
  84.         or    MoreFlags,UPPD_LINE
  85.         or    word ptr HopTabStat[bx],08
  86.   HopDspLinDone:
  87.  
  88.   HopDspNext:
  89.         mov    PutMinDigits,5
  90.         mov    ax,word ptr HopTabOth[bx] ; get delay
  91.         push    ax
  92.         mul    k512            ; adjust to 1 ms unit
  93.         add    ax,TimerResolution/2
  94.         adc    dx,0
  95.         div    kTimerScale
  96.         call    PutNumFb        ; put delay
  97.         mov    al,'?'            ; other unreachable err
  98.         mov    dx,word ptr HopTabOth+2[bx]
  99.         or    dx,dx            ; got anything?
  100.         jz    HopDspLost1
  101.         cmp    dx,0011            ; ttl exceeded?
  102.         jne    DspNotTtl
  103.   HopDspLost1:
  104.         mov    al,' '
  105.   DspNotTtl:
  106.         cmp    dx,0003h        ; net unreachable?
  107.         jne    DspNotNet1
  108.         mov    al,'N'
  109.   DspNotNet1:
  110.         cmp    dx,0103h        ; host unr?
  111.         jne    DspNotHost1
  112.         mov    al,'H'
  113.   DspNotHost1:
  114.         cmp    dx,0403h        ; need fragmenting?
  115.         jne    DspNotFrag1
  116.         mov    al,'F'
  117.   DspNotFrag1:
  118.         cmp    dx,0203h        ; prot unr
  119.         jne    DspNotProt1
  120.         mov    al,'P'
  121.   DspNotProt1:
  122.         cmp    dx,0303h        ; port unr
  123.         jne    DspNotPort1
  124.         mov    al,'p'
  125.   DspNotPort1:
  126.         stosb                ; put type of ICMP code
  127.  
  128.         pop    ax
  129.         test    word ptr HopTabStat[bx],01 ; already handled delay?
  130.         jnz    HopDspDlyDone
  131.         or    ax,ax            ; got it yet?
  132.         jz    HopDspDlyDone
  133.         or    MoreFlags,UPPD_LINE
  134.         or    word ptr HopTabStat[bx],01
  135.   HopDspDlyDone:
  136.         add    bx,4*MAXHOP
  137.         cmp    bx,12*MAXHOP
  138.         jb    HopDspNext        ; loop for all 3 turns
  139.         sub    bx,12*MAXHOP
  140.  
  141.         xor    ax,ax            ; clear last IP #
  142.         xor    dx,dx
  143.         lea    bp,HopTabIp[bx]        ; init first IP #
  144.  
  145.   HopDspNextIP:
  146.         lea    si,HopTabIp[bx]
  147.         cmp    dx,[si]            ; equal to last nr or zero?
  148.         jne    HopDspNE
  149.         cmp    ax,[si+2]
  150.         je    HopDspZ
  151.   HopDspNE:
  152.         cmp    word ptr [bp],0        ; found first IP # yet?
  153.         jnz    HopDspHavIp
  154.         mov    bp,si
  155.   HopDspHavIp:
  156.         mov    dx,[si]
  157.         mov    ax,[si+2]
  158.         or    dx,dx            ; zero IP # ?
  159.         jz    HopDspZ
  160.         cmp    si,bp            ; this turn is first nz IP nr?
  161.         je    HopDspNZ
  162.         cmp    dx,[bp]            ; equal to first IP # ?
  163.         jne    HopDspNZ
  164.         cmp    ax,[bp+2]
  165.         je    HopDspZ
  166.   HopDspNZ:
  167.         push    dx
  168.         push    ax
  169.         mov    al,' '
  170.         stosb
  171.         call    PutIpNum        ; put IP nr
  172.         pop    ax
  173.         pop    dx
  174.         or    word ptr HopTabStat[bx],02 ; dsp name for this IP nr
  175.   HopDspZ:
  176.         add    bx,4*MAXHOP
  177.         cmp    bx,12*MAXHOP
  178.         jb    HopDspNextIP        ; loop for all 3 turns
  179.         sub    bx,12*MAXHOP
  180.  
  181. HopDspNextNam:
  182.         test    word ptr HopTabStat[bx],02 ; dsp name for this IP nr?
  183.         jz    HopDspNamDone
  184.         and    word ptr HopTabStat[bx],not 02
  185.  
  186.         pop    dx            ; blankfill to col 37
  187.         push    dx
  188.         add    dx,37
  189.         mov    al,' '
  190.   HopDspFill:
  191.         stosb
  192.         cmp    di,dx
  193.         jbe    HopDspFill
  194.   
  195.         add    dx,80-37        ; max 80 columns
  196.         lea    si,HopTabIp[bx]
  197.         push    bx
  198.         mov    es,SegIpHwTbl
  199.         mov    bx,TblSize
  200.         mov    ax,4
  201.         call    FindIn16Table        ; this IP got a name?
  202.         mov    al,es:[bx].SlotPend
  203.         push    cs
  204.         pop    es
  205.         jnz    HopDspNotYet
  206.         cmp    al,'0'
  207.         je    HopDspYet
  208.         cmp    al,'N'
  209.         je    HopDspYet
  210.         cmp    al,'A'
  211.         jne    HopDspNotYet
  212.   HopDspYet:
  213.         call    TabPutName        ; put name
  214.         push    cs
  215.         pop    ds
  216.         pop    bx
  217.  
  218.         test    word ptr HopTabStat[bx],04 ; already handled name?
  219.         jnz    HopDspNamDone
  220.         SHOW_EVENT    'Y'
  221.         or    MoreFlags,UPPD_LINE
  222.         or    word ptr HopTabStat[bx],04
  223.         push    bx
  224.   HopDspNotYet:
  225.         pop    bx
  226.   HopDspNamDone:        
  227.  
  228.         add    bx,4*MAXHOP
  229.         cmp    bx,12*MAXHOP
  230.         jb    HopDspNextNam        ; loop for all 3 turns
  231.         sub    bx,12*MAXHOP
  232.  
  233.  
  234.         test    MoreFlags,UPPD_LINE    ; anything NEW to display?
  235.         jnz    HopDspUppd
  236.         pop    di
  237.         jmp    short HopDspNoUppd
  238.  
  239.   HopDspUppd:
  240.         and    MoreFlags,not UPPD_LINE
  241.         cmp    bx,HopBxMax
  242.         jb    HopDspBxDone
  243.         mov    HopBxMax,bx        ; highest non-zero entry
  244.   HopDspBxDone:
  245.         push    bx
  246.         call    GetDspRow        ; get cur screen row
  247.         mov    dh,bl
  248.         pop    bx
  249.         pop    bp            ; line start
  250.         push    bx
  251.         shr    dh,1
  252.         shr    dh,1
  253.         add    dh,HopTopRow
  254.         cmp    dh,HopMaxRows
  255.         jle    HopDspOkRow        ; below bottom?
  256.  
  257.         test    MoreFlags,NO_AUTOSCROLL    ; up/dn arrow key used?
  258.         jnz    HopDspOutside        ; -yes, manual scroll
  259.  
  260.         sub    dh,HopMaxRows        ; -no, auto scroll
  261.         sub    HopTopRow,dh
  262.  
  263.         mov    al,dh
  264.         mov    ah,6            ; scroll up <al> lines
  265.         call    ScrollUpDn
  266.  
  267.         mov    dh,HopMaxRows
  268.   HopDspOkRow:
  269.         call    DisplayLine        ; display bp-buf at row dh
  270.   HopDspOutside:
  271.         pop    bx
  272.   HopDspSkip:
  273.  
  274.   HopDspNoUppd:
  275.         add    bx,4            ; repeat for next hop row
  276.         cmp    bx,MAXHOP*4
  277. ;        jae    HopDspEnd
  278. ;        jmp    HopDspNewLine
  279.         jb    HopDspEnd
  280.         xor    bx,bx
  281.   HopDspEnd:
  282.         mov    HopBx,bx
  283.  
  284.         mov    al,ScrollVal
  285.         or    al,al            ; up/dn key used?
  286.         jz    HopDspRet
  287.         or    MoreFlags,NO_AUTOSCROLL    ; set manual scroll mode
  288.         mov    ScrollVal,0
  289.         or    al,al
  290.         js    HopDspScrUp
  291.   HopDspScrDn:
  292.         mov    al,HopTopRow        ; manual scroll down
  293.         cmp    al,2            ; anything more to show?
  294.         jns    HopDspRet
  295.  
  296.         inc    al
  297.         mov    HopTopRow,al
  298.  
  299.         sub    al,2            ; compute start addr
  300.         neg    al
  301.         xor    ah,ah
  302.         mul    k80
  303.         mov    bp,offset HopTabDsp-2*80
  304.         add    bp,ax
  305.  
  306.         mov    ah,7            ; scroll down
  307.         xor    dx,dx            ; display at 0,0
  308.         jmp    short HopDspScr
  309.  
  310.   HopDspScrUp:
  311.         mov    bx,HopBxMax        ; manual scroll up
  312.         shr    bx,1            ; anything more to show?
  313.         shr    bx,1
  314.         mov    al,HopTopRow
  315.         add    bl,al
  316.         cmp    bl,HopMaxRows
  317.         jle    HopDspRet
  318.  
  319.         dec    al
  320.         mov    HopTopRow,al
  321.         sub    al,HopMaxRows        ; compute start addr
  322.         neg    al
  323.         xor    ah,ah
  324.         mul    k80
  325.         mov    bp,offset HopTabDsp
  326.         add    bp,ax
  327.  
  328.         mov    ah,6            ; scroll up
  329.         mov    dh,HopMaxRows        ; display at last row
  330.         xor    dl,dl
  331.   HopDspScr:
  332.         mov    al,1            ; scroll one line
  333.         call    ScrollUpDn
  334.         call    DisplayLine        ; display bp-buf at row dh
  335.   HopDspRet:
  336.         ret
  337. HopDisplay    endp
  338.  
  339.  
  340.  
  341. ScrollUpDn    proc    near
  342.         push    dx            ; save row to display on
  343.         mov    bh,7            ; filler attribute
  344.         mov    cx,0000h        ; scroll all screen
  345.         mov    dx,24*256+79
  346.         int    10h
  347.         pop    dx
  348.         ret
  349. ScrollUpDn    endp
  350.  
  351.  
  352.  
  353. DisplayLine    proc    near
  354.         or    dh,dh            ; above the top?
  355.         jl    HopDspAbovTop
  356.  
  357.         mov    ax,1300h
  358.         cmp    dh,HopLimRow        ; lowest line yet?
  359.         jl    HopDspDecr
  360.         inc    al            ; move cursor
  361.         mov    HopLimRow,dh
  362.   HopDspDecr:
  363.         mov    bx,0007h        ; page 0 and attr 7
  364.         mov    cx,80            ; 80 or 79 chars
  365.         cmp    dh,HopMaxRows
  366.         jne    HopDspNoProbl
  367.         dec    cx            ; avoid scroll at last line
  368.   HopDspNoProbl:
  369.         mov    dl,0            ; first col
  370.         int    10h            ; display one line
  371.   HopDspAbovTop:
  372.         ret
  373. DisplayLine    endp
  374.  
  375. endif ; HOPCHK
  376.  
  377.  
  378.  
  379. ;************************************************************************
  380. ;*        FindIn16Table
  381. ;*
  382. ;*    Input:         DS:SI = address of search string key (saved)
  383. ;*            AX = string length (saved)
  384. ;*            ES = table segment (saved)
  385. ;*            BX = table size in bytes
  386. ;*    Output:      ES:BX = table slot address of entry less or equal to key
  387. ;*            Zero flag if equal to key
  388. ;*    Destroys:    BX, flags
  389. ;*
  390. ;* Before use, the table must be filled with all ones bits, except slot 0 which
  391. ;* must be filled with zeros. Slot 0 key must not be changed.
  392. ;************************************************************************
  393.  
  394. FindIn16Table    proc    near
  395.         assume    ds:nothing
  396.         push    cx
  397.         push    dx
  398.         push    di
  399.         push    bp
  400.         mov    bp,si
  401.         mov    cx,bx
  402.         xor    bx,bx
  403.         mov    dx,8000h        ; find proper 2**x size
  404.   FindLenLoop:
  405.         cmp    dx,cx
  406.         jb    FindHalfChk        ; start binary search
  407.         shr    dx,1
  408.         jmp    short FindLenLoop
  409.  
  410.   FindLess:
  411.         sub    bx,dx
  412.   FindGreater:
  413.         shr    dx,1            ; divide step by two
  414.   FindHalfChk:
  415.         cmp    dx,16            ; step < slot size?
  416.         jb    FindDone
  417.         add    bx,dx            ; position halfway
  418.  
  419.         mov    di,bx
  420.         mov    si,bp
  421.         mov    cx,ax
  422.         repe    cmpsb            ; compare strings
  423.         ja    FindGreater
  424.         jb    FindLess
  425.   FindDone:
  426.         mov    si,bp
  427.         pop    bp
  428.         pop    di
  429.         pop    dx
  430.         pop    cx
  431.         ret
  432. FindIn16Table    endp
  433.  
  434.  
  435.  
  436. ;************************************************************************
  437. ;*        GetHexNums
  438. ;************************************************************************
  439.  
  440. GetHexNums    proc    near
  441.         assume    ds:nothing
  442.   GetHexNum:
  443.         xor    dx,dx
  444.   GetHexDig:
  445.         lodsb
  446.         cmp    al,'0'
  447.         jb    GetHexEnd
  448.         cmp    al,'9'
  449.         ja    GetHexTst
  450.         sub    al,'0'
  451.         jmp    short GetHexConv
  452.   GetHexTst:
  453.         cmp    al,'a'
  454.         jb    GetHexEnd
  455.         cmp    al,'f'
  456.         ja    GetHexEnd
  457.         sub    al,'a'-10
  458.   GetHexConv:
  459.         cbw
  460.         add    ax,dx
  461.         mov    cx,ax
  462.         mul    k16
  463.         mov    dx,ax
  464.         jmp    short GetHexDig
  465.   GetHexEnd:
  466.         cmp    al,'-'
  467.         mov    ax,cx
  468.         stosb
  469.         je    GetHexNum
  470.         ret
  471. GetHexNums    endp
  472.  
  473.  
  474.  
  475. ;************************************************************************
  476. ;*        Ins16ByteSlot
  477. ;************************************************************************
  478.  
  479. Ins16ByteSlot    proc    near
  480.         SHOW_EVENT    'a'
  481.         assume    ds:nothing
  482.         push    ds
  483.         mov    cx,cs:TblSize
  484.         push    es
  485.         pop    ds
  486.         sub    cx,bx
  487.         mov    si,bx
  488.         sub    si,2
  489.         add    si,cx
  490.         mov    di,si
  491.         add    di,16
  492.         std
  493.         shr    cx,1
  494.         rep    movsw
  495.         cld
  496.         pop    ds
  497.         ret
  498. Ins16ByteSlot    endp
  499.  
  500.  
  501.  
  502. ;************************************************************************
  503. ;*        FindHostInTbls
  504. ;************************************************************************
  505.  
  506. FindHostInTbls    proc    near
  507.         assume    ds:nothing
  508.         push    dx
  509.         push    ax
  510.  
  511.         mov    es,cs:SegHwIpTbl
  512.         mov    bx,cs:TblSize
  513.         mov    ax,11
  514.         mov    si,bp
  515.         push    [si+10]
  516.         mov    byte ptr [si+10],' '
  517.         call    FindIn16Table
  518.         pop    [si+10]
  519.         jz    InitHwMatch
  520.  
  521.         add    bx,16
  522.         call    Ins16byteSlot
  523.         mov    si,bp
  524.         mov    cx,10/2
  525.         mov    di,bx
  526.         rep    movsw            ; (SlotHw SlotIp)
  527.  
  528.         mov    ax,'  '
  529.         stosw                ; SlotDupl SlotPend
  530.         mov    ax,TblSize
  531.         mov    cl,3
  532.         shr    ax,cl
  533.         stosw                ; SlotNamPtr
  534.   InitHwMatch:
  535.         mov    es,SegIpHwTbl
  536.         mov    bx,cs:TblSize
  537.         mov    ax,11
  538.         mov    si,bp
  539.         sub    si,4
  540.         push    [si+10]
  541.         mov    byte ptr [si+10],' '
  542.         call    FindIn16Table
  543.         pop    [si+10]
  544.         jz    InitIpMatch
  545.  
  546.         add    bx,16
  547.         call    Ins16byteSlot
  548.         mov    si,bp
  549.         sub    si,4
  550.         mov    cx,10/2
  551.         mov    di,bx
  552.         rep    movsw            ; SlotIp SlotHw
  553.  
  554.         mov    ax,'  '
  555.         stosw                ; SlotDupl SlotPend
  556.         mov    ax,cs:TblSize
  557.         mov    cl,3
  558.         shr    ax,cl
  559.         stosw                ; SlotNamPtr
  560.         xor    ax,ax
  561.         stosw                ; SlotSeen
  562.         SHOW_EVENT    'b'
  563.         add    cs:TblSize,16        ; non-zero
  564.   InitIpMatch:
  565.         pushf
  566.         test    cs:GenFlags,PROBE_REPLY
  567.         jnz    FindHostProbe
  568.  
  569.         inc    es:[bx].SlotSeen
  570.         add    cs:TblSeen,1
  571.         adc    cs:TblSeen+2,0
  572.   FindHostProbe:
  573.         popf
  574.         pop    ax
  575.         pop    dx
  576.         ret
  577. FindHostInTbls    endp
  578.  
  579.  
  580.  
  581. ;************************************************************************
  582. ;*        TableInit
  583. ;************************************************************************
  584.  
  585. TableInit    proc    near
  586.         assume    ds:code_s
  587. if HOPCHK
  588.         test    MoreFlags,HOP_CHK
  589.         jnz    TableInit2
  590. endif ; HOPCHK
  591.         test    Argflags,MAKE_TABLE
  592.         jnz    TableInit2
  593.         ret
  594.   TableInit2:
  595.         mov    bx,(TableSegs-1)*2
  596.         mov    dx,cs
  597.         add    dx,1000h
  598.         mov    ax,'  '         ; NamTbl2 must be blanked
  599.   TableFF:
  600.         mov    word ptr SegmData[bx],dx
  601.         mov    es,dx
  602.         add    dx,1000h
  603.         cmp    dx,PspTopMem        ; end of free memory?
  604.         jbe    TableFits
  605.  
  606.         mov    al,'M'-'0'
  607.         call    Terminate
  608.   TableFits:
  609.         mov    cx,08000h        ; prefill all 64 kb
  610.         xor    di,di
  611.         rep    stosw
  612.  
  613.         sub    bx,2
  614.         mov    ax,0ffffh        ; IpHwTbl prefill
  615.         jns    TableFF
  616.  
  617.         xor    ax,ax            ; zerofill first slot
  618.         mov    es,SegIpHwTbl
  619.         mov    cx,16/2
  620.         xor    di,di
  621.         rep    stosw
  622.  
  623.         mov    es,SegHwIpTbl
  624.         mov    cx,16/2
  625.         xor    di,di
  626.         rep    stosw
  627.  
  628.         push    cs
  629.         pop    es
  630.  
  631. if HOPCHK
  632.         test    MoreFlags,HOP_CHK
  633.         jz    TableInNoHop
  634.  
  635.         or    GenFlags,TBL_READY
  636.         ret
  637.  
  638.   TableInNoHop:
  639. endif ; HOPCHK
  640.  
  641.         mov    dx,offset NameHwTbl
  642.         mov    ax,3d02h
  643.         int    21h
  644.         jc    TabInitHw
  645.  
  646.         mov    bx,ax
  647.         mov    ah,3eh
  648.         int    21h
  649.         jmp    short TabTstIp
  650.   TabInitHw:
  651.         mov    dx,offset NameHwTbl
  652.         xor    cx,cx
  653.         mov    ah,3ch
  654.         int    21h
  655.         jc    TabOpenErr
  656.   TabTstIP:
  657.         mov    dx,offset NameIpTbl
  658.         mov    ax,3d02h
  659.         int    21h
  660.         mov    Handle,ax
  661.         jnc    TabRdNext
  662.  
  663.         mov    dx,offset NameIpTbl
  664.         xor    cx,cx
  665.         mov    ah,3ch
  666.         int    21h
  667.         jc    TabOpenErr
  668.         jmp    TabRdClOK
  669.   TabOpenErr:
  670.         mov    al,'O'-'0'
  671.         call    Terminate
  672.  
  673.   
  674.   TabRdLong:
  675.         mov    TblLineLen,81
  676.         mov    cx,9
  677.         mov    dx,offset FileBuf+72
  678.         jmp    short TabRdMore
  679.   
  680.   TabRdNext:
  681.         push    cs
  682.         pop    es
  683.         mov    cx,TblLineLen
  684.         mov    dx,offset FileBuf
  685.   TabRdMore:            
  686.         mov    bx,Handle
  687.         mov    ah,3fh
  688.         int    21h
  689.         jc    TabRdErr
  690.  
  691.         mov    si,offset FileBuf
  692.         cmp    byte ptr [si],'Z'-040h
  693.         je    TabRdEof
  694.             
  695.         or    ax,ax
  696.         jz    TabRdEof
  697.  
  698.         cmp    TblLineLen,72
  699.         jne    TabOkLen
  700.  
  701.         cmp    byte ptr FileBuf+71,LF
  702.         jne    TabRdLong
  703.   TabOkLen:
  704.         mov    di,offset TmpTbl
  705.         mov    bp,di
  706.         call    GetIpNr
  707.         jnz    TabRdErr
  708.  
  709.         mov    si,offset FileBuf+53
  710.         call    GetHexNums
  711.  
  712.         push    si
  713.         mov    si,bp
  714.         movsw
  715.         movsw
  716.  
  717.         add    bp,4
  718.         call    FindHostInTbls
  719.         je    InitDup
  720.  
  721.         push    es
  722.         mov    si,offset FileBuf+16
  723.         call    NamePut
  724.         pop    es
  725.   InitDup:
  726.         pop    si
  727.         cmp    byte ptr [si],LF
  728.         je    TabRdOld
  729.  
  730.         call    Skip_Blanks
  731.         call    GetNum
  732.         dec    ax
  733.         cwd
  734.         add    es:[bx].SlotSeen,ax
  735.         add    TblSeen,ax
  736.         adc    TblSeen+2,dx
  737.         inc    si
  738.   TabRdOld:
  739.         push    cs
  740.         pop    es
  741.             
  742.         cmp    byte ptr [si],LF
  743.         jne    TabRdErr
  744.  
  745.         mov    byte ptr [si+1],'$'
  746.  
  747.         mov    dx,offset FileBuf
  748.         call    DosPr$
  749.         jmp    TabRdNext
  750.  
  751.   TabRdErr:
  752.         mov    al,'R'-'0'
  753.         call    Terminate
  754.  
  755.   TabRdEof:
  756.         mov    bx,Handle
  757.         mov    ah,3eh
  758.         int    21h
  759.         jnc    TabRdClOK
  760.  
  761.         mov    al,'C'-'0'
  762.         call    Terminate
  763.   TabRdClOK:
  764. if DEBUG eq 0
  765.         call    ProbeIpInit
  766. endif ; not DEBUG
  767.         mov    cx,SavedTicks
  768.         mov    TblProbeNext,cx
  769.         mov    TblWrNext,cx
  770.         cmp    EchoTarget,0
  771.         jnz    TableInitRet
  772.  
  773. TableReady:
  774.         test    ArgFlags,MAKE_TABLE
  775.         jz    TableInitRet
  776.  
  777.         or    GenFlags,TBL_READY
  778.         mov    si,offset DefGwyNum
  779.         lodsw
  780.         mov    cx,ax
  781.         jcxz    TableInitRet
  782.   TableGwyLoop:
  783.         push    cx
  784.         lodsw
  785.         mov    dx,ax
  786.         lodsw
  787.         push    si
  788.         push    ds
  789.         push    es
  790.         call    BufAlloc
  791.         mov    [bx].dTimOutMsg,0    ; we don't require an answer
  792.         mov    [bx].dTickTimeout,0    ; don't wait
  793.         call    SendArpReq        ; send arp
  794.         call    BufRelease
  795.         pop    es
  796.         pop    ds
  797.         pop    si
  798.         pop    cx
  799.         loop    TableGwyLoop
  800.  
  801.   TableInitRet:
  802.         ret
  803. TableInit    endp
  804.  
  805.  
  806.  
  807. ProbeIpInit    proc    near
  808.         mov    dx,MyNet
  809.         mov    ax,Mynet+2
  810.         mov    TblIpProbe,dx
  811.         inc    ah
  812.         mov    TblIpProbe+2,ax
  813.         ret
  814. ProbeIpInit    endp
  815.  
  816.  
  817.  
  818. ;************************************************************************
  819. ;*        TblProbe
  820. ;************************************************************************
  821.  
  822. MsgNeedMask    db    "Need to know network mask", CR, LF, '$'
  823.  
  824. TblProbe    proc    near
  825.         assume    ds:nothing
  826.         mov    ds,cs:MySegm
  827.         assume    ds:code_s
  828.         cmp    InSendAndW,0
  829.         jnz    TblProbeRet
  830.  
  831.         test    GenFlags,TBL_READY
  832.         jz    TblProbeRet
  833.  
  834.         mov    cx,SavedTicks
  835.         mov    ax,cx
  836.         sub    ax,TblProbIntvl     ; 2 - 9 probes a second
  837.         sub    ax,TblProbeNext
  838.         js    TblProbeRet
  839.  
  840.         mov    TblProbeNext,cx
  841.  
  842.         mov    ax,cx
  843.         sub    ax,TblWrNext
  844.         js    TblWrLater
  845.  
  846.         add    cx,182*20        ; limit write to once in 200 s
  847.         mov    TblWrNext,cx
  848.  
  849.         mov    ax,TblSize
  850.         mov    dx,TblActive
  851.         cmp    dx,TblActLast
  852.         ja    TblProbeWr
  853.  
  854.         cmp    ax,TblSizeLast
  855.         jbe    TblWrLater
  856.   TblProbeWr:
  857.         mov    TblActLast,dx
  858.         mov    TblSizeLast,ax
  859.         call    TableWr
  860.   TblWrLater:
  861.         test    ArgFlags,TBL_PROBE
  862.         jnz    TblDoProbe
  863.   TblProbeRet:
  864.         ret
  865.  
  866.   TblDoProbe:
  867.         cmp    MyMask,0
  868.         jne    TblProbeChkIntvl
  869.         mov    dx,offset MsgNeedMask
  870.         mov    al,'P'-'0'
  871.         call    PrTerminate
  872.   TblProbeChkIntvl:
  873. if DEBUG
  874.         cmp    TblProbIntvl,1
  875. else
  876.         cmp    TblProbIntvl,2
  877. endif ; DEBUG
  878.         jbe    TblProbMin
  879.         dec    TblProbIntvl
  880.   TblProbMin:
  881.  
  882.         mov    dx,TblIpProbe
  883.         mov    ax,TblIpProbe+2
  884.         cmp    ax,ArpTabIp2+2        ; end of subnet numbers?
  885.         jne    TblProbeMore
  886.         cmp    dx,ArpTabIp1+2
  887.         jne    TblProbeMore
  888.         call    ProbeIpInit
  889.   TblProbeMore:
  890.         push    ds
  891.         push    es
  892.         call    BufAlloc
  893.         mov    [bx].dTimOutMsg,0    ; we don't require an answer
  894.         mov    [bx].dTickTimeout,0    ; don't wait
  895.         call    SendArpReq        ; send arp
  896.         call    BufRelease
  897.         pop    es
  898.         pop    ds
  899.  
  900.         add    ah,1            ; increment IP #
  901.         adc    al,0
  902.         adc    dh,0
  903.         adc    dl,0
  904.         mov    TblIpProbe,dx
  905.         mov    TblIpProbe+2,ax
  906.  
  907.         mov    si,offset TblIpProbe
  908.         mov    di,offset MsgTblDispl
  909.         call    PutIpNum
  910.         call    BlankUntil16
  911.         ret
  912. TblProbe    endp
  913.  
  914.  
  915.  
  916. ;************************************************************************
  917. ;*        InvNsReq
  918. ;************************************************************************
  919.  
  920. InvNsReq     proc    near
  921.         assume    ds:nothing
  922.         SHOW_EVENT    'c'
  923.         mov    cs:TblProbIntvl,9    ; slow down probe to
  924.         mov    es,cs:SegIpHwTbl    ;   twice a second
  925.         mov    cx,es:[bx].SlotNamPtr
  926.         push    cx            ; save name tbl idx
  927.  
  928.         push    cs
  929.         pop    es
  930.  
  931.         xor    ch,ch            ; reverse IP nr
  932.         mov    cl,dh
  933.         xor    dh,dh
  934.         push    dx
  935.         push    cx
  936.         mov    cl,ah
  937.         xor    ah,ah
  938.         push    ax
  939.         push    cx
  940.  
  941.         mov    di,offset FileBuf    ; generate request string
  942.         mov    bl,4
  943.         mov    cs:PutMinDigits,1
  944.   TableNumLoop:
  945.         mov    si,di
  946.         inc    di
  947.         pop    ax
  948.         call    PutNum
  949.         mov    es:[si],dl
  950.         dec    bl
  951.         jnz    TableNumLoop
  952.  
  953.         mov    si,offset InAdrArpa
  954.         mov    cx,InAdrArpaLen
  955.   TableNumL2:
  956.         movs    byte ptr es:[FileBuf],cs:[InAdrArpa]
  957.         loop    TableNumL2
  958.  
  959.         mov    dx,1234h        ; tblbuild udp src port
  960.         pop    ax            ; NsId = name table index
  961.         mov    si,offset FileBuf    ; Ns question string
  962.  
  963.         call    NsResolve        ; ask name for this #
  964.         SHOW_EVENT    'd'
  965.         ret
  966. InvNsReq    endp
  967.  
  968.  
  969.  
  970. ;************************************************************************
  971. ;*        NsResend
  972. ;************************************************************************
  973.  
  974. NsResend     proc    near
  975.         assume    ds:nothing
  976.         test    cs:MoreFlags,HOP_CHK
  977.         jnz    NsReseDo
  978.         test    cs:ArgFlags,MAKE_TABLE
  979.         jz    NsReseRet
  980.   NsReseDo:
  981.         test    cs:GenFlags,TBL_READY
  982.         jz    NsReseRet
  983.         SHOW_TRACE    'A'
  984.         mov    ds,cs:SegIpHwTbl
  985.         mov    bx,16
  986.   NsResNext:
  987.         push    bx
  988.         mov    al,[bx].SlotPend
  989.         cmp    al,'p'            ; Ns request pending?
  990.         jb    NsReseEnd
  991.  
  992.         inc    al
  993.         cmp    al,'p'+3+4        ; time to resend?
  994.         jbe    NsResInc
  995.         mov    al,'p'+3
  996.   NsResInc:
  997.         mov    [bx].SlotPend,al
  998.         cmp    al,'p'+3
  999.         jne    NsReseEnd
  1000.         mov    dx,[bx].SlotIp
  1001.         mov    ax,[bx].SlotIp+2
  1002.         SHOW_TRACE    'b'
  1003.         call    InvNsReq        ; resend Ns request
  1004.   NsReseEnd:
  1005.         pop    bx
  1006.         add    bx,16            ; check next slot
  1007.         cmp    bx,cs:TblSize
  1008.         jb    NsResNext
  1009.   NsReseRet:
  1010.         push    cs
  1011.         pop    ds
  1012.         push    cs
  1013.         pop    es
  1014.         ret
  1015. NsResend    endp
  1016.  
  1017.  
  1018.  
  1019. ;************************************************************************
  1020. ;*        DoTable
  1021. ;************************************************************************
  1022.  
  1023. DoTable     proc    near
  1024.         assume    ds:nothing
  1025.         test    cs:GenFlags,TBL_READY
  1026.         jz    TableRetRel0
  1027.         cmp    cs:TblSize,0fff0h
  1028.         jb    $+5
  1029.   TableRetRel0:
  1030.         jmp    TableRetRel
  1031.  
  1032.         mov    ax,[bx].dPtrPhys
  1033.         call    ArpFindHw
  1034.         mov    [bx].dIdxHwDst,di
  1035.  
  1036.         mov    di,[bx].dPtrIp
  1037.         cmp    word ptr [di-2],0008h    ; is this an IP pkt?
  1038.         jne    DoTabArp
  1039.  
  1040.         mov    dx,[di].iIpSrc
  1041.         mov    ax,[di].iIpSrc+2
  1042.         or    dx,dx
  1043.         jz    TableRetRel0        ; ignore bootp requests
  1044.         mov    di,[bx].dPtrPhys
  1045.         add    di,cs:Hlen
  1046.         mov    bp,di
  1047.         add    di,cs:Hlen
  1048.         mov    [di],dx
  1049.         mov    [di+2],ax
  1050.         mov    cx,0200h        ; fake an ARP reply
  1051.         mov    [bx].dIdxHwDst,ARPMYIDX
  1052.         jmp    short DoTabCommon
  1053.   DoTabArp:
  1054.         mov    cx,[di].iArpOp
  1055.         add    di,iArpMyHwAd
  1056.         mov    bp,di
  1057.         add    di,cs:Hlen
  1058.         mov    dx,[di]
  1059.         mov    ax,[di+2]
  1060.   DoTabCommon:
  1061.         mov    byte ptr [di+4],' '
  1062.         mov    ds:[bp-4],dx
  1063.         mov    ds:[bp-4+2],ax
  1064.         push    bx
  1065.  
  1066.         and    cs:GenFlags,not PROBE_REPLY
  1067.         cmp    cx,0200h        ; ignore arp REPLIES from hosts
  1068.         jne    DoTabUpdate        ; already known (probably a
  1069.         cmp    [bx].dIdxHwDst,ARPMYIDX ; proxy arp gateway)
  1070.         jne    DoTabUpdate
  1071.  
  1072. if HOPCHK
  1073.         test    cs:MoreFlags,HOP_CHK
  1074.         jnz    DoTabUpdate
  1075. endif ; HOPCHK
  1076.         or    cs:GenFlags,PROBE_REPLY
  1077.         push    ax
  1078.         mov    es,cs:SegHwIpTbl
  1079.         mov    si,bp
  1080.         mov    ax,11
  1081.         mov    bx,cs:TblSize
  1082.         call    FindIn16Table        ; this Hw+IP addr already known?
  1083.         pop    ax
  1084.         je    DoTabUpdate        ; -yes, lets update name
  1085.  
  1086.         push    ax
  1087.         mov    si,bp
  1088.         mov    ax,cs:Hlen
  1089.         mov    bx,cs:TblSize
  1090.         call    FindIn16Table        ; this Hw addr already known?
  1091.         pop    ax
  1092.         jne    DoTabUpdate        ; -no, must be a new one
  1093.         or    bx,bx            ; does he use hw addr zero?
  1094.         jz    DoTabUpdate        ; -yes, put him in the tables
  1095.         cmp    bx,cs:TblSize        ; he believes HE is broadcast?
  1096.         jb    TableAnswered        ; -no
  1097.   DoTabUpdate:                    ; put this addr in the tables
  1098.         call    FindHostInTbls
  1099.  
  1100.         cmp    byte ptr es:[bx].SlotPend,' '
  1101.         jne    TableAnswered
  1102.  
  1103.         mov    byte ptr es:[bx].SlotPend,'p'
  1104.         inc    cs:TblActive
  1105.         call    InvNsReq
  1106.  
  1107.   TableAnswered:
  1108.         pop    bx
  1109.   TableRetRel:
  1110.         call    BufRelease
  1111.   TableRet:
  1112.         ret
  1113. DoTable     endp
  1114.  
  1115.  
  1116.  
  1117. ;************************************************************************
  1118. ;*        BlankUntil16 byte boundry
  1119. ;************************************************************************
  1120.  
  1121. BlankUntil16    proc    near
  1122.         assume    ds:nothing
  1123.         mov    al,' '
  1124.   BlankMore:
  1125.         test    di,0fh
  1126.         jz    BlankRet
  1127.         stosb
  1128.         jmp    short BlankMore
  1129.   BlankRet:
  1130.         ret
  1131. BlankUntil16    endp
  1132.  
  1133.  
  1134.  
  1135. ;************************************************************************
  1136. ;*        NamePut from DS:SI to TblName[next]
  1137. ;************************************************************************
  1138.  
  1139. NamePut     proc    near
  1140.         assume    ds:nothing
  1141.  
  1142.         push    si
  1143.         mov    di,es:[bx].SlotNamPtr
  1144.         mov    es,cs:SegmNamTbl
  1145.         mov    di,es:[di]
  1146.         cmp    di,0ffffh        ; name already exists?
  1147.         je    NamePutNone
  1148.  
  1149.         shl    di,1            ; compute addr to name
  1150.         jnc    NamPut1st
  1151.   NamPut2nd:
  1152.         mov    es,cs:SegmNamTbl2
  1153.   NamPut1st:
  1154.         add    di,48
  1155.         jc    NamPut2nd
  1156.         sub    di,48
  1157.  
  1158.   NamPutNamL:
  1159.         mov    al,[si]
  1160.         cmp    al,' '
  1161.         je    NamePutRet
  1162.         cmpsb                ; new name equal to old?
  1163.         je    NamPutNamL
  1164.   NamePutNone:
  1165.         pop    si
  1166.         push    si
  1167.  
  1168.  
  1169.         mov    es,cs:SegIpHwTbl    ; -no, use the new name
  1170.         mov    ax,cs:TblNamPtr
  1171.         mov    di,es:[bx].SlotNamPtr
  1172.         mov    es,cs:SegmNamTbl
  1173.         stosw                ; store link addr
  1174.  
  1175.         mov    di,ax            ; compute addr to new name
  1176.         shl    di,1
  1177.         jnc    NamePut1st
  1178.   NamePut2nd:
  1179.         mov    es,cs:SegmNamTbl2
  1180.   NamePut1st:
  1181.         mov    cx,48
  1182.         add    di,cx
  1183.         jc    NamePut1st
  1184.         sub    di,cx
  1185.   NamePutLoop:
  1186.         lodsb
  1187.         cmp    al,' '
  1188.         je    NamePutEnd
  1189.         stosb                ; put new name
  1190.         loop    NamePutLoop
  1191.   NamePutEnd:
  1192.         mov    al,' '
  1193.         stosb
  1194.  
  1195.         inc    di            ; save next name addr
  1196.         shr    di,1
  1197.         mov    ax,es
  1198.         cmp    ax,cs:SegmNamTbl2
  1199.         jne    NamePutFirst
  1200.         or    di,8000h
  1201.   NamePutFirst:
  1202.         mov    cs:TblNamPtr,di
  1203.   
  1204. NamePutRet:
  1205.         pop    ax
  1206.         push    cs
  1207.         pop    es
  1208.         ret
  1209. NamePut     endp
  1210.  
  1211.  
  1212.  
  1213. ;************************************************************************
  1214. ;*        DoName
  1215. ;************************************************************************
  1216.  
  1217. DoName        proc    near
  1218.         assume    ds:nothing
  1219.         test    cs:GenFlags,TBL_READY
  1220.         jnz    NameInited
  1221.  
  1222.         ret
  1223.   NameInited:
  1224.         SHOW_EVENT    'e'
  1225.         push    ds
  1226.         pop    es
  1227.         lea    si,[di].uNsQuest
  1228.         mov    bp,[di].uNsId
  1229.         lea    di,[di].uNsNscount    ; used for scratch
  1230.         mov    dx,si
  1231.         inc    dx
  1232.  
  1233.   BS        equ    'H'-040h
  1234.         call    NameDecode
  1235.         mov    word ptr [si],'  '
  1236.         mov    word ptr [si+2],BS+256*BS
  1237.         add    si,4
  1238.  
  1239.         push    dx
  1240.         push    si
  1241.         mov    si,dx
  1242.         call    GetIpNr
  1243.         pop    si
  1244.         pop    dx
  1245.  
  1246.         mov    di,[bx].dPtrUdp
  1247.         cmp    [di].uNsAncount,0
  1248.         jne    NameHaveAns
  1249.         push    dx
  1250.         jmp    short NameNoAnswer
  1251.   NameHaveAns:
  1252.         mov    di,si
  1253.         call    NameDecode
  1254.         jnz    NameDcCompr
  1255.         mov    dx,di
  1256.         inc    dx
  1257.   NameDcCompr:
  1258.   TAB        equ    'I'-040h
  1259.         push    dx
  1260.         mov    word ptr [si],TAB+256*'N'
  1261.         mov    word ptr [si+2],'ma'
  1262.         mov    word ptr [si+4],'0e'
  1263.         mov    word ptr [si+6],'00'
  1264.         mov    word ptr [si+8],'=0'
  1265.         lea    di,[si+5]
  1266.         add    si,10
  1267.         mov    ax,bp
  1268.         shr    ax,1
  1269.         call    PutNumD4Fb
  1270.         mov    cs:PutMinDigits,2
  1271.  
  1272.         mov    di,si
  1273.         call    NameDecode
  1274.         dec    si
  1275.   NameNoAnswer:
  1276.         mov    word ptr [si],' '+256*CR
  1277.         mov    word ptr [si+2],LF+256*'$'
  1278.  
  1279.         mov    si,[bx].dPtrUdp
  1280.         mov    ax,[si].uNsNScount
  1281.         mov    dx,[si].uNsNscount+2
  1282.         xchg    ah,al
  1283.         xchg    dh,dl
  1284.         mov    [si].uNsNScount,dx
  1285.         mov    [si].uNsNScount+2,ax
  1286.         lea    si,[si].uNsNScount
  1287.         push    bx
  1288.         mov    bx,cs:TblSize
  1289.         mov    es,cs:SegIpHwTbl
  1290.         push    ax
  1291.         mov    ax,4
  1292.         call    FindIn16Table
  1293.         pop    ax
  1294.         mov    si,bx
  1295.         pop    bx
  1296.         je    NameFound
  1297.   NameNotFound:
  1298.         pop    dx
  1299. if DEBUG ge 3
  1300.         call    DosPr$
  1301.         mov    al,'A'-'0'
  1302.         call    Terminate
  1303. else
  1304.         jmp    NameRet
  1305. endif ; DEBUG ge 3
  1306.   NameFound:                    ; find question to this answer
  1307.         mov    cx,si
  1308.   NameFindNxtHi:
  1309.         cmp    bp,es:[si].SlotNamPtr
  1310.         je    NameFoundThis
  1311.         add    si,16
  1312.         cmp    dx,es:[si]
  1313.         jne    NameFindLower
  1314.         cmp    ax,es:[si+2]
  1315.         je    NameFindNxtHi
  1316.   NameFindLower:
  1317.         mov    si,cx
  1318.   NameFindNxtLo:
  1319.         sub    si,16
  1320.         cmp    bp,es:[si].SlotNamPtr
  1321.         je    NameFoundThis
  1322.         cmp    dx,es:[si]
  1323.         jne    NameNotFound
  1324.         cmp    ax,es:[si+2]
  1325.         jne    NameNotFound
  1326.         jmp    short NameFindNxtLo
  1327.   NameFoundThis:
  1328.         mov    bp,[bx].dPtrUdp
  1329.         mov    dx,ds:[bp].uNsAncount
  1330.         mov    ax,ds:[bp].uNsOpwd
  1331.         and    ah,0fh
  1332.         cmp    ah,1            ; format error?
  1333.         jne    NameFmtOK
  1334.  
  1335.         mov    al,'F'-'0'
  1336.         call    Terminate
  1337.   NameFmtOK:
  1338.         cmp    ah,2            ; temporary server problem?
  1339.         je    NameSkipUpd
  1340.  
  1341.         test    al,4            ; authorative answer?
  1342.         jz    NameTryLater
  1343.  
  1344.         mov    byte ptr es:[si].SlotPend,'0' ; we ask no more about this #
  1345.   NameTryLater:
  1346.         or    ah,ah            ; any other error?
  1347.         jnz    NameSkipUpd
  1348.  
  1349.         or    dx,dx            ; any answer?
  1350.         jz    NameSkipUpd
  1351.  
  1352.         mov    byte ptr es:[si].SlotPend,'N' ; we ask no more about this #
  1353.         test    al,4            ; authorititive answer?
  1354.         jz    NameNotAuth
  1355.  
  1356.         mov    byte ptr es:[si].SlotPend,'A' ; we ask no more about this #
  1357.   NameNotAuth:
  1358.         push    bx
  1359.         mov    bx,si
  1360.         mov    si,di
  1361.         inc    si
  1362.         call    NamePut            ; put real name into nametable
  1363.         pop    bx
  1364.         SHOW_EVENT    'f'
  1365.   NameSkipUpd:
  1366.         or    cs:Events,GOT_NSREPLY
  1367.         mov    di,offset DefNsNum
  1368.         call    ThisIpFirst        ; stick to this nameserver
  1369.         push    cs
  1370.         pop    es
  1371.         pop    dx
  1372. if DEBUG ge 99
  1373. else
  1374. if HOPCHK
  1375.         test    cs:MoreFlags,HOP_CHK
  1376.         jnz    NameRet
  1377. endif ; HOPCHK
  1378. endif ; DEBUG
  1379.         call    DosPr$
  1380.  
  1381.   NameRet:
  1382.         ret
  1383. DoName        endp
  1384.  
  1385.  
  1386.  
  1387. ;************************************************************************
  1388. ;*        TabMarkGw
  1389. ;************************************************************************
  1390.  
  1391. TabMarkGw    proc    near
  1392.         SHOW_EVENT    'g'
  1393.         assume    ds:code_s
  1394.         mov    bx,TblSize
  1395.         mov    ds,SegIpHwTbl
  1396.         assume    ds:nothing
  1397.   TabMarkLoop:
  1398.         mov    si,bx
  1399.         mov    dx,[si].SlotIp
  1400.         mov    ax,[si].SlotIp+2
  1401.         mov    cx,cs:DefGwyNum
  1402.         mov    si,offset DefGwys
  1403.         jcxz    TabGwyDone
  1404.   TabGwyLoop:
  1405.         cmp    ax,cs:[si].SlotIp+2
  1406.         jne    TabGwyNext
  1407.         cmp    dx,cs:[si].SlotIp
  1408.         jne    TabGwyNext
  1409.         mov    byte ptr [bx].SlotDupl,'+'
  1410.         jmp    short TabGwyDone
  1411.   TabGwyNext:
  1412.         add    si,4
  1413.         loop    TabGwyLoop
  1414.   TabGwyDone:
  1415.         sub    bx,16
  1416.         jns    TabMarkLoop
  1417.  
  1418.         mov    bx,cs:TblSize
  1419.   TabDupLoop:
  1420.         mov    si,bx
  1421.   TabMarkHwLoop:
  1422.         sub    si,16
  1423.         js    TabDupNext
  1424.  
  1425.         mov    ax,[si].SlotHw+4
  1426.         cmp    ax,[bx].SlotHw+4
  1427.         jne    TabMarkHwLoop
  1428.         mov    ax,[si].SlotHw+2
  1429.         cmp    ax,[bx].SlotHw+2
  1430.         jne    TabMarkHwLoop
  1431.         mov    ax,[si].SlotHw
  1432.         cmp    ax,[bx].SlotHw
  1433.         jne    TabMarkHwLoop
  1434.  
  1435.         cmp    byte ptr [si].SlotDupl,'+'
  1436.         je    TabMarkHwDup
  1437.  
  1438.         mov    byte ptr [si].SlotDupl,'>'
  1439.         cmp    byte ptr [bx].SlotDupl,'>'
  1440.         je    TabMarkHwDup
  1441.  
  1442.         cmp    byte ptr [bx].SlotDupl,'+'
  1443.         je    TabMarkHwLoop
  1444.  
  1445.         mov    byte ptr [bx].SlotDupl,'='
  1446.         jmp    short TabMarkHwLoop
  1447.  
  1448.   TabMarkHwDup:
  1449.         cmp    byte ptr [bx].SlotDupl,'+'
  1450.         je    TabMarkHwLoop
  1451.  
  1452.         mov    byte ptr [bx].SlotDupl,'>'
  1453.         jmp    short TabMarkHwLoop
  1454.   TabDupNext:
  1455.         sub    bx,16
  1456.         jns    TabDupLoop
  1457.  
  1458.         push    cs
  1459.         pop    ds
  1460.         ret
  1461. TabMarkGw    endp
  1462.  
  1463.  
  1464. ;************************************************************************
  1465. ;*        TabOpen
  1466. ;************************************************************************
  1467.  
  1468. TabOpen     proc    near
  1469.         assume    ds:code_s
  1470.         mov    ax,3d02h
  1471.         int    21h
  1472.         mov    Handle,ax
  1473.         jnc    TabOpenRet
  1474.         mov    al,'B'-'0'
  1475.         call    Terminate
  1476.   TabOpenRet:
  1477.         ret
  1478. TabOpen     endp
  1479.  
  1480.  
  1481.  
  1482. ;************************************************************************
  1483. ;*        TabPutHw
  1484. ;************************************************************************
  1485.  
  1486. TabPutHw    proc    near
  1487.         assume    ds:nothing
  1488.         mov    ds,cs:SegIpHwTbl
  1489.         lea    si,[bx].SlotHw
  1490.         call    PutHwNum
  1491.  
  1492.         mov    ds,cs:SegIpHwTbl
  1493.         cmp    byte ptr [bx].SlotDupl,'>'
  1494.         clc
  1495.         jne    TabPutHwRet
  1496.  
  1497.         stc
  1498.  
  1499.   TabPutHwRet:
  1500.         ret
  1501. TabPutHw    endp
  1502.  
  1503.  
  1504.  
  1505. ;************************************************************************
  1506. ;*        TabPutName
  1507. ;************************************************************************
  1508.  
  1509. TabPutName    proc    near
  1510.         assume    ds:nothing
  1511.         push    bx
  1512.         mov    ds,cs:SegIpHwTbl
  1513.         mov    cx,32
  1514. if HOPCHK
  1515.         test    cs:MoreFlags,HOP_CHK
  1516.         jz    TabPutNam2
  1517.  
  1518.         mov    cx,dx            ; end of cur line
  1519.         sub    cx,di            ; current dsp buf ptr
  1520.         js    TabPutNamRet2
  1521.         inc    cx
  1522.         mov    ah,[bx].SlotPend
  1523.         cmp    ah,'0'
  1524.         jne    TabPutNam3
  1525.         mov    al,'-'
  1526.         stosb
  1527.   TabPutNam3:
  1528.         cmp    ah,'N'
  1529.         je    TabPutNam2
  1530.         cmp    ah,'A'
  1531.         je    TabPutNam2
  1532.   TabPutNamRet2:
  1533.         pop    bx
  1534.         ret
  1535.  
  1536.   TabPutNam2:
  1537. endif ; HOPCHK
  1538.         mov    si,[bx].SlotNamPtr
  1539.         mov    ds,cs:SegmNamTbl
  1540.         mov    si,[si]
  1541.         cmp    si,0ffffh        ; any name yet?
  1542.         jne    TabPutNamGot
  1543.  
  1544.         mov    ds,cs:SegIpHwTbl    ; use IP nr as name
  1545.         mov    si,bx
  1546.         push    cx
  1547.         push    di
  1548.         call    PutIpNum
  1549.         pop    dx
  1550.         pop    cx
  1551.         add    cx,dx
  1552.         sub    cx,di
  1553.         jmp    short TabPutNamFill
  1554.  
  1555.   TabPutNamGot:
  1556.         shl    si,1            ; compute addr to name
  1557.         jnc    TabPut1st
  1558.   TabPut2nd:
  1559.         mov    ds,cs:SegmNamTbl2
  1560.   TabPut1st:
  1561.         add    si,48
  1562.         jc    TabPut2nd
  1563.         sub    si,48
  1564.  
  1565.         jcxz    TabPutNamEnd
  1566.   TabPutNamL:
  1567.         lodsb
  1568.         cmp    al,' '
  1569.         je    TabPutNamEnd
  1570.         stosb                ; move name
  1571.         loop    TabPutNamL
  1572.   TabPutNamEnd:
  1573. if HOPCHK
  1574.         test    cs:MoreFlags,HOP_CHK
  1575.         jnz    TabPutRet
  1576. endif ; HOPCHK
  1577.   TabPutNamFill:
  1578.         mov    al,' '
  1579.         rep    stosb
  1580.         mov    ax,'# '
  1581.         stosw
  1582.  
  1583.         pop    bx
  1584.         push    bx
  1585.         mov    ds,cs:SegIpHwTbl
  1586.         mov    si,bx
  1587.         mov    ah,[si].SlotPend
  1588.         cmp    ah,'0'
  1589.         jne    TabPutKnown
  1590.         mov    al,'-'
  1591.   TabPutKnown:
  1592.         mov    dx,[si].SlotIp
  1593.         mov    cx,[si].SlotIp+2
  1594.         cmp    dx,[si].SlotIp+16
  1595.         jne    TabPutNeN
  1596.         cmp    cx,[si].SlotIp+16+2
  1597.         jne    TabPutNeN
  1598.         mov    al,'='
  1599.   TabPutNeN:
  1600.         cmp    dx,[si].SlotIp-16
  1601.         jne    TabPutNeP
  1602.         cmp    cx,[si].SlotIp-16+2
  1603.         jne    TabPutNeP
  1604.         mov    al,'<'
  1605.   TabPutNeP:
  1606.         stosw
  1607.         mov    al,[bx].SlotDupl
  1608.         stosb
  1609.   TabPutRet:
  1610.         pop    bx
  1611.         ret
  1612. TabPutName    endp
  1613.  
  1614.  
  1615.  
  1616. ;************************************************************************
  1617. ;*        TabPutIp
  1618. ;************************************************************************
  1619.  
  1620. TabPutIp    proc    near
  1621.         assume    ds:nothing
  1622.         mov    ds,cs:SegIpHwTbl
  1623.         mov    si,bx
  1624.         call    PutIpNum
  1625.         ret
  1626. TabPutIp    endp
  1627.  
  1628.  
  1629.  
  1630. ;************************************************************************
  1631. ;*        TabWrLine
  1632. ;************************************************************************
  1633.  
  1634. TabWrLine    proc    near
  1635.         push    cs
  1636.         pop    ds
  1637.         assume    ds:code_s
  1638.         push    bx
  1639.         mov    cx,di
  1640.         mov    dx,offset FileBuf
  1641.         sub    cx,dx
  1642.         mov    bx,Handle
  1643.         mov    ah,40h
  1644.         int    21h
  1645.         jnc    TabWrOK
  1646.   TabWrErr:
  1647.         mov    al,'W'-'0'
  1648.         call    Terminate
  1649.   TabWrOK:
  1650.         pop    bx
  1651.         ret
  1652. TabWrLine    endp
  1653.  
  1654.  
  1655.  
  1656. ;************************************************************************
  1657. ;*        TabClose
  1658. ;************************************************************************
  1659.  
  1660. TabClose    proc    near
  1661.         assume    ds:code_s
  1662.         mov    byte ptr FileBuf,'Z'-40h
  1663.         mov    dx,offset FileBuf
  1664.         mov    cx,1
  1665.         mov    bx,Handle
  1666.         mov    ah,40h
  1667.         int    21h
  1668.         jc    TabWrErr
  1669.  
  1670.         mov    bx,Handle
  1671.         mov    ah,3eh
  1672.         int    21h
  1673.         jnc    TabHwClOK
  1674.  
  1675.         mov    al,'C'-'0'
  1676.         call    Terminate
  1677.   TabHwClOK:
  1678.         ret
  1679. TabClose    endp
  1680.  
  1681.  
  1682.  
  1683. ;************************************************************************
  1684. ;*        TabWrSeen
  1685. ;************************************************************************
  1686.  
  1687. TabWrSeen    proc    near
  1688.         assume    ds:nothing
  1689.         mov    ax,[bx].SlotSeen
  1690.         push    cs
  1691.         pop    ds
  1692.         assume    ds:code_s
  1693.         mov    PutMinDigits,9
  1694.         call    PutNumFb
  1695.         mov    PutMinDigits,1
  1696.         ret
  1697. TabWrSeen    endp
  1698.  
  1699.  
  1700.  
  1701. ;************************************************************************
  1702. ;*        TableWr
  1703. ;************************************************************************
  1704.  
  1705. TableWr     proc    near
  1706.         assume    ds:code_s
  1707.         test    MoreFlags,HOP_CHK
  1708.         jnz    TableWrRet
  1709.         cmp    TblSize,16
  1710.         ja    TableExist
  1711.   TableWrRet:
  1712.         ret
  1713.  
  1714.   TableExist:
  1715.         push    bx
  1716.  
  1717.         call    TabMarkGw
  1718.  
  1719.         mov    dx,offset NameIpTbl
  1720.         call    TabOpen
  1721.         mov    bx,16
  1722.   TabIpNext:
  1723.         mov    di,offset FileBuf
  1724.  
  1725.         call    TabPutIp
  1726.         assume    ds:nothing
  1727.  
  1728.         call    BlankUntil16
  1729.  
  1730.         call    TabPutName
  1731.  
  1732.         push    cs:ArgFlags
  1733.         and    cs:ArgFlags, not LANW_TABLE
  1734.         call    TabPutHw
  1735.         pop    cs:ArgFlags
  1736.  
  1737.         call    TabWrSeen
  1738.  
  1739.         mov    ax,CR+256*LF
  1740.         stosw
  1741.  
  1742.         call    TabWrLine
  1743.         assume    ds:code_s
  1744.  
  1745.         add    bx,16
  1746.         cmp    bx,TblSize
  1747.         jb    TabIpNext
  1748.  
  1749.         call    TabClose
  1750.  
  1751.         mov    dx,offset NameHwTbl
  1752.         call    TabOpen
  1753.         mov    bx,16
  1754.   TabHwNext:
  1755.         mov    di,offset FileBuf
  1756.         call    TabPutHw
  1757.         assume    ds:nothing
  1758.         pushf
  1759.  
  1760.         mov    al,' '
  1761.         stosb
  1762.         call    TabPutName
  1763.  
  1764.         call    TabPutIp
  1765.  
  1766.         call    BlankUntil16
  1767.         sub    di,10
  1768.  
  1769.         call    TabWrSeen
  1770.  
  1771.         mov    ax,CR+256*LF
  1772.         stosw
  1773.  
  1774.         popf
  1775.  
  1776.         call    TabWrLine
  1777.         assume    ds:code_s
  1778.   TabPutHwSkip:
  1779.         add    bx,16
  1780.         cmp    bx,TblSize
  1781.         jb    TabHwNext
  1782.  
  1783.         mov    bx,16
  1784.         mov    es,SegIpHwTbl
  1785.   TabPutRestore:
  1786.         mov    es:[bx].SlotDupl,' '
  1787.         add    bx,16
  1788.         cmp    bx,TblSize
  1789.         jb    TabPutRestore
  1790.         push    cs
  1791.         pop    es
  1792.  
  1793.         call    TabClose
  1794.  
  1795.         pop    bx
  1796.  
  1797.         mov    di,offset MsgTblSize+6
  1798.         mov    ax,TblSize
  1799.         mov    cl,4
  1800.         shr    ax,cl
  1801.         dec    ax
  1802.         call    PutNumD4Fb
  1803.         mov    di,offset MsgTblAct
  1804.         mov    ax,TblActive
  1805.         call    PutNum
  1806.         mov    dx,offset MsgTblSize
  1807.         call    DosPr$
  1808.         ret
  1809. TableWr     endp
  1810.  
  1811. ;========================================================================
  1812.  
  1813.