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

  1.  
  2. PAGE  44,132
  3.  
  4. ; Copyright (C) 1991-94 by Jan.Engvald@ldc.lu.se, see file COPYING.
  5.  
  6. ;========================================================================
  7.         include pdtstnet.doc
  8. ;========================================================================
  9.  
  10. ESCAPE        equ    27
  11. RFCC        equ    TBLBUILD+PINGCLIENT    ; RFC compliance needed
  12. MAXHOP        equ    64            ; must be 64
  13. REPVECLEN    equ    512            ; any power of two
  14.  
  15. if TBLBUILD
  16. PROGSTR     equ    'pdtstnet'
  17. elseif PINGCLIENT
  18. PROGSTR     equ    'pdclkset'
  19. else
  20. PROGSTR     equ    'pdclksml'
  21. endif ; TBLBUILD
  22.  
  23. IDSTRING    equ    PROGSTR,PRGVERSION
  24.  
  25.  
  26.         include defs.asm
  27.  
  28. ;************************************************************************
  29. ;*        Start of segment (PSP data)                *
  30. ;************************************************************************
  31.  
  32.         .386        ; (to avoid masm expression overflow)
  33.   
  34. code_s        segment use16
  35.         assume    cs:code_s, ds:nothing, ss:code_s, es:nothing
  36.  
  37.         org    0
  38. CodeOrg     label    byte
  39. PspInt20    dw    ?
  40. PspTopMem    dw    ?
  41.  
  42.         org    5Ch            ; PSP can be reused for data from here
  43.  
  44.         org    80h            ; PSP command parameter area  
  45. phd_dioa    db    ?
  46.         db    ?            ; always a space
  47. phd_string    db    ?
  48.  
  49.  
  50. ;************************************************************************
  51. ;*        Start of segment (code)                 *
  52. ;************************************************************************
  53.  
  54.         .8086
  55.         org    100h
  56. StackEnd    equ    $            ; 80h-100h is interupt stack
  57. SaveSP        equ    $
  58. SaveSS        equ    SaveSP+2
  59.  
  60. start:        jmp    start1            ; jump over data area
  61.         nop
  62.  
  63. id_label    db    IDSTRING
  64.  
  65.   
  66. ;************************************************************************
  67. ;*                                    *
  68. ;*        Data area                        *
  69. ;*                                    *
  70. ;************************************************************************
  71.  
  72. NotEnoughMsg    db    LF, "Need to know at least IP nr, Offset and Timeserver$"
  73. OccupiedMsg    db    LF, "My IP nr is already in use by another host with hardware addr "
  74. OccupiedHw    db    "00:00:00:00:00:00$"
  75. MsgNoConect    db    LF, "No response from target host$"
  76. NoBotReplyMsg    db    LF, "No BOOTP reply$"
  77. NoGwyMsg    db    LF, "Need to know a gateway (or wrong mask)$"
  78. NoTimeServMsg    db    LF, "No reply from time server$"
  79.  
  80. usage_msg    db    LF
  81.   db  "Copyright (C) 1991-94 by Jan.Engvald@ldc.lu.se, see file COPYING.", CR, LF
  82.   db  IDSTRING, ' ', ??date, " usage to set the PC clock from an UDP/IP TIME server:", CR, LF, LF
  83.   db  PROGSTR," [o[ffset]=time]   (time is [-|+][<hours>h][<minutes>m][<seconds>[s]])", CR, LF
  84.   db  "      [d[aylightsave]=PAC | USA | CUB | CHIL | BRZ | GBR |", CR, LF
  85.   db  "                      W_EU | M_EU | E_EU | LIBY | EGY | TURK | ISR |", CR, LF
  86.   db  "                      IRAN | PRC | ROK | AUS | TASM | NSW | LHI | NZE |", CR, LF
  87.   db  "                  FrTime,FrWeekDay,FrDayOfYear,ToTime,ToWday,ToDayOfYr,AddTime]", CR, LF, LF
  88.   db  "      [i[pnr]=n.n.n.n]  [t[imserver]=n.n.n.n[,n.n.n.n[,...]]]", CR, LF
  89.   db  "      [m[ask]=n.n.n.n  g[ateway]=n.n.n.n[,n.n.n.n[,...]]]  [f[lags]=flagnr]", CR, LF
  90.   db  "      [z[onename]= # | variable=normalname,dlsname]  [a[lter]=days,time]", CR, LF
  91.   db  "      [p[ktintno]=hexnr]"
  92.  
  93. if PINGCLIENT or TBLBUILD
  94.   db  "  [e[cho]=name|n.n.n.n [,size,interval[,data,inc,min]]]", CR, LF
  95.   db  "      [u[dpecho]=name|n.n.n.n [,size,interval[,data,inc,minsize]]]", CR, LF
  96. if HOPCHK
  97.   db  "      [h[opcheck]=name|n.n.n.n [,size,interval[,data,inc,minsize,maxhop]]]", CR, LF
  98. endif ; HOPCHK
  99.   db  "      [n[ameserver]=n.n.n.n[,n.n.n.n[,...]]]"
  100. endif ; PINGCLIENT or TBLBUILD
  101.  
  102.   db  "  [l[ongertimeout]=time]", CR, LF, LF
  103.   db  "Example: ",PROGSTR," o= -1h  d=M_EU  z=#   (my IP nr and timeserver(s) from BOOTP)", CR, LF
  104.   db  "         ",PROGSTR," offs= 6h dst= USA zonename= tz=CST,CDT   (sets TZ=CST or CDT)", CR, LF
  105.   db  "         ",PROGSTR," o=8h  d=PAC  ip=123.45.6.7  ts=123.45.6.8    (BOOTP not used)"
  106.  
  107. if PINGCLIENT
  108.   db  CR, LF, "         ",PROGSTR," pktdrv= 0x7c  echo= ping.lu.se    (ping client)"
  109. endif
  110.  
  111. if TBLBUILD
  112. if HOPCHK
  113.   db  CR, LF, "         ",PROGSTR," hopcheck= ftp.lu.se    (trace route)"
  114. endif ; HOPCHK
  115.   db  CR, LF, "         ",PROGSTR," flags= 2+4   (address table builder for LANwatch)"
  116. endif
  117.  
  118. crlf_msg    db    CR, LF, '$'
  119.  
  120. if DEBUG
  121. MsgErrDet    db    CR, LF, 7
  122.         db    " ax   dx   cx   si   ds   bx   di   es   bp "
  123.         db    " addr stack...", CR, LF
  124. MsgErrAdr    db    "0000/0000/0000/0000/0000/0000/0000/0000/0000"
  125.         db    " 0000 0000 0000 0000 0000 0000 0000"
  126. endif ; DEBUG
  127.  
  128. MsgTerm        db    CR, LF, "End of ", IDSTRING, ", error="
  129. MsgTermNr    db    255, ", HWaddr "
  130. MsgTermHw    db    "00:00:00:00:     , IP nr "
  131. MsgMyIp        db    "1.2.3.4        ", CR, LF
  132. MsgTermStop    db    "$", 7, Cr, LF
  133.         db    "Dst entries too old, update and reassemble PDCLKSET", CR, LF, '$'
  134.  
  135.         even
  136. Flagword    dw    0
  137. DONT_SETTIME    equ    1
  138. HAVE_MYIPNR    equ    2
  139. HAVE_TIMEOFFSET equ    4
  140. HAVE_TIMESERVER equ    8
  141.  
  142. HAVE_ENOUGH    equ    HAVE_MYIPNR + HAVE_TIMEOFFSET + HAVE_TIMESERVER
  143. EnoughWord    dw    HAVE_ENOUGH
  144.  
  145. ArgFlags    dw    0
  146. TERM_WAIT    equ    1    ; 0x0001
  147. NOT_SAFE    equ    1    ; 0x0001
  148. MAKE_TABLE    equ    2    ; 0x0002
  149. LANW_TABLE    equ    4    ; 0x0004
  150. TBL_PROBE    equ    8    ; 0x0008
  151. AVOID_HDWR    equ    16    ; 0x0010
  152. MICRO_100    equ    32    ; 0x0020
  153. UDP_DISCARD    equ    64    ; 0x0040
  154. QUIET_TERM    equ    128    ; 0x0080
  155. IP_15DIG    equ    256    ; 0x0100
  156. UPCALL_SEND    equ    512    ; 0x0200
  157. STOP_ON_ERR    equ    1024    ; 0x0400
  158.                                 ; 0x0800
  159. TR_GIANT        equ     4096    ; 0x1000
  160.                                 ; 0x2000
  161. NOT_ALL_MEM    equ    04000h
  162. TEMP_TEST    equ    08000h    ; 0x8000
  163.  
  164.  
  165. MAXTSERVS    equ    4
  166. ARPSLOTS    equ    8 + 4*TBLBUILD
  167. ROUTESLOTS    equ    5
  168. MAXDEFGWYS    equ    4 + 6*TBLBUILD
  169. MAXDEFNS    equ    3
  170.  
  171. ifdef SMALLBUFS
  172. NBUFSMALM    equ    24            ; at least so many small bufs
  173. else
  174. NBUFSMALM    equ    0            ; at least so many small bufs
  175. endif
  176.  
  177. ;========================================================================
  178.          include bufs.inc
  179.  
  180.  
  181. ;========================================================================
  182.          include arp.inc
  183.  
  184.  
  185. ;========================================================================
  186.          include ip.inc
  187.  
  188.  
  189. ;========================================================================
  190.         include settime.inc
  191.  
  192.  
  193. if PINGCLIENT
  194. ;========================================================================
  195.          include ping.inc
  196.  
  197. endif ; PINGCLIENT
  198.  
  199.  
  200. if TBLBUILD
  201. ;========================================================================
  202.         include tblbuild.inc
  203. endif ; TBLBUILD
  204.  
  205.  
  206.  
  207. ;**********************************************************************
  208. ;*
  209. ;*        End of data area
  210. ;*
  211. ;**********************************************************************
  212.  
  213.         .8086    ; ensure no 386-only instructions
  214.  
  215. MULTIPROCESS    equ    1        ; (the interrupt process counts here)
  216.  
  217. PushfDI     macro
  218. if    MULTIPROCESS
  219.         pushf                ; save enable interrupt flag
  220.         cli                ; and disable interrupt
  221. endif ; MULTIPROCESS
  222.         endm
  223.  
  224. PopfEI        macro
  225. if    MULTIPROCESS
  226.         popf                ; restore enable interrupt flag
  227. endif ; MULTIPROCESS
  228.         endm                ; (probably enabling interrupt)
  229.  
  230.  
  231. if DEBUG ge 3
  232.  
  233. CHK_ES_EQ_DS    macro
  234.         call    ChkEsEqDs
  235.         endm
  236.  
  237. ChkEsEqDs    proc    near
  238.         push    ax
  239.         push    dx
  240.         mov    ax,es
  241.         mov    dx,ds
  242.         cmp    ax,dx
  243.         jne    ChkESeqErr
  244.  
  245.         pop    dx
  246.         pop    ax
  247.         ret
  248. ChkEsEqDs    endp
  249.  
  250.   ChkEsEqErr:
  251.         mov    al,'z'-'0'
  252.         call    Terminate
  253.  
  254. else
  255.  
  256.  
  257. CHK_ES_EQ_DS    macro
  258.         endm
  259.  
  260. endif ; DEBUG ge 3
  261.  
  262.  
  263. If DEBUG ge 2
  264. ; This debug routine destroys no registers and needs only 3 bytes at each
  265. ; place called. It will put on the screen a one-line summary of which events
  266. ; that have ever occured and then some lines with the last sequence of events.
  267. ; The macro is called like
  268. ;    SHOW_EVENT    'A'
  269. ; and you can use one argument in the range from MINEVENT to MAXEVENT below.
  270.  
  271. MINEVENT        equ     'A'
  272. MAXEVENT        equ     'o'
  273. EVENTCOLOR      equ     3eh
  274. EVENTLINE       equ     8
  275. TRACECOLOR      equ     24h
  276.  
  277. ShowEvent    proc    near
  278. x        =    0
  279.                 rept    (MAXEVENT-MINEVENT+1)
  280.         push    ax
  281.         mov    al,x
  282.         jmp    ShowEventNum
  283. x        =    x+1
  284.         endm
  285.  
  286.   ShowEventNum:
  287.         pushf
  288.         push    di
  289.         push    es
  290.         mov    ah,EVENTCOLOR
  291.         mov    di,ax
  292.         shl    di,1
  293.                 add     al,MINEVENT
  294.         mov    es,cs:EventPar
  295.         cld
  296.         stosw
  297.  
  298.         mov    ah,TRACECOLOR
  299.         mov    es,cs:TracePar
  300.         cli
  301.         mov    di,cs:TraceInd
  302.         stosw
  303.                 and     di,03ffh                ; (3ff+1)/2 = 512 log entries
  304.         mov    cs:TraceInd,di
  305.         mov    al,01bh
  306.         not    ah
  307.         stosw
  308.  
  309.         pop    es
  310.         pop    di
  311.         popf
  312.         pop    ax
  313.         ret
  314. ShowEvent    endp
  315.  
  316.         even
  317. EventPar        dw      0b800h+(EVENTLINE-1)*10-2*EVENTCOLOR*16
  318. TracePar        dw      0b800h+EVENTLINE*10
  319. TraceInd        dw      0
  320.  
  321. endif ; DEBUG ge 2
  322.  
  323. if DEBUG ge 3
  324. SHOW_EVENT    macro    id
  325. if id gt MAXEVENT or id lt MINEVENT
  326.         .err
  327. endif
  328.                 call    ShowEvent+((id-MINEVENT)*(ShowEventNum-ShowEvent)/(MAXEVENT-MINEVENT+1))
  329.         endm
  330.  
  331. else
  332.  
  333. SHOW_EVENT    macro    num
  334.         endm
  335.  
  336. endif ; DEBUG ge 3
  337.  
  338. if DEBUG ge 2
  339. SHOW_TRACE    macro    id
  340. if id gt MAXEVENT or id lt MINEVENT
  341.         .err
  342. endif
  343.                 call    ShowEvent+((id-MINEVENT)*(ShowEventNum-ShowEvent)/(MAXEVENT-MINEVENT+1))
  344.         endm
  345.  
  346. else
  347.  
  348. SHOW_TRACE    macro    num
  349.         endm
  350.  
  351. endif ; DEBUG ge 2
  352.  
  353.  
  354.  
  355.         assume ds:nothing
  356.  
  357. ;========================================================================
  358.         include pktdr.asm
  359.  
  360. ;========================================================================
  361.         include pkterr.asm
  362. if RFCC
  363. ;========================================================================
  364.         include Movesb.asm
  365. endif ; RFCC
  366.  
  367. ;========================================================================
  368.          include bufs.asm
  369.  
  370. ;========================================================================
  371.          include arp.asm
  372.  
  373.  
  374. ;========================================================================
  375.          include ip.asm
  376.  
  377.  
  378. ;************************************************************************
  379. ;*        Something2Do
  380. ;*
  381. ;* Simulates a task scheduler.
  382. ;*
  383. ;*    Destroys:    flags
  384. ;************************************************************************
  385.  
  386. Something2Do    proc    near
  387.         push    ax
  388.         push    bx
  389.         push    cx
  390.         push    dx
  391.         push    si
  392.         push    di
  393.         push    bp
  394.         push    es
  395.         push    ds
  396.  
  397.         mov    ds,cs:Mysegm
  398.         assume    ds:code_s
  399.         cld
  400.  
  401.         call    Ageing            ; clear unused table slots
  402. if PINGCLIENT or TBLBUILD
  403.         call    EchoDisplay        ; show current values
  404. endif ; PIGCLIENT or TBLBUILD
  405.  
  406. if TBLBUILD
  407.         cmp    InSendAndW,0         ; avoid overload
  408.         jne    SomethingNxt5
  409.         cmp    sp,offset StackLow+13*16
  410.         jb    SomethingNxt5
  411.  
  412.         call    TblProbe        ; do tablebuilding things
  413.         mov    di,offset TblToDo
  414.         call    GetFromList
  415.         jz    SomethingNxt5
  416.         call    DoTable
  417.   SomethingNxt5:
  418. endif ; TBLBUILD
  419.  
  420. if RFCC
  421.         mov    di,offset IcmpToDo    ; ICMP or UDP replies to send?
  422.         call    GetFromList
  423.         jz    SomethingNxt4
  424.  
  425.         mov    di,[bx].dPtrIp
  426.         cmp    [di].iIpProt,UDP_PROT    ; UDP protocol?
  427.         je    Udp2Do
  428.  
  429.         call    SendIcmpPkt
  430.         jmp    short SomeIcmpDone
  431.   Udp2Do:
  432.         mov    [bx].dWaitEvent,0    ; don't wait for answer
  433.         call    SendUdpPkt
  434.   SomeIcmpDone:
  435.         call    BufRelease
  436.   SomethingNxt4:
  437. endif ; RFCC
  438.         mov    di,offset SendToDo    ; ARP replies to send?
  439.         call    GetFromList
  440.         jz    SomethingNxt2
  441.         call    SendAndWait
  442.         call    BufRelease
  443.   SomethingNxt2:
  444. if TBLBUILD or PINGCLIENT
  445.         mov    di,offset NameToDo    ; got nameserver replies?
  446.         call    GetFromList
  447.         jz    SomethingNxt6
  448.         call    DoNsInterp
  449.         call    BufRelease
  450.   SomethingNxt6:
  451. endif ; TBLBUILD or PINGCLIENT
  452.  
  453.         pop    ds
  454.         pop    es
  455.         pop    bp
  456.         pop    di
  457.         pop    si
  458.         pop    dx
  459.         pop    cx
  460.         pop    bx
  461.         pop    ax
  462.         ret
  463. Something2Do    endp
  464.  
  465.  
  466.  
  467. ;************************************************************************
  468. ;*        PrTerminate
  469. ;************************************************************************
  470.  
  471. PrTerminate:
  472.         push    cs
  473.         pop    ds
  474.         assume    ds:code_s
  475.         call    DosPr$            ; print error msg    
  476. Terminate:
  477. if DEBUG
  478.         or    cs:GenFlags,DBGSTOP    ; ignore upcalls
  479.         push    bp
  480.         push    es
  481.         push    di
  482.         push    bx
  483.         push    ds
  484.         push    si
  485.         push    cx
  486.         push    dx
  487.         push    ax
  488. endif ; DEBUG
  489.         push    cs
  490.         pop    ds
  491.         assume    ds:code_s
  492.  
  493.         push    ax
  494.  
  495.         cld
  496.         push    cs
  497.         pop    es
  498.         sti
  499.  
  500.         mov    bx,IpHandle        ; release ARP and IP handles
  501.         call    EndProtocol
  502.         mov    bx,ArpHandle
  503.         call    EndProtocol
  504. if PINGCLIENT
  505.         cmp    EchoTarget,0
  506.         jz    TermNoPing
  507.         call    RestoreTimer
  508.   TermNoPing:
  509. endif ; PINGCLIENT
  510.         pop    ax
  511.         push    ax
  512.         or    al,al            ; any errors?
  513.         jz    termnorm
  514.  
  515. if DEBUG
  516.         mov    PutNumBase,16
  517.         mov    PutMinDigits,4
  518.         mov    di,offset MsgErrAdr
  519.         mov    si,sp
  520.         sub    word ptr [si+20],3
  521.         lodsw                ; add si,2
  522.         mov    cx,16+256*(' ')
  523.         call    PutNumsF0        ; show regs
  524. endif ; DEBUG
  525.  
  526.         cmp    EnoughWord,HAVE_MYIPNR    ; clock errors?
  527.         je    termnorm
  528.  
  529.         mov    dx,offset MsgNotSet    ; display "clock not set"
  530.         call    DosPr$
  531.   termnorm:
  532.  
  533.         pop    ax
  534.         push    ax
  535.         add    al,'0'
  536.         mov    MsgTermNr,al        ; show error # in end line
  537.  
  538.         cmp    al,'0'
  539.         jne    showtermsg
  540.         test    ArgFlags,QUIET_TERM
  541.         jnz    termexit
  542.   showtermsg:
  543.         mov    si,offset MyHwAd
  544.         mov    di,offset MsgTermHw
  545.         call    PutHwNum        ; put my HW addr
  546.  
  547.         mov    si,offset MyIpNr
  548.         mov    di,offset MsgMyIp
  549.         call    PutIpNum        ; put my IP #
  550.  
  551.         mov    dx,offset MsgTerm    ; End of PDCLKSET msg
  552. if DEBUG
  553.         cmp    MsgTermNr,'0'
  554.         je    TermStdMsg
  555.         mov    dx,offset MsgErrDet
  556.   TermStdMsg:
  557. endif ; DEBUG
  558.         call    DosPr$
  559.   termexit:
  560.         pop    ax            ; error code
  561.         mov    ah,4ch
  562.         int    21h            ; terminate program
  563.  
  564.  
  565.  
  566.  
  567. ;************************************************************************
  568. ;************************************************************************
  569. ;*
  570. ;*        Input and Output routines
  571. ;*
  572. ;************************************************************************
  573. ;************************************************************************
  574.  
  575.  
  576. PutNumFiller    db    '0'
  577.         even
  578. PutNumBase    dw    10
  579. PutMinDigits    dw    2
  580. k10000        dw    10000
  581. GetNumBase    dw    10
  582.  
  583. IntTmpHwAd    dw    0, 0, 0, 0, 0, 0
  584. IntTmpIpNr    equ    IntTmpHwAd
  585.  
  586.  
  587.  
  588. ;************************************************************************
  589. ;*        DosPr$
  590. ;************************************************************************
  591.  
  592. DosPr$        proc    near
  593.         assume    ds:nothing
  594.         push    ax
  595.         mov    ah,9            ; print msg in ds:dx
  596.         int    21h
  597.         pop    ax
  598.         and    cs:GenFlags,not GOT_DSP_ROW
  599.         ret
  600. DosPr$        endp
  601.  
  602.  
  603.         assume    ds:code_s
  604.  
  605. ;************************************************************************
  606. ;*        SkipPastEq
  607. ;************************************************************************
  608.  
  609. SkipPastEq    proc    near
  610.         mov    cx,30            ; max name length
  611.   SkipLook4Eq:
  612.         cmp    al,'='            ; look for equal sign
  613.         je    SkipFoundEq
  614.  
  615.         lodsb
  616.         loop    SkipLook4Eq
  617.   SkipFoundEq:
  618.         call    skip_blanks        ; blanks may follow
  619.  
  620.         ret
  621. SkipPastEq    endp
  622.  
  623.  
  624.  
  625. ;************************************************************************
  626. ;*        NegDxAx
  627. ;************************************************************************
  628.  
  629. NegDxAx        proc    near
  630.         not    dx            ; take negative of number
  631.         not    ax
  632.         add    ax,1
  633.         adc    dx,0 
  634.         ret
  635. NegDxAx        endp
  636.  
  637.  
  638.  
  639. ;************************************************************************
  640. ;*        GetNums
  641. ;************************************************************************
  642.  
  643. GetNums     proc    near
  644.         assume    ds:nothing
  645.         mov    ch,','            ; comma separated numbers
  646.         jmp    short GetSkipBlanks
  647. GetNumsDot:
  648.         mov    ch,'.'            ; dot separated numbers
  649.   GetSkipBlanks:
  650.         push    bx
  651.         mov    bx,cx
  652.         call    skip_blanks
  653.   GetNextNum:
  654.         call    GetNum            ; get a number
  655.         or    cx,cx
  656.         jz    GetNumsErr    
  657.         stosw                ; store it in table
  658.         dec    bl            ; do we want more nums?
  659.         jz    GetNumsRet        ; - no, return
  660.  
  661.         lodsb                ; - yes
  662.         cmp    al,bh            ; is this a separator char?
  663.         je    GetNextNum        ; - yes
  664.   GetNumsErr:
  665.         or    sp,sp
  666.   GetNumsRet:                    ; - no, return
  667.         pop    bx
  668.         ret
  669. GetNums     endp
  670.  
  671.  
  672.  
  673. ;************************************************************************
  674. ;*        GetNum
  675. ;************************************************************************
  676.  
  677. GetNum        proc    near
  678.         assume    ds:nothing
  679.         push    si
  680.         xor    dx,dx
  681.         lodsb
  682.         cmp    al,'-'            ; minus prefix?
  683.         pushf
  684.         je    GetNumSign
  685.         cmp    al,'+'            ; plus prefix?
  686.         jne    GetNoPrefix
  687.   GetNumSign:
  688.         lodsb                ; get a char
  689.   GetNoPrefix:
  690.         mov    cs:GetNumBase,10
  691.         cmp    al,'0'            ; hex leading '0x' ?
  692.         jne    GetNextDig
  693.         cmp    byte ptr [si],'X'
  694.         je    GetNextHex
  695.         cmp    byte ptr [si],'x'
  696.         jne    GetNextDig
  697.   GetNextHex:
  698.         inc    si
  699.         mov    cs:GetNumBase,16
  700.         lodsb
  701.   GetNextDig:
  702.         cmp    al,'0'            ; a digit?
  703.         jb    GetNumEnd
  704.         cmp    al,'9'
  705.         ja    GetTstHex
  706.  
  707.         sub    al,'0'            ; convert to integer
  708.         jmp    short GetNumConv
  709.   GetTstHex:
  710.         cmp    al,'A'
  711.         jb    GetNumEnd
  712.         cmp    al,'F'
  713.         ja    GetTstHex2
  714.         sub    al,'A'-10
  715.         jmp    short GetNumConv
  716.   GetTstHex2:
  717.         cmp    al,'a'
  718.         jb    GetNumEnd
  719.         cmp    al,'f'
  720.         ja    GetNumEnd
  721.         sub    al,'a'-10
  722.   GetNumConv:
  723.         cbw
  724.         add    ax,dx
  725.         mov    cx,ax
  726.         mul    cs:GetNumBase
  727.         mov    dx,ax
  728.         lodsb
  729.         jmp    short GetNextDig
  730.   GetNumEnd:
  731.         mov    dx,60*60
  732.         cmp    al,'h'            ; hours suffix?
  733.         je    GetNumScale
  734.  
  735.         mov    dx,60
  736.         cmp    al,'m'            ; minutes suffix?
  737.         je    GetNumScale
  738.  
  739.         mov    dx,1
  740.         cmp    al,'s'            ; seconds suffix?
  741.         je    GetNumScale
  742.  
  743.         dec    si            ; move back char ptr
  744.   GetNumScale:
  745.         mov    ax,cx            ; do suffix scaling
  746.         mul    dx
  747.  
  748.         cmp    byte ptr [si],'+'    ; composite number?
  749.         je    GetComposite
  750.         cmp    byte ptr [si],'-'
  751.         je    GetComposite
  752.         cmp    byte ptr [si],'0'
  753.         jb    GetSingle
  754.         cmp    byte ptr [si],'9'
  755.         ja    GetSingle
  756.   GetComposite:
  757.         push    di            ; save partial value
  758.         mov    cx,ax
  759.         push    cx
  760.         mov    di,dx
  761.         call    GetNum            ; get next part
  762.         pop    cx
  763.         add    ax,cx            ; add to previous part
  764.         adc    dx,di
  765.         pop    di
  766.   GetSingle:
  767.         popf                ; minus prefix?
  768.         jne    GetNumRet
  769.  
  770.         call    NegDxAx
  771.  GetNumRet:
  772.         pop    cx            ; si at call
  773.         sub    cx,si
  774.         neg    cx            ; cx = # chars read
  775.         jnz    GetNumOkRet
  776.         or    sp,sp
  777.         ret
  778.   GetNumOkRet:
  779.         cmp    ax,ax            ; ensure zero flag
  780.         ret
  781. GetNum        endp
  782.  
  783.  
  784.  
  785. ;************************************************************************
  786. ;*        GetIpNr
  787. ;************************************************************************
  788.  
  789. GetIpNr     proc    near
  790.         assume    ds:nothing
  791.         mov    cx,1
  792. GetIpNums:
  793.         push    si            ; remember start in case of err
  794.         push    cx            ; remember how many we wanted
  795.   GetIpCont:
  796.         push    cx            ; IP #'s left to read
  797.  
  798.         push    es
  799.         push    cs
  800.         pop    es
  801.         push    di
  802.         mov    cl,4
  803.         mov    di,offset IntTmpIpNr
  804.         call    GetNumsDot        ; read an IP #
  805.         pop    di
  806.         pop    es
  807.         jnz    GetIpNrErr
  808.  
  809.         mov    cx,4
  810.         push    ds
  811.         push    cs
  812.         pop    ds
  813.         push    si
  814.         mov    si,offset IntTmpIpNr
  815.   GetIpNrLoop:
  816.         lodsw                ; convert to bytes
  817.         stosb
  818.         loop    GetIpNrLoop
  819.  
  820.         pop    si
  821.         pop    ds
  822.         pop    cx            ; want more IP #'s?
  823.         loop    GetIpMore
  824.   GetIpNrRet:
  825.         pop    ax
  826.         sub    ax,cx            ; ax = IP #'s read
  827.         cmp    cx,cx            ; zero flag
  828.         pop    dx            ; dx = original si
  829.         ret
  830.  
  831.   GetIpMore:
  832.         lodsb
  833.         cmp    al,','            ; comma separator?
  834.         je    GetIpCont
  835.  
  836.         dec    si
  837.         jmp    short GetIpNrRet
  838.  
  839.   GetIpNrErr:
  840.         pop    cx
  841.         pop    cx
  842.         pop    dx            ; original si
  843.         ret                ; non-zero return
  844. GetIpNr     endp
  845.  
  846.  
  847.  
  848. ;************************************************************************
  849. ;*        PutIpNum (4 bytes from DS:SI to decimal at ES:DI)
  850. ;************************************************************************
  851.  
  852. PutIpNum    proc    near
  853.         assume    ds:nothing
  854.         push    di
  855.         push    es
  856.         push    cs
  857.         pop    es
  858.         mov    cx,4
  859.         mov    di,offset IntTmpIpNr
  860.         xor    ah,ah
  861.   PutIpLoop:
  862.         lodsb                ; convert IP #
  863.         stosw                ;  into integers
  864.         loop    PutIpLoop
  865.         pop    es
  866.         pop    di
  867.  
  868.         push    ds
  869.         push    cs
  870.         pop    ds
  871.         assume    ds:code_s
  872.         mov    si,offset IntTmpIpNr
  873.         mov    ch,'.'
  874.         mov    cl,4
  875.         mov    PutMinDigits,1
  876.         test    ArgFlags,IP_15DIG
  877.         jz    PutIpNoZero
  878.         mov    PutMinDigits,3
  879.   PutIpNoZero:
  880.         call    PutNumsF0         ; put IP #
  881.         pop    ds
  882.         ret
  883. PutIpNum    endp
  884.  
  885.  
  886.  
  887. ;************************************************************************
  888. ;*        PutHwNum
  889. ;************************************************************************
  890.  
  891. PutHwNum    proc    near
  892.         assume    ds:nothing
  893.         push    di
  894.         push    cs
  895.         pop    es
  896.         mov    cx,6
  897.         mov    di,offset IntTmpHwAd
  898.         xor    ah,ah
  899.   PutHwLoop:
  900.         lodsb                ; convert HW #
  901.         stosw                ;  into integers
  902.         loop    PutHwLoop
  903.         pop    di
  904.  
  905.         push    si
  906.         push    ds
  907.         push    cs
  908.         pop    ds
  909.         assume    ds:code_s
  910.         mov    si,offset IntTmpHwAd
  911.         mov    ch,'-'            ; separator char
  912.         test    ArgFlags,LANW_TABLE
  913.         jz    PutHwDash
  914.         mov    ch,7fh            ;   except for LANwatch table
  915.   PutHwDash:
  916.         mov    cl,6
  917.         mov    PutNumBase,16
  918.         call    PutNumsD2F0         ; put HW #
  919.         mov    PutNumBase,10
  920.         pop    ds
  921.         pop    si
  922.         ret
  923. PutHwNum    endp
  924.  
  925.  
  926.  
  927. ;************************************************************************
  928. ;*        PutNums
  929. ;************************************************************************
  930.  
  931.         assume    ds:code_s
  932.  
  933. PutNumsD2F0    proc    near
  934.         mov    PutMinDigits,2
  935.  
  936. PutNumsF0:    mov    PutNumFiller,'0'
  937.  
  938. PutNums:
  939.   NextNum:
  940.         lodsw                ; get integer from table
  941.         call    PutNum            ; convert to decimal
  942.         dec    cl            ; any more #'s?
  943.         jz    PutNumsRet
  944.  
  945.         cmp    ch,7fh            ; no separator char?
  946.         je    NextNum
  947.  
  948.         mov    al,ch
  949.         stosb                ; put separator char
  950.         jmp    short NextNum
  951.   PutNumsRet:
  952.         ret
  953. PutNumsD2F0    endp
  954.  
  955.  
  956.  
  957. ;************************************************************************
  958. ;*        PutNum and PutBigNum
  959. ;************************************************************************
  960.  
  961.         assume    ds:nothing
  962.  
  963. PutNumD4Fb    proc    near
  964.         mov    cs:PutMinDigits,4
  965. PutNumFb:
  966.         mov    cs:PutNumFiller,' '
  967. PutNum:
  968.         xor    dx,dx
  969. PutBigNum:
  970.         push    ds
  971.         push    cs
  972.         pop    ds
  973.         assume    ds:code_s
  974.         push    bx
  975.         push    cx
  976.         xor    cx,cx            ; extract significant digits
  977.         mov    bx,dx
  978.         cmp    PutNumBase,10
  979.         jne    NextDig
  980.         div    k10000
  981.         mov    bx,ax
  982.         mov    ax,dx
  983.   NextDig:
  984.         xor    dx,dx
  985.         div    PutNumBase
  986.         add    dx,'0'
  987.         cmp    dx,'9'
  988.         jle    PutNotHex
  989.  
  990.         add    dx,'a'-'9'-1
  991.   PutNotHex:
  992.         push    dx
  993.         inc    cx
  994.         or    ax,ax
  995.         jnz    NextDig
  996.  
  997.         or    bx,bx
  998.         jz    PutFiller
  999.  
  1000.         mov    al,'0'
  1001.   PutZeroNext:
  1002.         cmp    cx,4
  1003.         jae    PutZeroNumbr
  1004.  
  1005.         push    ax
  1006.         inc    cx
  1007.         jmp    short PutZeroNext
  1008.   PutZeroNumbr:
  1009.  
  1010.         mov    ax,bx
  1011.   NextDig2:
  1012.         xor    dx,dx
  1013.         div    PutNumBase
  1014.         add    dx,'0'
  1015.         push    dx
  1016.         inc    cx
  1017.         or    ax,ax
  1018.         jnz    NextDig2
  1019.   PutFiller:
  1020.         mov    al,PutNumFiller
  1021.   PutFillNext:
  1022.         cmp    cx,PutMinDigits     ; want more digits?
  1023.         jae    PutDigNumbr
  1024.  
  1025.         push    ax
  1026.         inc    cx
  1027.         jmp    short PutFillNext
  1028.   PutDigNumbr:
  1029.         mov    dx,cx            ; save DX = # of digits
  1030.   PutDigs:
  1031.         pop    ax
  1032.         stosb                ; put the digits
  1033.         loop    PutDigs
  1034.  
  1035.         pop    cx
  1036.         pop    bx
  1037.         pop    ds
  1038.         ret
  1039. PutNumD4Fb    endp
  1040.  
  1041.  
  1042.  
  1043. ;************************************************************************
  1044. ;*        PutBigNums
  1045. ;************************************************************************
  1046.  
  1047.         assume    ds:code_s
  1048.  
  1049. PutBigNums    proc    near
  1050.   PutBigNext:
  1051.         lodsw
  1052.         mov    dx,ax
  1053.         lodsw
  1054.  
  1055.         call    PutBigNum
  1056.         loop    PutBigNext
  1057.  
  1058.         ret
  1059. PutBigNums    endp
  1060.  
  1061.  
  1062.  
  1063. ;************************************************************************
  1064. ;*        SkipBlk
  1065. ;************************************************************************
  1066.  
  1067.         include skipblk.asm
  1068.  
  1069. ;************************************************************************
  1070. ;*        ChrOut
  1071. ;************************************************************************
  1072.  
  1073.         include chrout.asm
  1074.  
  1075.  
  1076.  
  1077.  
  1078. ;************************************************************************
  1079. ;************************************************************************
  1080. ;*                                    *
  1081. ;*        Program begins                        *
  1082. ;*                                    *
  1083. ;************************************************************************
  1084. ;************************************************************************
  1085.  
  1086.         assume    ds:code_s
  1087.  
  1088.  
  1089. start1:
  1090.         call    DoArgs            ; decode arguments
  1091.         call    BufInit         ; initialize buffers
  1092.         call    FindPktint        ; find the packet driver
  1093.         call    InitProtocols         ; initialize ARP/IP protocols
  1094.  
  1095.         mov    ax,ArgFlags
  1096.         and    ax,TERM_WAIT+MAKE_TABLE ; if we build tables
  1097. if PINGCLIENT
  1098.         or    ax,EchoTarget        ;   or do pinging
  1099. endif ; PINGCLIENT
  1100.         jz    MustHave
  1101.  
  1102.         mov    EnoughWord,HAVE_MYIPNR    ;   time things not needed
  1103.   MustHave:
  1104.         mov    dx,Flagword
  1105.         and    dx,EnoughWord
  1106.         cmp    dx,EnoughWord        ; do we have needed info?
  1107.         jne    UseBootp
  1108.  
  1109.         call    ValidateIpNr        ; - yes. IP # occupied?
  1110.         jmp    short SkipBootp
  1111.   UseBootp:
  1112.         call    DoBootpPkt        ; - no, ask a bootp server
  1113.         call    InterpBootp
  1114.   SkipBootp:
  1115.         mov    dx,Flagword
  1116.         and    dx,EnoughWord
  1117.         cmp    dx,EnoughWord        ; do we NOW have needed info?
  1118.         je    DoTime
  1119.  
  1120.         mov    dx,offset NotEnoughMsg
  1121.         mov    al,07            ; error code 7
  1122.         call    PrTerminate
  1123.   DoTime:
  1124.         call    MakeMynet        ; process mask and IP #
  1125.  
  1126.         cmp    EnoughWord,HAVE_MYIPNR
  1127.         je    DidntGetIt
  1128.  
  1129.         call    GetTime         ; ask the time server
  1130.         jnz    DidntGetIt
  1131.         call    SetTime         ; set the PC clock
  1132.         call    SetZone         ; set zone environment name
  1133.   DidntGetIt:
  1134. if TBLBUILD
  1135.         call    TableInit
  1136. endif ; TBLBUILD
  1137.  
  1138. if PINGCLIENT
  1139.         call    EchoAwhile        ; do some ping?
  1140. endif ; PINGCLIENT
  1141.         call    DelayTermin        ; keep it running some more?
  1142.         xor    al,al            ; error code 0
  1143.   SkipTime:
  1144.         call    Terminate
  1145.  
  1146. ;************************************************************************
  1147. ;************************************************************************
  1148. ;*        End of program                        *
  1149. ;************************************************************************
  1150. ;************************************************************************
  1151.  
  1152.  
  1153.  
  1154. ;************************************************************************
  1155. ;*        DoArgs
  1156. ;************************************************************************
  1157.  
  1158.  
  1159. ArgTabEnt    struc
  1160. ArgTabNam    db    'a'            ; first char of arg name
  1161. ArgTabAdr    dw    0            ; arg name handler
  1162. ArgTabEnt    ends
  1163. ARGTABLEN    equ    SIZE ArgTabEnt
  1164.  
  1165. ArgTab        ArgTabEnt    <'a', offset ArgAlter>
  1166.         ArgTabEnt    <'d', offset ArgDls>
  1167. if PINGCLIENT
  1168.         ArgTabEnt    <'e', offset ArgEcho>
  1169. endif ; PINGCLIENT
  1170.         ArgTabEnt    <'f', offset ArgFlag>
  1171.         ArgTabEnt    <'g', offset ArgGwy>
  1172. if HOPCHK
  1173.         ArgTabEnt    <'h', offset ArgHop>
  1174. endif ; HOPCHK
  1175.         ArgTabEnt    <'i', offset ArgIpnr>
  1176.         ArgTabEnt    <'l', offset ArgLongTimeout>
  1177.         ArgTabEnt    <'m', offset ArgMask>
  1178. if TBLBUILD or PINGCLIENT
  1179.         ArgTabEnt    <'n', offset ArgNameserv>
  1180. endif ; TBLBUILD or PINGCLIENT
  1181.         ArgTabEnt    <'o', offset ArgOffset>
  1182.         ArgTabEnt    <'p', offset ArgPktIntNo>
  1183. ; suggested: r = ReverseLookup, s = ServiceType (TOS)
  1184.         ArgTabEnt    <'t', offset ArgTimeserv>
  1185. if PINGCLIENT
  1186.         ArgTabEnt    <'u', offset ArgUdpecho>
  1187. endif ; PINGCLIENT
  1188.         ArgTabEnt    <'z', offset ArgZoneNam>
  1189. ArgTabEnd    equ    $
  1190.  
  1191. DoArgs        proc    near
  1192.         cld
  1193.         mov    si,offset phd_dioa
  1194.         lodsb
  1195.         xor    ah,ah
  1196.         mov    bp,ax
  1197.         add    bp,si            ; end of args
  1198.  
  1199.         push    si            ; substitute : and ; to = and ,
  1200.   DoArgSubst:
  1201.         lodsb
  1202.         cmp    al,':'
  1203.         jne    DoArgChkComma
  1204.         mov    byte ptr [si-1],'='
  1205.   DoArgChkComma:
  1206.         cmp    al,'/'
  1207.         jne    DoArgChkCom2
  1208.         mov    byte ptr [si-1],','
  1209.   DoArgChkCom2:
  1210.         cmp    al,';'
  1211.         jne    DoArgChkE
  1212.         mov    byte ptr [si-1],','
  1213.   DoArgChkE:
  1214.         cmp    si,bp
  1215.         jb    DoArgSubst
  1216.         pop    si
  1217.  
  1218.         call    skip_blanks
  1219.         cmp    al,CR            ; no args?
  1220.         je    ArgError        ; - yes, display usage msg
  1221.  
  1222.   NextArg:
  1223.         call    skip_blanks
  1224.         cmp    si,bp
  1225.         ja    ArgError
  1226.  
  1227.         or    al,020h         ; conv to lower case
  1228.  
  1229.         cmp    al,'b'            ; bootp only, no args
  1230.         je    DoArgRet
  1231.  
  1232.         cmp    al,CR+020h        ; end
  1233.         je    DoArgRet
  1234.  
  1235.         mov    bx,offset ArgTab-ARGTABLEN
  1236.   ArgFindLoop:
  1237.         add    bx,ARGTABLEN
  1238.         cmp    bx,offset ArgTabEnd
  1239.         jae    ArgError
  1240.         cmp    al,[bx]         ; first char of arg name
  1241.         jne    ArgFindLoop
  1242.  
  1243.         call    SkipPastEq        ; skip rest of name
  1244.         inc    bx
  1245.         call    [bx]            ; process arg
  1246.         jz    NextArg         ; look for next arg
  1247.  
  1248.   ArgError:
  1249.         mov    dx,offset usage_msg
  1250.   error:
  1251.         call    DosPr$            ; display usage message
  1252.         mov    ax,4c01h        ; error code 1
  1253.         int    21h            ; terminate program
  1254.   DoArgRet:
  1255.         xor    ax,ax
  1256.         mov    word ptr StackLow,ax
  1257. if DEBUG
  1258.         mov    word ptr phd_dioa,ax
  1259. endif ; DEBUG
  1260.         ret
  1261. DoArgs        endp
  1262.  
  1263.  
  1264.  
  1265.   ArgAlter:
  1266.         or    word ptr Flagword,DONT_SETTIME    ; alter time
  1267.         mov    di,offset AlterTime
  1268.         mov    cl,2
  1269.         call    GetNums
  1270.         mov    AlterTime+4,dx
  1271.         ret
  1272.  
  1273.   ArgDls:
  1274.         cmp    al,'9'            ; daylight saving algorithm
  1275.         jbe    ArgGetAlgPar
  1276.         lodsw
  1277.         mov    dx,ax
  1278.         lodsw
  1279.         mov    di,offset AlgTab-AlgEntryLen
  1280.         cmp    ah,CR
  1281.         jne    ArgNextDls
  1282.         mov    ah,' '
  1283.         dec    si
  1284.   ArgNextDls:
  1285.         add    di,AlgEntryLen
  1286.         cmp    di,offset AlgTabEnd-1
  1287.         ja    ArgDlsRet
  1288.         cmp    dx,[di]
  1289.         jne    ArgNextDls
  1290.         cmp    ax,[di+2]
  1291.         jne    ArgNextDls            
  1292.         mov    AlgPtr,di
  1293.         ret
  1294.   ArgGetAlgPar:
  1295.         mov    di,offset AlgTab
  1296.         mov    AlgPtr,di
  1297.         add    di,4
  1298.         mov    cl,5
  1299.         call    GetNums
  1300.   ArgDlsRet:
  1301.         ret
  1302.  
  1303. if PINGCLIENT
  1304. k10        dw    10
  1305. if HOPCHK
  1306.   ArgHop:
  1307.         mov    EchoInterval,110
  1308.         mov    EchoSize,34
  1309.         or    MoreFlags,HOP_CHK    ; hop check (trace route)
  1310.         or    ArgFlags,MAKE_TABLE    ; (it will be removed later)
  1311. endif ; HOPCHK
  1312.   ArgUdpEcho:
  1313.         or    GenFlags,UDP_ECHO    ; UDP echo
  1314.   ArgEcho:
  1315.         mov    di,offset EchoTarget    ; ICMP echo to a target (ping)
  1316.         call    GetIpNr
  1317.         jnz    ArgEchoName
  1318.         cmp    byte ptr [si],'.'
  1319.         je    ArgEchoName
  1320.   ArgEchoMore:
  1321.         cmp    byte ptr [si],','
  1322.         jne    ArgGoodRet
  1323.  
  1324.         inc    si
  1325.         mov    cl,1
  1326.         call    GetNums
  1327.  
  1328.         cmp    byte ptr [si],'.'
  1329.         jne    ArgEchoMore
  1330.         inc    si
  1331.         mul    k10
  1332.         push    ax
  1333.         call    GetNum
  1334.         pop    dx
  1335.         add    ax,dx
  1336.         mov    [di-2],ax
  1337.         or    ArgFlags,MICRO_100
  1338.         jmp    short ArgEchoMore
  1339.  
  1340.   ArgEchoName:
  1341.         mov    si,dx            ; rescan
  1342.         mov    byte ptr [di],127    ; marker to do dns lookup
  1343.         mov    bx,offset EchoNameBuf
  1344.         lea    di,[bx+1]
  1345.         xor    cx,cx
  1346.   ArgEchoLoop:
  1347.         lodsb
  1348.         cmp     al,' '
  1349.         je    ArgEchoNamEnd
  1350.         cmp    al,CR
  1351.         je    ArgEchoNamEnd
  1352.         cmp    si,bp
  1353.         ja    ArgEchoRet
  1354.         cmp    al,','
  1355.         je    ArgEchoNamEnd
  1356.         cmp    al,'.'
  1357.         jne    ArgEchoNamChar
  1358.         mov    [bx],cl         ; prepend length to string
  1359.         mov    cx,-1
  1360.         mov    bx,di
  1361.   ArgEchoNamChar:
  1362.         stosb
  1363.         inc    cx
  1364.         jmp    short ArgEchoLoop
  1365.  
  1366.   ArgEchoNamEnd:
  1367.         mov    [bx],cl         ; prepend length to string
  1368.         xor    ax,ax
  1369.         stosb
  1370.         inc    ah
  1371.         stosw                ; store type and class
  1372.         stosw
  1373.         dec    si
  1374.         mov    di,offset EchoTarget+4
  1375.         jmp    short ArgEchoMore
  1376. endif ; PINGCLIENT
  1377.  
  1378.   ArgFlag:
  1379.         call    GetNum
  1380.         or    ArgFlags,ax        ; set arg flags
  1381.   ArgGoodRet:
  1382.         xor    ax,ax
  1383.   ArgEchoRet:
  1384.         ret
  1385.  
  1386.   ArgGwy:
  1387.         mov    di,offset DefGwys    ; default gateways
  1388.         mov    cx,MAXDEFGWYS
  1389.         call    GetIpNums
  1390.         mov    DefGwyNum,ax
  1391.         ret
  1392.  
  1393.   ArgIpnr:
  1394.         or    Flagword,HAVE_MYIPNR    ; my ip nr
  1395.         mov    di,offset MyIpNr
  1396.         call    GetIpNr
  1397.         ret
  1398.  
  1399.   ArgLongTimeout:
  1400.         call    GetNum            ; longer timeout
  1401.         mul    m18
  1402.         mov    LongerTimOut,ax
  1403.         jmp    short ArgGoodRet
  1404.  
  1405.   ArgMask:
  1406.         mov    di,offset MyMask    ; net mask
  1407.         call    GetIpNr
  1408.         ret
  1409.  
  1410. if TBLBUILD or PINGCLIENT
  1411.   ArgNameserv:
  1412.         mov    di,offset DefNS     ; default nameservers
  1413.         mov    cx,MAXDEFNS
  1414.         call    GetIpNums
  1415.         mov    DefNSnum,ax
  1416.         ret
  1417. endif ; TBLBUILD or PINGCLIENT
  1418.  
  1419.   ArgOffset:
  1420.         or    Flagword,HAVE_TIMEOFFSET
  1421.         call    GetNum            ; time offset
  1422.         xchg    ah,al
  1423.         xchg    dh,dl
  1424.         mov    tzoffset,dx
  1425.         mov    tzoffset+2,ax
  1426.         ret
  1427.  
  1428.   ArgPktIntno:
  1429.         call    GetNum            ; packet int number
  1430.         mov    word ptr packet_int_no,ax
  1431.         ret
  1432.  
  1433.   ArgTimeserv:
  1434.         or    Flagword,HAVE_TIMESERVER    ; time server
  1435.         mov    di,offset TimeServIpNr
  1436.         mov    cx,MAXTSERVS
  1437.         call    GetIpNums
  1438.         mov    TservNum,ax
  1439.         ret
  1440.  
  1441.   ArgZoneNam:
  1442.         or    GenFlags,ARGZONE    ; set zone env variable
  1443.         cmp    al,'#'
  1444.         jne    ArgZonePar
  1445.         inc    si
  1446.         jmp    short ArgGoodRet
  1447.   ArgZonePar:
  1448.         or    GenFlags,ARGZONESPEC
  1449.         mov    dl,05fh         ; convert to upper case for name
  1450.         mov    di,offset ZoneString
  1451.         mov    cx,di
  1452.         add    cx,ZONESPACE-2
  1453.   ArgZoneCopyNext:
  1454.         lodsb                ; get next arg char
  1455.         cmp     al,' '                  ; end of field?
  1456.         je    ArgZoneCopyRet
  1457.         cmp    al,CR
  1458.         je    ArgZoneCopyRet
  1459.         cmp    si,bp            ; beyond argument string?
  1460.         ja    ArgZoneCopyErr
  1461.         cmp    di,cx            ; too long name?
  1462.         jae    ArgZoneCopyErr
  1463.         cmp    al,'='            ; start of value part?
  1464.         jne    ArgZoneCopy2
  1465.         mov    dl,0ffh         ; any case allowed for 1st value
  1466.         mov    bx,di
  1467.         sub    bx,offset ZoneString-1
  1468.         mov    ZoneVarLen,bx        ; save env name length
  1469.   ArgZoneCopy2:
  1470.         cmp    al,','            ; second value part?
  1471.         jne    ArgZoneCopy3
  1472.  
  1473.         and    dl,07fh         ; any case allowed for 2nd value
  1474.         xor    ax,ax
  1475.         stosw                ; end of string marker
  1476.         mov    al,'$'            ; char for print stop 
  1477.         stosb
  1478.         mov    bx,di
  1479.         sub    bx,offset ZoneString
  1480.         mov    ZoneDstInd,bx        ; remember where 2nd value starts
  1481.         jmp    short ArgZoneCopyNext
  1482.   ArgZoneCopy3:
  1483.         and    al,dl            ; possibly convert to upper case
  1484.         stosb
  1485.         jmp    short ArgZoneCopyNext
  1486.   ArgZoneCopyRet:
  1487.         dec    si
  1488.         cmp    dl,07fh         ; seen two value parts?
  1489.         jne    ArgZoneCopyErr
  1490.         xor    ax,ax
  1491.         stosb                ; end of string marker
  1492.         ret
  1493.  
  1494.   ArgZoneCopyErr:
  1495.         inc    si            ; nonzero ret
  1496.         ret
  1497.  
  1498.  
  1499.  
  1500. ;************************************************************************
  1501. ;*        GetTime
  1502. ;*
  1503. ;* This code first does one turn to query the timeservers to see if any
  1504. ;* one responds within half a second. If none has responded it will do a
  1505. ;* second turn giving each server 2 seconds to respond. As soon as a time
  1506. ;* reply from any server arrives, it stops.
  1507. ;************************************************************************
  1508.  
  1509. GetTime     proc    near
  1510.         assume    ds:code_s
  1511.         push    es
  1512.         push    ds
  1513.         call    BufAlloc
  1514.         assume    ds:nothing
  1515.         call    MakeSendDescr
  1516.         mov    [di].uUdpDst,2500h    ; 37 = time port
  1517.         mov    [di].uUdpSrc,4321    ; my port
  1518.         mov    [bx].dTickTimeout,10    ; 10/18 second
  1519.         mov    [bx].dWaitEvent,GOT_TIMEREPLY
  1520.         mov    [bx].dTimOut2Msg,offset NoTimeServMsg ; timeout msg
  1521.         mov    [bx].dTick2Timeout,2*18
  1522.         mov    dx,offset TservNum
  1523.         mov    [bx].dPktlen,UDPHDRLEN
  1524.         call    SendUdpFind        ; send time requset
  1525.         call    BufRelease
  1526.         pop    ds
  1527.         assume    ds:code_s
  1528.         pop    es
  1529.         ret
  1530. GetTime     endp
  1531.  
  1532.  
  1533. ;========================================================================
  1534.         include settime.asm
  1535.  
  1536.  
  1537.  
  1538. ;************************************************************************
  1539. ;*        DelayTermin
  1540. ;************************************************************************
  1541.  
  1542.         assume    ds:code_s
  1543.  
  1544. DelayTermin    proc    near
  1545. if RFCC
  1546.         test    ArgFlags,TERM_WAIT+MAKE_TABLE ; want delayed termination?
  1547.         jnz    DelayLoop
  1548.         ret
  1549.   
  1550.   DelayLoop:
  1551.         call    SomeThing2Do        ; ARP or ICMP reply to do
  1552. if PINGCLIENT
  1553.         test    GenFlags,PING_DELAY
  1554.         jnz    DelayLoop
  1555. endif ; PINGCLIENT
  1556.         call    AnyKey
  1557.         jz    DelayLoop        ; second key stops receive
  1558.   DelayCrLf:
  1559. if PINGCLIENT
  1560. if HOPCHK
  1561.         test    MoreFlags,HOP_CHK
  1562.         jnz    DelayHopEnd
  1563. endif ; HOPCHK
  1564.         cmp    al,ESCAPE        ; want error size distribution?
  1565.         je    DelayNotPing
  1566.  
  1567.         mov    word ptr FileBuf,LF*256+CR
  1568.         mov     cx,(GIANTTR-HWHDRLEN-20)/20
  1569.         mov    si,offset EchoSizeVec+2
  1570.         mov    ax,21
  1571.   PingNextRow:
  1572.         push    cx
  1573.         push    ax
  1574.         mov    di,offset FileBuf+2
  1575.         call    PutNumD4Fb
  1576.         mov    al,':'
  1577.         stosb
  1578.         xor    bx,bx
  1579.         mov    cx,20
  1580.   PingNextCol:
  1581.         push    cx
  1582.         mov    PutMinDigits,2
  1583.         mov     al,' '
  1584.         stosb
  1585.         lodsw
  1586.         or    bx,ax
  1587.         or    ax,ax
  1588.         jnz    PingNextNZ
  1589.         mov    ax,'. '
  1590.         stosw
  1591.         jmp    short PingNextCol2
  1592.   PingNextNZ:
  1593.         jns    PingNextVal
  1594.         mov    byte ptr [di],'-'
  1595.         inc    di
  1596.         neg    ax
  1597.         dec    PutMinDigits
  1598.   PingNextVal:
  1599.         call    PutNum
  1600.   PingNextCol2:
  1601.         pop    cx
  1602.         loop    PingNextCol
  1603.  
  1604.         or    bx,bx
  1605.         jz    PingNoRow
  1606.         mov    byte ptr [di],'$'
  1607.         mov    dx,offset FileBuf
  1608.         call    DosPr$
  1609.         dec    PingRowCnt
  1610.         jnz    PingNoRow
  1611.         mov    PingRowCnt,22
  1612.   PingDispPause:
  1613.         call    AnyKey
  1614.         jz    PingDispPause
  1615.         cmp    al,ESCAPE
  1616.         jne    PingNoRow
  1617.         pop    ax
  1618.         pop    cx
  1619.         jmp    short DelayNotPing
  1620.   PingNoRow:
  1621.         pop    ax
  1622.         add    ax,20
  1623.         pop    cx
  1624.         loop    PingnextRow
  1625.   DelayNotPing:
  1626. endif ; PINGCLIENT
  1627.         mov    dx,offset CrLf_Msg
  1628.         call    DosPr$
  1629.   DelayHopEnd:
  1630. if TBLBUILD
  1631.         call    TableWr         ; write HW and IP tbl files
  1632. endif ; TBLBUILD
  1633.  
  1634. endif ; RFCC
  1635.         ret
  1636. DelayTermin    endp
  1637.  
  1638.  
  1639.  
  1640. ;************************************************************************
  1641. ;*        AnyKey
  1642. ;************************************************************************
  1643.  
  1644. AnyKey        proc    near
  1645. if PINGCLIENT
  1646.         test    ArgFlags,AVOID_HDWR
  1647.         jnz    AnyKeyDos
  1648.  
  1649.         push    es    ; simulates int 21h, ah=06, dl=ff, but faster
  1650.         push    bx
  1651.         mov    ax,040h
  1652.         mov    es,ax
  1653.         mov    bx,es:[01ch]
  1654.         mov    es:[01ah],bx        ; set head to tail
  1655.         cmp    bx,es:[080h]        ; just wraped around?
  1656.         ja    AnyKeyPtrOK
  1657.         mov    bx,es:[082h]        ; -yes, unwrap
  1658.   AnyKeyPtrOK:
  1659.         mov    ax,es:[bx-2]        ; last char typed
  1660.  
  1661.         cmp    OldkeyPtr,0
  1662.         jne    AnyKeyInited
  1663.         mov    OldKeyPtr,bx
  1664.   AnyKeyInited:
  1665.         cmp    bx,OldKeyPtr        ; any key pressed?
  1666.         mov    OldkeyPtr,bx
  1667. if HOPCHK
  1668.         jz    AnyKeyRet
  1669.  
  1670.         or    al,al
  1671.         jz    AnyKeySpec
  1672.         cmp    al,0e0h
  1673.         jne    AnyKeyGot
  1674.   AnyKeySpec:
  1675.         inc    ScrollVal
  1676.         cmp    ah,48h            ; scroll up?
  1677.         je    AnyKeyRet
  1678.         sub    ScrollVal,2
  1679.         cmp    ah,50h            ; scroll down?
  1680.         je    AnyKeyRet
  1681.         inc    ScrollVal
  1682.   AnyKeyGot:
  1683.         or    sp,sp
  1684. endif ; HOPCHK
  1685.   AnyKeyRet:
  1686.         pop    bx
  1687.         pop    es
  1688.         ret
  1689.  
  1690. OldKeyPtr    dw    0
  1691. ScrollVal    db    0
  1692. endif ; PINGCLIENT
  1693.  
  1694.   AnyKeyDos:
  1695.         mov    ah,06h
  1696.         mov    dl,0ffh
  1697.         int    21h            ; any key pressed?
  1698.         ret
  1699. AnyKey        endp
  1700.  
  1701.  
  1702.  
  1703. if PINGCLIENT
  1704. ;========================================================================
  1705.          include ping.asm
  1706.  
  1707. endif ; PINGCLIENT
  1708.  
  1709.  
  1710.  
  1711. if TBLBUILD
  1712. ;========================================================================
  1713.         include tblbuild.asm
  1714. endif ; TBLBUILD
  1715.  
  1716. ;************************************************************************
  1717. ;*        Receive buffers                     *
  1718. ;************************************************************************
  1719.  
  1720.         even
  1721. if PINGCLIENT
  1722. MsgEchoHead    db    CR, LF, "Ping  with packet size     "
  1723. MsgEchoSweep    db    "<"
  1724. MsgEchoSize    db    "0    and interval"
  1725. MsgEchoMs    db    "     0  ms to "
  1726. MsgEchoTarget    db    "1.2.3.4        : ", CR, LF, LF
  1727. MsgEchoStats    db    "───────── Packets ──────── ║ ────── Delay ms ────── ║   Packet  ║ Load ║  Time ", CR, LF
  1728.         db    "transmit  receive     diff ║ this   min   avg   max ║    loss   ║ kb/s ║     s ", CR, LF, "$$"
  1729. MsgEcho        db    "       0        0        0      0     0     0     0     0.0000 %     0       0 ", CR, '$'
  1730. MsgEchoSeqEr    equ    MsgEcho+26
  1731. MsgEchoTime    equ    $-11
  1732. MsgEchoLen    equ    $-MsgEcho-2
  1733. endif ; PINGCLIENT
  1734.  
  1735. if HOPCHK
  1736. HopTabDsp    equ    MsgEchoHead+2+80*2
  1737.  
  1738. EchoNameBuf    equ    HopTabDsp+MAXHOP*80
  1739. else
  1740. EchoNameBuf    equ    $
  1741. endif ; HOPCHK
  1742.  
  1743. EchoRepVec    equ    EchoNameBuf+80
  1744. EchoSizeVec    equ    EchoRepVec+REPVECLEN
  1745.  
  1746. if HOPCHK
  1747.  
  1748. HOPTABLEN    equ    48+MAXHOP*(3*4*3)
  1749. HopTabIp    equ    EchoSizeVec+48
  1750. HopTabOth    equ    HopTabIp+3*MAXHOP*4
  1751. HopTabStat    equ    HopTabOth+3*MAXHOP*4
  1752.  
  1753. if HOPTABLEN ge 2*(GIANTTR-HWHDRLEN)
  1754. EchoSizeEnd    equ    EchoSizeVec+HOPTABLEN
  1755. else
  1756. EchoSizeEnd     equ     EchoSizeVec+2*(GIANTTR-HWHDRLEN)
  1757. endif
  1758.  
  1759. BlockAdj    =    (EchoSizeEnd-CodeOrg) and 0ffh
  1760.  
  1761. else
  1762.  
  1763. EchoSizeEnd     equ     EchoSizeVec+2*(GIANTTR-HWHDRLEN)
  1764. BlockAdj    =    (EchoSizeEnd-CodeOrg) and 0ffh
  1765.  
  1766. endif ; HOPCHK
  1767.  
  1768. FileBuf     equ    EchoSizeEnd+256-BlockAdj
  1769.  
  1770. BufStart    equ    FileBuf+128        ; buffer pool space
  1771.  
  1772. BufStartSml    equ    BufStart + NBUFS*BUFSIZE
  1773. ; BufEnd        equ    BufStartSml + NBUFSMALL*BUFSIZESML
  1774.  
  1775.         org    0fed0h            ; from here to ffff is
  1776. StackLow    equ    $            ; non interrupt stack space
  1777.  
  1778. code_s        ends
  1779.         end    start
  1780.  
  1781. ;************************************************************************
  1782. ;*                                    *
  1783. ;*        This is the end                     *
  1784. ;*                                    *
  1785. ;************************************************************************
  1786.