home *** CD-ROM | disk | FTP | other *** search
- ;
- ; fram.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 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 ds
- and dx, 7f7fh
- sub dx, 2121h
- mov al, 94
- mul dh
- xor dh, dh
- add ax, dx ; ax = c1*94 + c2
- shl ax, 1
- lea si, cs:FontStart
- mov di, bx
- mov bx, cs
- add ax, bx
- mov ds, ax
- mov cx, 10h
- cld
- rep movsw
- Ret0: pop ds
- popa
- iret
- Int16 endp
- ;
- ;
- UseF16 db 0
- ;
- Old16 dd ?
- ;
- FHandle dw 0
- ;
- LoadFont: mov FHandle, ax
- lea dx, FontStart
- mov cx, 8
- push ds
- ;
- ldLoop: push cx
- push dx
- mov ah, 3fh ; Read Font
- mov bx, cs:FHandle
- mov cx, 8000h
- int 21h
- pop dx
- mov ax, ds
- add ax, 0800h
- mov ds, ax
- pop cx
- loop ldLoop
- ;
- pop ds
- mov ah, 3eh
- mov bx, FHandle
- int 21h
- ;
- mov ax, 2516h
- lea dx, Int16
- int 21h ; Set Interrupt
- mov ah, 49h
- mov es, Env
- int 21h ; Free Environment
- ;
- lea dx, FontStart
- mov cl, 4
- shr dx, cl
- inc dx
- add dx, 4000h ; Font = 256 KB
- mov ax, 3100h
- int 21h
- ;
- PmtErr: mov ah, 9
- int 21h
- mov ax, 4c01h
- int 21h
- ;
- db 100h dup(0)
- rStack label byte
- ;
- FontStart label byte
- ;
- NoPage db 'fram: No enough memory !', 0dh, 0ah, '$'
- FnErr db 'fram: gbj16 open error !', 0dh, 0ah, '$'
- ;
- Mark db 13, 10, 9, 'CHCS'
- ;
- ReInst db 'fram: System font has been loaded !', 0dh, 0ah, '$'
- ;
- NameOff dw ?
- Path db 80 dup(?)
- Font db 'gbj16', 0
- ;
- ;
- start: lea ax, rStack
- mov sp, ax
- 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, 3d00h
- lea dx, Path
- int 21h
- jnb cont3
- lea dx, FnErr
- jmp PmtErr
- ;
- cont3: jmp LoadFont
- ;
- db 2 dup('CHCS 1.0')
- ;
- code ends
- end begin
-