home *** CD-ROM | disk | FTP | other *** search
- ;
- ; xis.asm
- ;
- .286
- code segment
- org 100h
- assume cs:code, ds:code
- begin: jmp init
- ;
- Mark db 'CHCS 1.0'
- ;
- Psp dw ?
- Env dw ?
- db ?
- ;
- ; ---------------------------------------
- ;
- xHandle dw ?
- xEntry dd 0
- ; ------------------------------------------------
- xStruc label word
- Count dw ? ; Transfer Bytes
- dw 0
- sHandle dw ? ; Source Handle
- sOffset dd ? ; Source Offset
- dHandle dw ? ; Destinate Handle
- dOffset dd ? ; Destinate Offset
- ; ------------------------------------------------
- xStruc2 label word
- Count2 dw ? ; Transfer Bytes
- dw 0
- sHandle2 dw ? ; Source Handle
- sOffset2 dd ? ; Source Offset
- dHandle2 dw ? ; Destinate Handle
- dOffset2 dd ? ; Destinate Offset
- ; ------------------------------------------------
- dSize dw ?
- nPage db ?
- eSize dw ?
- pSize dw 1128
- ;
- cPage db 0
- cSize dw 1128
- cPntr dw ?
- CodeEnd dw ?
- ;
- ; ---------------------------------------
- ;
- CCs dw 32 dup(?)
- Keys db 12 dup(?)
- ;
- ;
- bAttr db 70h ;
- kAttr db 0eh ; ╩Σ╚δ┬δ╔½
- eAttr db 04h ; 1-0╨≥║┼╔½
- sAttr db 00h ; ═¼┬δ╫╓╔½
- nAttr db 0eh ; ':'ɫ
- ;
- Current db ?
- tmp db ?
- KTable db 8 dup(0)
- Fname db 8*16 dup(0)
- NameOff dw ?
- Path db 88 dup(0)
- Handle dw ?
- ;
- Int16 dd ?
- ;
- SameNum db 0
- SameOfs db 0
- SamAddr dd ?
- KeyNum db 0
- KeyBuf db 12 dup(?) ; ╝ⁿ┼╠╗║│σ╟°
- ;
- PmtX db ?
- ;
- AutoPop db 0
- ;
- KeyEnd db 0
- TabOff dw ?
- ;
- pgSize dw 11
- pageMin dw 0
- pageMax dw 10
- sameCnt dw 0
- sameMax dw 0
- ;
- inSrch db 0 ; ─ú║²▓Θ╒╥▒Ω╓╛
- reSrch db 0 ; ╖┤╧≥▓Θ╒╥▒Ω╓╛
- ;
- ; ---------------------------------------
- ;
- KeyProc proc far
- ;
- ; IN: ax = 0ffffh
- ; bh = KeyNo
- ; bl = 0ffh: Unload the KeyNo Encode
- ; bl != 0ffh: Set KeyMode to KeyNo
- ; ax != 0ffffh: Keyboard Key
- ;
- cmp ax, 0ffffh
- je toSetKmode
- jmp TreatKey
- toSetKmode: cmp bl, 10h
- je inExit
- mov cs:KeyNum, 0
- mov cs:KeyEnd, 0
- mov cs:SameNum, 0
- cmp bl, 0ffh
- je unLoad
- ; call sKmode
- inExit: jmp kRetn
- ;
- unLoad: push es
- mov ah, 49h
- mov es, cs:Psp
- int 21h
- pop es
- cmp cs:nPage, 0
- je unExit
- mov ah, 0ah
- mov dx, cs:xHandle
- call dword ptr cs:xEntry
- unExit: jmp kRetn
- ;
- TreatKey: cmp al, 08h ; Backspace
- je toBack
- cmp al, 0dh ; Enter
- je toReset
- cmp al, 1bh ; Escape
- je toReset
- cmp al, ' ' ; Space bar
- je toSpace
- or al, al ; Extend Keys
- jz kElse
- cmp al, cs:WildKey
- je toMatch
- push es
- push di
- push cs
- pop es
- lea di, cs:KeyTab
- mov cx, 112
- cld
- repne scasb
- pop di
- pop es
- mov cx, 0
- jz toMatch
- cmp al, '[' ; Last page
- je toPgBack
- cmp al, ',' ; Last page
- je toPgBack
- cmp al, ']' ; Next page
- je toPgFore
- cmp al, '.' ; Next page
- je toPgFore
- ;
- kElse: cmp cs:KeyNum, 0
- jne kConte
- retf
- kConte: cmp al, ';'
- je toSele
- cmp al, '0'
- jb kBeep
- cmp al, '9'
- jbe toSele
- kBeep: mov ax, 0e07h
- int 10h
- toRetn: jmp kRetn
- ;
- toSele: call kSele
- toRet0: retf
- ;
- toSpace: jmp kSpace
- ;
- toReset: jmp kReset
- ;
- toBack: cmp cs:KeyEnd, 1
- je toReset
- jmp kBack
- ;
- toPgBack: jmp kPgBack
- ;
- toPgFore: jmp kPgFore
- ;
- toMatch: cmp cs:KeyEnd, 0
- je toMatchCont1
- cmp al, ';'
- je toSele
- cmp al, '0'
- jb toMatchCont0
- cmp al, '9'
- jbe toSele
- toMatchCont0: mov cs:AutoPop, 1
- toMatchCont1: mov cs:inSrch, 0
- mov cs:reSrch, 0
- mov cs:pageMin, 0
- mov cs:pageMax, 10
- jmp kMatch
- ;
- kSpace: cmp cs:KeyNum, 0
- je toRet0
- jmp toSele
- ;
- kPgBack: cmp cs:KeyNum, 0
- je toRet0
- cmp cs:pageMin, 0
- je toRetn
- mov cs:reSrch, 1
- mov bx, cs:pgSize
- sub cs:pageMin, bx
- sub cs:pageMax, bx
- jmp PgSet
- ;
- kPgFore: cmp cs:KeyNum, 0
- je kRet0
- mov cs:reSrch, 0
- mov bx, cs:pageMax
- cmp bx, cs:sameMax
- jae kRetn
- mov bx, cs:pgSize
- add cs:pageMin, bx
- add cs:pageMax, bx
- PgSet: dec cs:KeyNum
- mov bl, cs:KeyNum
- xor bh, bh
- mov al, cs:KeyBuf[bx]
- jmp kMatch
- ;
- kBack: cmp cs:KeyNum, 0
- je kRet0
- dec cs:KeyNum
- jz kClear
- dec cs:KeyNum
- mov bl, cs:KeyNum
- xor bh, bh
- mov al, cs:KeyBuf[bx]
- jmp toMatch
- ;
- kReset: cmp cs:KeyNum, 0
- je kRet0
- mov cs:KeyNum, 0
- kClear: mov cs:KeyEnd, 0
- mov ah, 24h
- int 16h
- kRetn: xor ax, ax
- mov cx, ax
- kRet0: retf
- ;
- kMatch: push es
- push ds
- push di
- push si
- push cs
- pop ds
-
- mov cPage, 0
- mov inSrch, 0
- mov sameCnt, 0
- mov KeyEnd, 0
- mov pgSize, 11
- xor bh, bh
- mov bl, KeyNum
- cmp bl, 4
- jb kmCont0
- xor bx, bx
- kmCont0: mov KeyBuf[bx], al
- call prKeys
- inc KeyNum
- cmp KeyNum, 4
- je kGetS4
- ja kToS4
- ;
- kTo123: mov SameNum, 0
- mov AutoPop, 0
- kSr123: call Key123
- xor ch, ch
- cmp AutoPop, 1
- jne kToEx
- mov cx, 0101h
- jmp k4Exit
- kToEx: jmp kS4Ex
- ;
- kToS4: mov KeyNum, 1
- cmp SameNum, 1
- jbe kTo123
- mov SameNum, 0
- mov AutoPop, 1
- jmp kSr123
- ;
- kGetS4: mov KeyEnd, 1
- mov SameNum, 0
- mov AutoPop, 0
- k4Srch: lea bx, KeyBuf
- mov ax, [bx]
- mov dx, [bx+2]
- mov ch, WildKey
- cmp al, ch
- je SetSrch
- cmp ah, ch
- je SetSrch
- cmp dl, ch
- je SetSrch
- cmp dh, ch
- je SetSrch
- jmp kS4Srch
- ;
- SetSrch: mov inSrch, 1
- mov pgSize, 6
- ;
- kS4Srch: call MatchUcWx
- cmp SameNum, 1
- jb kS4Skip
- jmp SkipCW4
- ;
- kS4Skip: lea si, CodeTab
- lea di, NextTab
- cmp nPage, 0
- je kS4Loop
- call MapPage
- lea di, CodeTab+1128
- jmp kS4Loop
- ;
- k4toNext: jmp k4Next
- ;
- k4NextPage: cmp nPage, 0
- je k4toNext
- inc cPage
- cmp cPage, 23
- ja k4toNext
- call MapPage
- lea si, CodeTab
- ;
- kS4Loop: cmp si, di
- jae k4NextPage
- mov bx, [si]
- add si, +2
- mov cl, [si]
- add si, +2
- and bx, 7f7fh
- cmp al, bl
- je kS4S2
- cmp al, ch ; ch = WildKey
- jne kS4Loop
- kS4S2: cmp ah, bh
- je kS4S3
- cmp ah, ch
- jne kS4Loop
- kS4S3: and cl, 7fh
- cmp dl, cl
- je kS4S4
- cmp dl, ch
- jne kS4Loop
- kS4S4: cmp dh, [si-1]
- je kS4Ok
- cmp dh, ch
- jne kS4Loop
- kS4Ok: inc sameCnt
- mov bx, sameCnt
- cmp bx, pageMin
- jbe kS4Loop
- call PushSam
- jmp kS4Loop
- ;
- ; Match Next Encode :
- ;
- k4Next: mov di, CodeEnd
- cmp nPage, 0
- je n4Loop
- call MapPage
- lea si, CodeTab
- mov bl, cPage
- cmp bl, nPage
- jb n4Loop
- lea di, CodeTab
- add di, eSize
- jmp n4Loop
- ;
- n4NextPage: cmp nPage, 0
- je kS4End
- inc cPage
- call MapPage
- lea si, CodeTab
- mov bl, cPage
- cmp bl, nPage
- jb n4Loop
- ja kS4End
- mov di, si
- add di, eSize
- ;
- n4Loop: cmp si, di
- jae n4NextPage
- mov bx, [si]
- add si, 2
- mov cl, [si]
- add si, 4
- and bx, 7f7fh
- cmp al, bl
- je n4S2
- cmp al, ch ; ch = WildKey
- jne n4Loop
- n4S2: cmp ah, bh
- je n4S3
- cmp ah, ch
- jne n4Loop
- n4S3: and cl, 7fh
- cmp dl, cl
- je n4S4
- cmp dl, ch
- jne n4Loop
- n4S4: cmp dh, [si-3]
- je n4Ok
- cmp dh, ch
- jne n4Loop
- n4Ok: call AddNext
- jmp n4Loop
-
- kS4End: mov bx, sameCnt
- mov sameMax, bx
- ;
- cmp SameNum, 1
- ja SkipCW4
- call MatchW4
- SkipCW4: cmp inSrch, 1
- je kS4pSam
- cmp SameNum, 1
- jb kS4Exit
- ja kS4Beep
- mov KeyNum, 0
- mov KeyEnd, 0
- mov cx, 0101h
- mov ah, 24h
- int 16h
- jmp k4Exit
- ;
- kS4Beep: mov ax, 0e07h
- int 10h
- kS4pSam: call prSames
- kS4Exit: mov ch, 1
- kS4Ex: mov cl, SameNum
- k4Exit: pop si
- pop di
- pop ds
- pop es
- xor ax, ax
- retf
- KeyProc endp
- ; --------------------------------
- MatchW4 proc near
- push cs
- pop es
- mov ax, 3900h
- pushf
- call dword ptr Int16
- or ax, ax
- jz W4Code0
- jmp W4End
- ;
- W4Loop0: mov ax, 3901h
- pushf
- call dword ptr Int16
- or ax, ax
- jz W4Code0
- jmp W4End
- ;
- W4Code0: call EnCode1 ; dh = cc1, dl = cc2
- cmp al, byte ptr KeyBuf
- jne W4Loop0
- mov word ptr Keys, ax
- xchg dh, dl
- mov word ptr CCs, dx ; dl = cc1, dh = cc2
- mov ax, 3a00h
- lea bx, CCs+2
- xchg dh, dl
- pushf
- call dword ptr Int16
- or ax, ax
- jnz W4Loop0
- mov ah, Keys+1
- cmp ah, KeyBuf+1
- jne GetW4Co1
- jmp GetW4Co
- ;
- W4Loop1: mov ax, 3a01h
- lea bx, CCs+2
- pushf
- call dword ptr Int16
- or ax, ax
- jnz W4Loop0
- GetW4Co: call CWEnCodes
- jc W4Loop1
- lea si, CCs
- call AddSame
- jmp W4Loop1
- ;
- W4Loop2: mov ax, 3a01h
- lea bx, CCs+2
- pushf
- call dword ptr Int16
- or ax, ax
- jnz W4Loop0
- GetW4Co1: cmp cl, 2
- jbe W4Loop2
- call CWEnCodes
- jc W4Loop2
- lea si, CCs
- call AddSame
- jmp W4Loop1
- ;
- W4End: ret
- ;
- MatchW4 endp
- ; --------------------------------
- MatchUcWx proc near
- push ax
- push cx
- push dx
- mov ax, 3a03h
- pushf
- call dword ptr Int16
- or ax, ax
- jnz noUsrLib ; es:bx = &UsrWLib, cx = uLen
- mov si, bx
- mov di, bx
- add di, cx
- mov bx, word ptr KeyBuf
- mov dx, word ptr KeyBuf+2
- cmp KeyNum, 3
- jne kUcWxSkip
- mov dh, ' '
- kUcWxSkip: push ds
- mov ax, es
- mov ds, ax
- push cs
- pop es
- cld
- kUcWxLoop: cmp si, di
- jae kUcWxEnd
- lodsw
- cmp ax, bx
- jne kUcWxNext
- lodsw
- cmp ax, dx
- je kUcWxFound
- kUcWxNext: lodsb
- cmp al, 0ah
- ja kUcWxNext
- jmp kUcWxLoop
- ;
- kUcWxFound: lea di, CCs
- mov cx, 64
- cld
- kUcWxLoop1: lodsb
- cmp al, ' '
- jb kUcWxCont0
- stosb
- loop kUcWxLoop1
- kUcWxCont0: mov byte ptr es:[di], 0
- push ds
- push si
- push cs
- pop ds
- mov ah, SameNum
- lea si, CCs
- call AddSame
- pop si
- pop ds
- jmp kUcWxLoop
- ;
- kUcWxEnd: pop ds
- noUsrLib: pop dx
- pop cx
- pop ax
- ret
- MatchUcWx endp
- ; --------------------------------
- kSele proc near
- ;
- ; Select Sames from Same[]
- ;
- ;
- push es
- push ds
- push si
- push di
- push cs
- pop ds
- ;
- cmp al, ' '
- jne kSContx
- cmp KeyEnd, 1
- je isDef
- cmp sameNum, 1
- jbe isDef
- mov KeyEnd, 1
- mov KeyNum, 4
- jmp ksBeep
- ;
- kSContx: cmp al, ';'
- jne ksSel
- isOne: mov al, '1'
- ksSel: cmp al, '0'
- je isTen
- sub al, '0'
- jmp ksCont0
- isDef: mov al, 0
- jmp ksCont0
- isTen: mov al, 10
- ksCont0: cmp al, SameNum
- jae ksBeep
- add al, AutoPop
- or al, al
- jz ksSkip
- mov bl, al
- xor bh, bh
- call MovSame
- ksSkip: mov ah, 24h
- int 16h
- mov AutoPop, 0
- mov sameNum, 0
- mov KeyNum, 0
- mov KeyEnd, 0
- mov cx, 0101h
- ksExit: xor ax, ax
- pop di
- pop si
- pop ds
- pop es
- ret
- ;
- ksBeep: mov ax, 0e07h
- int 10h
- xor cx, cx
- jmp ksExit
- kSele endp
- ; --------------------------------
- MovSame proc near
- ;
- ; Move Same[bx] to Same[0]
- ; IN: bx = Same No.
- ;
- les di, SamAddr
- mov bl, es:[di+bx]
- xor bh, bh
- mvLoop: mov al, es:[di+bx+10h]
- mov es:[di+10h], al
- inc di
- or al, al
- jnz mvLoop
- ret
- MovSame endp
- ; --------------------------------
- GetAttr proc near
- ;
- ; Get Prompt Line Attrs
- ;
- push ax
- push bx
- push cx
- mov ax, 1480h
- int 10h
- mov bAttr, al
- mov kAttr, bh
- mov sAttr, bl
- mov nAttr, ch
- mov eAttr, cl
- pop cx
- pop bx
- pop ax
- ret
- GetAttr endp
- ; --------------------------------
- ClrLine proc near
- ;
- ; Clear Prompt Line
- ;
- mov ch, KeyNum
- add ch, 9
- mov cl, 20
- sub cl, ch
- xor ch, ch
- clLoop1: mov ax, 1403h
- mov bl, bAttr
- mov dl, ' '
- int 10h
- loop clLoop1
- mov ax, 1402h
- mov dl, 22
- int 10h
- mov cx, 49
- clLoop2: mov ax, 1403h
- mov bl, bAttr
- mov dl, ' '
- int 10h
- loop clLoop2
- clEnd: mov PmtX, 22
- ret
- ClrLine endp
- ; --------------------------------
- prKeys proc near
- ;
- ; Prompt Input Key
- ;
- ; IN: al = char
- ; bl = KeyNum - 1
- ;
- push ax
- call GetAttr
- mov cl, al
- mov dl, bl
- add dl, 9
- mov ax, 1402h
- int 10h
- mov ax, 1403h
- mov dl, cl
- mov bl, bAttr
- or bl, kAttr
- int 10h
- call ClrLine
- pop ax
- ret
- prKeys endp
- ; --------------------------------
- StrLen proc near
- ;
- ; Calc String [si] Length:
- ; IN: ds:[si] = String
- ; OUT: cx = StrLen
- ;
- push bx
- xor bx, bx
- strLoop: cmp byte ptr [si+bx], 0
- je strEnd
- inc bl
- jmp strLoop
- ;
- strEnd: mov cx, bx
- pop bx
- ret
- StrLen endp
- ; --------------------------------
- CalLen proc near
- ;
- ; Calculate Can't Prompt the Sames in ds:[si]
- ; IN: ds:[si] = String
- ; OUT: cx = strlen
- ; bl = new PmtX
- ;
- call StrLen
- mov bx, cx
- add bl, PmtX
- add bl, 2
- cmp inSrch, 1
- jne clSkip
- add bl, 4
- clSkip: cmp bl, 71
- jae NotPr
- clc
- ret
- NotPr: stc
- ret
- CalLen endp
- ; --------------------------------
- VeriPos proc near
- ;
- ; Verify & adapt PmtX
- ;
- ; IN: ds:[si] = String of CCs
- ;
- push bx
- push cx
- call CalLen
- mov PmtX, bl
- pop cx
- pop bx
- ret
- VeriPos endp
- ; --------------------------------
- prSame proc near
- ;
- ; Print Same CC
- ; IN: ah = Same No.
- ; es:[si] = CCs
- ;
- mov cl, ah
- cmp ah, 0
- jne prCont0
- mov PmtX, 22
- jmp prPutCC
- ;
- prCont0: inc PmtX
- mov ax, 1402h
- mov dl, PmtX
- int 10h
- mov ax, 1403h
- mov bl, bAttr
- or bl, eAttr
- mov dl, cl
- cmp dl, 10
- je is10
- add dl, '0'
- jmp prContx
- ;
- is10: mov dl, '0'
- prContx: int 10h
- inc PmtX
- cmp cl, 1
- jne prPutCC
- mov ax, 1403h
- mov bl, bAttr
- or bl, eAttr
- mov dl, ';'
- int 10h
- inc PmtX
- ;
- prPutCC: mov ax, 1402h
- mov dl, PmtX
- int 10h
- push si
- prLoop: cmp PmtX, 71
- jb prConto
- jmp prEnd
- ;
- prConto: mov al, es:[si]
- inc si
- or al, al
- jz prEnd
- mov dl, al
- mov ax, 1403h
- mov bl, bAttr
- or bl, sAttr
- int 10h
- inc PmtX
- jmp prLoop
- ;
- prEnd: pop si
- ret
- prSame endp
- ; --------------------------------
- prSames proc near
- ;
- ; Print All Sames in SameBuf
- ;
- cmp inSrch, 1
- jne prSContx
- ret
- ;
- prSContx: push es
- push si
- call GetAttr
- xor ch, ch
- mov cl, SameNum
- cmp AutoPop, 1
- jne psSkip0
- dec cl
- psSkip0: or cl, cl
- jz psEnd
- xor ah, ah
- mov al, AutoPop
- les si, SamAddr
- psLoop: push ax
- push bx
- push cx
- push si
- xor bh, bh
- mov bl, ah
- add bl, al
- mov bl, es:[si+bx]
- add bx, 10h
- add si, bx
- call prSame
- pop si
- pop cx
- pop bx
- pop ax
- inc ah
- loop psLoop
- psEnd: pop si
- pop es
- ret
- prSames endp
- ; --------------------------------
- Encode1 proc near
- ;
- ; Get CC Encode
- ; IN: dx = CC (dh = cc1; dl = cc2; )
- ; OUT: ax = K2K1
- ;
- push bx
- mov bx, dx
- and bx, 7f7fh
- sub bx, 3021h
- cmp nPage, 0
- je retEncode1
- ;
- xor ah, ah
- mov al, bh
- mov ch, 3
- div ch
- mov ch, al
- mov bh, ah
- ;
- cmp ch, cPage
- je retEncode1
- mov cPage, ch
- call MapPage
- retEncode1: mov al, 94
- mul bh
- xor bh, bh
- add bx, ax ; dx = c1*94 + c2
- shl bx, 1
- shl bx, 1
- mov ax, word ptr CodeTab[bx]
- and ax, 7f7fh
- pop bx
- ret
- Encode1 endp
- ; --------------------------------
- Encode2 proc near
- ;
- ; Get CC Encode
- ; IN: dx = CC (dh = cc1; dl = cc2; )
- ; OUT: ax = K2K1
- ;
- push bx
- mov bx, dx
- and bx, 7f7fh
- sub bx, 3021h
- mov al, 94
- mul bh
- xor bh, bh
- add bx, ax ; dx = c1*94 + c2
- shl bx, 1
- shl bx, 1
- cmp nPage, 0
- jne FromXMS
- mov ax, word ptr CodeTab[bx]
- and ax, 7f7fh
- pop bx
- ret
- ;
- FromXMS: call ReadEncode
- mov ax, word ptr TmpCode
- and ax, 7f7fh
- pop bx
- ret
- Encode2 endp
- ; --------------------------------
- CWEnCodes proc near
- ;
- ; IN: CCs = String
- ; OUT: Keys = CWEnCodes
- ;
- lea si, CCs
- xor ch, ch
- inc cl
- cmp cl, 2
- je toTwo
- jb notMatch
- cmp cl, 3
- je toThree
- ;
- ; CCs >= 4:
- ;
- dec cx
- shl cx, 1
- mov bx, cx
- mov dx, [si+bx]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr KeyBuf+3
- jne notMatch
- ;
- mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr KeyBuf+1
- jne notMatch
- mov dx, [si+4]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr KeyBuf+2
- jne notMatch
- clc
- ret
- ;
- notMatch: stc
- ret
- ;
- toTwo: mov al, byte ptr Keys+1
- cmp al, byte ptr KeyBuf+1
- jne notMatch
- mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp ax, word ptr KeyBuf+2
- jne notMatch
- clc
- ret
- ;
- toThree: cmp W3Mode, 1
- jb to3
- ja to3e
- ;
- ; W3Mode = 1: Keys = '1123'
- ;
- mov al, byte ptr Keys+1
- cmp al, byte ptr KeyBuf+1
- jne W3nMatch
- mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr KeyBuf+2
- jne W3nMatch
- mov dx, [si+3]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr KeyBuf+3
- jne W3nMatch
- clc
- ret
- ;
- ; W3Mode = 0: Keys = '123 '
- ;
- to3: cmp KeyNum, 3
- jne W3nMatch
- mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr KeyBuf+1
- jne W3nMatch
- mov dx, [si+4]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr KeyBuf+2
- jne W3nMatch
- clc
- ret
- ;
- ; W3Mode = 2: Keys = '1233'
- ;
- to3e: mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr KeyBuf+1
- jne W3nMatch
- mov dx, [si+4]
- xchg dh, dl
- call EnCode2
- cmp ax, word ptr KeyBuf+2
- jne W3nMatch
- clc
- ret
- ;
- W3nMatch: stc
- ret
- CWEnCodes endp
- ; --------------------------------
- Key123 proc near
- ;
- ; Matches Simple Encoded CCs
- ;
- mov inSrch, 0
- cmp KeyNum, 1
- je kGetH1
- cmp KeyNum, 2
- je kGetH2
- jmp kGetH3
- ;
- kH2No: xor ax, ax
- mov ch, 1
- xor cl, cl
- ret
- ;
- kGetH1: lea bx, KeyBuf
- mov al, [bx]
- mov dl, WildKey
- cmp al, dl
- je kH2No
- sub al, ' '
- and al, 7fh
- xor ah, ah
- mov bx, ax
- shl bx, 1
- mov ax, word ptr OneTab[bx]
- cmp ah, 0a1h
- jb kH2No
- cmp al, 0a1h
- jb kH2No
- lea si, CCs
- mov [si], ax
- mov byte ptr [si+2], 0
- mov ah, 0
- push es
- push ds
- pop es
- call prSame
- pop es
- call AddSame
- xor ax, ax
- mov cx, 0101h
- ret
- ;
- kGetH2: lea bx, KeyBuf
- mov ax, [bx]
- mov ch, WildKey
- cmp al, ch
- je k2SetSrch
- cmp ah, ch
- je k2SetSrch
- jmp k2Srch
- ;
- k2SetSrch: mov inSrch, 1
- mov pgSize, 6
- k2Srch: lea si, CodeTab
- lea di, NextTab
- cmp nPage, 0
- je kH2Loop
- call MapPage
- lea di, CodeTab+1128
- jmp kH2Loop
- ;
- k2NextPage: cmp nPage, 0
- je kH2End
- inc cPage
- cmp cPage, 23
- ja kH2End
- call MapPage
- lea si, CodeTab
- ;
- kH2Loop: cmp si, di
- jae k2NextPage
- mov bx, [si]
- add si, +4
- and bl, 7fh
- cmp al, ch ; first is WildKey ?
- je h2Cont0
- cmp al, bl ; first key equals ?
- jne kH2Loop
- h2Cont0: test bh, 80h
- jz kH2Loop
- cmp ah, ch ; second is WildKey ?
- je h2Cont1
- and bh, 7fh
- cmp ah, bh ; second key equals ?
- jne kH2Loop
- h2Cont1: inc sameCnt
- mov bx, sameCnt
- cmp bx, pageMin
- jbe kH2Loop
- call PushSam
- jmp kH2Loop
- ;
- kH2End: mov bx, sameCnt
- mov sameMax, bx
- ;
- call prSames
- xor ax, ax
- mov cl, SameNum
- mov ch, 01h
- ret
- ;
- kGetH3: lea bx, KeyBuf
- mov ax, [bx]
- mov dl, [bx+2]
- mov ch, WildKey
- cmp al, ch
- je k3SetSrch
- cmp ah, ch
- je k3SetSrch
- cmp dl, ch
- je k3SetSrch
- jmp k3sSrch
- ;
- k3SetSrch: mov inSrch, 1
- mov pgSize, 6
- jmp k3sSkip
- ;
- k3sSrch: call MatchUcWx
- cmp SameNum, 1
- jb k3sSkip
- jmp SkipW3
- ;
- k3sSkip: lea si, CodeTab
- lea di, NextTab
- cmp nPage, 0
- je kH3Loop
- call MapPage
- lea di, CodeTab+1128
- jmp kH3Loop
- ;
- k3NextPage: cmp nPage, 0
- je k3Next
- inc cPage
- cmp cPage, 23
- ja k3Next
- call MapPage
- lea si, CodeTab
- ;
- kH3Loop: cmp si, di
- jae k3NextPage
- mov bx, [si]
- add si, +2
- mov cl, [si]
- add si, +2
- and bx, 7f7fh
- cmp al, ch
- je h3Cont0
- cmp al, bl
- jne kH3Loop
- h3Cont0: cmp ah, ch
- je h3Cont1
- cmp ah, bh
- jne kH3Loop
- h3Cont1: cmp byte ptr [si-1], ' '
- je h3Cont2
- test cl, 80h
- jz kH3Loop
- h3Cont2: cmp dl, ch
- je kH3Ok
- and cl, 7fh
- cmp dl, cl
- jne kH3Loop
- kH3Ok: inc sameCnt
- mov bx, sameCnt
- cmp bx, pageMin
- jbe kH3Loop
- call PushSam
- jmp kH3Loop
- ;
- k3Next: mov di, CodeEnd
- cmp nPage, 0
- je n3Loop
- call MapPage
- lea si, CodeTab
- cmp nPage, 23
- ja n3Loop
- mov di, si
- add di, eSize
- jmp n3Loop
- ;
- n3NextPage: cmp nPage, 0
- je kH3End
- inc cPage
- mov bl, cPage
- cmp bl, nPage
- ja kH3End
- call MapPage
- lea si, CodeTab
- mov bl, cPage
- cmp bl, nPage
- jb n3Loop
- mov di, si
- add di, eSize
- ;
- n3Loop: cmp si, di
- jae n3NextPage
- mov bx, [si]
- add si, +2
- mov cl, [si]
- add si, +4
- and bx, 7f7fh
- cmp al, ch
- je n3Cont0
- cmp al, bl
- jne n3Loop
- n3Cont0: cmp ah, ch
- je n3Cont1
- cmp ah, bh
- jne n3Loop
- n3Cont1: cmp byte ptr [si-3], ' '
- je n3Cont2
- test cl, 80h
- jz n3Loop
- n3Cont2: cmp dl, ch
- je nH3Ok
- and cl, 7fh
- cmp dl, cl
- jne n3Loop
- nH3Ok: call AddNext
- jmp n3Loop
- ;
- kH3End: mov bx, sameCnt
- mov sameMax, bx
- ;
- cmp SameNum, 1
- ja SkipW3
- cmp W3Mode, 0
- jne SkipW3
- call MatchW3
- SkipW3: call prSames
- mov ch, 1
- mov cl, SameNum
- ret
- Key123 endp
- ; --------------------------------
- AddNext proc near
- ;
- ; IN: ds:[si] = NextCC
- ;
- inc sameCnt
- mov bx, sameCnt
- cmp bx, pageMin
- jbe noAddIt
- push si
- push ax
- mov ax, [si-2]
- sub si, 6
- mov TabOff, si
- lea si, CCs
- mov [si], ax
- mov byte ptr [si+2], 0
- call VeriPos
- call AddSame
- pop ax
- pop si
- noAddIt: ret
- AddNext endp
- ; --------------------------------
- MatchW3 proc near
- ;
- push cs
- pop es
- mov ax, 3900h
- pushf
- call dword ptr Int16
- or ax, ax
- jz W3Code0
- jmp W3End
- ;
- W3Loop0: mov ax, 3901h
- pushf
- call dword ptr Int16
- or ax, ax
- jz W3Code0
- jmp W3End
- ;
- W3Code0: call EnCode1 ; dh = cc1, dl = cc2
- cmp al, byte ptr KeyBuf
- jne W3Loop0
- xchg dh, dl
- mov word ptr CCs, dx ; dl = cc1, dh = cc2
- mov ax, 3a00h
- lea bx, CCs+2
- xchg dh, dl
- pushf
- call dword ptr Int16
- or ax, ax
- jnz W3Loop0
- jmp GetW3Co
- ;
- W3Loop1: mov ax, 3a01h
- lea bx, CCs+2
- pushf
- call dword ptr Int16
- or ax, ax
- jnz W3Loop0
- GetW3Co: cmp cl, 2
- jne W3Loop1
- call CWEnCodes
- jc W3Loop1
- lea si, CCs
- call AddSame
- jmp W3Loop1
- ;
- W3End: ret
- MatchW3 endp
- ; --------------------------------
- PushSam proc near
- ;
- ; IN: si = Offset of CODE TABLE
- ;
- push ax
- push si
- call GetCode
- sub si, 4
- mov TabOff, si
- lea si, CCs
- mov [si], ax
- mov byte ptr [si+2], 0
- call VeriPos
- call AddSame
- pop si
- pop ax
- ret
- PushSam endp
- ; --------------------------------
- GetCode proc near
- ;
- ; IN: si = offset of CODE TABLE
- ; OUT: ax = GBcode
- ;
- push bx
- push dx
- mov ax, si
- sub ax, offset CodeTab
- dec ax
- dec ax
- shr ax, 1
- shr ax, 1
- mov bl, 94
- div bl
- add ax, 2130h
- ;
- mov dl, cPage
- add al, dl
- shl dl, 1
- add al, dl ; 3 Qu / Page
- ;
- or ax, 8080h
- pop dx
- pop bx
- ret
- GetCode endp
- ; --------------------------------
- prEncode proc near
- ;
- ; IN: es:si = Offset of CODE TABLE
- ; ah = sameNo
- ;
- pusha
- push es
- push cs
- pop es
- mov dl, ah
- shl dl, 1
- shl dl, 1
- shl dl, 1
- add dl, 21
- cmp ah, 1
- jne prECont0
- dec dl
- prECont0: mov PmtX, dl
- lea si, CCs
- call prSame
- mov si, TabOff
- ;
- mov ax, [si]
- mov dx, [si+2]
- and ax, 7f7fh
- and dx, 7f7fh
- ;
- push dx
- mov cx, ax
- mov ax, 1403h
- mov bl, bAttr
- or bl, kAttr
- ;
- mov dl, cl
- pusha
- int 10h
- popa
- inc PmtX
- ;
- mov dl, ch
- pusha
- int 10h
- popa
- inc PmtX
- ;
- pop dx
- mov cx, dx
- pusha
- int 10h
- popa
- inc PmtX
- ;
- mov dl, ch
- int 10h
- inc PmtX
- ;
- pop es
- popa
- ret
- prEncode endp
- ; --------------------------------
- AddSame proc near
- ;
- ; IN: [si] = Strings of CCs
- ;
- mov ax, pgSize
- cmp SameNum, al
- jae asAbort
- cmp PmtX, 71
- jae asAbort
- push es
- push ax
- push bx
- push cx
- push di
- push si
- les di, SamAddr
- cmp SameNum, 0
- jne asSkip
- mov cx, 11
- xor bx, bx
- mov al, 0
- asLoop0: mov es:[di+bx], al
- add al, 16
- inc bl
- loop asLoop0
- asSkip: xor bh, bh
- mov bl, SameNum
- add bl, AutoPop
- mov bl, es:[di+bx]
- mov cl, bl
- asLoop: cld
- lodsb
- mov es:[di+bx+10h], al
- or al, al
- jz asEnd
- inc bl
- jmp asLoop
- ;
- asEnd: inc SameNum
- add cl, 16
- cmp bl, cl
- jb asSkipRePntr
- inc bl
- mov al, bl
- mov bl, ah
- inc bl
- mov es:[bx], al
- asSkipRePntr: pop si
- cmp inSrch, 1
- jne asSkipPr
- mov ah, sameNum
- dec ah
- call prEncode
- asSkipPr: pop di
- pop cx
- pop bx
- pop ax
- pop es
- clc
- ret
- asAbort: stc
- ret
- AddSame endp
- ; -------------------------------
- MapPage proc near
- ;
- ; IN: cPage = to be Mapped
- ;
- pusha
- xor ah, ah
- mov al, cPage
- mov cx, 1128
- mul cx
- mov word ptr sOffset, ax
- lea si, xStruc
- mov ah, 0bh
- call dword ptr xEntry
- popa
- ret
- ;
- inPage db 0
- MapPage endp
- ; -------------------------------
- ReadEncode proc near
- ;
- ; IN: bx = offset
- ;
- push si
- mov word ptr sOffset2, bx
- mov ah, 0bh
- lea si, xStruc2
- call dword ptr xEntry
- pop si
- ret
- ;
- TmpCode dw 3 dup(0)
- ReadEncode endp
- ;
- ; -------------------------------
- ;
- CSVer db 16 dup(?)
- EName db 8 dup(?)
- CodeLen db ?
- ;
- ; W3Mode = 0 ... One Code for every CC
- ; = 1 ... Two Codes for First CC
- ; = 2 ... Two Codes for End CC
- ;
- W3Mode db ?
- ;
- KeyTab db 112 dup(?)
- OneTab db 224 dup(?)
- ;
- WildKey db '?'
- db ?
- db (400 - 364) dup(?)
- ;
- ; -------------------------------
- ;
- CodeTab db 27072 dup(?) ; 6768 * 4
- NextTab db 3200 dup(?) ; 800 * 4
- ;
- dw 0ffffh
- HdMark db 'Encodes ended', 1ah
- ;
- ; -------------------------------
- ;
- sKmode proc near
- ;
- ; Set Current Key Mode to:
- ;
- ; IN: bh = kmode
- ;
- push es
- push ds
- mov ax, cs
- mov ds, ax
- mov byte ptr KeyNum, 0
- mov byte ptr KeyEnd, 0
- mov byte ptr SameNum, 0
- cmp bh, 2
- jb sRetn
- cmp bh, 7
- jbe sCont0
- sRetn: mov ax, 8080h
- jmp sExit
- ;
- sCont0: mov bl, bh
- xor bh, bh
- cmp bl, KTable[bx]
- jne sRetn
- mov tmp, bl
- mov cl, 4
- shl bx, cl
- lea si, Fname ; Get File
- add si, bx
- mov di, NameOff
- mov ax, cs
- mov ds, ax
- mov es, ax
- mov cx, 13
- cld
- rep movsb ; Make Path
- mov ax, 3d00h
- lea dx, Path
- int 21h
- jc sFail
- mov Handle, ax
- mov bx, ax
- mov ah, 3fh
- mov cx, 400 + 27072 + 3200
- lea dx, CSVer
- int 21h
- jc sFail
- and al, 0feh
- lea bx, CSVer
- add bx, ax
- ;
- sub ax, 400
- mov dSize, ax
- ;
- mov word ptr [bx], 0ffffh
- add bx, +2
- mov CodeEnd, bx
- ;
- mov al, tmp
- mov Current, al
- mov ah, 3eh
- mov bx, Handle
- int 21h
- push cs
- pop es
- lea si, Mark
- lea di, CSVer
- mov cx, 8
- cld
- repz cmpsb
- jnz BadDat
- ;
- call MoveToXMS
- ;
- xor ax, ax
- sExit: pop ds
- pop es
- ret
- ;
- BadDat: lea dx, BadFile
- mov ah, 09h
- int 21h
- ;
- sFail: mov ax, 8080h
- jmp sExit
- ;
- sKmode endp
- ; -------------------------------
- MoveToXMS proc near
- ;
- cmp word ptr xEntry+2, 0
- jne MToCont0
- ;
- SetNoXMS: mov nPage, 0
- mov dx, dSize
- mov pSize, dx
- mov eSize, dx
- mov cSize, dx
- mov cPage, 0
- ret
- ;
- MToCont0: mov dx, dSize
- test dx, 03ffh
- jz noInc
- add dx, 400h
- noInc: mov dl, dh
- xor dh, dh
- shr dx, 1
- shr dx, 1
- ;
- mov ah, 9
- call dword ptr xEntry
- cmp bl, 0
- jne SetNoXMS
- mov xHandle, dx
- ;
- mov dHandle, dx
- mov ax, dSize
- mov Count, ax
- mov sHandle, 0
- lea ax, CodeTab
- mov word ptr sOffset, ax
- mov ax, cs
- mov word ptr sOffset+2, ax
- mov word ptr dOffset, 0
- mov word ptr dOffset+2, 0
- mov ah, 0bh
- lea si, xStruc
- call dword ptr xEntry
- cmp bl, 0
- je MoveSucceed
- ;
- mov ah, 0ah
- mov dx, xHandle
- call dword ptr xEntry
- jmp SetNoXMS
- ;
- MoveSucceed: mov Count, 1128
- mov Count2, 4
- ;
- mov ax, xHandle
- mov sHandle, ax
- mov sHandle2, ax
- ;
- mov word ptr sOffset+2, 0
- mov word ptr sOffset2+2, 0
- ;
- lea ax, CodeTab
- mov word ptr dOffset, ax
- lea ax, TmpCode
- mov word ptr dOffset2, ax
- ;
- mov ax, cs
- mov word ptr dOffset+2, ax
- mov word ptr dOffset2+2, ax
- ;
- mov dHandle, 0
- mov dHandle2, 0
- ;
- mov bx, 1128
- lea ax, CodeTab+1128
- mov CodeEnd, ax
- mov pSize, bx
- mov cSize, bx
- mov ax, dSize
- xor dx, dx
- div bx
- mov nPage, al
- mov eSize, dx
- mov cPage, 0
- ret
- MoveToXMS endp
- ;
- ; -------------------------------
- ;
- iFile db 'chcs.ini', 0
- ;
- kmode0 db ?
- firstk db 0
- ;
- ChcsMark db 13,10,9, 'CHCS'
- noCHCS db 7, 'xis: CHCS/CHIS not installed !', 0dh,0ah, '$'
- BadVer db 7, 'xis: ░µ▒╛║┼▓╗╢╘', 0dh,0ah, '$'
- BadFile db 7, 'xis: ▒α┬δ╬─╝■╕±╩╜┤φ╗≥░µ▒╛║┼▓╗╢╘', 0dh,0ah, '$'
- ;
- ; --------------------------------
- ;
- init: mov ax, 3f00h
- int 16h
- mov di, bx
- lea si, ChcsMark
- mov cx, 5
- cld
- repz cmpsb
- jz iCont00
- lea dx, noCHCS
- jmp PrError
- ;
- iCont00: cmp ax, 0100h
- je iCont01
- lea dx, BadVer
- jmp PrError
- ;
- iCont01: mov ax, cs
- mov ds, ax
- mov es, ax
- 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
- cld
- 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 di, NameOff
- lea si, iFile
- cld
- iLoop2: lodsb
- stosb
- cmp al, 0
- jne iLoop2
- ;
- ; Test XMS memory
- ;
- mov ax, 4300h
- int 2fh
- cmp al, 80h
- jne iNoXMS
- mov ax, 4310h
- int 2fh
- mov word ptr xEntry, bx
- mov word ptr xEntry+2, es
- ;
- ; Treat Command Line Parameters:
- ;
- iNoXMS: mov si, 81h
- cmdLoop0: mov al, [si]
- inc si
- cmp al, ' '
- je cmdLoop0
- cmp al, 09h
- je cmdLoop0
- or al, 20h
- cmp al, 'f'
- jne noCmd
- cmdLoop1: mov al, [si]
- inc si
- cmp al, ' '
- je cmdLoop1
- cmp al, 09h
- je cmdLoop1
- cmp al, '3'
- jb noCmd
- cmp al, '8'
- ja noCmd
- sub al, '1'
- xor bh, bh
- mov bl, al
- mov byte ptr KTable[bx], al
- mov tmp, al
- mov kmode0, al
- cmdLoop2: mov al, [si]
- inc si
- cmp al, ' '
- je cmdLoop2
- cmp al, 09h
- je cmdLoop2
- cmp al, '='
- jne noCmd
- cmdLoop3: mov al, [si]
- inc si
- cmp al, ' '
- je cmdLoop3
- cmp al, 09h
- je cmdLoop3
- or al, 20h
- cmp al, 'a'
- jb noCmd
- cmp al, 'z'
- ja noCmd
- cmdLoop4: dec si
- xor bh, bh
- mov bl, tmp
- mov cl, 4
- shl bx, cl
- lea di, Fname
- add di, bx
- mov cx, 16
- push cs
- pop es
- cld
- cmdLoop5: lodsb
- cmp al, ' '
- jbe noCmd
- stosb
- loop cmdLoop5
- ;
- noCmd: push cs
- pop es
- mov ax, 3d00h
- lea dx, iFile ; use CurDir chcs.ini
- int 21h
- jnc iCont8
- ;
- mov ax, 3d00h
- lea dx, Path ; use ChcsSys chcs.ini
- int 21h
- jnc iCont8
- jmp iTest
- ;
- iCont8: mov Handle, ax
- mov bx, ax
- mov ah, 3fh
- lea dx, Buffer
- mov cx, 0400h
- int 21h
- lea si, Buffer
- mov bx, ax
- mov word ptr [si+bx], 1a1ah ; Set File End Mark
- mov ah, 3eh
- mov bx, Handle
- int 21h
- ;
- iLoop3: mov al, [si]
- cmp al, '#'
- je iLoop4
- cmp al, 0dh
- je NxtLine
- cmp al, 0ah
- je NxtLine
- cmp al, 1ah
- jne iCont0
- toCont4: jmp iTest
- NxtLine: inc si
- jmp iLoop3
- ;
- iLoop4: inc si
- mov al, [si]
- cmp al, 1ah
- je toCont4
- cmp al, 0dh
- je NxtLine
- cmp al, 0ah
- je NxtLine
- jmp iLoop4
- iSpace0: inc si
- mov al, [si]
- iCont0: cmp al, ' '
- je iSpace0
- cmp al, 09h
- je iSpace0
- cmp al, 'F'
- je iCont1
- cmp al, 'f'
- je iCont1
- jmp iLoop4 ; Skip This Line
- iCont1: cmp tmp, 0
- jne iLoop4
- inc si
- mov al, [si]
- cmp al, '3'
- jb iLoop4
- cmp al, '8'
- ja iLoop4
- sub al, '1'
- xor bh, bh
- mov bl, al
- mov KTable[bx], al
- mov tmp, al
- mov kmode0, al
- iSpace1: inc si
- mov al, [si]
- cmp al, ' '
- je iSpace1
- cmp al, 09h
- je iSpace1
- cmp al, '='
- je iCont2
- jmp iLoop4
- ;
- iCont2: inc si
- mov al, [si]
- cmp al, ' '
- je iCont2
- cmp al, 09h
- je iCont2
- ;
- xor bh, bh
- mov bl, tmp
- mov cl, 4
- shl bx, cl
- lea di, Fname
- add di, bx
- mov cx, 16
- iLoop5: lodsb
- cmp al, ' '
- jbe toNxtl
- stosb
- dec cx
- jz toNxtl
- jmp iLoop5
- toNxtl: jmp iLoop3
- ;
- iTest: mov ax, 3516h
- int 21h
- mov word ptr Int16, bx
- mov word ptr Int16+2, es
- ;
- lea bx, KTable
- mov cx, 8
- iLoop6: cmp byte ptr [bx], 0
- jne iTSR
- inc bx
- loop iLoop6
- ;
- iQuit: mov ax, 4c00h
- int 21h
- iTSR: mov bh, kmode0
- call sKmode ; Load Default
- or ax, ax
- jnz iQuit
- mov ah, 31h
- mov al, kmode0
- lea bx, KeyProc
- lea dx, EName
- mov di, Psp
- push cs
- pop es
- int 16h
- or ax, ax
- jnz iQuit
- mov word ptr SamAddr, bx
- mov word ptr SamAddr+2, es
- mov es, Env
- mov ah, 49h
- int 21h ; Free Environment
- ;
- mov ax, Psp
- dec ax
- mov es, ax
- mov di, 11
- mov al, '@'
- cld
- stosb
- lea si, FName
- mov bl, kmode0
- xor bh, bh
- mov cl, 4
- shl bx, cl
- add si, bx
- mov cx, 4
- cld
- adLoop: lodsb
- cmp al, '.'
- je adEnd
- cmp al, 'a'
- jb skipConv
- cmp al, 'z'
- ja skipConv
- and al, 5fh ; toUpper
- skipConv: stosb
- loop adLoop
- jmp tsrCont
- ;
- adEnd: xor al, al
- stosb
- ;
- tsrCont: mov dx, CodeEnd
- mov cl, 4
- shr dx, cl
- inc dx
- mov ax, 3100h
- int 21h
- ;
- PrError: mov ah, 09h
- int 21h
- mov ax, 4cffh
- int 21h
- ;
- db 8 dup(0)
- Buffer db 'XIS Ver 1.20', 0, '$'
- ;
- code ends
- end begin
-