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

  1. ;
  2. ;       fems.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. Int16   proc    far
  18.     sti
  19.     cmp     ah, 80h
  20.     je      iCont0
  21.     cmp     ah, 81h
  22.     je      iQuit
  23. toOld:  jmp     dword ptr cs:Old16
  24. ;
  25. iQuit:  push    es
  26.     push    dx
  27.     push    cx
  28.     xor     dx, dx
  29.     mov     es, dx
  30.     mov     dx, word ptr cs:Old16
  31.     mov     cx, word ptr cs:Old16+2
  32.     cli
  33.     mov     es:[58h], dx
  34.     mov     es:[5ah], cx
  35.     sti
  36.     mov     dx, cs:EHandle
  37.     mov     ah, 45h
  38.     int     67h
  39.     mov     ah, 49h
  40.     mov     es, cs:Psp
  41.     int     21h
  42.     pop     cx
  43.     pop     dx
  44.     pop     es
  45.     iret
  46. ;
  47. toRet0: jmp     exit
  48. ;
  49. iCont0: cmp     cl, 0
  50.     jne     toOld
  51. ;
  52.     pusha
  53.     push    es
  54.     push    ds
  55.     mov     ax, cs
  56.     mov     ds, ax
  57.     mov     di, bx                  ; es:di = buf[32]
  58.     and     dx, 7f7fh
  59.     sub     dx, 2121h
  60.     mov     al, 94
  61.     mul     dh
  62.     xor     dh, dh
  63.     add     ax, dx
  64.     shl     ax, 1
  65.     mov     cx, 400h
  66.     xor     dx, dx
  67.     div     cx
  68.     push    dx
  69.     mov     bx, ax
  70. ;
  71. ;        push    es
  72. ;        push    di
  73. ;        push    bx
  74. ;        mov     ax, cs
  75. ;        mov     es, ax
  76. ;        mov     ds, ax
  77. ;        lea     di, MapRegs
  78. ;        mov     ax, 4e00h
  79. ;        int     67h
  80. ;
  81.     mov     ax, 4403h
  82. ;        pop     bx
  83.     mov     dx, EHandle
  84.     int     67h
  85. ;
  86. ;        mov     ax, 4e01h
  87. ;        lea     si, MapRegs
  88. ;        int     67h
  89. ;
  90. ;        pop     di
  91. ;        pop     es
  92.  
  93.     pop     dx
  94.     mov     ax, FrAddr
  95.     add     ax, dx
  96.     mov     ds, ax
  97.     mov     cx, 16
  98.     xor     si, si
  99.     cld
  100.     rep     movsw
  101. exit:   pop     ds
  102.     pop     es
  103.     popa
  104.     iret
  105. Int16   endp
  106. ;
  107. FrAddr  dw      0
  108. EHandle dw      0
  109. Old16   dd      ?
  110. ;
  111. UseF16  db      0
  112. ;
  113. ;MapRegs db      128 dup(?)
  114. ;
  115. ;ChrBuf  db      96*16 dup(0)
  116. ;
  117. ;
  118. EMSDev  db      'EMMXXXX0'
  119. NoEMS   db      'fems: EMS memory not found !',0dh, 0ah, '$'
  120. Error   db      'fems: EMS error !', 0dh, 0ah, '$'
  121. NoPage  db      'fems: No enough EMS memory !', 0dh, 0ah, '$'
  122. ;
  123. Mark    db      13, 10, 9, 'CHCS'
  124. ;
  125. ReInst  db      'fems: System font has been loaded !', 0dh, 0ah, '$'
  126. ;
  127. NameOff dw      ?
  128. Path    db      80 dup(?)
  129. Font    db      'gbj16', 0
  130. ;
  131. FHandle dw      0
  132. ;
  133. start:  mov     ax, ds
  134.     mov     Psp, ax
  135.     mov     ax, cs:[2ch]
  136.     mov     Env, ax
  137.     xor     si, si
  138.     mov     ds, ax
  139. iLoop0: cmp     word ptr [si], 0
  140.     je      iEnd0
  141.     inc     si
  142.     jmp     iLoop0
  143. iEnd0:  add     si, +4
  144.     lea     di, Path
  145. iLoop1: lodsb
  146.     stosb
  147.     or      al, al
  148.     jz      iEnd1
  149.     cmp     al, '\'
  150.     jne     iLoop1
  151.     mov     es:NameOff, di
  152.     jmp     iLoop1
  153. iEnd1:  mov     ax, cs
  154.     mov     ds, ax
  155. ;
  156.     mov     bx, 81h
  157. fLoop0: mov     al, cs:[bx]
  158.     inc     bx
  159.     cmp     al, ' '
  160.     je      fLoop0
  161.     cmp     al, 09h
  162.     je      fLoop0
  163.     cmp     al, 0dh
  164.     je      fEnd0
  165.     cmp     al, '/'
  166.     jne     fEnd0
  167.     mov     al, cs:[bx]
  168.     or      al, 20h
  169.     cmp     al, 'f'
  170.     jne     fEnd0
  171.     mov     UseF16, 1
  172.     mov     byte ptr Font+2, al
  173. ;
  174. fEnd0:  mov     di, NameOff
  175.     lea     si, Font
  176. iLoop2: lodsb
  177.     stosb
  178.     cmp     al, 0
  179.     jne     iLoop2
  180. ;
  181.     mov     di, NameOff
  182.     lea     si, Font
  183. iLoop3: lodsb
  184.     stosb
  185.     cmp     al, 0
  186.     jne     iLoop3
  187. ;
  188.     mov     ax, 3516h
  189.     int     21h
  190.     mov     word ptr Old16, bx
  191.     mov     word ptr Old16+2, es
  192. ;
  193.     mov     ax, 3f00h
  194.     int     16h
  195.     mov     di, bx
  196.     lea     si, Mark
  197.     mov     cx, 5
  198.     cld
  199.     repz    cmpsb
  200.     jnz     contu
  201.     lea     dx, ReInst
  202.     jmp     PmtErr
  203. ;
  204. contu:  mov     ax, 3567h
  205.     int     21h
  206.     mov     di, 000ah
  207.     lea     si, EMSDev
  208.     mov     cx, 8
  209.     cld
  210.     repz    cmpsb
  211.     jz      cont0
  212.     lea     dx, NoEMS
  213.     jmp     PmtErr
  214. cont0:  mov     ah, 42h                 ; Get Free Pages
  215.     int     67h
  216.     cmp     ah, 0
  217.     jz      cont1
  218.     lea     dx, Error
  219.     jmp     PmtErr
  220. cont1:  cmp     bx, 17
  221.     jnb     cont2
  222.     lea     dx, NoPage
  223.     jmp     PmtErr
  224. cont2:  mov     ah, 41h                 ; Get Frame Addr
  225.     int     67h
  226.     cmp     ah, 0
  227.     je      cont3
  228.     lea     dx, Error
  229.     jmp     PmtErr
  230. cont3:  add     bx, 0c00h
  231.     mov     FrAddr, bx
  232.     mov     ah, 43h                 ; Alloc Pages
  233.     mov     bx, 17
  234.     int     67h
  235.     cmp     ah, 0
  236.     je      cont4
  237.     lea     dx, Error
  238.     jmp     PmtErr
  239. cont4:  mov     EHandle, dx
  240.     mov     ax, 3d00h
  241.     lea     dx, Path
  242.     int     21h
  243.     jnb     cont5
  244.     jmp     PmtErr
  245. ;
  246. cont5:  mov     bx, ax
  247.     mov     FHandle, ax
  248.     xor     cx, cx
  249.     xor     dx, dx
  250.     mov     ax, 4200h
  251.     int     21h
  252.     jnb     cont6
  253.     jmp     PmtErr
  254. ;
  255. cont6:  xor     bx, bx
  256. ldLoop: push    bx
  257.     mov     ax, 4403h               ; Map Pages (bx = Logical Page)
  258.     mov     dx, EHandle
  259.     int     67h
  260.     pop     bx
  261.     cmp     ah, 0
  262.     je      cont7
  263.     lea     dx, Error
  264.     jmp     PmtErr
  265. cont7:  push    bx
  266.     push    ds
  267.     mov     bx, FHandle
  268.     mov     cx, FrAddr
  269.     mov     ds, cx
  270.     mov     cx, 4000h
  271.     xor     dx, dx
  272.     mov     ah, 3fh
  273.     int     21h
  274.     pop     ds
  275.     pop     bx
  276.     inc     bx
  277.     cmp     bx, 17
  278.     jb      ldLoop
  279. ;
  280.     mov     ah, 3eh
  281.     mov     bx, FHandle
  282.     int     21h
  283. ;
  284.     mov     ax, 2516h
  285.     lea     dx, Int16
  286.     int     21h
  287.     mov     ah, 49h
  288.     mov     dx, Env
  289.     mov     es, dx
  290.     int     21h                     ; Free Environment
  291.     sti
  292.     lea     dx, EMSDev
  293.     mov     cl, 4
  294.     shr     dx, cl
  295.     inc     dx
  296.     mov     ax, 3100h
  297.     int     21h
  298. PmtErr: mov     ah, 9
  299.     int     21h
  300.     mov     ax, 4c01h
  301.     int     21h
  302. code    ends
  303.     end     begin
  304.