程序員曬貼:94年雷軍寫的代碼水平如何?
網友直呼:跪著讀完!
雷軍曾自誇自己寫的代碼像詩一樣優雅,網友感覺這雷軍寫的94年代碼如何?2019年世界500強企業排行榜,僅成立9年的小米全球排名第468位,這讓小米的創始人雷軍興奮的像個孩子一樣。雷軍一高興就給小米的每一位員工包了1000股公司的股票,總價值超過了一億。
最近有人在網上曬出了雷軍94年的時候寫出的代碼,引來了很多網友的圍觀,小編雖然不是學編程出身,但是從下面網友的評論中還是能感覺到雷軍的實力,有網友甚至直呼跪著讀完
,還有網友表示,當時大學的時候武漢大學用的就是雷軍編的教程
雷軍的代碼像詩一樣優雅
↓↓↓
有網友在評論中質疑,說雷軍代碼不會是「shi」一樣優雅吧。說這話的網友,也許是開玩笑的,也許是真沒看過雷軍寫過的代碼。
在 2011 年的時候,@程序員的那些事在微博轉過雷軍在 1994 年寫的一段完整的彙編代碼。雷軍這段彙編代碼,有程序員評價「如今能寫出這麼高質量的代碼的程序員恐怕也不多」。
後來雷軍在轉發上條微博時還補充說:「這個程序第一個版本是我 1989 年寫的,懷念當初寫程序的快樂時光。」
之前微博帖子中引用的鏈接已掛,今天重新在網上找到了完整版,如下:
(在移動端窄屏看大篇幅代碼,可能體驗不如 PC 端。大家可以試試點擊右上角的「……」,然後「複製鏈接」,方便的時候,在 PC 端看看。)
前方高能……
↓↓↓
<code>;
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
Use mouse driver software reset function to initiation mouse
by Mr. Lei and Mr. Feng
RI cannot work in Windows DOS prompt
by Mr. Lei
1. When XMS cannot allocate 1K memory, RI halts.
RI repeat deallocates EMS memory.
HotKey Setup Error
by Mr. Lei
KB Buffer
1. Release high memory blocks (EMM386 QEMM386 S-ICE 386MAX)
RI copies flag
1. Exists a critical error in Init 8259 procedure
Save [40:F0--FF] user data area
dosseg
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:[94]
cmp
ax, offset NewInt9
pop
ax
pop
ds
jnz
GoINT1C
mov
cs:StopFlag, 0
:push ax
push
ds
push
es
xor
ax, ax
mov
ds, ax
mov
es, ds:[94+2]
cmp
word ptr es:[101h], 'IE' ; 'LEI'
jz
@@1
cli
mov
cs:StopFlag, 1
mov
ax, ds:[94]
mov
cs:oldINT9_addr2, ax
mov
ax, ds:[94+2]
mov
cs:oldINT9_addr2[2], ax
mov
ds:[94], offset newINT9_2
mov
ds:[94+2], cs
sti
: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
:cmp ax, 0c0d7h+1
jnz
@@2
jmp
KeepSelf
:cmp ax, 0c0d7h+2
jnz
@@3
jmp
NoKeepSelf
:cmp ax, 0c0d7h+3
jnz
@@9
mov
cs:NextDataSeg, -1
mov
cs:Copies, '1'
jmp
NoKeepSelf
: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
: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
: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
:mov
es:[1ah], bx
:call
IsWinDos
or
ax, ax
jz
@@1
call
Beep
:sti
pop
es
pop
bx
pop
ax
mov
cs:Flag, ' ' ; no busy
iret
:; 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
: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
:mov
ax, 4680h
int
2fh
cmp
al, 80h
jnz
@@9
xor
ax, ax
jmp
@@10
:mov ax, 1
:ret
-----------------------------------------------------------------------
RestoreSelfIntVec
:cmp
Copies, '0'
jz
@@0
ret
:cli
push
cs
pop
ds
xor
ax, ax
mov
es, ax
mov
si, offset oldInt9_Addr
mov
di, 94
movsw
movsw
mov
si, offset oldInt2F_Addr
mov
di, 2Fh4
movsw
movsw
mov
si, offset oldInt1C_Addr
mov
di, 1Ch4
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
:push
cs
pop
ds
:mov
ax,ds:NextDataSeg
cmp
ax, -1
jz
@@_1
mov
cs:PrevDataSeg, ds
mov
ds, ax
jmp
@@_0
:mov si,ds:DataBegin
mov
cs:WorkSeg, ds
lodsw
cmp
ax, 'XX'
jz
@@_2
call
Beep
ret
: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
: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
:mov cs:ShowCopies, al
:mov
si, offset clsStr
call
ColorPrintStr
mov
cs:Flag, ' ' ; no busy
cmp
Copies, '1'
jnz
@@_end
mov
cs:StopFlag, 0
: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
:cmp
cs:MachineID, 0fch
ja
@@pc_xt
: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
: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
: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'
: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
:cmp byte ptr es:[0], 'Z'
jnz
@@0
mov
byte ptr es:[10h], 0
jmp
@@0
: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
: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
:lodsb
or
al, al
jnz
@@1 cmp byte ptr ds:[si], 0
jz
@@2
:stosb
jmp
@@0
:stosb
stosb
pop
es
pop
ds
pop
di
pop
si
ret
-----------------------------------------------------------------------
RestoreVecList
:xor
ax,ax
mov
di,ax
mov
es,ax
mov
cx,100h
: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]
:stosw
xchg
ax, dx
stosw
xchg
ax, dx
loop
@@a
pop
cx
or
cx, cx
jz
@@9
jmp
@@0
:xchg
ax, dx
stosw
xchg
ax, dx
stosw
loop
@@0
: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
:push
ax
push
cx
push
es
-----------------------------------------------------------------
lodsw
; DPB
mov
di, ax
lodsw
mov
es, ax
: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
: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
:test
cs:Status, EMSbit
jz
@@2
call
LoadEMSstatus
:ret
LoadEMSstatus
:lodsw
cmp
ax, 'ME'
jz
@@_0
call
Beep
ret
:lodsw
mov
cx, ax
xor
dx, dx
:push ds
push
si
push
dx
push
cx
:cmp dx, ds:[si]
jz
@@1
add
si, 4
loop
@@0
push
cx
mov
cx, 5
:mov ah, 45h ; Deallocate Handle and Memory
int
67h
or
ah, ah
jz
@@1
loop
@@0
:pop cx
: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
:lodsw
mov
cx, ax
jcxz
@@5
:lodsw
mov
dx, ax
: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
:loop @@1
: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
: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:[33h4+2], 0
jz
@@0 cmp word ptr es:[33h4], 0
jz
@@0
mov
ax, 21h
int
33h ; Hook Mouse Interrupt
: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
:lodsb
cmp
al, '$'
jz
@@2
or
al, al
jz
@@2
mov
ah, 0eh
int
10h
jmp
short @@1
: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 + 710 + 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 <=710 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 <=526 bytes
First DCB pointer 4 bytes
Pointer to NUL 4 bytes
All device driver datas <=30h10 bytes
Flag 'XM' 2 bytes
XMS free handle counter 2 bytes
EMS free handle list <=100h4 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
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
instMsg
call
IsWinDos
or
ax, ax
jz
@@1
WinErr
mov
ax, 4c00h
int
21h
: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
:call
CmdLine
call
PrintHotKeyPrompt
cmp
cs:tsrOK, true
jz
@@2
call
tsrReplyOK
:cmp cs:tsrOK, true
jnz
@@_2
call
PrintCopies
: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
: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
: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
: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
: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
: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
:inc ax
add
ax, ds:[3]
jmp
@@0
:call
SaveFreeMCB
cmp
ax, 0a000h
inc
ax
jnb
@@30
mov
ax, 9fffh ; MS-DOS UMB
jmp
@@0
:cmp
ax, 0c000h ; 386MAX
ja
@@90
mov
ax, 0c020h
jmp
@@0
:; 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
:push cx
xor
cx, cx
: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
:mov
es, cs:Self
inc
es:Copies
:cmp es:NextDataSeg, -1
jz
@@_1
mov
es, es:NextDataSeg
jmp
@@_0
:mov es:NextDataSeg, cs
: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
:mov
cx, ax
dec
ax
push
ax
push
si
:lodsb
cmp
al, ' '
jz
@@0 cmp al, '/'
jnz
@@2
lodsb
cmp
al, 'S'
jz
@@_2
cmp
al, 's'
jnz
@@2
:call
SetHotKey
SetMsg
mov
ax, 4c00h
int
21h
:pop
si
pop
ax
push
ax
push
si
:lodsb
cmp
al, 'A'
jb
@@3 cmp al, 'Z'
ja
@@3
add
byte ptr ds:[si-1],20h ; DownCase
: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
: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
:cmp
cs:Self, 0
jz
@Err
mov
ax, 0c0d7h+2 int 2fh
:cmp al, 'w' ; NEW
jnz
@@8 cmp word ptr ds:[si-3], 'en'
jnz
@@8
mov
cs:tsrOK, true
ret
:cmp
al, 'l' ; ALL
jnz
@@9 cmp word ptr ds:[si-3], 'la'
jnz
@@9
mov
ax, 0c0d7h+3 int 2fh
:cmp
al, ' '
jnz
@Err
ret
:ErrMsg
:HelpMsg
mov
ax, 4c00h
int
21h
;---------------------------------------------------------------------------
tsrReplyOK
:cmp
cs:Self, 0
jz
@@1
Msg0
push
es
mov
ax, cs:Self
:mov es, ax
mov
ax, es:NextDataSeg
cmp
ax, -1
jnz
@@_10
mov
ax, es
: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
Msg_0
mov
ah, 1 int 21h
push
ax
crlf
pop
ax
cmp
al, 'y'
jz
@@3 cmp al, 'Y'
jz
@@3
:; Print Msg_1
mov
ax, 4c01h
int
21h
: :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
: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
:; 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
:pop
es
mov
cs:Msg_RI, al
Msg_2
: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
:lodsw
xchg
dx, ax
lodsw
cmp
ax, es:[di-2]
jnz
@@1 cmp dx, es:[di-4]
jz
@@2
:or bx, bx
jz
@@3
call
SaveCounter
:xchg dx, ax
stosw
xchg
dx, ax
stosw
loop
@@0
jmp
@@4
:inc bx
loop
@@0
call
SaveCounter
: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
: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]
:cmp word ptr es:[bx], -1
jz
@@10
les
bx, es:[bx]
jmp
@@11
: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
: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
: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
:mov
ax, 'MX'
stosw
mov
dx, 1
call
XMS_alloc
jnz
@@_1
xor
cx, cx ; XMS alloc failure
stosw
ret
:push
dx
sub
dx, MaxHandles 10
:push
dx
call
XMS_Lock
pop
dx
jnz
@@3 cmp bl, 0a2h
jnz
@@4
add
dx, 10
jmp
@@2
:push dx
call
XMS_unlock
pop
dx
: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
:push dx
call
XMS_Lock
pop
dx
jnz
@@6 cmp bl, 0a2h ; Handle invalid
jz
@@7
:call XMS_unlock
add
dx, 10
jmp
@@5
: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
: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
:ret
EMMname
db 'EMMXXXX0',0
-----------------------------------------------------------------------------
SetHotKey
:xor
bx, bx
lodsb
push
ax
:lodsb
cmp
al, 0dh
jz
@@9 cmp al, 'C'
jnz
@@2
or
bl, LeftCtrl
jmp
@@1
:cmp
al, 'c'
jnz
@@3
or
bl, RightCtrl
jmp
@@1
:cmp
al, 'A'
jnz
@@4
or
bl, LeftAlt
jmp
@@1
:cmp
al, 'a'
jnz
@@5
or
bl, RightAlt
jmp
@@1
:cmp
al, 'S'
jnz
@@6
or
bl, LeftShift
jmp
@@1
:cmp
al, 's'
jnz
@@7
or
bl, RightShift
jmp
@@1
:pop ax
jmp
@Err
:mov
cs:HotKey, bl
pop
ax
mov
cs:AuxHotKey, 2dh ; 'X' scan key
cmp
al, '1'
jz
@@29
mov
cs:AuxHotKey, 0
: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
: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
: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
: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
: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, 124
mov
si, offset KMsg2
mov
di, offset KMsg1
rep
movsb
:cmp cs:MachineID, 0fch
jna
@@10
mov
cs:clsStrcolor, 70h ; Mono
mov
cs:clsStr, 70h
:ret
---------------------------------------------------------------------------
PrintHotKeyPrompt
:Msg1
mov
al, cs:HotKey
mov
ah, al
shr
al, 1
shr
al, 1
and
ax, 33ch
or
al, ah
mov
dx, offset KeyMsg
: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
:add dx, 12
pop
ax
jmp
@@40
:pop ax
:cmp cs:AuxHotKey, 0
jz
@@43 cmp cs:HotKey, 0 ; Mr. Lei
jz
@@_43
mov
dx, offset PlusMsg
call
ColorDisplayStr
Print PlusMsg
:mov dx, offset AuxHotKeyName
call
ColorDisplayStr
Print AuxHotKeyName
:crlf
ret
ColorDisplayStr
:push
bx
push
cx
push
dx
push
si
mov
bl, 0fh
mov
si, dx
xor
bh, bh
mov
cx, 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
: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
:mov es, ax
les
bx, es:[94h]
cmp
word ptr es:[bx-2], 4b53h
jz
@@2
ret
: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
:mov cs:cvtOfs, 0
ret
: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
HotKeyErr
mov
ax, 4cfeh
int
21h
:ret
HotKeyErr
db 'Sorry, please setup hotkey again. ',0dh,0ah,'$'
eof
:ends
end
Start
------------- The End ! ---------------------------------------------------
/<code>
朋友,你還記得自己寫的第一行代碼是什麼嗎?歡迎留言告訴我們。
本文內容整理自程序員的那些事(id:iProgrammer),微博@程序員的那些事,微博@人才76116,版權歸原作者所有,僅供分享使用。