Assembly code written by Xiaomi CEO Lei Jun, 25 years ago
In case you never heard of Xiaomi, it is Apple Inc. in China. Xiaomi is so hot in Asia now. Former Google Android exec Hugo Barra joined it and enjoy working there.
The CEO of Xiaomi, Lei Jun, is considered as Steve Jobs in China. But, Lei Jun can actually write code ...
(This page is created by sending the code file as an attachment to *****@mailp.in -- create a web page with an email).
RI.ASM
:
- ;
- ; RI.ASM Revision 2.12 [ July 12, 1994 ]
- Revision equ 'V2.12 '
- ;
- ; **************************************************************************
- ; * *
- ; * RAMinit Release 2.0 *
- ; * Copyright (c) 1989-1994 by Yellow Rose Software Co. *
- ; * Written by Mr. Leijun *
- ; * *
- ; * Function: *
- ; * Press HotKey to remove all TSR program after this program *
- ; * *
- ; **************************************************************************
-
- ; ..........................................................................
- ; Removed Softwares by RI:
- ; SPDOS v6.0F, WPS v3.0F
- ; Game Busters III, IV
- ; NETX ( Novell 3.11 )
- ; PC-CACHE
- ; Norton Cache
- ; Microsoft SmartDrv
- ; SideKick 1.56A
- ; MOUSE Driver
- ; Crazy (Monochrome simulate CGA program)
- ; RAMBIOS v2.0
- ; 386MAX Version 6.01
- ; ..........................................................................
- ; No cancel softwares:
- ; Windows 3.1 MSD
- ;
- ; No removed TSR softwares:
- ; MS-DOS fastopen
- ; Buffers, Files ... (QEMM 6.0)
- ; QCache (386MAX 6.01)
- ; ..........................................................................
- ;
- COMMENT *
-
- V2.04 Use mouse driver software reset function to initiation mouse
- 2/17/1993 by Mr. Lei and Mr. Feng
- V2.05 RI cannot work in Windows DOS prompt
- 3/9/1993 by Mr. Lei
- V2.06 1. When XMS cannot allocate 1K memory, RI halts.
- 2. RI repeat deallocates EMS memory.
- V2.07 HotKey Setup Error
- 4/25/1993 by Mr. Lei
- V2.08 KB Buffer
- V2.10 1. Release high memory blocks (EMM386 QEMM386 S-ICE 386MAX)
- 2. RI copies flag
- V2.12 1. Exists a critical error in Init 8259 procedure
- 2. Save [40:F0--FF] user data area
-
- *
-
- dosseg
- .model tiny
- .code
- locals @@
- org 100h
-
- Start: jmp Main
- org 103h
-
- True equ 1
- False equ 0
- MaxHandles equ 100h
-
- INT3 macro
- out 0ffh,al
- endm
- ;
- ; HotKey Status Test Var
- ; --------------- ---------------
- ;
- ; 7 6 5 4 3 2 1 0 417 418 496
- ; . . x . x . . . Left Alt is pressed 8 2
- ; x . . . x . . . Right Alt is pressed 8 8
- ; . . . x . x . . Left Ctrl is pressed 4 1
- ; . x . . . x . . Right Ctrl is pressed 4 4
- ; . . . . . . x . Left Shift is pressed 2
- ; . . . . . . . x Right Shift is pressed 1
- ;
- LeftAlt equ 00101000b
- RightAlt equ 10001000b
- LeftCtrl equ 00010100b
- RightCtrl equ 01000100b
- LeftShift equ 00000010b
- RightShift equ 00000001b
- HotKey db LeftCtrl or RightCtrl
-
- DataBegin dw 0
- NextDataSeg dw 0ffffh
- oldInt2F_addr dw 0, 0
- XMS_control dw 0, 0
- Handle_begin dw 0
- cvtOfs dw 0 ; DOS 3.0 equ 0 and above DOS 4.0 is 1
- org 104h
- db 0dh
- db Revision
- db ??date
- db 26
- org 114h
- tsrLength dw 0
- MachineID db 0FCh ; IBM PC/AT
-
- AuxHotKey db 0 ; 2Dh ; 'X' Scan Code
- AuxHotKeyName db 'X$ '
- Power db True
- Flag db '!'
- Kbd102 db 0
- NoFlag db 0
- StopFlag db 1
- DosEnv dw 0
- WorkSeg dw 0
- PrevDataSeg dw 0
- Copies db '1'
- old_8259 db 0 ; 21h port
- db 0 ; a1h port
-
- Status dw 0
- XMSbit equ 00000001b
- EMSbit equ 00000010b
- SKbit equ 10000000b
-
- GoINT1C: db 0eah
- oldInt1C_addr dw 0, 0
- newINT1C:
- test cs:Status, SKbit
- jnz GoINT1C
- cmp cs:StopFlag, 0
- jz @@0
- ;
- ; Mr. Lei 2/8/1993
- ; Problem: if WPS quit and reenter, old RI cann't control keyboard.
- ;
- push ds
- push ax
- xor ax, ax
- mov ds, ax
- mov ax, ds:[9*4]
- cmp ax, offset NewInt9
- pop ax
- pop ds
- jnz GoINT1C
- mov cs:StopFlag, 0
-
- @@0: push ax
- push ds
- push es
- xor ax, ax
- mov ds, ax
- mov es, ds:[9*4+2]
- cmp word ptr es:[101h], 'IE' ; 'LEI'
- jz @@1
- cli
- mov cs:StopFlag, 1
- mov ax, ds:[9*4]
- mov cs:oldINT9_addr2, ax
- mov ax, ds:[9*4+2]
- mov cs:oldINT9_addr2[2], ax
- mov ds:[9*4], offset newINT9_2
- mov ds:[9*4+2], cs
- sti
- @@1: pop es
- pop ds
- pop ax
- jmp GoINT1C
-
- ; ----------------------------------------------------------------------
- ; INT2F Func
- ;
- ; AX = C0D7h Return RI segment in AX
- ; AX = C0D8h Removes all TSR programs after RI
- ; AX = C0D9h Removes all TSR programs include RI
- ; AX = C0DAh Removes all RI copies
- ; ----------------------------------------------------------------------
-
- newINT2F:
- cmp ax, 0c0d7h ; LEI Hanzi GB Code
- jnz @@1
- push cs
- pop ax
- iret
- @@1: cmp ax, 0c0d7h+1
- jnz @@2
- jmp KeepSelf
- @@2: cmp ax, 0c0d7h+2
- jnz @@3
- jmp NoKeepSelf
- @@3: cmp ax, 0c0d7h+3
- jnz @@9
- mov cs:NextDataSeg, -1
- mov cs:Copies, '1'
- jmp NoKeepSelf
- @@9: jmp dword ptr cs:oldInt2F_addr
-
-
- CallInt9:
- ret
-
-
- newINT9_2:
- mov cs:NoFlag, 1
- pushf
- db 9ah ; call far ptr oldint9_addr
- oldInt9_Addr2 dw 0, 0
- jmp newINT9_proc
-
- newINT9:
- pushf
- db 9ah ; call far ptr oldint9_addr
- oldInt9_Addr dw 0, 0
- cmp cs:NoFlag, 0
- jz newINT9_proc
- mov cs:NoFlag, 0
- iret
- newINT9_proc:
- cmp cs:Flag, '!' ; busy ?
- jnz @@0
- iret
- @@0:
- mov cs:Flag, '!' ; set busy flag
- push ax ; cmp hot key
- push bx
- push es
- mov ax,40h
- mov es,ax
-
- cmp cs:AuxHotKey, 0
- jz @@_1
- mov bx, es:[1ah]
- cmp bx, es:[1ch]
- jz @@10
- push bx
- mov bl, es:[bx+1]
- cmp bl, cs:AuxHotKey
- pop bx
- jnz @@10
- @@_1:
- mov ah,es:[17h] ; test CTRL SHIFT ALT
- mov al,cs:HotKey
- push ax
- and ax,0f0fh
- cmp al,ah
- pop ax
- jnz @@10
- cmp cs:Kbd102, True
- jnz @@1
- shr al, 1
- shr al, 1
- shr al, 1
- shr al, 1
- push ax
- mov ah, es:[18h]
- and ax, 303h
- cmp al, ah
- pop ax
- jnz @@10
- mov ah, es:[96h]
- shr ax, 1
- shr ax, 1
- and ax, 303h
- cmp al, ah
- jnz @@10
-
- cmp cs:AuxHotKey, 0
- jz @@_3
- inc bx
- inc bx
- cmp bx, 3eh
- jb @@_2
- mov bx, 1eh
- @@_2:
- mov es:[1ah], bx
- @@_3:
- call IsWinDos
- or ax, ax
- jz @@1
- call Beep
- @@10:
- sti
- pop es
- pop bx
- pop ax
- mov cs:Flag, ' ' ; no busy
- iret
- @@1: ; OK
- pop es
- pop bx
- pop ax
-
- KeepSelf:
- call RemoveTSR
- push es
- mov es,cs:WorkSeg
- mov dx,es:tsrLength
- mov di,dx
- mov al,0h ; Aug 24, 1993
- mov cx,100h
- rep stosb
- pop es
- int 27h
-
- NoKeepSelf:
- mov ax,0e07h
- int 10h
- mov cs:clsStr, 47h ; Color (White in Red)
- call RemoveTSR
- dec cs:Copies
- call RestoreSelfIntVec
- push es
- cmp cs:PrevDataSeg, 0
- jz @@1
- mov es, cs:PrevDataSeg
- mov es:NextDataSeg, -1
- @@1: pop es
- mov ax, 4c00h
- int 21h
-
- ; ---------------------------------------------------------------------------
-
- IsWinDOS:
- mov ax, 1600h
- int 2fh
- cmp al, 01h
- jz @@9
- cmp al, 0ffh
- jz @@9 ; Windows/386 Version 2.X
- cmp al, 00h
- jz @@1
- cmp al, 80h
- jnz @@9 ; Windows 3 in enhanced mode
- ; Version number in AL/AH
- @@1:
- mov ax, 4680h
- int 2fh
- cmp al, 80h
- jnz @@9
- xor ax, ax
- jmp @@10
- @@9: mov ax, 1
- @@10: ret
-
- ; -----------------------------------------------------------------------
- RestoreSelfIntVec:
- cmp Copies, '0'
- jz @@0
- ret
- @@0:
- cli
- push cs
- pop ds
- xor ax, ax
- mov es, ax
- mov si, offset oldInt9_Addr
- mov di, 9*4
- movsw
- movsw
- mov si, offset oldInt2F_Addr
- mov di, 2Fh*4
- movsw
- movsw
- mov si, offset oldInt1C_Addr
- mov di, 1Ch*4
- movsw
- movsw
- sti
- ret
-
- ; ------------- KERNEL PROGRAM ----------------------------------------------
- RemoveTSR:
- pop ax
- cli ; Set stack
- mov sp, cs
- mov ss, sp
- mov sp, 100h
- sti
- push ax
-
- cmp cs:Power, True
- jnz @@1
- call Init8259
- @@1:
- push cs
- pop ds
- @@_0:
- mov ax,ds:NextDataSeg
- cmp ax, -1
- jz @@_1
- mov cs:PrevDataSeg, ds
- mov ds, ax
- jmp @@_0
- @@_1: mov si,ds:DataBegin
- mov cs:WorkSeg, ds
- lodsw
- cmp ax, 'XX'
- jz @@_2
- call Beep
- ret
- @@_2:
- call RestoreEnvStr
- call RestoreMCB ; restore current mcb
- call CloseFiles
- call RestorePort
- call RestoreLEDs
- call RestoreVecList ; Restore vectors list
- call RestoreFloppyParam
- cmp cs:Power, True
- jnz @@2
- call RestoreCVTchain ; Restore cvt chain
- call RestoreMemoryManager
- @@2:
- call RestoreBiosData
- call Enable8259
- mov ah, 1
- int 16h
-
- call RestoreClockSpeed
- call CloseSpeaker
- call ResetDisk
- call UpdateTime
-
- call ClosePRN
- mov bx,cs:WorkSeg
- mov ah,50h
- int 21h ; Set PSP segment
- mov ax,3
- int 10h ; Set display mode
-
- call InitPRN
- call InitMouse
- mov al, cs:Copies
- cmp al, '1'
- ja @@_sh1
- mov cs:ShowCopies, '*'
- jmp @@_sh2
- @@_sh1: mov cs:ShowCopies, al
- @@_sh2:
- mov si, offset clsStr
- call ColorPrintStr
- mov cs:Flag, ' ' ; no busy
- cmp Copies, '1'
- jnz @@_end
- mov cs:StopFlag, 0
- @@_end:
- call ClearKB_buffer
- ret
-
- Beep:
- mov ax,0e07h
- int 10h
- ret
-
- ; #########################################################################
-
- ClearKB_Buffer:
- push es
- push bx
- mov bx, 0040h
- mov es, bx
- cli
- mov bx, es:[1ah]
- mov es:[1ch], bx
- sti
- pop bx
- pop es
- ret
-
-
- Init8259:
- ; cmp cs:Copies, '1'
- ; jz @@1
- ; ret
- @@1:
- cmp cs:MachineID, 0fch
- ja @@pc_xt
- @@AT:
- mov bx,870h ;
- mov al,0 ;
- out 0F1h,al ;
- jcxz $+2
- jcxz $+2
- mov al,11h ; ICW1
- out 0A0h,al
- jcxz $+2
- jcxz $+2
- out 20h,al
- jcxz $+2
- jcxz $+2
- mov al,bl ; ICW2
- out 0A1h,al
- jcxz $+2
- jcxz $+2
- mov al,bh
- out 21h,al
- jcxz $+2
- jcxz $+2
- mov al,2 ; ICW3
- out 0A1h,al
- jcxz $+2
- jcxz $+2
- mov al,4
- out 21h,al
- jcxz $+2
- jcxz $+2
- mov al,1 ; ICW4
- out 0A1h,al
- jcxz $+2
- jcxz $+2
- out 21h,al
- jcxz $+2
- jcxz $+2
- mov al,0FFh ; OCW1
- out 0A1h,al
- jcxz $+2
- jcxz $+2
- out 21h,al
- ret
- @@PC_XT:
- mov al,13h ; ICW1
- out 20h,al
- jcxz $+2
- jcxz $+2
- mov al,8 ; ICW2
- out 21h,al
- jcxz $+2
- jcxz $+2
- mov al,9 ; ICW4
- out 21h,al
- jcxz $+2
- jcxz $+2
- mov al,0FFh ; OCW1
- out 21h,al
- ret
-
- Enable8259:
- mov ax, word ptr cs:old_8259
- out 021h,al
- jcxz $+2
- jcxz $+2
- mov al,ah
- out 0a1h,al ; DEC PC Bus Mouse
- ret ; July 1994 by Mr. Lei
-
- ; -------------------------------------------------------------------------
-
- RestoreBiosData:
- lodsw
- cmp ax, '--'
- jz @@1
- call Beep
- ret
- @@1: push es
- push di
- mov di, 40h
- mov es, di
-
- mov di, 10h
- movsw
- mov di, 0a8h ; [40h:a8h]
- movsw
- movsw
- mov di, 49h
- mov cx, 1dh
- rep movsb
-
- mov di, 0f0h ; User data
- mov cx, 8
- rep movsw
-
- pop di
- pop es
- ret
-
- ; -------------------------------------------------------------------------
-
- RestoreMCB:
- push ds
- push es
- lodsw ; 'MZ'
- @@0: lodsw
- cmp ax, 'MM'
- jz @@1
- mov es,ax
- xor di,di
- movsb
- movsw
- movsw
- inc ax
- mov bx, ds
- cmp ax, bx
- jz @@10
- mov byte ptr es:[8], 0 ; Aug 24, 1993
- @@10: cmp byte ptr es:[0], 'Z'
- jnz @@0
- mov byte ptr es:[10h], 0
- jmp @@0
- @@1:
- pop es
- pop ds
- ret
-
- ; -------------------------------------------------------------------------
- CloseFiles:
- mov ax, 5 ; Begin handle
- push ds
- push si
- mov cx, 15 ; Max handle
- sub cx, ax
- inc cx
- mov bx, ax
- @@1: push bx
- push cx
- mov ah, 3eh
- int 21h
- pop cx
- pop bx
- inc bx
- loop @@1
- pop si
- pop ds
- ret
-
- ; -------------------------------------------------------------------------
- RestorePort:
- mov di, 40h ; restore port
- mov es, di
- xor di, di
- mov cx, 8
- rep movsw
- ret
-
- ; -------------------------------------------------------------------------
- RestoreLEDs:
- lodsb
- and al, 11110000b ; LED status
- mov ah, es:[17h]
- and ah, 00001111b
- or ah, al
- and ah, 0f0h ; Clear CTRL ALT SHIFT
- mov es:[17h], ah
- ret
-
- ; -------------------------------------------------------------------------
- RestoreEnvStr:
- lodsw
- push si
- push di
- push ds
- push es
- mov es, cs:DosEnv
- mov ds, ax
- xor si, si
- mov di, si
- @@0: lodsb
- or al, al
- jnz @@1
- cmp byte ptr ds:[si], 0
- jz @@2
- @@1: stosb
- jmp @@0
- @@2: stosb
- stosb
- pop es
- pop ds
- pop di
- pop si
- ret
-
- ; -----------------------------------------------------------------------
- RestoreVecList:
- xor ax,ax
- mov di,ax
- mov es,ax
- mov cx,100h
- @@0: lodsw
- xchg dx, ax
- lodsw
- cmp dx, 'EL'
- jnz @@1
- cmp al, 'I'
- jnz @@1
- sub cl, ah
- push cx
- mov cl, ah
- mov ax, es:[di-4]
- mov dx, es:[di-2]
- @@a: stosw
- xchg ax, dx
- stosw
- xchg ax, dx
- loop @@a
- pop cx
- or cx, cx
- jz @@9
- jmp @@0
- @@1:
- xchg ax, dx
- stosw
- xchg ax, dx
- stosw
- loop @@0
- @@9:
- ret
-
- ;----------------------------------------------------------------------------
- RestoreFloppyParam: ; Mr. Lei 2/10/1992
- push es
- push ax
- xor ax, ax
- mov es, ax
- mov byte ptr es:[525h], 2
- pop ax
- pop es
- ret
-
- ;---------------------------------------------------------------------------
- RestoreCVTchain:
- lodsw
- cmp ax, 'VC'
- jz @@_0
- call Beep
- ret
- @@_0:
- push ax
- push cx
- push es
-
- ; -----------------------------------------------------------------
- lodsw ; DPB
- mov di, ax
- lodsw
- mov es, ax
- @@1: lodsb
- inc di
- stosb
- add di, cs:cvtOfs
- add di, 10h
- movsw
- movsw
- les di, es:[di+2]
- cmp di, -1
- jnz @@1
-
- ; -----------------------------------------------------------------
- lodsw ; DCB
- mov di, ax
- lodsw
- mov es, ax
- xor ax, ax
- dec ax
- stosw
-
- ; -----------------------------------------------------------------
- lodsw ; Device Driver Chain
- mov di, ax
- lodsw
- mov es, ax
- xor cx, cx
- @@9: push di
- mov cl, 5
- rep movsw
- pop di
- les di, es:[di]
- mov ax, di
- inc ax
- jnz @@9
- pop es
- pop cx
- pop ax
- ret
-
- ; ----------------------------------------------------------------------------
- RestoreMemoryManager:
- test cs:Status, XMSbit
- jz @@1
- call LoadXMSstatus
- @@1:
- test cs:Status, EMSbit
- jz @@2
- call LoadEMSstatus
- @@2:
- ret
-
-
- LoadEMSstatus:
- lodsw
- cmp ax, 'ME'
- jz @@_0
- call Beep
- ret
- @@_0:
- lodsw
- mov cx, ax
- xor dx, dx
- @@_1: push ds
- push si
- push dx
- push cx
-
- @@0: cmp dx, ds:[si]
- jz @@1
- add si, 4
- loop @@0
-
- push cx
- mov cx, 5
- @@__0: mov ah, 45h ; Deallocate Handle and Memory
- int 67h
- or ah, ah
- jz @@__1
- loop @@__0
- @@__1: pop cx
-
- @@1:
- pop cx
- pop dx
- pop si
- pop ds
- inc dx
- cmp dx, 100h
- jb @@_1
- shl cx, 1
- shl cx, 1
- add si, cx
- ret
-
-
- LoadXMSstatus:
- lodsw
- cmp ax, 'MX'
- jz @@_0
- call Beep
- ret
- @@_0:
- lodsw
- mov cx, ax
- jcxz @@5
- @@1:
- lodsw
- mov dx, ax
- @@2: push dx
- mov ah, 0ah ; free
- call dword ptr cs:xms_control
- or ax, ax
- pop dx
- jnz @@4
- cmp bl, 0abh
- jnz @@4
- push dx
- mov ah, 0dh ; unlock
- call dword ptr cs:xms_control
- or ax, ax
- pop dx
- jmp @@2
- @@4: loop @@1
- @@5: ret
- endp
-
- ; -----------------------------------------------------------------------
- CloseSpeaker:
- in al, 61h
- and al, 0fch
- out 61h, al
- ret
-
- ; -----------------------------------------------------------------------
- RestoreClockSpeed:
- mov al, 00110110b
- out 43h, al
- xor ax, ax
- out 40h, al
- out 40h, al
- ret
-
- ; -----------------------------------------------------------------------
- ResetDisk:
- xor ax, ax
- xor dx, dx
- int 13h ; Restore A
- inc dx
- int 13h ; Restore B
- mov dl, 80h
- int 13h ; Restore C
- ret
-
-
-
- ; --------------------------------------------------------------------------
- ClosePRN:
- mov ah, 51h ; Get PSP seg
- int 21h
- mov es, bx
- mov ax, es:[16h] ; Prev PSP seg
- cmp ax, bx
- jnz @@9
- mov ax, 3e00h ; COMMAND
- mov bx, 4
- int 21h
- @@9:
- ret
-
- InitPRN:
- mov ax, 3e00h
- mov bx, 4 ; PRN
- int 21h
- mov ax, 3d01h
- mov dx, offset PRNname
- push cs
- pop ds
- int 21h
- ret
- PRNname db 'PRN',0
-
- InitMouse: ; 2/16/1993 by Mr. Lei
- push es
- xor ax, ax
- mov es, ax
- cmp word ptr es:[33h*4+2], 0
- jz @@0
- cmp word ptr es:[33h*4], 0
- jz @@0
- mov ax, 21h
- int 33h ; Hook Mouse Interrupt
- @@0: pop es
- ret
-
- ; ------------- CMOS CLOCK set to System -----------------------------------
- UpdateTime:
- call GetRealTime
- mov ah, 2dh
- int 21h
- ret
-
- GetRealTime:
- mov ah,2
- int 1Ah
- mov al,ch
- call bcdxchg
- mov ch,al
- mov al,cl
- call bcdxchg
- mov cl,al
- mov al,dh
- call bcdxchg
- mov dh,al
- mov dl,0
- ret
-
- BCDxchg:
- push ax
- push cx
- mov cl,4
- shr al,cl
- pop cx
- mov bl,0Ah
- mul bl
- pop bx
- and bl,0Fh
- add al,bl
- ret
-
- ; -----------------------------------------------------------------------
- ; Display string
- ColorPrintStr:
- lodsb
- mov bh, al ; color
- xor cx, cx
- mov dx, 014fh
- mov ax, 0600h
- int 10h
-
- mov ah, 02 ; GotoXY (0, 0)
- xor dx, dx
- mov bh, 0
- int 10h
- PrintStr:
- push cs
- pop ds
- xor bx, bx
- @@1: lodsb
- cmp al, '$'
- jz @@2
- or al, al
- jz @@2
- mov ah, 0eh
- int 10h
- jmp short @@1
- @@2: mov al, cs:clsStrcolor
- mov cs:clsStr, al
- ret
-
- ; -----------------------------------------------------------------------
- Self dw 0
- clsStrcolor db 17h
- clsStr db 17h ; Color (White in Blue)
- db ' RAMinit Version 2.12 (c) 1989-1994 by KingSoft Ltd. Mr. Leijun'
- db 0dh,0ah
- db ' ['
- ShowCopies db '*'
- db '] Activate...',0ah,0dh,'$'
-
- endTSR equ $
- mcbList equ offset endTSR + 2 + 2
- vecList equ mcbList + 7*10 + 2 + 10h + 1 + 400h
- devLink equ vecList + 4 + 5 * 26 + 4 + 10 * 30h + 4
- xmsList equ devLink + 2 + MaxHandles * 2
- emsList equ xmsList + 4 + 1024
- crtMode equ emsList + 2 + 1Dh + 4 + 10h
- tsrLen equ crtMode + 1
- ;
- ; DOS Environment Reserved by RI
- ; --------------------------------------------------
- ; Flag 'XX' 2 bytes
- ; Environment Segment 1 word
- ; Free MCBs <=7*10 bytes
- ; MCB segment 1 word
- ; MCB 5 bytes
- ; End flag 'MM' 1 word
- ; COM LPT ports 10h bytes
- ; LEDs status 1 bytes
- ; Packed vectors list <=400h bytes
- ; Flag 'CV' 2 bytes
- ; CVT First DPB pointer 4 bytes
- ; DPBs data <=5*26 bytes
- ; First DCB pointer 4 bytes
- ; Pointer to NUL 4 bytes
- ; All device driver datas <=30h*10 bytes
- ; Flag 'XM' 2 bytes
- ; XMS free handle counter 2 bytes
- ; EMS free handle list <=100h*4 bytes
- ; Flag 'EM' 2 bytes
- ; EMS free handle counter 2 bytes
- ; EMS free handle list <=1024 bytes
- ; EMS handle 1 word
- ; Number of pages 1 word
- ; Flag '--' 1 word
- ; Equipment List 1 word
- ; CRT 40:49h-66h 1dh bytes
- ; 40:A8h 1 dword
- ; BIOS User Data Area 40:F0--FF 10h bytes
- ; ***************************************************************************
- ;
- main: jmp main0
-
- Print Macro Str
- Lea dx, Str
- call DisplayStr
- endm
-
- InstMsg db 'RAMinit Version 2.12 '
- db 'Copyright (c) 1989-1994 by KingSoft Ltd. ',0dh,0ah,'$'
- Msg0 db 'Already installed !',0dh,0ah,0ah
- db 'For Help, type "RI /?". ',0dh,0ah,'$'
- Msg_0 db 0ah,'Residents a new RAMinit copy [y/n] ? $'
- Msg_2 db 'OK, RI No.'
- Msg_RI db '2'
- db ' residents successful !', 0dh,0ah,'$'
- Msg1 db 'Activate with: $'
- KeyMsg db 'Right_Shift$'
- db 'Left_Shift$ '
- KMsg1 db 'Left_Ctrl$ '
- db 'Left_Alt$ '
- db 'Right_Ctrl$ '
- db 'Right_Alt$ '
- KMsg2 db 'Ctrl$ '
- db 'Alt$ '
- db 'Ctrl$ '
- db 'Alt$ '
- PlusMsg db ' + $'
- crlf db 0dh,0ah,'$'
-
- HelpMsg db 'Programmed by Mr. Leijun Dec 1992', 0dh,0ah,0ah
- db 'Usage: RI [options]',0dh,0ah,0ah
- db '/H,/? Display this screen',0dh,0ah
- db '/CLS Removes all TSR programs after current RI',0dh,0ah
- db '/RET Removes TSR programs include current RI',0dh,0ah
- db '/NEW Residents a new data copy of current environment',0dh,0ah
- db '/ALL Removes all RI copies and all other tsr programs',0dh,0ah
- db '/Sxyy.. Define Hotkey x=AuxHotkey yy..=shift status',0dh,0ah
- db ' x=auxiliary hotkey (default is "X") ',0dh,0ah
- db ' x equ "1" means need AuxHotkey',0dh,0ah
- db ' yy..=shift status [CAScas]',0dh,0ah
- db ' C: Left Ctrl A: Left Alt S: Left Shift',0dh,0ah
- db ' c: Right Ctrl a: Right Alt s: Right Shift',0dh,0ah,0ah
- db 'Example: "RI /S1c" means Hotkey is Right_Ctrl+X',0dh,0ah
- db ' "RI /S0Cc" means HotKey is Left_Ctrl+Right_Ctrl',0dh,0ah
- db ' "RI /CLS" equals simply press hotkey',0dh,0ah
- db ' "RI /RET" Removes all TSRs after current RI and this RI',0dh,0ah
- db 0ah
- db 'Contact me for RAMinit problems: (01)2561155 Call 1997',0dh,0ah
- db '$'
- ErrMsg db 'ERROR: Invalid options !',0dh,0ah,0ah,'$'
- WinErr db 7, 'Sorry, I cannot work in Windows DOS environment.',0dh,0ah,'$'
- SetMsg db 7, 'Defines new Hotkey successful !',0dh,0ah,0ah,'$'
- tsrOK db False
-
- Main0:
- cld
- Print instMsg
- call IsWinDos
- or ax, ax
- jz @@1
- Print WinErr
- mov ax, 4c00h
- int 21h
- @@1:
- call HotKeyValid
- mov cs:Status, 0
- call EMS_test
- call CmpDosVer
- call CmpSideKick
- call GetMachineID
- call ModifyHotKeyPrompt
-
- mov ax, 0c0d7h
- int 2fh
- mov es, ax
- cmp word ptr es:[101h], 'IE' ; 'LEI'
- jnz @@0
- mov cs:Self, ax
- @@0:
- call CmdLine
- call PrintHotKeyPrompt
-
- cmp cs:tsrOK, true
- jz @@2
- call tsrReplyOK
- @@2: cmp cs:tsrOK, true
- jnz @@_2
- call PrintCopies
- @@_2:
- mov word ptr cs:[100h], 'EL'
- mov byte ptr cs:[102h], 'I'
-
- push cs
- pop es
- push cs
- pop ds
- std
- mov si, offset eof
- mov cx, eof - offset Here
- mov di, tsrLen
- add di, cx
- inc cx
- rep movsb
- cld
- mov bx, tsrLen
- jmp bx
-
- Here:
- mov ax,cs
- mov es,ax
- mov di,offset endTSR
- mov cs:DataBegin, di
- mov cs:NextDataSeg, -1
- mov ax, 'XX'
- stosw
- in al, 0a1h
- mov ah, al
- in al, 21h
- push ax
- mov word ptr cs:old_8259, ax
- xor ax, ax
- out 21h,al ; CLI
- call SaveOthers
- call SetSelfInt
- call BackupVecList
- cmp cs:Power, true
- jnz @@20
- call BackupCVTchain
- call BackupMemoryManager
- @@20:
- call BackupBiosData
-
- sti
- mov cs:Flag, ' ' ; no busy
- mov cs:StopFlag, 0 ;
-
- mov cs:tsrLength, di
- call SetDosEnvSeg
- cmp cs:Self, 0
- jz @@29
- push cs
- pop ds
- push cs
- pop es
- cld
- mov cx, cs:tsrLength
- mov si, cs:DataBegin
- sub cx, si
- mov di, 120h
- mov cs:DataBegin, di
- rep movsb
- mov cs:tsrLength, di
- @@29:
- pop ax
- out 21h, al ; STI
- mov al, ah
- out 0a1h, al
- mov dx, cs:tsrLength
- inc dx
- int 27h
-
- ; ----------------------------------------------------------------------------
- SetDosEnvSeg:
- push ds
- push es
- mov ax, cs
- @@10: mov es, ax
- mov ax, es:[16h] ; Get father process psp segment
- or ax, ax
- jz @@11
- mov bx, es
- cmp ax, bx
- jnz @@10
- @@11:
- mov es, word ptr es:[2ch] ; Get father process env segment
- mov cs:DosEnv, es
- pop es
- pop ds
- ret
-
- ; ----------------------------------------------------------------------------
-
- SaveOthers:
- mov ax, cs:[2ch] ; Env Seg
- stosw
- call backupMCB ; Current MCB
- mov ax, 40h ; COM LPT Port
- mov ds, ax
- mov si, 0h
- mov cx, 8
- rep movsw
-
- mov si, 17h ; LED status
- lodsb
- stosb
- ; call OpenLEDs
- ret
-
- ; --------------------------------------------------------------------------
- backupMCB:
- mov ax, 'ZM'
- stosw
- push ds
- push es
- mov ah, 52h
- int 21h ; Get MCB chain head
- mov ax, es:[bx-2]
- pop es
- @@0: mov ds, ax
- cmp byte ptr ds:[0], 'Z' ; End ?
- jz @@20
- cmp byte ptr ds:[0], 'M' ; Memory control block
- jnz @@30
- cmp word ptr ds:[3], 0 ; Nul mcb
- jz @@10
- cmp word ptr ds:[1], 0 ; Free MCB
- jnz @@10
- call SaveFreeMCB
- @@10: inc ax
- add ax, ds:[3]
- jmp @@0
- @@20:
- call SaveFreeMCB
- cmp ax, 0a000h
- inc ax
- jnb @@30
- mov ax, 9fffh ; MS-DOS UMB
- jmp @@0
-
- @@30:
- cmp ax, 0c000h ; 386MAX
- ja @@90
- mov ax, 0c020h
- jmp @@0
-
- @@90: ; Error ?
- pop ds
- mov ax, 'MM' ; Set MCB flag
- stosw
- ret
-
- SaveFreeMCB:
- stosw
- xor si,si
- movsb
- movsw
- movsw
- ret
- ;
- ; push ax
- ; stosw
- ; xor si,si
- ; movsb
- ; movsw
- ; movsw
- ; pop ax
- ; cmp ax, 09fffh
- ; jnb @@3
- ; push ax
- ; push ds
- ; mov ds,ax
- ; cmp byte ptr ds:[0], 'M'
- ; pop ds
- ; pop ax
- ; jnz @@4
- ; mov ax, 09fffh ; MS-DOS UMB
- ; jmp @@0
- ; @@4: cmp ax, 0c000h
- ; ja @@3
- ; mov ax, 0c020h ; 386MAX
- ; jmp @@0
- ;
- ; --------------------------------------------------------------------------
-
- OpenLEDs: push ax ; Open all LEDs
- or al, 070h
- mov ds:[17h], al
- mov ah, 1
- int 16h
- mov cx, 4 ; Delay
- @@20: push cx
- xor cx, cx
- @@21: loop @@21
- pop cx
- loop @@20
- pop ax
- mov ds:[17h], al
- mov ah, 1
- int 16h
- ret
-
- ; --------------------------------------------------------------------------
- SetSelfInt:
- push es
- push di
-
- cmp cs:self, 0
- jnz @@1
- push cs
- pop ds
- mov ax,3509h
- int 21h
- mov word ptr cs:oldInt9_addr,bx
- mov word ptr cs:oldInt9_addr[2],es
- mov dx,offset NewInt9
- mov ax,2509h
- int 21h
-
- mov ax,352Fh
- int 21h
- mov word ptr cs:oldInt2F_addr,bx
- mov word ptr cs:oldInt2F_addr[2],es
- mov dx,offset newInt2F
- mov ax,252Fh
- int 21h
-
- mov ax,351Ch
- int 21h
- mov word ptr cs:oldInt1C_addr,bx
- mov word ptr cs:oldInt1C_addr[2],es
- mov dx,offset newInt1C
- mov ax,251ch
- int 21h
- cli
- jmp @@2
- @@1:
- mov es, cs:Self
- inc es:Copies
- @@_0: cmp es:NextDataSeg, -1
- jz @@_1
- mov es, es:NextDataSeg
- jmp @@_0
- @@_1: mov es:NextDataSeg, cs
- @@2:
- pop di
- pop es
- ret
-
- ; -----------------------------------------------------------------------
- SaveCounter:
- mov word ptr es:[di], 'EL'
- mov byte ptr es:[di+2], 'I'
- mov byte ptr es:[di+3], bl
- xor bx, bx
- add di, 4
- ret
-
- ; -----------------------------------------------------------------------
- DisplayStr: push cs
- pop ds
- mov ah, 9
- int 21h
- ret
-
- ; -----------------------------------------------------------------------
- CmdLine:
- push cs
- pop ds
- xor ax, ax
- mov si, 80h
- lodsb
- or al, al
- jnz @@1
- ret
- @@1:
- mov cx, ax
- dec ax
- push ax
- push si
- @@0: lodsb
- cmp al, ' '
- jz @@0
- cmp al, '/'
- jnz @@2
- lodsb
- cmp al, 'S'
- jz @@_2
- cmp al, 's'
- jnz @@2
- @@_2:
- call SetHotKey
- Print SetMsg
- mov ax, 4c00h
- int 21h
- @@2:
- pop si
- pop ax
- push ax
- push si
- @@_3: lodsb
- cmp al, 'A'
- jb @@3
- cmp al, 'Z'
- ja @@3
- add byte ptr ds:[si-1],20h ; DownCase
- @@3: loop @@_3
- pop si
- pop cx
-
- add si, cx
- lodsb
- cmp al, 's' ; CLS
- jnz @@5
- cmp word ptr ds:[si-3], 'lc'
- jnz @@5
- cmp cs:Self, 0
- jz @Err
- mov ax, 0c0d7h+1
- int 2fh
-
- @@5: cmp al, 'h' ; HELP
- jz @help
- cmp al, '?'
- jz @help
- cmp al, 't' ; RET
- jnz @@6
- cmp word ptr ds:[si-3], 'er'
- jnz @@6
- @@7:
- cmp cs:Self, 0
- jz @Err
- mov ax, 0c0d7h+2
- int 2fh
- @@6: cmp al, 'w' ; NEW
- jnz @@8
- cmp word ptr ds:[si-3], 'en'
- jnz @@8
- mov cs:tsrOK, true
- ret
- @@8:
- cmp al, 'l' ; ALL
- jnz @@9
- cmp word ptr ds:[si-3], 'la'
- jnz @@9
- mov ax, 0c0d7h+3
- int 2fh
- @@9:
- cmp al, ' '
- jnz @Err
- ret
-
- @Err:
- Print ErrMsg
- @help:
- Print HelpMsg
- mov ax, 4c00h
- int 21h
-
- ;---------------------------------------------------------------------------
- tsrReplyOK:
- cmp cs:Self, 0
- jz @@1
- Print Msg0
-
- push es
- mov ax, cs:Self
- @@_10: mov es, ax
- mov ax, es:NextDataSeg
- cmp ax, -1
- jnz @@_10
- mov ax, es
-
- @@_0: push ax
- dec ax
- mov es, ax
- mov bx, es:[3]
- pop ax
-
- add ax, bx
- inc ax
- mov es, ax
- cmp word ptr es:[0], 'OC'
- jz @@_0
-
- mov bx, cs
- cmp ax, bx
- pop es
- jz @@2
- Print Msg_0
- mov ah, 1
- int 21h
-
- push ax
- Print crlf
- pop ax
-
- cmp al, 'y'
- jz @@3
- cmp al, 'Y'
- jz @@3
- @@2: ; Print Msg_1
- mov ax, 4c01h
- int 21h
- @@3:
- @@1: mov cs:tsrOK, true
- ret
-
- PrintCopies:
- cmp cs:Self, 0
- jz @@1
- push es ; Added -by- Mr. Lei
- mov es, cs:Self ; Aug 24, 1993
- mov al, es:Copies
- inc al ; Total RI copies
- push ax ; Set es = current mcb
- mov ax, cs
- dec ax
- mov es, ax
- pop ax
- mov cx, 5 ; Search end of file name
- mov bx, 8
- @@10: inc bx
- cmp byte ptr es:[bx], 20h
- jz @@20
- cmp byte ptr es:[bx], 0ffh
- jz @@20
- cmp byte ptr es:[bx], 00h
- jz @@20
- loop @@10
- @@20: ; Set current RI no
- mov byte ptr es:[bx], ':' ; "RI:2"
- mov byte ptr es:[bx+1], al
- cmp bx, 8+7
- jnb @@30
- mov byte ptr es:[bx+2], 0
- @@30:
- pop es
-
- mov cs:Msg_RI, al
- Print Msg_2
- @@1: ret
-
- ;---------------------------------------------------------------------------
- ; Backup Interrupt Vector List
- ;
- BackupVecList:
- push ds
- push cs
- pop es
- xor si,si ; Vectors
- mov ds,si
- movsw
- movsw
- xor bx, bx
- mov cx,00ffh
- @@0: lodsw
- xchg dx, ax
- lodsw
- cmp ax, es:[di-2]
- jnz @@1
- cmp dx, es:[di-4]
- jz @@2
- @@1: or bx, bx
- jz @@3
- call SaveCounter
- @@3: xchg dx, ax
- stosw
- xchg dx, ax
- stosw
- loop @@0
- jmp @@4
- @@2: inc bx
- loop @@0
- call SaveCounter
- @@4:
- pop ds
- ret
- ;
- ;-----------------------------------------------------------------------------
- BackupCVTchain:
- mov ax, 'VC'
- stosw
- push ax
- push bx
- push cx
- push ds
- push es
- mov ah, 52h
- int 21h ; ES:BX -- DOS table as described below
-
- ; --------------------------------------------------------------------
- push es ; DPB chains
- push bx
- lds si, es:[bx]
- push cs
- pop es
- mov ax, si
- stosw
- mov ax, ds
- stosw
- mov bx, cs:cvtOfs
- xor cx, cx
- @@1: mov al, ds:[si+1]
- stosb
- mov ax, ds:[si+bx+12h]
- stosw
- mov ax, ds:[si+bx+14h]
- stosw
- inc cx
- lds si, ds:[si+bx+18h]
- cmp si, -1
- jnz @@1
- ; mov ax, 5
- ; mul cl
- ; add ax, 4
- ; add cs:tsrLength, ax
- pop bx
- pop es
-
- ; --------------------------------------------------------------------
- push es ; DCB file control blocks
- push bx
- les bx, es:[bx+4]
- @@11: cmp word ptr es:[bx], -1
- jz @@10
- les bx, es:[bx]
- jmp @@11
- @@10:
- mov ax, es
- xchg ax, bx
- push cs
- pop es
- stosw
- xchg ax, bx
- stosw
- pop bx
- pop es
- ; add cs:tsrLength, 4
-
- ; ---------------------------------------------------------------------
- push es ; Device Driver Chains
- pop ds
- add bx, 22h
- mov si, bx ; NUL
-
- pop es
- mov ax, si
- stosw
- mov ax, ds
- stosw
- xor cx, cx
- xor bx, bx
- @@9: push si
- mov cl, 5
- rep movsw
- inc bx
- pop si
- lds si, ds:[si]
- mov ax, si
- inc ax
- jnz @@9
-
- pop ds
- pop cx
- pop bx
- pop ax
- ret
-
- ; ----------------------------------------------------------------------------
-
- BackupBiosData:
- mov ax, '--'
- stosw
- push ds
- push si
- mov si, 40h
- mov ds, si
- mov si, 10h
- movsw
- mov si, 0a8h
- movsw
- movsw
- mov si, 49h
- mov cx, 1dh
- rep movsb
-
- mov si, 0f0h
- mov cx, 8
- rep movsw
- pop si
- pop ds
- ret
-
- ; ---------------------------------------------------------------------------
-
- BackupMemoryManager:
- push cs
- pop es
- push ds
- push es
- call SaveXMSstatus
- call SaveEMSstatus
- pop es
- pop ds
- ret
-
- ;---------------------------------------------------------------------
-
- SaveEMSstatus:
- test cs:status, EMSbit
- jnz @@1
- ret
- @@1:
- mov ax, 'ME'
- stosw
- inc di
- inc di
- push di
- mov ah, 4dh
- int 67h
- pop di
- mov es:[di-2], bx
- shl bx, 1
- shl bx, 1
- add di, bx
- ret
- ; -------------------------------------------------------------------
-
- SaveXMSstatus:
- call XMS_test
- test cs:status, XMSbit
- jnz @@1
- ret
- @@1:
- mov ax, 'MX'
- stosw
-
- mov dx, 1
- call XMS_alloc
- jnz @@_1
- xor cx, cx ; XMS alloc failure
- stosw
- ret
- @@_1:
- push dx
- sub dx, MaxHandles * 10
- @@2:
- push dx
- call XMS_Lock
- pop dx
- jnz @@3
- cmp bl, 0a2h
- jnz @@4
- add dx, 10
- jmp @@2
- @@3: push dx
- call XMS_unlock
- pop dx
- @@4:
- mov cs:handle_begin, dx
- pop dx
- push dx
- call XMS_bstat
- xor cx, cx
- mov cl, bl
- inc cx
- pop dx
- call XMS_Free
- mov dx, cs:Handle_begin
-
- push cx
- push cs
- pop es
- mov ax, cx
- stosw
- @@5: push dx
- call XMS_Lock
- pop dx
- jnz @@6
- cmp bl, 0a2h ; Handle invalid
- jz @@7
- @@6: call XMS_unlock
- add dx, 10
- jmp @@5
- @@7: mov ax, dx
- stosw
- add dx, 10
- loop @@5
- pop cx
- ret
- ; ------------------------------------------------------------------
-
- XMS_test:
- push es
- mov ax, 4300h
- int 2fh
- cmp al, 80h
- jnz @@9
- mov ax, 4310h
- int 2fh
- mov cs:XMS_control, bx
- mov cs:XMS_control[2], es
- or cs:Status, XMSbit
- @@9:
- pop es
- ret
-
- XMS_stat:
- mov ah, 0
- call dword ptr cs:xms_control
- mov hma_exist, dl
- ret
- hma_exist db 0
-
- XMS_alloc:
- mov ah, 9
- call dword ptr cs:xms_control
- or ax, ax
- ret
-
- XMS_lock:
- mov ah, 0ch
- call dword ptr cs:xms_control
- or ax, ax
- ret
-
- XMS_unlock:
- mov ah, 0dh
- call dword ptr cs:xms_control
- or ax, ax
- ret
- XMS_bstat:
- mov ah, 0eh
- call dword ptr cs:xms_control
- or ax, ax
- ret
-
- XMS_free:
- mov ah, 0ah
- call dword ptr cs:xms_control
- or ax, ax
- ret
-
- ; ----------------------------------------------------------------------------
- EMS_test:
- push cs
- pop ds
- mov dx, offset EMMname
- mov ax, 3d00h
- int 21h
- jc @@2
- mov bx, ax
- mov ah, 3eh
- int 21h
- or cs:Status, EMSbit
- @@2:
- ret
- EMMname db 'EMMXXXX0',0
-
- ; -----------------------------------------------------------------------------
-
- SetHotKey:
- xor bx, bx
- lodsb
- push ax
-
- @@1: lodsb
- cmp al, 0dh
- jz @@9
- cmp al, 'C'
- jnz @@2
- or bl, LeftCtrl
- jmp @@1
- @@2:
- cmp al, 'c'
- jnz @@3
- or bl, RightCtrl
- jmp @@1
- @@3:
- cmp al, 'A'
- jnz @@4
- or bl, LeftAlt
- jmp @@1
- @@4:
- cmp al, 'a'
- jnz @@5
- or bl, RightAlt
- jmp @@1
- @@5:
- cmp al, 'S'
- jnz @@6
- or bl, LeftShift
- jmp @@1
- @@6:
- cmp al, 's'
- jnz @@7
- or bl, RightShift
- jmp @@1
- @@7: pop ax
- jmp @Err
- @@9:
- mov cs:HotKey, bl
- pop ax
- mov cs:AuxHotKey, 2dh ; 'X' scan key
- cmp al, '1'
- jz @@29
- mov cs:AuxHotKey, 0
- @@29:
- cmp cs:Self, 0
- jz @@30
- push es
- mov es, cs:Self
- mov es:HotKey, bl
- mov bl, cs:AuxHotKey
- mov es:AuxHotKey, bl
- pop es
- @@30:
- call GetRunFileName
- mov ax, 3d02h
- int 21h
- jc @@10
- push cs
- pop ds
- mov bx, ax
- mov cx, 4
- mov dx, 100h
- mov ah, 40h
- int 21h
- jc @@10
- mov ax, 4200h
- xor cx, cx
- mov dx, 17h
- int 21h
- jc @@10
- mov cx, 1
- mov dx, offset AuxHotKey
- mov ah, 40h
- int 21h
- jc @@10
- mov ah, 3eh
- int 21h
- @@10:
- ret
-
-
- ; -----------------------------------------------------------------------
- GetRunFileName:
- ; Return:
- ; DS:DX Pointer of this run file name ASCIIZ string
- push ax
- push bx
- push cx
- push si
- push di
- push es
-
- push cs
- pop es
- mov ax, es:[2ch]
- mov es, ax
- xor di, di
- mov cx, 1000h
- xor al, al
- @@1: repnz scasb
- cmp es:[di], al
- loopnz @@1
- mov dx, di
- add dx, 3
- push es
- pop ds
-
- pop es
- pop di
- pop si
- pop cx
- pop bx
- pop ax
- ret
-
- ; ---------------------------------------------------------------------------
- GetMachineID:
- push es
- mov KBD102,True
- mov ax,40h
- mov es,ax
- test byte ptr es:[96h], 00010000b
- jnz @@1
- mov Kbd102,False
- @@1:
- xor ax,ax
- dec ax
- mov es,ax
- mov al,es:[0eh]
- mov cs:MachineID, al
- pop es
- ret
-
- ; ---------------------------------------------------------------------------
- ModifyHotKeyPrompt:
- cmp cs:Kbd102, True
- jz @@9
- push cs
- pop es
- push cs
- pop ds
- mov cx, 12*4
- mov si, offset KMsg2
- mov di, offset KMsg1
- rep movsb
- @@9: cmp cs:MachineID, 0fch
- jna @@10
- mov cs:clsStrcolor, 70h ; Mono
- mov cs:clsStr, 70h
- @@10:
- ret
-
- ; ---------------------------------------------------------------------------
- PrintHotKeyPrompt:
- Print Msg1
- mov al, cs:HotKey
- mov ah, al
- shr al, 1
- shr al, 1
- and ax, 33ch
- or al, ah
- mov dx, offset KeyMsg
- @@40:
- or ax, ax ; Mr. Lei 4/25/1993
- jz @@_42
- shr al, 1
- push ax
- jnc @@41
-
- push ax
- call ColorDisplayStr
- ; mov ah, 9
- ; int 21h
- pop ax
-
- or al, al
- jz @@42
-
- push dx
- mov dx, offset PlusMsg
- call ColorDisplayStr
- ; Print PlusMsg
- pop dx
-
- @@41: add dx, 12
- pop ax
- jmp @@40
- @@42: pop ax
- @@_42: cmp cs:AuxHotKey, 0
- jz @@43
- cmp cs:HotKey, 0 ; Mr. Lei
- jz @@_43
- mov dx, offset PlusMsg
- call ColorDisplayStr
- ; Print PlusMsg
- @@_43: mov dx, offset AuxHotKeyName
- call ColorDisplayStr
- ; Print AuxHotKeyName
- @@43:
- Print crlf
- ret
-
- ColorDisplayStr:
- push bx
- push cx
- push dx
- push si
- mov bl, 0fh
- mov si, dx
- xor bh, bh
- mov cx, 1
- @@1: lodsb
- cmp al, '$'
- jz @@2
- or al, al
- jz @@2
- push cx
- mov ah, 09h
- int 10h
- mov ah, 3
- int 10h
- inc dl
- mov ah, 2
- int 10h
- pop cx
- jmp short @@1
- @@2:
- pop si
- pop dx
- pop cx
- pop bx
- ret
-
- ; ---------------------------------------------------------------------------
- CmpSideKick:
- xor ax, ax
- mov es, ax
- les bx, es:[20h]
- cmp word ptr es:[bx-4], 4b53h
- jnz @@1
- cmp word ptr es:[bx-2], 4942h
- jz @@2
- @@1: mov es, ax
- les bx, es:[94h]
- cmp word ptr es:[bx-2], 4b53h
- jz @@2
- ret
- @@2: or cs:Status, SKbit
- ret
-
- ; ---------------------------------------------------------------------------
- CmpDosVer: mov ah, 30h
- int 21h
- cmp al, 3
- jb @@1
- cmp al, 3
- jna @@2
- mov cs:cvtOfs, 1
- ret
- @@2: mov cs:cvtOfs, 0
- ret
- @@1: Print DosVerErr
- mov ax, 4cffh
- int 21h
-
- DosVerErr db 'Sorry, DOS version too lower !',0dh,0ah,'$'
-
- HotKeyValid:
- cmp cs:HotKey, 0
- jnz @@_1
- cmp cs:AuxHotKey, 0
- jnz @@_1
- Print HotKeyErr
- mov ax, 4cfeh
- int 21h
- @@_1: ret
-
- HotKeyErr db 'Sorry, please setup hotkey again. ',0dh,0ah,'$'
-
- eof:
- ends
- end Start
-
- ; ------------- The End ! ---------------------------------------------------
-