home *** CD-ROM | disk | FTP | other *** search
- ;
- ; chpy.asm
- ;
- .286
- code segment
- org 100h
- assume cs:code, ds:code
- begin: jmp start
- ;
- CSMark db 'CHCS 1.0'
- ;
- Psp dw ?
- Env dw ?
- db 0
- ;
- ; ---------------------------------------
- ;
- 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
- ;
- dSize dw ?
- nPage db ?
- eSize dw ?
- pSize dw 1504
- ;
- cPage db 0
- cSize dw 1504
- cPntr dw ?
- ;
- ; ---------------------------------------
- ;
- PyName db '╞┤╥⌠╫╓┤╩', 0
- ;
- SpSm db 'ichushvzh', 0dh, 0ah
- ChSp db 'xiangmiongxuang'
- db 'zang-ceng-wian-liao-ning-'
- db 'mong-huan-wuai-'
- db 'qai--san--gao--rei--den--'
- db 'bia--fie--kin--yiu--pou--'
- db 'bua--tue--vui--jun--ouo--'
- db 'tve--'
- db 'aa---ee---ii---oo---uu---'
- db 'vv---', 0
- ;
- HiuseCC db "░▓▓╗┤╙╡─╢°╖╓╕÷║═▓·╝╢┐╔┴╦├╟"
- db "─Ω┼╖┼·╞≡╚╦╦∙╦√╩╟╒Γ╬╥╤º╥╗╘┌"
- ;
- HiCWord db "░┤╒╒▓┐╖╓▓╔╙├┤≤╝╥╢°╟╥╖╟│ú╣²╚Ñ"
- db "╗╣╩╟│ñ╞┌╛¡╣²┐╔╥╘┴ó╝┤├╗╙╨─π├╟"
- db "┼╖╓▐╞╒▒Θ╞Σ╓╨╚╧╬¬╦∙╥╘╦√├╟╩▒╝Σ"
- db "╓╨╣·╬╥├╟╨╟╞┌╥╗╕÷╫≈╙├"
- ;
- bAttr db 70h ;
- kAttr db 0eh ; ╩Σ╚δ┬δ╔½
- eAttr db 04h ; 1-0╨≥║┼╔½
- sAttr db 00h ; ═¼┬δ╫╓╔½
- nAttr db 0eh ; ':'ɫ
- ;
- Int16 dd ?
- ;
- SameNum db 0
- SameOfs db 0
- SamAddr dd ?
- KeyNum db 0
- KeyBuf db 13 dup(?) ; ╝ⁿ┼╠╗║│σ╟°
- ;
- KeyMax db 12
- ;
- ChSpNum db ?
- Keys db 25 dup(?)
- ;
- CCs db 65 dup(?)
- ;
- Codes db 13 dup(?)
- ;
- W3Mode db 0
- PySwitch db 1
- ;
- PmtX db ?
- ;
- AutoPop db 0
- ;
- CurPage db 0
- CCNoMin db 1
- CCNoMax db 11
- ;
- CurCCNo db 0 ; for CurPage >= 2
- ;
- PgFull db 0
- ;
- inSrch db 0 ; ─ú║²▓Θ╒╥▒Ω╓╛
- reSrch db 0 ; ╖┤╧≥▓Θ╒╥▒Ω╓╛
- ;
- PyOnStr db '╚½╞┤╩Σ╚δ╘╩╨φ(╞⌠╢»╫┤╠¼)', 0
- PyOffStr db '╚½╞┤╩Σ╚δ╣╪▒╒', 0
- ; -------------------------------
- KeyProc proc far
- cmp ax, 0ffffh
- je toSetKmode
- jmp TreatKey
- ;
- toSetKmode: mov cs:KeyNum, 0
- mov cs:SameNum, 0
- cmp bl, 0ffh
- jne qRetn
- push es
- mov ah, 49h
- mov es, cs:Psp
- int 21h
- pop es
- cmp cs:nPage, 0
- je qRetn
- mov ah, 0ah
- mov dx, cs:xHandle
- call dword ptr cs:xEntry
- qRetn: jmp kRetn
- ;
- TreatKey: cmp al, 08h ; Backspace
- je toBack
- cmp al, 0dh ; Enter
- je toReset
- cmp al, 1bh ; Escape
- je toReset
- or al, al ; Extend Keys
- jz kElse
- cmp al, '[' ; Last page
- je toPgBack
- cmp al, ',' ; Last page
- je toPgBack
- cmp al, ']' ; Next page
- je toPgFore
- cmp al, '.' ; Next page
- je toPgFore
- cmp al, 27h
- je toMatch
- cmp al, 'a'
- jb kElse
- cmp al, 'z'
- jbe toMatch
- ;
- kElse: cmp cs:KeyNum, 0
- jne kConte
- retf
- kConte: cmp al, ' '
- je toSele
- 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
- ;
- toPgBack: jmp kPgBack
- ;
- toPgFore: jmp kPgFore
- ;
- toMatch: mov cs:CurPage, 0
- mov cs:CCNoMin, 1
- mov cs:CCNoMax, 11
- mov cs:inSrch, 0
- mov cs:reSrch, 0
- jmp kMatch
- ;
- toBack: jmp kBack
- ;
- toReset: jmp kReset
- ;
- kPgRetn: jmp kRetn
- ;
- kPgBack: cmp cs:KeyNum, 0
- je toRet0
- cmp cs:CurPage, 0
- je kPgRetn
- mov cs:reSrch, 1
- dec cs:CurPage
- sub cs:CCNoMin, 11
- sub cs:CCNoMax, 11
- jmp PgSet
- ;
- kPgFore: cmp cs:KeyNum, 0
- je toRet0
- cmp cs:PgFull, 1
- jne kPgRetn
- inc cs:CurPage
- add cs:CCNoMin, 11
- add cs:CCNoMax, 11
- ;
- 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 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 inSrch, 0
- mov SameNum, 0
- mov PgFull, 0
- mov AutoPop, 0
- mov cPage, 0
- xor ah, ah
- xor bh, bh
- mov bl, KeyNum
- cmp bl, KeyMax
- jb kmCont0
- xor bl, bl
- mov KeyNum, 0
- kmCont0: mov word ptr KeyBuf[bx], ax
- call prKeys
- inc KeyNum
- cmp KeyNum, 2
- jb toKey1
- je toKey2
- mov cl, KeyNum
- cmp cl, KeyMax
- jb toKeyx
- mov AutoPop, 1
- jmp toKeyx
- ;
- toKey1: call kGetS01
- jmp kSxEnd
- ;
- toKey2: lea si, KeyBuf
- call kGetS02
- jmp kSxEnd
- ;
- toKeyx: call kGetS0x
- ;
- kSxEnd: cmp SameNum, 11
- jne SkipFull
- mov PgFull, 1
- SkipFull: call prSames
- mov cl, SameNum
- mov ch, 0
- mov al, KeyNum
- cmp al, KeyMax
- jne kS4Ex
- inc ch
- cmp cl, 1
- jne kS4Ex
- mov KeyNum, 0
- mov ah, 24h
- int 16h
- kS4Ex: pop si
- pop di
- pop ds
- pop es
- xor ax, ax
- retf
- KeyProc endp
- ;
- ; -------------------------------
- kGetS01 proc near
- mov bl, byte ptr KeyBuf
- cmp bl, 27h
- jne kS01Conta
- ret
- ;
- kS01Conta: sub bl, 'a'
- xor bh, bh
- shl bx, 1
- mov ax, word ptr HiuseCC[bx]
- lea si, CCs
- mov [si], ax
- mov byte ptr [si+2], 0
- mov ah, 0
- call AddSame
- shl bx, 1
- mov ax, word ptr HiCWord[bx]
- mov [si], ax
- mov ax, word ptr HiCWord[bx+2]
- mov [si+2], ax
- mov byte ptr [si+4], 0
- mov ah, 1
- call AddSame
- ret
- kGetS01 endp
- ; -------------------------------
- kGetS02 proc near
- ;
- ; IN: ds:si = Keys
- ;
- mov CurCCNo, 0
- cmp byte ptr [si+2], 0
- je kS02Contx
- ret
- ;
- kS02Contx: mov bx, [si]
- sub bx, 6060h ; bh=K2,bl=K1
- and bx, 1f1fh
- xchg bh, bl ; bh=K1,bl=K2
- mov dh, bh
- mov cl, 3
- ror bx, cl
- and bx, 0e007h
- or bh, dh
- lea si, PyCode
- lea di, NextPy
- cmp nPage, 0
- je kS02Loop0
- call MapPage
- lea di, PyCode+1504
- jmp kS02Loop0
- ;
- kS02NextPage: cmp nPage, 0
- je kS02NextPy
- inc cPage
- cmp cPage, 8
- ja kS02NextPy
- call MapPage
- lea si, PyCode
- ;
- kS02Loop0: cmp si, di
- jae kS02NextPage
- mov dx, [si]
- add si, +2
- mov ah, dl
- and dl, 3
- cmp dx, bx
- jne kS02Loop0
- mov cl, 3
- shr ah, cl
- ;
- cmp CurPage, 2
- jb kS02VeriNo
- or ah, ah
- jnz kS02VeriNo
- inc CurCCNo
- mov ah, CurCCNo
- add ah, 30
- ;
- kS02VeriNo: cmp ah, CCNoMin
- jb kS02Loop0
- cmp ah, CCNoMax
- ja kS02Loop0
- sub ah, CCNoMin
- kS02toPush: call PushSam
- jnc kS02Loop0
- jmp kS02End
- ;
- kS02NextPy: lea si, NextPy
- lea di, PyEnd
- cmp nPage, 0
- je kS02Loop1
- call MapPage
- lea si, PyCode
- mov di, si
- add di, eSize
- ;
- kS02Loop1: cmp si, di
- jae kS02End
- mov dx, [si]
- add si, +4
- mov ah, dl
- and dl, 3
- cmp dx, bx
- jne kS02Loop1
- mov cl, 3
- shr ah, cl
- ;
- cmp CurPage, 2
- jb kS02NxtVeriNo
- or ah, ah
- jnz kS02NxtVeriNo
- ;
- inc CurCCNo
- mov ah, CurCCNo
- add ah, 30
- ;
- kS02NxtVeriNo: cmp ah, CCNoMin
- jb kS02Loop1
- cmp ah, CCNoMax
- ja kS02Loop1
- sub ah, CCNoMin
- kS02NxtPush: mov dx, [si-2]
- push si
- lea si, CCs
- mov [si], dx
- mov byte ptr [si+2], 0
- call AddSame
- pop si
- jnc kS02Loop1
- kS02End: ret
- kGetS02 endp
- ; -------------------------------
- kGetS0x proc near
- cmp KeyNum, 4
- ja kS0xSkip
- cmp byte ptr KeyBuf, 27h
- je kS0xTestSwitch
- call MatchUcWx
- cmp SameNum, 1
- ja kS0xEnd
- kS0xSkip: call ConvKeys
- cmp cl, 4
- ja kS0xEnd
- mov ChSpNum, cl
- cmp cl, 3
- je toMatchCW3
- ja toMatchCWx
- lea si, Keys
- call kGetS02
- ret
- ;
- kS0xTestSwitch: cmp byte ptr KeyBuf+1, 'o'
- jne kS0xEnd
- cmp KeyNum, 4
- jb kS0xTestPyOn
- cmp word ptr KeyBuf+2, 6666h
- jne kS0xEnd
- mov PySwitch, 0 ; KeyBuf[] = 'off
- mov KeyNum, 0
- mov KeyMax, 4
- lea si, PyOffStr
- call prStr
- ret
- ;
- kS0xTestPyOn: cmp byte ptr KeyBuf+2, 'n'
- jne kS0xEnd
- mov PySwitch, 1 ; KeyBuf[] = 'on
- mov KeyNum, 0
- mov KeyMax, 12
- lea si, PyOnStr
- call prStr
- ret
- ;
- toMatchCWx: cmp cl, 4
- ja kS0xErr
- cmp nPage, 0
- je kS0xSkipX
- call MapPage
- kS0xSkipX: call MatchCWx
- kS0xEnd: ret
- ;
- kS0xErr: mov ax, 0e07h
- int 10h
- ret
- ;
- toMatchCW3: cmp nPage, 0
- je k0xSkipX
- call MapPage
- k0xSkipX: call MatchCW3
- ret
- kGetS0x endp
- ; -------------------------------
- MatchCWx proc near
- push cs
- pop es
- mov ax, 3900h
- pushf
- call dword ptr Int16
- or ax, ax
- jz WxCode0
- jmp WxEnd
- ;
- WxLoop0: mov ax, 3901h
- pushf
- call dword ptr Int16
- or ax, ax
- jz WxCode0
- jmp WxEnd
- ;
- WxCode0: call EnCode1 ; dh = cc1, dl = cc2
- cmp al, byte ptr Keys
- jne WxLoop0
- mov word ptr Codes, 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 WxLoop0
- jmp GetWxCo
- ;
- WxLoop1: mov ax, 3a01h
- lea bx, CCs+2
- pushf
- call dword ptr Int16
- or ax, ax
- jnz WxLoop0
- GetWxCo: call CWEnCodes
- jc WxLoop1
- lea si, CCs
- mov ah, SameNum
- call AddSame
- jmp WxLoop1
- ;
- WxEnd: ret
- MatchCWx endp
- ; -------------------------------
- MatchCW3 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
- mov ah, SameNum
- call AddSame
- jmp W3Loop1
- ;
- W3End: ret
- MatchCW3 endp
- ; -------------------------------
- MatchUcWx proc near
- 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: ret
- MatchUcWx endp
- ; -------------------------------
- kSele proc near
- ;
- ; Select Sames from Same[]
- ;
- push es
- push ds
- push si
- push di
- push cs
- pop ds
- cmp al, ' '
- je isDef
- 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 AutoPop, 1
- jne ksCont1
- inc al
- ksCont1: cmp al, SameNum
- jae ksBeep
- or al, al
- jz ksSkip
- mov bl, al
- xor bh, bh
- call MovSame
- ksSkip: mov ah, 24h
- int 16h
- mov AutoPop, 0
- mov KeyNum, 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
- ; -------------------------------
- ConvKeys proc near
- ;
- ; IN: KeyBuf[] = Input Keys
- ; OUT: Keys[] = ShuanPin Codes
- ;
- push si
- push di
- lea si, KeyBuf
- lea di, Keys
- ConvLoop: call GetPy1
- cmp byte ptr [si], 0
- je ConvEnd
- call GetPy2
- cmp byte ptr [si], 0
- jne ConvLoop
- ConvEnd: mov byte ptr [di], 0
- sub di, offset Keys
- mov cx, di
- pop di
- pop si
- ret
- ConvKeys endp
- ; -------------------------------
- GetPy1 proc near
- ;
- ; IN: ds:si = PyStr
- ; OUT: ds:di = Py1
- ;
- cmp byte ptr PySwitch, 1
- je Py1Again
- mov al, [si]
- jmp Py1End
- ;
- Py1Again: mov al, [si]
- cmp byte ptr [si+1], 'h'
- jne Py1Cont1
- mov dl, [si+2]
- cmp dl, 'a'
- je toSpPy1
- cmp dl, 'e'
- je toSpPy1
- cmp dl, 'i'
- je toSpPy1
- cmp dl, 'o'
- je toSpPy1
- cmp dl, 'u'
- je toSpPy1
- cmp dl, 'v'
- je toSpPy1
- jmp Py1Cont1
- ;
- toSpPy1: cmp al, 'c'
- je Py1toI
- cmp al, 's'
- je Py1toU
- cmp al, 'z'
- jne Py1Cont1
- mov al, byte ptr SpSm+6
- jmp Py1Cont0
- ;
- Py1toI: mov al, byte ptr SpSm
- jmp Py1Cont0
- ;
- Py1toU: mov al, byte ptr SpSm+3
- Py1Cont0: add si, +2
- mov [di], al
- inc di
- ret
- ;
- toPy1Again: inc si
- jmp Py1Again
- ;
- Py1Cont1: cmp al, 27h
- je toPy1Again
- cmp al, 'a'
- jne Py1End
- mov dx, word ptr [si+1]
- cmp dl, 'n'
- jne Py1End
- cmp dh, 'g'
- jne Py1End
- dec si
- Py1End: inc si
- mov [di], al
- inc di
- ret
- GetPy1 endp
- ; -------------------------------
- GetPy2 proc near
- ;
- ; IN: ds:si = PyStr
- ; OUT: ds:di = Py2
- ;
- push bx
- cmp byte ptr PySwitch, 1
- jne Py2Copy
- mov cx, 4
- lea bx, ChSp
- Py2Loop0: mov dl, [bx]
- or dl, dl
- jnz Py2Cont0
- Py2Copy: mov dl, [si]
- mov ax, 1
- jmp Py2End
- ;
- Py2Cont0: push si
- push cx
- push bx
- Py2Loop2: inc bx
- mov al, [bx]
- cmp al, '-'
- je isFound
- mov ah, [si]
- inc si
- cmp ah, al
- jne NextPy2
- loop Py2Loop2
- isFound: mov ax, 4
- sub ax, cx
- pop bx
- pop cx
- pop si
- jmp Py2End
- ;
- NextPy2: pop bx
- pop cx
- pop si
- add bx, +5
- jmp Py2Loop0
- ;
- toPy2Again: inc si
- jmp Py2Loop0
- ;
- Py2End: cmp dl, 27h
- je toPy2Again
- mov [di], dl
- inc di
- add si, ax
- pop bx
- ret
- GetPy2 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
- cmp ch, cl
- jae clSkip0
- sub cl, ch
- xor ch, ch
- clLoop1: mov ax, 1403h
- mov bl, bAttr
- mov dl, ' '
- int 10h
- loop clLoop1
- clSkip0: 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
- jae prSameEnd
- mov al, es:[si]
- inc si
- or al, al
- jz prSameEnd
- mov dl, al
- mov ax, 1403h
- mov bl, bAttr
- or bl, sAttr
- int 10h
- inc PmtX
- jmp prLoop
- ;
- prSameEnd: pop si
- ret
- prSame endp
- ; -------------------------------
- prSames proc near
- ;
- ; Print All Sames in SameBuf
- ;
- push es
- push si
- call GetAttr
- xor ch, ch
- mov cl, SameNum
- or cl, cl
- jz psEnd
- 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
- ; -------------------------------
- prStr proc near
- ;
- ; IN: ds:si = String
- ;
- call GetAttr
- mov ax, 1402h
- mov dl, 22
- int 10h
- prStrLoop: mov dl, [si]
- inc si
- or dl, dl
- jz prStrEnd
- mov ax, 1403h
- mov bl, bAttr
- or bl, eAttr
- int 10h
- jmp prStrLoop
- ;
- prStrEnd: ret
- prStr 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
- mov al, 94
- cmp nPage, 0
- je retEncode1
- mov ch, bh
- and bh, 7
- shr ch, 1
- shr ch, 1
- shr ch, 1
- cmp ch, cPage
- je retEncode1
- mov cPage, ch
- call MapPage
- retEncode1: mul bh
- xor bh, bh
- add bx, ax ; dx = c1*94 + c2
- shl bx, 1
- mov ax, word ptr PyCode[bx]
- jmp MakeCode
- ;
- 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
- cmp nPage, 0
- jne FromXMS
- mov ax, word ptr PyCode[bx]
- jmp MakeCode
- ;
- FromXMS: call ReadEncode
- mov ax, word ptr TmpCode
- ;
- MakeCode: mov bh, ah
- and bh, 1fh
- rol ax, 1
- rol ax, 1
- rol ax, 1
- and al, 1fh
- mov ah, bh
- xchg ah, al
- add ax, 6060h
- pop bx
- ret
- Encode2 endp
- ; -------------------------------
- CWEnCodes proc near
- ;
- ; IN: CCs = String
- ; cl = CW Length
- ; OUT: Codes = 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 Keys+3
- jne notMatch
- ;
- mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr Keys+1
- jne notMatch
- mov dx, [si+4]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr Keys+2
- jne notMatch
- clc
- ret
- ;
- notMatch: stc
- ret
- ;
- toTwo: mov al, byte ptr Codes+1
- cmp al, byte ptr Keys+1
- jne notMatch
- mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp ax, word ptr Keys+2
- jne notMatch
- clc
- ret
- ;
- toThree: cmp W3Mode, 1
- jb to3
- ja to3e
- ;
- ; W3Mode = 1: Keys = '1123'
- ;
- mov al, byte ptr Codes+1
- cmp al, byte ptr Keys+1
- jne W3nMatch
- mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr Keys+2
- jne W3nMatch
- mov dx, [si+3]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr Keys+3
- jne W3nMatch
- clc
- ret
- ;
- ; W3Mode = 0: Keys = '123 '
- ;
- to3: cmp ChSpNum, 3
- jne W3nMatch
- mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr Keys+1
- jne W3nMatch
- mov dx, [si+4]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr Keys+2
- jne W3nMatch
- clc
- ret
- ;
- ; W3Mode = 2: Keys = '1233'
- ;
- to3e: mov dx, [si+2]
- xchg dh, dl
- call EnCode2
- cmp al, byte ptr Keys+1
- jne W3nMatch
- mov dx, [si+4]
- xchg dh, dl
- call EnCode2
- cmp ax, word ptr Keys+2
- jne W3nMatch
- clc
- ret
- ;
- W3nMatch: stc
- ret
- CWEnCodes endp
- ; -------------------------------
- PushSam proc near
- ;
- ; IN: si = Offset of CODE TABLE
- ;
- push si
- push ax
- call GetCode
- lea si, CCs
- mov [si], ax
- mov byte ptr [si+2], 0
- call VeriPos
- pop ax
- call AddSame
- pop si
- 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 PyCode
- dec ax
- dec ax
- shr ax, 1
- mov bl, 94
- div bl
- add ax, 2130h
- ;
- mov dl, cPage
- shl dl, 1
- shl dl, 1
- shl dl, 1
- add al, dl ; 8 Qu / Page
- ;
- or ax, 8080h
- pop dx
- pop bx
- ret
- GetCode endp
- ; -------------------------------
- AddSame proc near
- ;
- ; IN: [si] = Strings of CCs
- ;
- cmp SameNum, 11
- jae asAbort
- cmp PmtX, 71
- jae asAbort
- push es
- push ax
- push bx
- push cx
- push si
- push di
- les di, SamAddr
- xor bh, bh
- mov bl, ah
- cmp SameNum, 0
- jne asSkip
- ;
- push di
- push bx
- mov cx, 11
- xor bx, bx
- asLoop0: mov es:[di], bl
- add bl, 16
- inc di
- loop asLoop0
- pop bx
- pop di
- ;
- asSkip: 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 di
- pop si
- pop cx
- pop bx
- pop ax
- pop es
- clc
- ret
- ;
- asAbort: mov PgFull, 1
- stc
- ret
- AddSame endp
- ; -------------------------------
- MapPage proc near
- ;
- ; IN: cPage = to be Mapped
- ;
- pusha
- xor ah, ah
- mov al, cPage
- mov cx, 1504
- mov Count, cx
- mul cx
- mov word ptr sOffset, ax
- lea ax, PyCode
- mov word ptr dOffset, 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 sOffset, bx
- mov Count, 2
- lea ax, TmpCode
- mov word ptr dOffset, ax
- mov ah, 0bh
- lea si, xStruc
- call dword ptr xEntry
- pop si
- ret
- ;
- TmpCode dw 3 dup(0)
- ReadEncode endp
- ; -------------------------------
- ;
- db 'PY CODE:'
- PyCode db 6768*2 dup(?)
- NextPy db (15976-6768*2) dup(?)
- PyEnd label byte
- ;
- iFile db 'chcs.ini', 0
- ;
- CHCSMark db 13,10,9, 'CHCS'
- ;
- noCHCS db 7, 'chpy: CHCS/CHIS no installed !'
- db 0dh,0ah, '$'
- ReInst db 'chpy: ╞┤╥⌠╩Σ╚δ╖¿╥╤╫░╚δ !', 0dh,0ah, '$'
- BadVer db 7, 'chpy: ░µ▒╛║┼▓╗╢╘', 0dh,0ah, '$'
- ;
- SpFileSuf db 'sp.dat', 0
- Path db 88 dup(?)
- NameOff dw ?
- ChangeSp db 0
- ;
- ; -------------------------------
- MoveToXMS proc near
- mov dSize, 15976
- 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
- ; add dx, 400
- 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, PyCode
- 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, 1504
- mov ax, xHandle
- mov sHandle, ax
- mov word ptr sOffset+2, 0
- lea ax, PyCode
- mov word ptr dOffset, ax
- mov ax, cs
- mov word ptr dOffset+2, ax
- mov dHandle, 0
- ;
- mov bx, 1504
- 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
- ; -------------------------------
- start: mov ax, ds
- mov es, ax
- 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
- 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
- ;
- ; Treat Command Line Parameters:
- ;
- mov si, 81h
- cmdLoop0: mov al, [si]
- inc si
- cmp al, ' '
- je cmdLoop0
- cmp al, 09h
- je cmdLoop0
- cmp al, '/'
- jne CmdLineEnd
- mov al, [si]
- inc si
- and al, 5fh
- cmp al, 'P'
- jne CmdLineEnd
- mov al, [si]
- inc si
- cmp al, ':'
- jne CmdLineEnd
- mov cx, 8
- cld
- iLoop2: lodsb
- cmp al, ' '
- jbe iAddSuffix
- stosb
- loop iLoop2
- iAddSuffix: lea si, SpFileSuf
- mov cx, 7
- cld
- rep movsb
- mov ChangeSp, 1
- ;
- CmdLineEnd: mov ax, 3f00h
- int 16h
- mov di, bx
- lea si, CHCSMark
- mov cx, 5
- cld
- repz cmpsb
- jz iCont0
- lea dx, noCHCS
- jmp prError
- ;
- iCont0: cmp ax, 0100h
- je iCont2
- lea dx, BadVer
- jmp prError
- ;
- iCont2: mov ax, 3516h
- int 21h
- mov word ptr Int16, bx
- mov word ptr Int16+2, es
- ;
- ; 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
- ;
- iNoXMS: mov ax, 3101h
- lea bx, KeyProc
- lea dx, PyName
- mov di, Psp
- push cs
- pop es
- int 16h
- or ax, ax
- jz iCont1
- lea dx, ReInst
- jmp prError
- ;
- iCont1: mov word ptr SamAddr, bx
- mov word ptr SamAddr+2, es
- ;
- call MoveToXMS
- ;
- cmp ChangeSp, 1
- jne iCont3
- ;
- lea dx, Path
- mov ax, 3d00h
- int 21h
- jc iCont3
- mov bx, ax
- mov ah, 3fh
- lea dx, SpSm
- mov cx, 11 + 165
- int 21h
- mov ah, 3eh
- int 21h
- ;
- iCont3: mov es, Env
- mov ah, 49h
- int 21h
- ;
- lea dx, PyCode
- add dx, pSize
- mov cl, 4
- shr dx, cl
- inc dx
- mov ax, 3100h
- int 21h
- ;
- prError: mov ah, 9
- int 21h
- mov ax, 4cffh
- int 21h
- ; -------------------------------
- code ends
- end begin
-