home *** CD-ROM | disk | FTP | other *** search
- ;
- ; fems.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
- ;
- 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 dx, cs:EHandle
- mov ah, 45h
- int 67h
- mov ah, 49h
- mov es, cs:Psp
- int 21h
- pop cx
- pop dx
- pop es
- iret
- ;
- toRet0: jmp exit
- ;
- iCont0: cmp cl, 0
- jne toOld
- ;
- pusha
- push es
- push ds
- mov ax, cs
- mov ds, ax
- mov di, bx ; es:di = buf[32]
- and dx, 7f7fh
- sub dx, 2121h
- mov al, 94
- mul dh
- xor dh, dh
- add ax, dx
- shl ax, 1
- mov cx, 400h
- xor dx, dx
- div cx
- push dx
- mov bx, ax
- ;
- ; push es
- ; push di
- ; push bx
- ; mov ax, cs
- ; mov es, ax
- ; mov ds, ax
- ; lea di, MapRegs
- ; mov ax, 4e00h
- ; int 67h
- ;
- mov ax, 4403h
- ; pop bx
- mov dx, EHandle
- int 67h
- ;
- ; mov ax, 4e01h
- ; lea si, MapRegs
- ; int 67h
- ;
- ; pop di
- ; pop es
-
- pop dx
- mov ax, FrAddr
- add ax, dx
- mov ds, ax
- mov cx, 16
- xor si, si
- cld
- rep movsw
- exit: pop ds
- pop es
- popa
- iret
- Int16 endp
- ;
- FrAddr dw 0
- EHandle dw 0
- Old16 dd ?
- ;
- UseF16 db 0
- ;
- ;MapRegs db 128 dup(?)
- ;
- ;ChrBuf db 96*16 dup(0)
- ;
- ;
- EMSDev db 'EMMXXXX0'
- NoEMS db 'fems: EMS memory not found !',0dh, 0ah, '$'
- Error db 'fems: EMS error !', 0dh, 0ah, '$'
- NoPage db 'fems: No enough EMS memory !', 0dh, 0ah, '$'
- ;
- Mark db 13, 10, 9, 'CHCS'
- ;
- ReInst db 'fems: 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, cs:[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
- ;
- fEnd0: mov di, NameOff
- lea si, Font
- iLoop2: lodsb
- stosb
- cmp al, 0
- jne iLoop2
- ;
- mov di, NameOff
- lea si, Font
- iLoop3: lodsb
- stosb
- cmp al, 0
- jne iLoop3
- ;
- 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, 3567h
- int 21h
- mov di, 000ah
- lea si, EMSDev
- mov cx, 8
- cld
- repz cmpsb
- jz cont0
- lea dx, NoEMS
- jmp PmtErr
- cont0: mov ah, 42h ; Get Free Pages
- int 67h
- cmp ah, 0
- jz cont1
- lea dx, Error
- jmp PmtErr
- cont1: cmp bx, 17
- jnb cont2
- lea dx, NoPage
- jmp PmtErr
- cont2: mov ah, 41h ; Get Frame Addr
- int 67h
- cmp ah, 0
- je cont3
- lea dx, Error
- jmp PmtErr
- cont3: add bx, 0c00h
- mov FrAddr, bx
- mov ah, 43h ; Alloc Pages
- mov bx, 17
- int 67h
- cmp ah, 0
- je cont4
- lea dx, Error
- jmp PmtErr
- cont4: mov EHandle, dx
- mov ax, 3d00h
- lea dx, Path
- int 21h
- jnb cont5
- jmp PmtErr
- ;
- cont5: mov bx, ax
- mov FHandle, ax
- xor cx, cx
- xor dx, dx
- mov ax, 4200h
- int 21h
- jnb cont6
- jmp PmtErr
- ;
- cont6: xor bx, bx
- ldLoop: push bx
- mov ax, 4403h ; Map Pages (bx = Logical Page)
- mov dx, EHandle
- int 67h
- pop bx
- cmp ah, 0
- je cont7
- lea dx, Error
- jmp PmtErr
- cont7: push bx
- push ds
- mov bx, FHandle
- mov cx, FrAddr
- mov ds, cx
- mov cx, 4000h
- xor dx, dx
- mov ah, 3fh
- int 21h
- pop ds
- pop bx
- inc bx
- cmp bx, 17
- jb ldLoop
- ;
- mov ah, 3eh
- mov bx, FHandle
- int 21h
- ;
- mov ax, 2516h
- lea dx, Int16
- int 21h
- mov ah, 49h
- mov dx, Env
- mov es, dx
- int 21h ; Free Environment
- sti
- lea dx, EMSDev
- mov cl, 4
- shr dx, cl
- inc dx
- mov ax, 3100h
- int 21h
- PmtErr: mov ah, 9
- int 21h
- mov ax, 4c01h
- int 21h
- code ends
- end begin
-