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

  1. ;
  2. ;       fext.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. GDT     label   byte
  18.  
  19.     db      8 dup(0)
  20. GDTdsc  db      8 dup(0)
  21.  
  22. ;       SrcDsc:
  23. sCount  dw      003fh
  24. sAddr   db      0
  25.     dw      0
  26. sRight  db      93h
  27.     dw      0
  28.  
  29. ;       DesDsc:
  30. dCount  dw      003fh
  31. dAddr   db      0
  32.     dw      0
  33. dRight  db      93h
  34.     dw      0
  35.  
  36. BiosCS  db      8 dup(0)
  37. BiosSS  db      8 dup(0)
  38. ;
  39. ExtBase dd      0
  40. ;
  41. Int16   proc    far
  42.     sti
  43.     cmp     ah, 80h
  44.     je      RdFont
  45.     cmp     ah, 81h
  46.     je      iQuit
  47. toOld:  jmp     dword ptr cs:Old16
  48. ;
  49. iQuit:  push    es
  50.     push    dx
  51.     push    cx
  52.     xor     dx, dx
  53.     mov     es, dx
  54.     mov     dx, word ptr cs:Old15
  55.     mov     cx, word ptr cs:Old15+2
  56.     cli
  57.     mov     es:[54h], dx
  58.     mov     es:[56h], cx
  59.     mov     dx, word ptr cs:Old16
  60.     mov     cx, word ptr cs:Old16+2
  61.     mov     es:[58h], dx
  62.     mov     es:[5ah], cx
  63.     sti
  64.     mov     ah, 49h
  65.     mov     es, cs:Psp
  66.     int     21h
  67.     pop     cx
  68.     pop     dx
  69.     pop     es
  70.     iret
  71. ;
  72. RdFont: cmp     cl, 0
  73.     jne     toOld
  74. ;
  75.     pusha
  76.     push    es
  77.     push    ds
  78.     mov     ax, cs
  79.     mov     ds, ax
  80.     and     dx, 7f7fh
  81.     sub     dx, 2121h
  82.     mov     al, 94
  83.     mul     dh
  84.     xor     dh, dh
  85.     add     ax, dx               ; ax = c1*94 + c2
  86.     mov     dl, ah
  87.     mov     cl, 5
  88.     shl     ax, cl               ; ax *= 32
  89.     shr     dx, 1
  90.     shr     dx, 1
  91.     shr     dx, 1                ; dx:ax = XMS Offset
  92.     add     ax, word ptr ExtBase
  93.     adc     dl, byte ptr ExtBase+2
  94.     mov     word ptr sAddr, ax
  95.     mov     byte ptr sAddr+2, dl
  96.     mov     cl, 4
  97.     mov     ax, es
  98.     mov     dx, bx
  99.     and     bx, 000fh
  100.     shr     dx, cl
  101.     add     ax, dx
  102.     mov     ch, ah
  103.     shl     ax, cl
  104.     shr     ch, cl
  105.     add     ax, bx
  106.     mov     word ptr dAddr, ax
  107.     mov     byte ptr dAddr+2, ch
  108.     mov     ax, cs
  109.     mov     es, ax
  110. ;
  111.     lea     si, GDT              ; es:si = GDT
  112.     mov     ah, 87h
  113.     mov     cx, 0010h            ; Transfer 32 bytes
  114.     int     15h
  115. Ret0:   pop     ds
  116.     pop     es
  117.     popa
  118.     iret
  119. Int16   endp
  120. ;
  121. Old16   dd      ?
  122. ;
  123. Old15   dd      ?
  124. ;
  125. useMem  dw      ?
  126. ;
  127. UseF16  db      0
  128. ;
  129. Int15   proc    far
  130.     cmp     ah, 88h
  131.     je      toNew
  132.     jmp     dword ptr cs:Old15
  133. ;
  134. toNew:  pushf
  135.     call    dword ptr cs:Old15
  136.     sub     ax, cs:useMem
  137.     iret
  138. Int15   endp
  139. ;
  140. NoExt   db      'fext: No enough extend memory !', 0dh, 0ah, '$'
  141. FnErr   db      'fext: gbj16 open error !', 0dh, 0ah, '$'
  142. ;
  143. Mark    db      13,10,9,'CHCS'
  144. ;
  145. ReInst  db      'fext: System font has been loaded !', 0dh, 0ah, '$'
  146. NameOff dw      ?
  147. Path    db      80 dup(?)
  148. Font    db      'gbj16', 0
  149. ;
  150. ;
  151. start:  mov     ax, ds
  152.     mov     Psp, ax
  153.     mov     ax, ds:[2ch]
  154.     mov     Env, ax
  155.     xor     si, si
  156.     mov     ds, ax
  157. iLoop0: cmp     word ptr [si], 0
  158.     je      iEnd0
  159.     inc     si
  160.     jmp     iLoop0
  161. iEnd0:  add     si, +4
  162.     lea     di, Path
  163. iLoop1: lodsb
  164.     stosb
  165.     or      al, al
  166.     jz      iEnd1
  167.     cmp     al, '\'
  168.     jne     iLoop1
  169.     mov     es:NameOff, di
  170.     jmp     iLoop1
  171. iEnd1:  mov     ax, cs
  172.     mov     ds, ax
  173. ;
  174.     mov     bx, 81h
  175. fLoop0: mov     al, [bx]
  176.     inc     bx
  177.     cmp     al, ' '
  178.     je      fLoop0
  179.     cmp     al, 09h
  180.     je      fLoop0
  181.     cmp     al, 0dh
  182.     je      fEnd0
  183.     cmp     al, '/'
  184.     jne     fEnd0
  185.     mov     al, [bx]
  186.     or      al, 20h
  187.     cmp     al, 'f'
  188.     jne     fEnd0
  189.     mov     UseF16, 1
  190.     mov     byte ptr Font+2, al
  191.     mov     byte ptr FnErr+6, al
  192. ;
  193. fEnd0:  mov     di, NameOff
  194.     lea     si, Font
  195. iLoop2: lodsb
  196.     stosb
  197.     cmp     al, 0
  198.     jne     iLoop2
  199. ;
  200. ;
  201.     mov     ax, 3515h
  202.     int     21h
  203.     mov     word ptr cs:Old15, bx
  204.     mov     word ptr cs:Old15+2, es
  205.     mov     ax, 3516h
  206.     int     21h
  207.     mov     word ptr Old16, bx
  208.     mov     word ptr Old16+2, es
  209.  
  210.     mov     ax, 3f00h
  211.     int     16h
  212.     mov     di, bx
  213.     lea     si, Mark
  214.     mov     cx, 5
  215.     cld
  216.     repz    cmpsb
  217.     jnz     contu
  218.     lea     dx, ReInst
  219.     jmp     PmtErr
  220. ;
  221. contu:  mov     ax, 3d00h
  222.     lea     dx, Path
  223.     int     21h
  224.     jnc     Contu1
  225.     jmp     PrFnErr
  226. ;
  227. Contu1: mov     bx, ax
  228.     push    bx
  229. ;
  230.     mov     ax, 4202h
  231.     xor     cx, cx
  232.     xor     dx, dx
  233.     int     21h                  ; dx:ax = gbj16 Size (Byte)
  234.     mov     cx, 400h             
  235.     div     cx
  236.     inc     ax
  237.     mov     useMem, ax           ; ax = gbj16 Size (KB)
  238.     pop     bx
  239.     mov     ah, 4eh
  240.     int     21h
  241. ;
  242.     mov     ah, 88h
  243.     int     15h                  ; ax = Extend MEM Size (KB)
  244.     sub     ax, useMem
  245.     jnc     cont0
  246.     jmp     prNoExt
  247. ;
  248. cont0:  mov     cx, 400h
  249.     mul     cx
  250.     add     dl, 10h
  251.     shl     ax, cl
  252.     mov     word ptr dAddr, ax
  253.     mov     byte ptr dAddr+2, dl
  254.     mov     byte ptr ExtBase+2, dl
  255.     mov     cl, 4
  256.     shr     ax, cl
  257.     mov     word ptr ExtBase, ax
  258.     mov     byte ptr sRight, 93h
  259.     mov     word ptr sRight+1, 0
  260.     mov     byte ptr dRight, 93h
  261.     mov     word ptr dRight+1, 0
  262. ;
  263.     lea     dx, Path
  264.     mov     ax, 3d00h
  265.     int     21h
  266.     jc      prFnErr
  267.     mov     bx, ax
  268.     push    bx
  269.     jmp     LdLoop
  270. ;
  271. prNoExt:lea     dx, NoExt
  272.     mov     ah, 9
  273.     int     21h
  274.     jmp     exit
  275. ;
  276. prFnErr:lea     dx, FnErr
  277. PmtErr: mov     ah, 9
  278.     int     21h
  279. exit:   mov     ax, 4cffh
  280.     int     21h
  281. ;
  282. LdLoop: pop     bx
  283.     push    bx
  284.     lea     dx, Buffer
  285.     mov     cx, 4000h
  286.     mov     ah, 3fh
  287.     int     21h
  288.     jc      prFnErr
  289.     cmp     ax, 0
  290.     jne     LdCont
  291.     jmp     Ended
  292. ;
  293. LdCont: mov     ax, 5000h
  294.     mov     word ptr sCount, ax
  295.     mov     ax, cs
  296.     mov     bx, ax
  297.     mov     cl, 4
  298.     shl     ax, cl
  299.     shr     bh, cl
  300.     lea     cx, Buffer
  301.     add     ax, cx
  302.     adc     bh, 0
  303.     mov     word ptr sAddr, ax
  304.     mov     byte ptr sAddr+2, bh
  305.     mov     ax, 5000h
  306.     mov     word ptr dCount, ax
  307.     mov     ax, cs
  308.     mov     es, ax
  309.     lea     si, GDT
  310.     mov     ah, 87h
  311.     mov     cx, 2000h
  312.     int     15h
  313.     mov     ax, word ptr dAddr
  314.     mov     bh, byte ptr dAddr+2
  315.     add     ax, 4000h
  316.     adc     bh, 0
  317.     mov     word ptr dAddr, ax
  318.     mov     byte ptr dAddr+2, bh
  319.     jmp     LdLoop
  320. ;
  321. Ended:  pop     bx
  322.     mov     ah, 3eh
  323.     int     21h
  324. ;
  325. ;       Set GDT Data:
  326. ;
  327.     mov     word ptr sCount, 0040h
  328.     mov     byte ptr sRight, 93h
  329.     mov     word ptr sRight+1, 0
  330.     mov     word ptr dCount, 0040h
  331.     mov     byte ptr dRight, 93h
  332.     mov     word ptr dRight+1, 0
  333. ;
  334.     lea     dx, Int15
  335.     mov     ax, 2515h
  336.     int     21h
  337.     lea     dx, Int16
  338.     mov     ax, 2516h
  339.     int     21h
  340.     mov     dx, Env
  341.     mov     es, dx
  342.     mov     ah, 49h
  343.     int     21h                     ; Free Environment
  344.     lea     dx, noExt
  345.     mov     cl, 4
  346.     shr     dx, cl
  347.     inc     dx
  348.     mov     ax, 3100h
  349.     int     21h
  350. ;
  351. Buffer  label   byte
  352. ;
  353. code    ends
  354.     end     begin
  355.