home *** CD-ROM | disk | FTP | other *** search
- ;
- ; init.asm
- ;
- code segment byte public 'CODE'
- assume cs:code, ds:code
- ;
- include xcs.mac
- ;
- public StrCpy
- public StrCat
- public StrChr
- public main
- ;
- extrn ChcsPsp:word
- extrn ChcsEnv:word
- extrn OldInt08:dword
- extrn OldInt09:dword
- extrn OldInt10:dword
- extrn OldInt13:dword
- extrn OldInt16:dword
- extrn OldInt1c:dword
- extrn NewInt08:far
- extrn NewInt09:far
- extrn NewInt10:far
- extrn NewInt13:far
- extrn NewInt16:far
- extrn NewInt1c:far
- extrn PushBackStr:near
- extrn ISentries
- extrn Ascii:far
- extrn QuWei:far
- extrn FuHao:far
- extrn ver:near
- ;
- extrn F8x8:dword
- extrn F8x14:dword
- extrn F8x16:dword
- extrn TextVRamSEG:word
- extrn ScrBuf:word
- extrn mode:byte
- extrn bAttr:byte
- extrn nAttr:byte
- extrn kAttr:byte
- extrn sAttr:byte
- extrn eAttr:byte
- extrn TimeOut:word
- extrn CurTextMode:byte
- extrn inGrCursor:byte
- extrn ClockSwitch:byte
- extrn CharTable:byte
- extrn VideoCard:byte
- extrn Vi600x16:byte
- ;
- StrCpy proc near
- ;
- ; IN: [bp+4] = destin
- ; [bp+6] = source
- ;
- push bp
- mov bp, sp
- push si
- push di
- mov si, [bp+6]
- mov di, [bp+4]
- scLoop0: mov al, [si]
- inc si
- mov [di], al
- inc di
- or al, al
- jnz scLoop0
- pop di
- pop si
- pop bp
- ret
- StrCpy endp
- ;
- StrCat proc near
- ;
- ; IN: [bp+4] = destin
- ; [bp+6] = source
- ;
- push bp
- mov bp, sp
- push si
- push di
- mov si, [bp+6]
- mov di, [bp+4]
- scLoop1: cmp byte ptr [di], 0
- je scLoop0
- inc di
- jmp scLoop1
- ;
- StrCat endp
- ;
- StrChr proc near
- ;
- ; IN: [bp+4] = string
- ; [bp+6] = char
- ;
- push bp
- mov bp, sp
- push si
- mov si, [bp+4]
- mov al, [bp+6]
- scLoop2: mov ah, [si]
- inc si
- or ah, ah
- jz scNoMatch
- cmp al, ah
- jne scLoop2
- mov al, 1
- jmp StrChrRet0
- ;
- scNoMatch: mov al, 0
- StrChrRet0: pop si
- pop bp
- ret
- StrChr endp
- ;
- TSREnd label byte
- ;
- code ends
- ;
- ; Templiary Part :
- ;
- data segment para public 'DATA'
- ;
- ChcsMark db 0dh,0ah,9, 'CHCS'
- startp dw 0
- endpt dw 0
- Handle dw 0
- Sorry db 'chcsvga: Sorry, VGA/SVGA card not found !'
- db 0dh, 0ah, '$'
- BadMapFile db 'chcsvga: Character map file open error !'
- db 0dh, 0ah, '$'
- ReInst db 'chcsvga: CHCS ╓╨╬─╧╡═│╥╤╫░╚δ !', 0dh, 0ah, '$'
- ;
- Login db 'login',0dh,0
- ;
- dMark db 'DIGITS',0
- sMark db 'SYMBOLS',0
- nMark db 'NUMPADS',0
- ;
- bcMark db 'BACKCOLOR',0
- ncMark db 'NAMECOLOR',0
- kcMark db 'KEYCOLOR',0
- scMark db 'SAMECOLOR',0
- ecMark db 'SELECOLOR',0
- ;
- timMark db 'TIMEOUT',0
- xmMark db 'TEXTMODE',0
- ;
- cursorMark db 'CURSORTYPE', 0
- clockMark db 'CLOCK', 0
- vicardMark db 'VIDEOCARD', 0
- ;
- VModeTable label byte
- ;
- ; No.1 800x600x16 No.2 1024x768x16
- ; No.3 640x400x256 No.4 640x480x256
- ; No.5 800x600x256 No.6 1024x768x256
- ; No.7 0 No.8 0
- ;
- ; 0. Standard VGA :
- db 8 dup(0)
- ; 1. 1Standard VESA :
- db 6ah, 04h, 00h, 01h, 03h, 05h, 0, 0
- ; 2. Trident Super VGA :
- db 5bh, 5fh, 5ch, 5dh, 00h, 62h, 0, 0
- ; 3. Paradise Super VGA :
- db 58h, 5dh, 5eh, 5fh, 5ch, 00h, 0, 0
- ; 4. ATI Super VGA :
- db 53h, 55h, 61h, 62h, 63h, 00h, 0, 0
- ; 5. Chips Super VGA :
- db 6ah, 72h, 78h, 79h, 7ch, 7eh, 0, 0
- ; 6. Video 7 Super VGA :
- db 62h, 65h, 66h, 67h, 69h, 00h, 0, 0
- ; 7. Geona Super VGA :
- db 6ah, 5fh, 7eh, 00h, 00h, 00h, 0, 0
- ; 8. Tseng Labs Super VGA :
- db 29h, 37h, 00h, 2eh, 30h, 38h, 0, 0
- ;
- NameOff dw 0
- Path db 88 dup(?)
- CfgFile db 'chcs.ini', 0
- BufLine db 88 dup(?)
- ;
- data ends
- ;
- code segment byte public 'CODE'
- assume cs:code, ds:data, ss:stack
- ;
- LoadBiosFont proc near
- push bp
- push ds
- mov ax, cs
- mov ds, ax
- mov ax, 1130h
- mov bh, 3
- int 10h
- mov word ptr F8x8, bp
- mov word ptr F8x8+2, es
- mov ax, 1130h
- mov bh, 2
- int 10h
- mov word ptr F8x14, bp
- mov word ptr F8x14+2, es
- mov ax, 1130h
- mov bh, 6
- int 10h
- mov word ptr F8x16, bp
- mov word ptr F8x16+2, es
- pop ds
- pop bp
- ret
- LoadBiosFont endp
- ;
- ResetBiosKey proc near
- cli
- push es
- xor ax, ax
- mov es, ax
- mov byte ptr es:[41ah], 1eh
- mov byte ptr es:[41ch], 1eh
- pop es
- sti
- ret
- ResetBiosKey endp
- ;
- TestVGA proc near
- mov ax, 1a00h
- int 10h
- cmp al, 1ah
- jne noVGA
- cmp bl, 7
- je MonoVGA
- cmp bl, 8
- je ColorVGA
- MonoVGA: mov cs:TextVRamSEG, 0b000h
- noVGA: mov al, 0
- ret
- ;
- ColorVGA: mov cs:TextVRamSEG, 0b800h
- mov al, 1
- ret
- TestVGA endp
- ;
- CloseFile proc near
- mov ah, 3eh
- mov bx, Handle
- int 21h
- ret
- CloseFile endp
- ;
- LoadCharMap proc near
- push ds
- mov ax, 3d00h
- mov dx, NameOff
- int 21h
- jnc LdChCont0
- lea dx, Path
- mov ax, 3d00h
- int 21h
- jc BadCharMap
- LdChCont0: mov bx, ax
- push cs
- pop ds
- mov ah, 3fh
- mov cx, 257
- lea dx, CharTable
- int 21h
- jc BadCharMap
- mov ah, 3eh
- int 21h
- jc BadCharMap
- pop ds
- ret
- ;
- BadCharMap: pop ds
- mov ah, 09h
- lea dx, BadMapFile
- int 21h
- mov ax, 4cffh
- int 21h
- ;
- LoadCharMap endp
- ;
- ReadFile proc near
- ;
- ; IN: ds:dx = Path
- ;
- push ds
- mov ax, ds
- mov es, ax
- mov ax, 3d00h
- int 21h
- jc rfError
- mov es:Handle, ax
- mov bx, ax
- mov ax, cs
- mov ds, ax
- mov ah, 3fh
- lea dx, ScrBuf
- mov cx, 4096
- int 21h
- mov es:endpt, ax
- jnc rfCont0
- pop ds
- call CloseFile
- mov al, 0
- ret
- ;
- rfCont0: mov al, 1
- pop ds
- ret
- rfError: mov al, 0
- pop ds
- ret
- ReadFile endp
- ;
- ReadLine proc near
- push es
- push ds
- push si
- push di
- mov ax, ds
- mov es, ax
- lea di, BufLine
- mov ax, cs
- mov ds, ax
- lea si, ScrBuf
- mov bx, es:startp
- add si, bx
- xor cx, cx
- cld
- rlLoop: lodsb
- inc bx
- cmp bx, es:endpt
- jae rlCont0
- or al, al
- jz rlEnd0
- cmp al, 0dh
- je rlLoop
- cmp al, 0ah
- je rlEnd0
- cmp cx, 88
- jae rlLoop
- cmp al, 'a'
- jb rlSave
- cmp al, 'z'
- ja rlSave
- and al, 5fh
- rlSave: stosb
- inc cx
- cmp bx, es:endpt
- jb rlLoop
- rlCont0: cmp cx, 0
- jne rlEnd0
- mov al, 0
- jmp rlExit
- ;
- rlEnd0: mov byte ptr es:[di], 0
- mov word ptr es:startp, bx
- mov al, 1
- rlExit: pop di
- pop si
- pop ds
- pop es
- ret
- ReadLine endp
- ;
- TransByte proc near
- ;
- ; IN: dl = NumChar
- ; bh = '$' ... Hex
- ; OUT: dl = Value
- ;
- xor dh, dh
- cmp dl, '0'
- jb tbExit0
- cmp dl, '9'
- jbe tbDigit
- cmp bh, '$'
- jne tbExit0
- cmp dl, 'A'
- jb tbExit0
- cmp dl, 'F'
- ja tbExit0
- sub dl, ('A'- 10)
- jmp tbExit1
- tbDigit: sub dl, '0'
- tbExit1: clc
- ret
- tbExit0: stc
- ret
- TransByte endp
- ;
- SearchVar proc near
- ;
- ; IN: di = Mark Str
- ; bh = Trans Char
- ; OUT: ax = Value
- ; CF flag = 0 ... Ok
- ; CF flag = 1 ... Fail
- ;
- push si
- lea si, BufLine
- cld
- svLoop0: lodsb
- cmp al, ' '
- je svLoop0
- cmp al, 09h
- je svLoop0
- cmp al, 0
- je svExit0
- mov ah, [di]
- or ah, ah
- je svLoop1
- cmp al, ah
- jne svExit0
- inc di
- jmp svLoop0
- ;
- svLoop1: lodsb
- cmp al, ' '
- je svLoop1
- cmp al, 09h
- je svLoop1
- cmp al, '='
- je svLoop1
- mov bl, 10
- cmp bh, '$'
- jne svSkipHex
- mov bl, 16
- svSkipHex: cmp al, bh
- je svCont0
- cmp bh, ' '
- jne svExit0
- dec si
- svCont0: xor ax, ax
- xor dh, dh
- mov dl, [si]
- or dl, dl
- jz svExit0
- call TransByte
- jc svExit0
- mov ax, dx
- mov dl, [si+1]
- or dl, dl
- je svSave
- cmp dl, ' '
- je svSave
- call TransByte
- jc svExit0
- mul bl
- add ax, dx
- mov dl, [si+2]
- or dl, dl
- je svSave
- cmp dl, ' '
- je svSave
- call TransByte
- jc svExit0
- mul bl
- add ax, dx
- svSave: clc
- jmp svExit
- svExit0: stc
- svExit: pop si
- ret
- SearchVar endp
- ; ;;;;;;;;;;;;;;;;;;;;;
- ReadConfig proc near
- lea dx, CfgFile
- call ReadFile
- or al, al
- jnz toGetVars
- lea dx, Path
- call ReadFile
- or al, al
- jnz toGetVars
- ret
- ;
- SearchVarLoop: lea bx, BufLine
- cmp byte ptr [bx], '#'
- jne toGetDmode
- toGetVars: jmp toReadLine
- ;
- toGetDmode: lea di, dMark
- mov bh, 'D'
- call SearchVar
- jc toGetSmode
- cmp ax, 9
- jae inValidDmode
- mov byte ptr cs:mode.dmode, al
- inValidDmode: jmp toReadLine
- ;
- toGetSmode: lea di, sMark
- mov bh, 'S'
- call SearchVar
- jc toGetPmode
- cmp ax, 1
- ja inValidSmode
- mov byte ptr cs:mode.smode, al
- inValidSmode: jmp toReadLine
- ;
- toGetPmode: lea di, nMark
- mov bh, 'P'
- call SearchVar
- jc toGetBackColor
- cmp ax, 5
- ja inValidPmode
- mov byte ptr cs:mode.pmode, al
- inValidPmode: jmp toReadLine
- ;
- toGetBackColor: lea di, bcMark
- mov bh, ' '
- call SearchVar
- jc toGetNameColor
- cmp ax, 7
- ja inValidbAttr
- mov cl, 4
- shl al, cl
- mov byte ptr cs:bAttr, al
- inValidbAttr: jmp toReadLine
- ;
- toGetNameColor: lea di, ncMark
- mov bh, ' '
- call SearchVar
- jc toGetKeyColor
- cmp ax, 0fh
- ja inValidnAttr
- mov byte ptr cs:nAttr, al
- inValidnAttr: jmp toReadLine
- ;
- toGetKeyColor: lea di, kcMark
- mov bh, ' '
- call SearchVar
- jc toGetSameColor
- cmp ax, 0fh
- ja inValidkAttr
- mov byte ptr cs:kAttr, al
- inValidkAttr: jmp toReadLine
- ;
- toGetSameColor: lea di, scMark
- mov bh, ' '
- call SearchVar
- jc toGetSeleColor
- cmp ax, 0fh
- ja inValidsAttr
- mov byte ptr cs:sAttr, al
- inValidsAttr: jmp toReadLine
- ;
- toGetSeleColor: lea di, ecMark
- mov bh, ' '
- call SearchVar
- jc toGetTimeOut
- cmp ax, 0fh
- ja inValideAttr
- mov byte ptr cs:eAttr, al
- inValideAttr: jmp toReadLine
- ;
- toGetTimeOut: lea di, timMark
- mov bh, ' '
- call SearchVar
- jc toGetTextMode
- mov word ptr cs:TimeOut, ax
- jmp toReadLine
- ;
- toGetTextMode: lea di, xmMark
- mov bh, ' '
- call SearchVar
- jc toGetCursor
- cmp ax, 3
- ja invalidTxMode
- mov byte ptr cs:CurTextMode, al
- invalidTxMode: jmp toReadLine
- ;
- toGetCursor: lea di, cursorMark
- mov bh, ' '
- call SearchVar
- jc toGetClock
- cmp ax, 1
- ja invalidCursor
- mov byte ptr cs:inGrCursor, al
- invalidCursor: jmp toReadLine
- ;
- toGetClock: lea di, clockMark
- mov bh, ' '
- call SearchVar
- jc toGetViCard
- cmp ax, 1
- ja invalidClock
- mov byte ptr cs:ClockSwitch, al
- invalidClock: jmp toReadLine
- ;
- toGetViCard: lea di, vicardMark
- mov bh, ' '
- call SearchVar
- jc toReadLine
- cmp al, 7
- ja toReadLine
- ;
- mov byte ptr cs:VideoCard, al
- push es
- mov bl, al
- mov ax, cs
- mov es, ax
- lea si, VModeTable
- xor bh, bh
- shl bx, 1
- shl bx, 1
- shl bx, 1
- add si, bx
- lea di, Vi600x16
- mov cx, 8
- cld
- rep movsb
- pop es
- jmp toReadLine
- ;
- toReadLine: call ReadLine
- or al,al
- jz ReadCfgEnd
- jmp SearchVarLoop
- ;
- ReadCfgEnd: call CloseFile
- ret
- ReadConfig endp
- ;
- GetPath proc near
- push ds
- mov ax, ds
- mov es, ax
- lea di, Path
- mov ax, cs:ChcsEnv
- mov ds, ax
- xor si, si
- GetPathLoop0: cmp word ptr [si], 0
- je GetPathEnd0
- inc si
- jmp GetPathLoop0
- ;
- GetPathEnd0: add si, +4
- cld
- GetPathLoop1: lodsb
- stosb
- or al, al
- jz GetPathEnd1
- cmp al, '\'
- jne GetPathLoop1
- mov es:NameOff, di
- jmp GetPathLoop1
- ;
- GetPathEnd1: mov di, es:NameOff
- mov ax, cs:ChcsPsp
- mov ds, ax
- mov si, 81h
- cld
- CmdLineLoop0: lodsb
- cmp al, 0dh
- je CmdLineEnd
- cmp al, ' '
- je CmdLineLoop0
- cmp al, 09h
- je CmdLineLoop0
- cmp al, '/'
- jne CmdLineEnd
- lodsb
- and al, 5fh
- cmp al, 'C'
- jne CmdLineEnd
- lodsb
- cmp al, ':'
- jne CmdLineEnd
- mov cx, 13
- CmdLineLoop1: lodsb
- cmp al, '.'
- jb CmdLineCont0
- stosb
- loop CmdLineLoop1
- CmdLineCont0: xor al, al
- stosb
- mov ax, data
- mov ds, ax
- call LoadCharMap
- ;
- CmdLineEnd: pop ds
- mov di, NameOff
- lea si, CfgFile
- cld
- GetPathLoop2: lodsb
- stosb
- or al, al
- jnz GetPathLoop2
- ret
- GetPath endp
- ;
- prVer proc near
- push ds
- push cs
- pop ds
- lea dx, ver
- mov ah, 09h
- int 21h
- pop ds
- ret
- prVer endp
- ;
- assume cs:code, ds:data, ss:stack
- main proc far
- mov ax, ds
- mov cs:ChcsPsp, ax
- mov ax, ds:[2ch]
- mov cs:ChcsEnv, ax
- ;
- mov ax, data
- mov ds, ax
- ;
- call TestVGA
- or al, al
- jnz mainCont0
- lea dx, Sorry
- Error: mov ah, 09h
- int 21h
- mov ax, 4c01h
- int 21h
- ;
- mainCont0: mov ax, 3508h
- int 21h
- mov word ptr cs:OldInt08+2, es
- mov word ptr cs:OldInt08, bx
- mov ax, 3509h
- int 21h
- mov word ptr cs:OldInt09+2, es
- mov word ptr cs:OldInt09, bx
- mov ax, 3510h
- int 21h
- mov word ptr cs:OldInt10+2, es
- mov word ptr cs:OldInt10, bx
- mov ax, 3513h
- int 21h
- mov word ptr cs:OldInt13+2, es
- mov word ptr cs:OldInt13, bx
- mov ax, 3516h
- int 21h
- mov word ptr cs:OldInt16+2, es
- mov word ptr cs:OldInt16, bx
- mov ax, 351ch
- int 21h
- mov word ptr cs:OldInt1c+2, es
- mov word ptr cs:OldInt1c, bx
- ;
- mov ax, 3f00h
- int 16h
- mov di, bx
- lea si, ChcsMark
- mov cx, 5
- cld
- repz cmpsb
- jnz mainCont1
- lea dx, ReInst
- jmp Error
- ;
- mainCont1: call LoadBiosFont
- ; call ResetBiosKey
- ;
- ; mov ax, 6
- ; push ax
- ; lea ax, Login
- ; push ax
- ; call PushBackStr
- ; add sp, +4
- ;
- call GetPath
- call ReadConfig
- ;
- mov ax, cs
- mov ds, ax
- mov ax, 2508h
- lea dx, NewInt08
- int 21h
- mov ax, 2509h
- lea dx, NewInt09
- int 21h
- mov ax, 2510h
- lea dx, NewInt10
- int 21h
- mov ax, 2513h
- lea dx, NewInt13
- int 21h
- mov ax, 2516h
- lea dx, NewInt16
- int 21h
- mov ax, 251ch
- lea dx, NewInt1c
- int 21h
- cmp CurTextMode, 3
- jne toVMode3
- mov CurTextMode, 0
- mov ax, 0006h
- jmp InitCRT
- toVMode3: mov ax, 0003h
- InitCRT: int 10h
- ; call prVer
- lea dx, TSREnd
- add dx, 100h
- mov cl, 4
- shr dx, cl
- inc dx
- mov ax, 3100h
- int 21h
- main endp
- ;
- code ends
- ;
- stack segment para STACK 'STACK'
- db 64 dup('CHCS 1.0')
- stack ends
- ;
- end main
-