home *** CD-ROM | disk | FTP | other *** search
- ;
- ; fxms.asm
- ;
- .286
- code segment
- org 100h
- assume cs:code, ds:code
- ;
- begin: jmp start
- ;
- Ver db 'CHCS 1.0'
- ;
- Psp dw ?
- Env dw ?
- db 0
- ;
- EMB label byte
- Count dd ? ; Transfer Bytes
- sHandle dw ? ; Source Handle
- sOffset dd ? ; Source Offset
- dHandle dw ? ; Destinate Handle
- dOffset dd ? ; Destinate Offset
- ;
- ;
- Int16 proc far
- sti
- cmp ah, 80h
- je iCont0
- cmp ah, 81h
- je iQuit
- toOld: jmp dword ptr cs:Old16
- ;
- iQuit: push es
- push dx
- push cx
- xor dx, dx
- mov es, dx
- mov dx, word ptr cs:Old16
- mov cx, word ptr cs:Old16+2
- cli
- mov es:[58h], dx
- mov es:[5ah], cx
- sti
- mov ah, 0ah
- mov dx, cs:xHandle
- call dword ptr cs:xEntry ; Free XMS
- mov ah, 49h
- mov es, cs:Psp
- int 21h
- pop cx
- pop dx
- pop es
- iret
- ;
- toRet0: jmp Ret0
- ;
- iCont0: cmp cl, 0
- jne toOld
- ;
- pusha
- push es
- push ds
- mov ax, cs
- mov ds, ax
- mov word ptr dOffset, bx
- mov word ptr dOffset+2, es
- and dx, 7f7fh
- sub dx, 2121h
- mov al, 94
- mul dh
- xor dh, dh
- add ax, dx ; ax = c1*94 + c2
- mov dl, ah
- mov cl, 5
- shl ax, cl ; ax *= 32
- shr dx, 1
- shr dx, 1
- shr dx, 1 ; dx:ax = XMS Offset
- mov word ptr sOffset, ax
- mov word ptr sOffset+2, dx
- cld
- lea si, EMB
- mov ah, 0bh
- call dword ptr xEntry
- Ret0: pop ds
- pop es
- popa
- iret
- Int16 endp
- ;
- xHandle dw 0
- xEntry dd ?
- ;
- UseF16 db 0
- ;
- Old16 dd ?
- ;
- XMSDev db 'XMMXXXX0'
- NoXMS db 'fxms: XMS memory not found !',0dh, 0ah, '$'
- Error db 'fxms: XMS error !', 0dh, 0ah, '$'
- NoPage db 'fxms: No enough XMS memory !', 0dh, 0ah, '$'
- FnErr db 'fxms: gbj16 open error !', 0dh, 0ah, '$'
- ;
- Mark db 13, 10, 9, 'CHCS'
- ;
- ReInst db 'fxms: System font has been loaded !', 0dh, 0ah, '$'
- ;
- NameOff dw ?
- Path db 80 dup(?)
- Font db 'gbj16', 0
- FHandle dw 0
- ;
- ;
- start: mov ax, ds
- mov Psp, ax
- mov ax, ds:[2ch]
- mov Env, ax
- xor si, si
- mov ds, ax
- iLoop0: cmp word ptr [si], 0
- je iEnd0
- inc si
- jmp iLoop0
- iEnd0: add si, +4
- lea di, Path
- iLoop1: lodsb
- stosb
- or al, al
- jz iEnd1
- cmp al, '\'
- jne iLoop1
- mov es:NameOff, di
- jmp iLoop1
- iEnd1: mov ax, cs
- mov ds, ax
- ;
- mov bx, 81h
- fLoop0: mov al, cs:[bx]
- inc bx
- cmp al, ' '
- je fLoop0
- cmp al, 09h
- je fLoop0
- cmp al, 0dh
- je fEnd0
- cmp al, '/'
- jne fEnd0
- mov al, cs:[bx]
- or al, 20h
- cmp al, 'f'
- jne fEnd0
- mov UseF16, 1
- mov byte ptr Font+2, al
- mov byte ptr FnErr+8, al
- ;
- fEnd0: mov di, NameOff
- lea si, Font
- iLoop2: lodsb
- stosb
- cmp al, 0
- jne iLoop2
- ;
- mov ax, 3516h
- int 21h
- mov word ptr Old16, bx
- mov word ptr Old16+2, es
- ;
- mov ax, 3f00h
- int 16h
- mov di, bx
- lea si, Mark
- mov cx, 5
- cld
- repz cmpsb
- jnz contu
- lea dx, ReInst
- jmp PmtErr
- ;
- contu: mov ax, 4300h
- int 2fh
- cmp al, 80h
- je cont0
- toErr: lea dx, NoXMS
- jmp PmtErr
- cont0: push es
- mov ax, 4310h
- int 2fh
- mov word ptr xEntry, bx
- mov word ptr xEntry+2, es
- pop es
- mov ah, 08h
- call dword ptr xEntry
- cmp bl, 0
- je cont1
- xErr: lea dx, Error
- jmp PmtErr
- cont1: cmp ax, 256
- jae cont2
- lea dx, NoPage
- jmp PmtErr
- cont2: mov ax, 3d00h
- lea dx, Path
- int 21h
- jnb cont3
- lea dx, FnErr
- jmp PmtErr
- cont3: mov FHandle, ax
- mov ah, 9
- mov dx, 256
- call dword ptr xEntry ; Alloc XMS
- cmp bl, 0
- jne xErr
- mov cs:xHandle, dx
- ;
- LoadF: mov word ptr Count, 4000h
- mov word ptr Count+2, 0
- mov word ptr sHandle, 0
- mov word ptr dOffset, 0
- mov word ptr dOffset+2, 0
- mov cx, 16 ; 16 KB * 16
- ldLoop: push cx
- lea dx, Buffer
- mov ah, 3fh ; Read Font
- mov bx, cs:FHandle
- mov cx, 4000h
- int 21h
- push ax
- lea dx, Buffer
- mov word ptr sOffset, dx
- mov word ptr sOffset+2, ds
- mov dx, xHandle
- mov word ptr dHandle, dx
- mov ah, 0bh
- lea si, EMB
- call dword ptr xEntry
- pop ax
- add word ptr dOffset, ax
- adc word ptr dOffset+2, 0
- pop cx
- loop ldLoop
- ;
- mov ah, 3eh
- mov bx, FHandle
- int 21h
- ;
- mov word ptr Count, 32
- mov word ptr Count+2, 0
- mov dx, xHandle
- mov word ptr sHandle, dx
- mov word ptr dHandle, 0
- ;
- mov ax, 2516h
- lea dx, Int16
- int 21h ; Set Interrupt
- mov ah, 49h
- mov es, Env
- int 21h ; Free Environment
- lea dx, XMSDev
- mov cl, 4
- shr dx, cl
- inc dx
- mov ax, 3100h
- int 21h
- ;
- PmtErr: mov ah, 9
- int 21h
- mov ax, 4c01h
- int 21h
- ;
- db 2 dup('XCS V1.2')
- ;
- Buffer label byte
- ;
- code ends
- end begin
-