home *** CD-ROM | disk | FTP | other *** search
- ;
- ; fext.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
- ;
- GDT label byte
-
- db 8 dup(0)
- GDTdsc db 8 dup(0)
-
- ; SrcDsc:
- sCount dw 003fh
- sAddr db 0
- dw 0
- sRight db 93h
- dw 0
-
- ; DesDsc:
- dCount dw 003fh
- dAddr db 0
- dw 0
- dRight db 93h
- dw 0
-
- BiosCS db 8 dup(0)
- BiosSS db 8 dup(0)
- ;
- ExtBase dd 0
- ;
- Int16 proc far
- sti
- cmp ah, 80h
- je RdFont
- 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:Old15
- mov cx, word ptr cs:Old15+2
- cli
- mov es:[54h], dx
- mov es:[56h], cx
- mov dx, word ptr cs:Old16
- mov cx, word ptr cs:Old16+2
- mov es:[58h], dx
- mov es:[5ah], cx
- sti
- mov ah, 49h
- mov es, cs:Psp
- int 21h
- pop cx
- pop dx
- pop es
- iret
- ;
- RdFont: cmp cl, 0
- jne toOld
- ;
- pusha
- push es
- push ds
- mov ax, cs
- mov ds, ax
- 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
- add ax, word ptr ExtBase
- adc dl, byte ptr ExtBase+2
- mov word ptr sAddr, ax
- mov byte ptr sAddr+2, dl
- mov cl, 4
- mov ax, es
- mov dx, bx
- and bx, 000fh
- shr dx, cl
- add ax, dx
- mov ch, ah
- shl ax, cl
- shr ch, cl
- add ax, bx
- mov word ptr dAddr, ax
- mov byte ptr dAddr+2, ch
- mov ax, cs
- mov es, ax
- ;
- lea si, GDT ; es:si = GDT
- mov ah, 87h
- mov cx, 0010h ; Transfer 32 bytes
- int 15h
- Ret0: pop ds
- pop es
- popa
- iret
- Int16 endp
- ;
- Old16 dd ?
- ;
- Old15 dd ?
- ;
- useMem dw ?
- ;
- UseF16 db 0
- ;
- Int15 proc far
- cmp ah, 88h
- je toNew
- jmp dword ptr cs:Old15
- ;
- toNew: pushf
- call dword ptr cs:Old15
- sub ax, cs:useMem
- iret
- Int15 endp
- ;
- NoExt db 'fext: No enough extend memory !', 0dh, 0ah, '$'
- FnErr db 'fext: gbj16 open error !', 0dh, 0ah, '$'
- ;
- Mark db 13,10,9,'CHCS'
- ;
- ReInst db 'fext: System font has been loaded !', 0dh, 0ah, '$'
- NameOff dw ?
- Path db 80 dup(?)
- Font db 'gbj16', 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, [bx]
- inc bx
- cmp al, ' '
- je fLoop0
- cmp al, 09h
- je fLoop0
- cmp al, 0dh
- je fEnd0
- cmp al, '/'
- jne fEnd0
- mov al, [bx]
- or al, 20h
- cmp al, 'f'
- jne fEnd0
- mov UseF16, 1
- mov byte ptr Font+2, al
- mov byte ptr FnErr+6, al
- ;
- fEnd0: mov di, NameOff
- lea si, Font
- iLoop2: lodsb
- stosb
- cmp al, 0
- jne iLoop2
- ;
- ;
- mov ax, 3515h
- int 21h
- mov word ptr cs:Old15, bx
- mov word ptr cs:Old15+2, es
- 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, 3d00h
- lea dx, Path
- int 21h
- jnc Contu1
- jmp PrFnErr
- ;
- Contu1: mov bx, ax
- push bx
- ;
- mov ax, 4202h
- xor cx, cx
- xor dx, dx
- int 21h ; dx:ax = gbj16 Size (Byte)
- mov cx, 400h
- div cx
- inc ax
- mov useMem, ax ; ax = gbj16 Size (KB)
- pop bx
- mov ah, 4eh
- int 21h
- ;
- mov ah, 88h
- int 15h ; ax = Extend MEM Size (KB)
- sub ax, useMem
- jnc cont0
- jmp prNoExt
- ;
- cont0: mov cx, 400h
- mul cx
- add dl, 10h
- shl ax, cl
- mov word ptr dAddr, ax
- mov byte ptr dAddr+2, dl
- mov byte ptr ExtBase+2, dl
- mov cl, 4
- shr ax, cl
- mov word ptr ExtBase, ax
- mov byte ptr sRight, 93h
- mov word ptr sRight+1, 0
- mov byte ptr dRight, 93h
- mov word ptr dRight+1, 0
- ;
- lea dx, Path
- mov ax, 3d00h
- int 21h
- jc prFnErr
- mov bx, ax
- push bx
- jmp LdLoop
- ;
- prNoExt:lea dx, NoExt
- mov ah, 9
- int 21h
- jmp exit
- ;
- prFnErr:lea dx, FnErr
- PmtErr: mov ah, 9
- int 21h
- exit: mov ax, 4cffh
- int 21h
- ;
- LdLoop: pop bx
- push bx
- lea dx, Buffer
- mov cx, 4000h
- mov ah, 3fh
- int 21h
- jc prFnErr
- cmp ax, 0
- jne LdCont
- jmp Ended
- ;
- LdCont: mov ax, 5000h
- mov word ptr sCount, ax
- mov ax, cs
- mov bx, ax
- mov cl, 4
- shl ax, cl
- shr bh, cl
- lea cx, Buffer
- add ax, cx
- adc bh, 0
- mov word ptr sAddr, ax
- mov byte ptr sAddr+2, bh
- mov ax, 5000h
- mov word ptr dCount, ax
- mov ax, cs
- mov es, ax
- lea si, GDT
- mov ah, 87h
- mov cx, 2000h
- int 15h
- mov ax, word ptr dAddr
- mov bh, byte ptr dAddr+2
- add ax, 4000h
- adc bh, 0
- mov word ptr dAddr, ax
- mov byte ptr dAddr+2, bh
- jmp LdLoop
- ;
- Ended: pop bx
- mov ah, 3eh
- int 21h
- ;
- ; Set GDT Data:
- ;
- mov word ptr sCount, 0040h
- mov byte ptr sRight, 93h
- mov word ptr sRight+1, 0
- mov word ptr dCount, 0040h
- mov byte ptr dRight, 93h
- mov word ptr dRight+1, 0
- ;
- lea dx, Int15
- mov ax, 2515h
- int 21h
- lea dx, Int16
- mov ax, 2516h
- int 21h
- mov dx, Env
- mov es, dx
- mov ah, 49h
- int 21h ; Free Environment
- lea dx, noExt
- mov cl, 4
- shr dx, cl
- inc dx
- mov ax, 3100h
- int 21h
- ;
- Buffer label byte
- ;
- code ends
- end begin
-