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

  1. ;
  2. ;               fxms.asm
  3. ;
  4. .286
  5. code            segment
  6.         org     100h
  7.         assume  cs:code, ds:code
  8. ;
  9. begin:          jmp     start
  10. ;
  11. Ver             db      'CHCS 1.0'
  12. ;
  13. Psp             dw      ?
  14. Env             dw      ?
  15.         db      0
  16. ;
  17. EMB             label   byte
  18. Count           dd      ?                    ; Transfer Bytes
  19. sHandle         dw      ?                    ; Source Handle
  20. sOffset         dd      ?                    ; Source Offset
  21. dHandle         dw      ?                    ; Destinate Handle
  22. dOffset         dd      ?                    ; Destinate Offset
  23. ;
  24. ;
  25. Int16           proc    far
  26.         sti
  27.         cmp     ah, 80h
  28.         je      iCont0
  29.         cmp     ah, 81h
  30.         je      iQuit
  31. toOld:          jmp     dword ptr cs:Old16
  32. ;
  33. iQuit:          push    es
  34.         push    dx
  35.         push    cx
  36.         xor     dx, dx
  37.         mov     es, dx
  38.         mov     dx, word ptr cs:Old16
  39.         mov     cx, word ptr cs:Old16+2
  40.         cli
  41.         mov     es:[58h], dx
  42.         mov     es:[5ah], cx
  43.         sti
  44.         mov     ah, 0ah
  45.         mov     dx, cs:xHandle
  46.         call    dword ptr cs:xEntry  ; Free XMS
  47.         mov     ah, 49h
  48.         mov     es, cs:Psp
  49.         int     21h
  50.         pop     cx
  51.         pop     dx
  52.         pop     es
  53.         iret
  54. ;
  55. toRet0:         jmp     Ret0
  56. ;
  57. iCont0:         cmp     cl, 0
  58.         jne     toOld
  59. ;
  60.         pusha
  61.         push    es
  62.         push    ds
  63.         mov     ax, cs
  64.         mov     ds, ax
  65.         mov     word ptr dOffset, bx
  66.         mov     word ptr dOffset+2, es
  67.         and     dx, 7f7fh
  68.         sub     dx, 2121h
  69.         mov     al, 94
  70.         mul     dh
  71.         xor     dh, dh
  72.         add     ax, dx               ; ax = c1*94 + c2
  73.         mov     dl, ah
  74.         mov     cl, 5
  75.         shl     ax, cl               ; ax *= 32
  76.         shr     dx, 1
  77.         shr     dx, 1
  78.         shr     dx, 1                ; dx:ax = XMS Offset
  79.         mov     word ptr sOffset, ax
  80.         mov     word ptr sOffset+2, dx
  81.         cld
  82.         lea     si, EMB
  83.         mov     ah, 0bh
  84.         call    dword ptr xEntry
  85. Ret0:           pop     ds
  86.         pop     es
  87.         popa
  88.         iret
  89. Int16           endp
  90. ;
  91. xHandle         dw      0
  92. xEntry          dd      ?
  93. ;
  94. UseF16          db      0
  95. ;
  96. Old16           dd      ?
  97. ;
  98. XMSDev          db      'XMMXXXX0'
  99. NoXMS           db      'fxms: XMS memory not found !',0dh, 0ah, '$'
  100. Error           db      'fxms: XMS error !', 0dh, 0ah, '$'
  101. NoPage          db      'fxms: No enough XMS memory !', 0dh, 0ah, '$'
  102. FnErr           db      'fxms: gbj16 open error !', 0dh, 0ah, '$'
  103. ;
  104. Mark            db      13, 10, 9, 'CHCS'
  105. ;
  106. ReInst          db      'fxms: System font has been loaded !', 0dh, 0ah, '$'
  107. ;
  108. NameOff         dw      ?
  109. Path            db      80 dup(?)
  110. Font            db      'gbj16', 0
  111. FHandle         dw      0
  112. ;
  113. ;
  114. start:          mov     ax, ds
  115.         mov     Psp, ax
  116.         mov     ax, ds:[2ch]
  117.         mov     Env, ax
  118.         xor     si, si
  119.         mov     ds, ax
  120. iLoop0:         cmp     word ptr [si], 0
  121.         je      iEnd0
  122.         inc     si
  123.         jmp     iLoop0
  124. iEnd0:          add     si, +4
  125.         lea     di, Path
  126. iLoop1:         lodsb
  127.         stosb
  128.         or      al, al
  129.         jz      iEnd1
  130.         cmp     al, '\'
  131.         jne     iLoop1
  132.         mov     es:NameOff, di
  133.         jmp     iLoop1
  134. iEnd1:          mov     ax, cs
  135.         mov     ds, ax
  136. ;
  137.         mov     bx, 81h
  138. fLoop0:         mov     al, cs:[bx]
  139.         inc     bx
  140.         cmp     al, ' '
  141.         je      fLoop0
  142.         cmp     al, 09h
  143.         je      fLoop0
  144.         cmp     al, 0dh
  145.         je      fEnd0
  146.         cmp     al, '/'
  147.         jne     fEnd0
  148.         mov     al, cs:[bx]
  149.         or      al, 20h
  150.         cmp     al, 'f'
  151.         jne     fEnd0
  152.         mov     UseF16, 1
  153.         mov     byte ptr Font+2, al
  154.         mov     byte ptr FnErr+8, al
  155. ;
  156. fEnd0:          mov     di, NameOff
  157.         lea     si, Font
  158. iLoop2:         lodsb
  159.         stosb
  160.         cmp     al, 0
  161.         jne     iLoop2
  162. ;
  163.         mov     ax, 3516h
  164.         int     21h
  165.         mov     word ptr Old16, bx
  166.         mov     word ptr Old16+2, es
  167. ;
  168.         mov     ax, 3f00h
  169.         int     16h
  170.         mov     di, bx
  171.         lea     si, Mark
  172.         mov     cx, 5
  173.         cld
  174.         repz    cmpsb
  175.         jnz     contu
  176.         lea     dx, ReInst
  177.         jmp     PmtErr
  178. ;
  179. contu:          mov     ax, 4300h
  180.         int     2fh
  181.         cmp     al, 80h
  182.         je      cont0
  183. toErr:          lea     dx, NoXMS
  184.         jmp     PmtErr
  185. cont0:          push    es
  186.         mov     ax, 4310h
  187.         int     2fh
  188.         mov     word ptr xEntry, bx
  189.         mov     word ptr xEntry+2, es
  190.         pop     es
  191.         mov     ah, 08h
  192.         call    dword ptr xEntry
  193.         cmp     bl, 0
  194.         je      cont1
  195. xErr:           lea     dx, Error
  196.         jmp     PmtErr
  197. cont1:          cmp     ax, 256
  198.         jae     cont2
  199.         lea     dx, NoPage
  200.         jmp     PmtErr
  201. cont2:          mov     ax, 3d00h
  202.         lea     dx, Path
  203.         int     21h
  204.         jnb     cont3
  205.         lea     dx, FnErr
  206.         jmp     PmtErr
  207. cont3:          mov     FHandle, ax
  208.         mov     ah, 9
  209.         mov     dx, 256
  210.         call    dword ptr xEntry     ; Alloc XMS
  211.         cmp     bl, 0
  212.         jne     xErr
  213.         mov     cs:xHandle, dx
  214. ;
  215. LoadF:          mov     word ptr Count, 4000h
  216.         mov     word ptr Count+2, 0
  217.         mov     word ptr sHandle, 0
  218.         mov     word ptr dOffset, 0
  219.         mov     word ptr dOffset+2, 0
  220.         mov     cx, 16                ; 16 KB * 16
  221. ldLoop:         push    cx
  222.         lea     dx, Buffer
  223.         mov     ah, 3fh              ; Read Font
  224.         mov     bx, cs:FHandle
  225.         mov     cx, 4000h
  226.         int     21h
  227.         push    ax
  228.         lea     dx, Buffer
  229.         mov     word ptr sOffset, dx
  230.         mov     word ptr sOffset+2, ds
  231.         mov     dx, xHandle
  232.         mov     word ptr dHandle, dx
  233.         mov     ah, 0bh
  234.         lea     si, EMB
  235.         call    dword ptr xEntry
  236.         pop     ax
  237.         add     word ptr dOffset, ax
  238.         adc     word ptr dOffset+2, 0
  239.         pop     cx
  240.         loop    ldLoop
  241. ;
  242.         mov     ah, 3eh
  243.         mov     bx, FHandle
  244.         int     21h
  245. ;
  246.         mov     word ptr Count, 32
  247.         mov     word ptr Count+2, 0
  248.         mov     dx, xHandle
  249.         mov     word ptr sHandle, dx
  250.         mov     word ptr dHandle, 0
  251. ;
  252.         mov     ax, 2516h
  253.         lea     dx, Int16
  254.         int     21h                  ; Set Interrupt
  255.         mov     ah, 49h
  256.         mov     es, Env
  257.         int     21h                  ; Free Environment
  258.         lea     dx, XMSDev
  259.         mov     cl, 4
  260.         shr     dx, cl
  261.         inc     dx
  262.         mov     ax, 3100h
  263.         int     21h
  264. ;
  265. PmtErr:         mov     ah, 9
  266.         int     21h
  267.         mov     ax, 4c01h
  268.         int     21h
  269. ;
  270.         db      2 dup('XCS V1.2')
  271. ;
  272. Buffer          label   byte
  273. ;
  274. code            ends
  275.         end     begin
  276.