雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

程序員曬貼:94年雷軍寫的代碼水平如何?

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

網友直呼:跪著讀完!

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

雷軍曾自誇自己寫的代碼像詩一樣優雅,網友感覺這雷軍寫的94年代碼如何?2019年世界500強企業排行榜,僅成立9年的小米全球排名第468位,這讓小米的創始人雷軍興奮的像個孩子一樣。雷軍一高興就給小米的每一位員工包了1000股公司的股票,總價值超過了一億。

最近有人在網上曬出了雷軍94年的時候寫出的代碼,引來了很多網友的圍觀,小編雖然不是學編程出身,但是從下面網友的評論中還是能感覺到雷軍的實力,有網友甚至直呼跪著讀完

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

,還有網友表示,當時大學的時候武漢大學用的就是雷軍編的教程

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

雷軍的代碼像詩一樣優雅

↓↓↓

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

有網友在評論中質疑,說雷軍代碼不會是「shi」一樣優雅吧。說這話的網友,也許是開玩笑的,也許是真沒看過雷軍寫過的代碼。

在 2011 年的時候,@程序員的那些事在微博轉過雷軍在 1994 年寫的一段完整的彙編代碼。雷軍這段彙編代碼,有程序員評價「如今能寫出這麼高質量的代碼的程序員恐怕也不多」。

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

後來雷軍在轉發上條微博時還補充說:「這個程序第一個版本是我 1989 年寫的,懷念當初寫程序的快樂時光。」

雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

之前微博帖子中引用的鏈接已掛,今天重新在網上找到了完整版,如下:

(在移動端窄屏看大篇幅代碼,可能體驗不如 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

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

:

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

Print

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

:

Print

ErrMsg

:

Print

HelpMsg

mov

ax, 4c00h

int

21h

;---------------------------------------------------------------------------

tsrReplyOK

:

cmp

cs:Self, 0

jz

@@1

Print

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

Print

Msg_0

mov

ah, 1 int 21h

push

ax

Print

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

Print

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

:

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

:

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

:

Print

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

Print

HotKeyErr

mov

ax, 4cfeh

int

21h

:

ret

HotKeyErr

db 'Sorry, please setup hotkey again. ',0dh,0ah,'$'

eof

:

ends

end

Start

------------- The End ! ---------------------------------------------------

/<code>
雷軍的代碼像詩一樣優雅(94年寫的),網友直呼:跪著讀完!

朋友,你還記得自己寫的第一行代碼是什麼嗎?歡迎留言告訴我們。

本文內容整理自程序員的那些事(id:iProgrammer),微博@程序員的那些事,微博@人才76116,版權歸原作者所有,僅供分享使用。


分享到:


相關文章: