home *** CD-ROM | disk | FTP | other *** search
/ Popular Software (Premium Edition) / mycd.iso / DICT / DFKC / ZWH / CHCS / WCH.ASM < prev    next >
Encoding:
Assembly Source File  |  1998-01-12  |  15.7 KB  |  769 lines

  1. ;
  2. ;               wch.asm
  3. ;
  4. .286
  5. code            segment
  6.         org     100h
  7.         assume  cs:code, ds:code
  8. begin:          jmp     start
  9. ;
  10. CSver           db      'CHCS 1.0'
  11. ;
  12. Psp             dw      ?
  13. Env             dw      ?
  14.         db      0
  15. ;
  16. wHas            db      0
  17. uHas            db      0
  18. ;
  19. ;               ---------------------------------------
  20. ;
  21. PageSize        equ     1024
  22. ;               ------------------------------------------------
  23. xHandle         dw      ?
  24. xEntry          dd      0
  25. ;               ------------------------------------------------
  26. xStruc          label   word
  27. Count           dw      ?                    ; Transfer Bytes
  28.         dw      0
  29. sHandle         dw      ?                    ; Source Handle
  30. sOffset         dd      ?                    ; Source Offset
  31. dHandle         dw      ?                    ; Destinate Handle
  32. dOffset         dd      ?                    ; Destinate Offset
  33. ;               ------------------------------------------------
  34. xStruc2         label   word
  35. Count2          dw      512                  ; Transfer Bytes
  36.         dw      0
  37. sHandle2        dw      ?                    ; Source Handle
  38. sOffset2        dw      ?                    ; Source Offset
  39.         dw      0
  40. dHandle2        dw      0                    ; Destinate Handle
  41. dOffset2        dd      ?                    ; Destinate Offset
  42. ;               ------------------------------------------------
  43. ;
  44. TSREnd          dw      ?
  45. wEnd            dw      ?
  46. wSize           dw      ?
  47. nPage           db      ?
  48. eSize           dw      ?
  49. ;
  50. cPage           db      0
  51. cSize           dw      PageSize
  52. cPntr           dw      ?
  53. ccPage          db      0
  54. ;
  55. ;               ---------------------------------------
  56. ;
  57. WordProc        proc    far
  58. ;
  59.         sti
  60.         cmp     ah, 39h
  61.         je      toCC1
  62.         cmp     ah, 3ah
  63.         je      toWord
  64.         cmp     ah, 3eh
  65.         je      toUnLib
  66.         retf
  67. ;
  68. toCC1:          call    GetWordCC1
  69.         retf
  70. ;
  71. toWord:         call    GetWord
  72.         retf
  73. ;
  74. toUnLib:        call    UnInstallWLib
  75.         retf
  76. WordProc        endp
  77. ;               ----------------------------
  78. GetWordCC1      proc    near
  79. ;
  80. ;       IN:     ah = 39h
  81. ;               al = 0 ... Get WLib First CC
  82. ;               al = 1 ... Get WLib Next  CC
  83. ;       OUT:    ah = 0 ... Ok
  84. ;                    dx = CC
  85. ;               ah != 0 .. Fail
  86. ;                    dx = 0
  87. ;
  88.         push    ds
  89.         push    si
  90.         push    bx
  91.         push    cx
  92.         mov     si, cs
  93.         mov     ds, si
  94. ;
  95.         cmp     wHas, 1
  96.         jne     toCCRetn
  97.         cmp     al, 1
  98.         je      toGetNextCC
  99.         ja      toCCRetn
  100. ;
  101.         mov     si, wStart
  102.         mov     cPntr, si
  103.         cmp     nPage, 0
  104.         je      ccCont0
  105.         mov     cPage, 0
  106.         mov     ccPage, 0
  107.         call    MapPage
  108.         jmp     ccCont0
  109. ;
  110. toCCRetn:       jmp     GetCCRetn
  111. ;
  112. toGetNextCC:    cmp     nPage, 0
  113.         je      ccCont0
  114.         mov     bl, ccPage
  115.         cmp     bl, cPage
  116.         je      ccCont0
  117.         mov     cPage, bl
  118.         call    MapPage
  119. ccCont0:        mov     si, wStart
  120.         mov     bx, cPntr
  121.         mov     cx, bx
  122.         sub     cx, si
  123.         jb      GetCCRetn
  124.         shr     cx, 1
  125. ;
  126.         cmp     nPage, 0
  127.         je      GetCCLoop0
  128.         xor     al, al
  129.         mov     ah, cPage
  130.         shl     ax, 1
  131.         add     cx, ax
  132.         jmp     GetCCLoop0
  133. ;
  134. toNextPage:     cmp     nPage, 0
  135.         je      GetCCRetn
  136.         inc     cPage
  137.         call    MapPage
  138.         mov     bl, cPage
  139.         mov     ccPage, bl
  140.         mov     bx, wStart
  141. ;
  142. GetCCLoop0:     cmp     bx, wEnd
  143.         jae     toNextPage
  144.         cmp     cx, 3755
  145.         jae     toGetCCW2
  146.         cmp     word ptr [bx], 0
  147.         jne     isFoundCC
  148.         inc     cx
  149.         inc     bx
  150.         inc     bx
  151.         jmp     GetCCLoop0
  152. ;
  153. toGetCCW2:      mov     dx, [bx]
  154.         cmp     dx, 0ffffh
  155.         jne     isFoundCC2
  156.         mov     word ptr cPntr, 0
  157. ;
  158. GetCCRetn:      mov     ax, 8080h
  159.         xor     dx, dx
  160.         pop     cx
  161.         pop     bx
  162.         pop     si
  163.         pop     ds
  164.         ret
  165. ;
  166. isFoundCC2:     add     bx, 4
  167.         cmp     word ptr [bx], 0ffffh
  168.         jne     SkipRePntr
  169.         xor     bx, bx
  170. SkipRePntr:     mov     cPntr, bx
  171.         xchg    dl, dh
  172.         xor     ax, ax
  173.         pop     cx
  174.         pop     bx
  175.         pop     si
  176.         pop     ds
  177.         ret
  178. ;
  179. isFoundCC:      mov     ax, bx
  180.         inc     bx
  181.         inc     bx
  182.         mov     cPntr, bx
  183.         sub     ax, si
  184.         shr     ax, 1
  185.         mov     dl, 94
  186.         cmp     nPage, 0
  187.         je      ccSkip0
  188. ;
  189.         mov     bh, cPage
  190.         xor     bl, bl
  191.         shl     bx, 1
  192.         add     ax, bx
  193. ;
  194. ccSkip0:        div     dl
  195.         mov     dx, ax
  196.         xchg    dl, dh
  197.         add     dx, 0b0a1h
  198.         xor     ax, ax
  199.         pop     cx
  200.         pop     bx
  201.         pop     si
  202.         pop     ds
  203.         ret
  204. GetWordCC1      endp
  205. ;               ----------------------------
  206. GetWord         proc    near
  207. ;
  208. ;       IN:     ah = 3ah
  209. ;               al = 0 ... Get First WORD of Specify CC
  210. ;                  dx = CC
  211. ;               al = 1 ... Get Next
  212. ;               al = 2 ... Get StdCWLib Addr
  213. ;               al = 3 ... Get UsrCWLib Addr
  214. ;                  
  215. ;               es:bx = buffer
  216. ;       OUT:    ah = 0    ... Ok
  217. ;                  es:bx = CCWord String
  218. ;                  cx = CC Num
  219. ;               ah != 80h ... Fail
  220. ;               es:bx = &StdCWlib (IN: al = 2)
  221. ;               es:bx = &UsrCWlib (IN: al = 3)
  222. ;               cx    = CWLibLen (IN: al = 2/3)
  223. ;
  224.         xor     cx, cx
  225.         cmp     al, 2
  226.         jae     toGetuStart
  227.         cmp     cs:wHas, 1
  228.         jne     toGetCWRetn
  229.         cmp     al, 1
  230.         je      GetWordCont0
  231.         cmp     dh, 0b0h
  232.         jb      toGetCWRetn
  233.         cmp     dl, 0a0h
  234.         ja      GetWordCont0
  235. toGetCWRetn:    mov     ax, 8080h
  236.         ret
  237. ;
  238. toGetuStart:    cmp     al, 3
  239.         ja      toGetCWRetn
  240.         jb      toGetStdAddr
  241.         cmp     cs:uHas, 1
  242.         jne     toGetCWRetn
  243.         mov     bx, cs
  244.         mov     es, bx
  245.         lea     bx, cs:uStart
  246.         mov     cx, cs:uLen
  247.         xor     ax, ax
  248.         ret
  249. ;
  250. toGetStdAddr:   cmp     cs:wHas, 1
  251.         jne     toGetCWRetn
  252.         cmp     nPage, 0
  253.         jne     toGetCWRetn
  254.         mov     bx, cs
  255.         mov     es, bx
  256.         mov     bx, cs:wStart
  257.         mov     cx, cs:wLen
  258.         xor     ax, ax
  259.         ret
  260. ;
  261. wPntr           dw      0
  262. wEntry          dw      0
  263. ;
  264. GetWordCont0:   push    ds
  265.         push    si
  266.         push    bx
  267.         mov     si, cs
  268.         mov     ds, si
  269.         mov     si, wStart
  270.         cmp     al, 1
  271.         je      toNextWord
  272.         push    bx
  273.         cmp     dh, 0d8h
  274.         jae     toGet2ndCW
  275.         sub     dx, 0b0a1h
  276.         mov     al, 94
  277.         mul     dh
  278.         xor     dh, dh
  279.         add     ax, dx
  280.         shl     ax, 1
  281.         add     si, ax
  282.         cmp     nPage, 0
  283.         je      GetWordCont1
  284.         shr     ah, 1
  285.         shr     ah, 1
  286.         cmp     ah, cPage
  287.         je      cwSkipMap
  288. ;
  289.         mov     cPage, ah
  290.         call    MapPage
  291. ;
  292. cwSkipMap:      xor     al, al
  293.         shl     ah, 1
  294.         shl     ah, 1
  295.         sub     si, ax
  296.         jmp     GetWordCont1
  297. ;
  298. toNextWord:     jmp     toGetNextWord
  299. ;
  300. toGet2ndCW:     add     si, 3755*2
  301.         cmp     nPage, 0
  302.         je      GetCW2Loop0
  303.         mov     si, wStart
  304.         add     si, (3755 MOD 512) * 2
  305.         cmp     cPage, 7
  306.         je      GetCW2Loop0
  307.         mov     cPage, 7
  308.         call    MapPage
  309. GetCW2Loop0:    cmp     dx, [si]
  310.         je      isFoundCW
  311.         cmp     word ptr [si], 0ffffh
  312.         je      trunNoCW
  313.         add     si, 4
  314.         jmp     GetCW2Loop0
  315. ;
  316. isFoundCW:      add     si, +2
  317. GetWordCont1:   pop     bx
  318.         mov     ax, [si]
  319.         or      ax, ax
  320.         jz      trunAbort
  321.         mov     si, ax
  322. ;
  323.         call    ReadCWord
  324. ;
  325.         mov     wPntr, si
  326.         mov     wEntry, si
  327. toGetNextWord:  mov     si, wEntry
  328.         or      si, si
  329.         jz      trunAbort
  330.         cld
  331. GetCWLoop:      lodsw
  332.         mov     dx, ax
  333.         or      dx, 8080h
  334.         mov     es:[bx], dx
  335.         inc     bx
  336.         inc     bx
  337.         inc     cx
  338.         test    ah, 80h
  339.         je      toGetCWEnd
  340.         test    al, 80h
  341.         je      GetCWLoop
  342.         cmp     si, wPntr
  343.         jbe     GetCWLoop
  344.         jmp     toGetCWEnd1
  345. ;
  346. trunNoCW:       pop     bx
  347. trunAbort:      pop     bx
  348.         pop     si
  349.         pop     ds
  350.         ret
  351. ;
  352. toGetCWEnd:     test    al, 80h
  353.         jne     GetCWSkip0
  354.         xor     si, si
  355. GetCWSkip0:     mov     wEntry, si
  356. toGetCWEnd1:    mov     byte ptr es:[bx], 0
  357.         mov     wPntr, si
  358.         xor     ax, ax
  359.         pop     bx
  360.         pop     si
  361.         pop     ds
  362.         ret
  363. ;
  364. GetWordRetn:    mov     wEntry, 0
  365.         mov     wPntr, 0
  366.         mov     ax, 8080h
  367.         pop     bx
  368.         pop     si
  369.         pop     ds
  370.         ret
  371. GetWord         endp
  372. ;               ----------------------------
  373. UnInstallWLib   proc    near
  374. ;
  375. ;       IN:     ah = 3eh
  376. ;               al = 0 ... uninstall StdWLib
  377. ;               al = 1 ... uninstall UsrWLib
  378. ;       OUT:    ax = 0 ... Ok
  379. ;               ax != 0 .. Fail
  380. ;
  381.         push    es
  382.         push    ds
  383.         push    cs
  384.         pop     ds
  385.         cmp     al, 1
  386.         ja      UnInsWRetn
  387.         je      UnInsUsrWLib
  388.         cmp     wHas, 1
  389.         jne     UnInsWRetn
  390. ;
  391.         mov     wHas, 0
  392.         cmp     nPage, 0
  393.         je      UnInsWCont
  394.         mov     ah, 0ah
  395.         mov     dx, xHandle
  396.         call    dword ptr xEntry
  397. ;
  398. UnInsWCont:     cmp     uHas, 1
  399.         je      UnInsWRet0
  400.         mov     es, Psp
  401.         mov     ah, 49h
  402.         int     21h
  403.         jmp     UnInsWRet0
  404. ;
  405. UnInsUsrWLIb:   cmp     uHas, 1
  406.         jne     UnInsWRetn
  407.         mov     uHas, 0
  408. ;
  409.         cmp     wHas, 1
  410.         je      UnInsWRet0
  411.         mov     es, Psp
  412.         mov     ah, 49h
  413.         int     21h
  414. ;
  415. UnInsWRet0:     xor     ax, ax
  416. UnInsWExit:     pop     ds
  417.         pop     es
  418.         ret
  419. ;
  420. UnInsWRetn:     mov     ax, 8080h
  421.         jmp     UnInsWExit
  422. UnInstallWLib   endp
  423. ;               -------------------------------
  424. ReadCWord       proc    near
  425. ;
  426. ;       IN:     si = Offset of CWord Lib
  427. ;
  428.         cmp     nPage, 0
  429.         je      toSetAddr
  430.         pusha
  431.         mov     word ptr sOffset2, si
  432.         lea     si, xStruc2
  433.         mov     ah, 0bh
  434.         call    dword ptr xEntry
  435.         popa
  436.         mov     si, wEnd
  437.         ret
  438. ;
  439. toSetAddr:      add     si, wStart
  440.         ret
  441. ReadCWord       endp
  442. ;               -------------------------------
  443. MapPage         proc    near
  444. ;
  445. ;       IN:     cPage = to be Mapped
  446. ;
  447.         pusha
  448.         push    ds
  449.         mov     ax, cs
  450.         mov     ds, ax
  451.         xor     ah, ah
  452.         mov     al, cPage
  453.         mov     cx, PageSize
  454.         mul     cx
  455.         mov     word ptr sOffset, ax
  456.         lea     si, xStruc
  457.         mov     ah, 0bh
  458.         call    dword ptr xEntry
  459.         pop     ds
  460.         popa
  461.         ret
  462. ;
  463. inPage          db      0
  464. MapPage         endp
  465. ;
  466. ;               -------------------------------
  467. ;
  468. CWMax           equ     0f000h
  469. ;
  470. CwordVer        dw      ?
  471. wStart          dw      ?
  472. wBuffer         dw      ?
  473. ;
  474. wLen            dw      ?
  475. uLen            dw      ?
  476.         db      'CWord Lib : '
  477. ;
  478. uStart          db      CWMax dup(0ffh)
  479. ;
  480. ;               -------------------------------
  481. ;
  482. MoveToXMS       proc    near
  483. ;
  484.         cmp     word ptr xEntry+2, 0
  485.         jne     toXMS
  486. ;
  487. SetNoXMS:       mov     nPage, 0
  488.         mov     ax, wEnd
  489.         mov     TSREnd, ax
  490.         ret
  491. ;
  492. toXMS:          mov     dx, wLen
  493.         test    dx, 03ffh
  494.         jz      noInc
  495.         add     dx, 400h
  496. noInc:          mov     dl, dh
  497.         xor     dh, dh
  498.         shr     dx, 1
  499.         shr     dx, 1
  500. ;
  501.         mov     ah, 9
  502.         call    dword ptr xEntry
  503.         cmp     bl, 0
  504.         jne     SetNoXMS
  505.         mov     xHandle, dx
  506. ;
  507.         mov     dHandle, dx
  508.         mov     ax, wLen
  509.         mov     Count, ax
  510.         mov     sHandle, 0
  511.         mov     ax, wStart
  512.         mov     word ptr sOffset, ax
  513.         mov     ax, cs
  514.         mov     word ptr sOffset+2, ax
  515.         mov     word ptr dOffset, 0
  516.         mov     word ptr dOffset+2, 0
  517.         mov     ah, 0bh
  518.         lea     si, xStruc
  519.         call    dword ptr xEntry
  520.         cmp     bl, 0
  521.         je      MoveSucceed
  522. ;
  523.         mov     ah, 0ah
  524.         mov     dx, xHandle
  525.         call    dword ptr xEntry
  526.         jmp     SetNoXMS
  527. ;
  528. MoveSucceed:    mov     Count, PageSize
  529.         mov     ax, xHandle
  530.         mov     sHandle, ax
  531.         mov     word ptr sOffset+2, 0
  532.         mov     ax, wStart
  533.         mov     word ptr dOffset, ax
  534.         mov     ax, cs
  535.         mov     word ptr dOffset+2, ax
  536.         mov     dHandle, 0
  537. ;
  538.         mov     ax, xHandle
  539.         mov     sHandle2, ax
  540.         mov     ax, wStart
  541.         add     ax, PageSize
  542.         mov     word ptr dOffset2, ax
  543.         mov     ax, cs
  544.         mov     word ptr dOffset2+2, ax
  545. ;
  546.         mov     bx, PageSize
  547.         mov     cSize, bx
  548.         mov     ax, wStart
  549.         add     ax, bx
  550.         mov     wEnd, ax
  551.         add     ax, 512
  552.         mov     TSREnd, ax
  553.         mov     ax, wLen
  554.         xor     dx, dx
  555.         div     bx
  556.         mov     nPage, al
  557.         mov     eSize, dx
  558.         mov     cPage, 0
  559.         ret
  560. MoveToXMS       endp
  561. ;
  562. ;               -------------------------------
  563. ;
  564. Path            db      80 dup(?)
  565. StCW            db      'xisch.dat', 0
  566. UsrCW           db      'usrch.dat', 0
  567. ;
  568. CSMark          db      13, 10, 9, 'CHCS'
  569. noCHCS          db      7, 'wch: CHCS/CHIS not installed !', 0dh,0ah, '$'
  570. BadVer          db      7, 'wch: ░µ▒╛║┼▓╗╢╘', 0dh, 0ah, '$'
  571. BadFile         db      7, 'wch: ┤φ╬≤┤╩┐Γ╕±╩╜╗≥░µ▒╛║┼▓╗╢╘', 0dh,0ah, '$'
  572. ReInst          db      'wch: ┤╩┐Γ╥╤╫░╚δ !', 0dh,0ah, '$'
  573. noFile          db      7, 'wch: ╬┤─▄┤≥┐¬┤╩┐Γ╬─╝■ !', 0dh,0ah, '$'
  574. ;
  575. Handle          dw      ?
  576. NameOff         dw      ?
  577. ;
  578.         db      100h dup(0)
  579. rStack          label   byte
  580. ;
  581. start:          mov     ax, 3f00h
  582.         int     16h
  583.         mov     di, bx
  584.         lea     si, CSMark
  585.         mov     cx, 5
  586.         cld
  587.         repz    cmpsb
  588.         jz      iCont00
  589.         lea     dx, noCHCS
  590.         jmp     PrError
  591. ;
  592. iCont00:        cmp     ax, 0100h
  593.         je      iCont01
  594.         lea     dx, BadVer
  595.         jmp     PrError
  596. ;
  597. ;               Test XMS memory
  598. ;
  599. iCont01:        mov     ax, 4300h
  600.         int     2fh
  601.         cmp     al, 80h
  602.         jne     iNoXMS
  603.         mov     ax, 4310h
  604.         int     2fh
  605.         mov     word ptr xEntry, bx
  606.         mov     word ptr xEntry+2, es
  607. ;
  608. iNoXMS:         push    cs
  609.         pop     es
  610.         lea     ax, rStack
  611.         mov     sp, ax
  612.         mov     ax, ds
  613.         mov     Psp, ax
  614.         mov     ax, ds:[2ch]
  615.         mov     Env, ax
  616.         xor     si, si
  617.         mov     ds, ax
  618. iLoop0:         cmp     word ptr [si], 0
  619.         je      iEnd0
  620.         inc     si
  621.         jmp     iLoop0
  622. iEnd0:          add     si, +4
  623.         lea     di, Path
  624. iLoop1:         lodsb
  625.         stosb
  626.         or      al, al
  627.         jz      iEnd1
  628.         cmp     al, '\'
  629.         jne     iLoop1
  630.         mov     es:NameOff, di
  631.         jmp     iLoop1
  632. iEnd1:          mov     ax, cs
  633.         mov     ds, ax
  634.         mov     di, NameOff
  635.         lea     si, UsrCW
  636. iLoop2:         lodsb
  637.         stosb
  638.         cmp     al, 0
  639.         jne     iLoop2
  640. ;
  641.         mov     ax, 3d00h
  642.         lea     dx, UsrCW
  643.         int     21h
  644.         jnc     iCont
  645.         mov     ax, 3d00h
  646.         lea     dx, Path
  647.         int     21h
  648.         jnc     iCont
  649.         jmp     toLoadST
  650. ;
  651. toErr:          lea     dx, noFile
  652.         jmp     PrError
  653. ;
  654. iCont:          mov     bx, ax
  655.         mov     ah, 3fh
  656.         mov     cx, 3000h
  657.         lea     dx, uStart
  658.         int     21h
  659.         jc      toErr
  660.         mov     uLen, ax
  661.         mov     ah, 3eh
  662.         int     21h
  663. ;
  664.         mov     uHas, 1
  665.         mov     ax, 3c01h
  666.         lea     bx, WordProc
  667.         mov     cx, uLen
  668.         push    cs
  669.         pop     es
  670.         int     16h
  671.         or      ax, ax
  672.         jz      iContu
  673. ;
  674. toLoadST:       mov     word ptr uLen, 2
  675.         mov     byte ptr uHas, 0
  676. iContu:         lea     ax, uStart
  677.         add     ax, uLen
  678.         mov     word ptr CwordVer, ax
  679.         add     ax, 0010h
  680.         mov     word ptr wStart, ax
  681. ;
  682.         mov     bx, NameOff
  683.         mov     byte ptr [bx], 'X'
  684.         mov     byte ptr [bx+1], 'I'
  685.         mov     byte ptr [bx+2], 'S'
  686.         lea     dx, Path
  687.         mov     ax, 3d00h
  688.         int     21h
  689.         jc      toErr
  690.         mov     bx, ax
  691.         mov     ah, 3fh
  692.         mov     dx, CwordVer
  693.         mov     cx, CWMax
  694.         sub     cx, uLen
  695.         int     21h
  696.         pushf
  697.         and     al, 0feh
  698.         mov     wLen, ax
  699.         mov     wSize, ax
  700.         add     ax, wStart
  701.         mov     wEnd, ax
  702.         mov     TSREnd, ax
  703.         mov     ah, 3eh
  704.         int     21h
  705.         popf
  706.         jnc     iConti
  707.         jmp     toErr
  708. ;
  709. iConti:         mov     nPage, 0
  710. ;
  711.         lea     si, CSVer
  712.         mov     di, CwordVer
  713.         mov     cx, 8
  714.         push    cs
  715.         pop     es
  716.         cld
  717.         repz    cmpsb
  718.         jz      iContIn
  719.         lea     dx, BadFile
  720.         jmp     PrError
  721. ;
  722. iContIn:        mov     wHas, 1
  723.         mov     ax, 3c00h
  724.         lea     bx, WordProc
  725.         mov     cx, wLen
  726.         push    cs
  727.         pop     es
  728.         int     16h
  729.         or      ax, ax
  730.         jz      iContw
  731.         mov     wHas, 0
  732.         mov     wLen, 0
  733.         mov     wSize, 0
  734.         jmp     iContw1
  735. ;
  736. iContw:         cmp     word ptr xEntry+2, 0
  737.         je      iContw1
  738. ;
  739.         call    MoveToXMS
  740. ;
  741. iContw1:        cmp     wHas, 1
  742.         je      toTSR
  743.         cmp     uHas, 1
  744.         je      toTSR
  745.         lea     dx, ReInst
  746.         jmp     PrError
  747. ;
  748. toTSR:          mov     dx, TSREnd
  749.         inc     dx
  750.         inc     dx
  751.         push    dx
  752.         mov     es, Env
  753.         mov     ah, 49h              ; Free Environment
  754.         int     21h
  755.         pop     dx
  756.         mov     cl, 4
  757.         shr     dx, cl
  758.         inc     dx
  759.         mov     ax, 3100h
  760.         int     21h
  761. ;
  762. PrError:        mov     ah, 09h
  763.         int     21h
  764.         mov     ax, 4c01h
  765.         int     21h
  766. ;
  767. code            ends
  768.         end     begin
  769.