雷军20年前编写的汇编代码,你觉得是什么水平?

jopen 11年前

  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 p@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 ! ---------------------------------------------------

来自: mailp.in