雷軍20年前編寫的匯編代碼
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 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
- @@
最後更新:2017-04-03 05:39:37
上一篇:
【PHP】基於ThinkPHP框架搭建OAuth2.0服務
下一篇:
匯編 HelloWorld