8月9日,雷军在其个人微博发文称,将举办年度演讲,主题是“成长”。雷军表示,“这是我的第4次年度演讲,想和大家聊聊,过去30多年几次关键成长的经历和感悟。”值得注意的是,今天雷军发布的官宣海报上有个彩蛋,是雷军30多年前写过的一段汇编语言。
图片.png
这段代码早前也曾曝光。各位来审判一下。

2011 年的时候,@程序员的那些事在微博转过雷军在 1994 年写的一段完整的汇编代码。后来雷军在转发上条微博时还补充说:「这个程序第一个版本是我 1989 年写的,怀念当初写程序的快乐时光。」
↓↓↓
;
  • ; RI.ASM Revision2.12[ July12,1994]
  • Revision equ'V2.12 '
  • ;
  • ;
  • ;
  • ; RAMinit Release2.0
  • ; Copyright (c)1989-1994by Yellow Rose Software Co.
  • ; Written by Mr. Leijun
  • ;
  • ; Function:
  • ; Press HotKey to remove all TSR program afterthisprogram
  • ;
  • ;

  • ; ..........................................................................
  • ; Removed Softwares by RI:
  • ; SPDOS v6.0F, WPS v3.0F
  • ; Game Busters III, IV
  • ; NETX ( Novell3.11)
  • ; PC-CACHE
  • ; Norton Cache
  • ; Microsoft SmartDrv
  • ; SideKick1.56A
  • ; MOUSE Driver
  • ; Crazy (Monochrome simulate CGA program)
  • ; RAMBIOS v2.0
  • ;386MAX Version6.01
  • ; ..........................................................................
  • ; No cancel softwares:
  • ; Windows3.1MSD
  • ;
  • ; No removed TSR softwares:
  • ; MS-DOS fastopen
  • ; Buffers, Files ... (QEMM6.0)
  • ; QCache (386MAX6.01)
  • ; ..........................................................................
  • ;
  • COMMENT

  • V2.04Use mouse driver software reset function to initiation mouse
  • 2/17/1993by Mr. Lei and Mr. Feng
  • V2.05RI cannot work in Windows DOS prompt
  • 3/9/1993by Mr. Lei
  • V2.061.When XMS cannot allocate1K memory, RI halts.
  • 2.RI repeat deallocates EMS memory.
  • V2.07HotKey Setup Error
  • 4/25/1993by Mr. Lei
  • V2.08KB Buffer
  • V2.101.Release high memoryblocks(EMM386 QEMM386 S-ICE386MAX)
  • 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
  • ; --------------- ---------------
  • ;
  • ;76543210417418496
  • ; . . x . x . . . Left Alt is pressed82
  • ; x . . . x . . . Right Alt is pressed88
  • ; . . . x . x . . Left Ctrl is pressed41
  • ; . x . . . x . . Right Ctrl is pressed44
  • ; . . . . . . x . Left Shift is pressed2
  • ; . . . . . . . x Right Shift is pressed1
  • ;
  • LeftAlt equ00101000b
  • RightAlt equ10001000b
  • LeftCtrl equ00010100b
  • RightCtrl equ01000100b
  • LeftShift equ00000010b
  • RightShift equ00000001b
  • HotKey db LeftCtrl or RightCtrl

  • DataBegin dw0
  • NextDataSeg dw0ffffh
  • oldInt2F_addr dw0,0
  • XMS_control dw0,0
  • Handle_begin dw0
  • cvtOfs dw0; DOS3.0equ0and above DOS4.0is1
  • org104h
  • db0dh
  • db Revision
  • db ??date
  • db26
  • org114h
  • tsrLength dw0
  • MachineID db0FCh ; IBM PC/AT

  • AuxHotKey db0;2Dh ;'X'Scan Code
  • AuxHotKeyName db'X$ '
  • Power db True
  • Flag db'!'
  • Kbd102 db0
  • NoFlag db0
  • StopFlag db1
  • DosEnv dw0
  • WorkSeg dw0
  • PrevDataSeg dw0
  • Copies db'1'
  • old_8259 db0;21h port
  • db0; a1h port

  • Status dw0
  • XMSbit equ00000001b
  • EMSbit equ00000010b
  • SKbit equ10000000b

  • GoINT1C: db0eah
  • oldInt1C_addr dw0,0
  • newINT1C:
  • test cs:Status, SKbit
  • jnz GoINT1C
  • cmp cs:StopFlag,0
  • jz @@0
  • ;
  • ; Mr. Lei2/8/1993
  • ; Problem:ifWPS 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

  • @@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
  • @@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
  • db9ah ; call far ptr oldint9_addr
  • oldInt9_Addr2 dw0,0
  • jmp newINT9_proc

  • newINT9:
  • pushf
  • db9ah ; call far ptr oldint9_addr
  • oldInt9_Addr dw0,0cmp cs:NoFlag,0
  • jz newINT9_proc
  • mov cs:NoFlag,0
  • iret
  • newINT9_proc:
  • cmp cs:Flag,'!'; busy ?
  • jnz @@0
  • iret
  • @@0:
  • mov cs:Flag,'!';setbusy 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 @@10cmp 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 @@10cmp 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 ; Aug24,1993
  • mov cx,100h
  • rep stosb
  • pop es
  • int27h

  • NoKeepSelf:
  • mov ax,0e07h
  • int10h
  • 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
  • int21h

  • ; ---------------------------------------------------------------------------

  • IsWinDOS:
  • mov ax,1600h
  • int2fh
  • cmp al,01h
  • jz @@9cmp al,0ffh
  • jz @@9; Windows/386Version2.X
  • cmp al,00h
  • jz @@1cmp al,80h
  • jnz @@9; Windows3in enhanced mode
  • ; Version number in AL/AH
  • @@1:
  • mov ax,4680h
  • int2fh
  • 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,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 ; Setstack
  • 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 vectorslist
  • call RestoreFloppyParam
  • cmp cs:Power, True
  • jnz @@2
  • call RestoreCVTchain ; Restore cvt chain
  • call RestoreMemoryManager
  • @@2:
  • call RestoreBiosData
  • call Enable8259
  • mov ah,1int16h

  • call RestoreClockSpeed
  • call CloseSpeaker
  • call ResetDisk
  • call UpdateTime

  • call ClosePRN
  • mov bx,cs:WorkSeg
  • mov ah,50h
  • int21h ; Set PSP segment
  • mov ax,3int10h ; 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
  • int10h
  • 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;
  • out0F1h,al ;
  • jcxz $+2
  • jcxz $+2
  • mov al,11h ; ICW1
  • out0A0h,al
  • jcxz $+2
  • jcxz $+2
  • out20h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,bl ; ICW2
  • out0A1h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,bh
  • out21h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,2; ICW3
  • out0A1h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,4
  • out21h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,1; ICW4
  • out0A1h,al
  • jcxz $+2
  • jcxz $+2
  • out21h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,0FFh ; OCW1
  • out0A1h,al
  • jcxz $+2
  • jcxz $+2
  • out21h,al
  • ret
  • @@PC_XT:
  • mov al,13h ; ICW1
  • out20h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,8; ICW2
  • out21h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,9; ICW4
  • out21h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,0FFh ; OCW1
  • out21h,al
  • ret

  • Enable8259:
  • mov ax, word ptr cs:old_8259
  • out021h,al
  • jcxz $+2
  • jcxz $+2
  • mov al,ah
  • out0a1h,al ; DEC PC Bus Mouse
  • ret ; July1994by 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; Aug24,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
  • int21h
  • 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 @@1cmp 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 @@1cmp 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. Lei2/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
  • int67h
  • 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 @@4cmp 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
  • out61h, al
  • ret

  • ; -----------------------------------------------------------------------
  • RestoreClockSpeed:
  • mov al,00110110b
  • out43h, al
  • xor ax, ax
  • out40h, al
  • out40h, al
  • ret

  • ; -----------------------------------------------------------------------
  • ResetDisk:
  • xor ax, ax
  • xor dx, dx
  • int13h ; Restore A
  • inc dx
  • int13h ; Restore B
  • mov dl,80h
  • int13h ; Restore C
  • ret



  • ; --------------------------------------------------------------------------
  • ClosePRN:
  • mov ah,51h ; Get PSP seg
  • int21h
  • mov es, bx
  • mov ax, es:[16h] ; Prev PSP seg
  • cmp ax, bx
  • jnz @@9
  • mov ax,3e00h ; COMMAND
  • mov bx,4int21h
  • @@9:
  • ret

  • InitPRN:
  • mov ax,3e00h
  • mov bx,4; PRN
  • int21h
  • mov ax,3d01h
  • mov dx, offset PRNname
  • push cs
  • pop ds
  • int21h
  • ret
  • PRNname db'PRN',0

  • InitMouse: ;2/16/1993by Mr. Lei
  • push es
  • xor ax, ax
  • mov es, ax
  • cmp word ptr es:[33h4+2],0
  • jz @@0cmp word ptr es:[33h4],0
  • jz @@0
  • mov ax,21h
  • int33h ; Hook Mouse Interrupt
  • @@0: pop es
  • ret

  • ; ------------- CMOS CLOCKsetto System -----------------------------------
  • UpdateTime:
  • call GetRealTime
  • mov ah,2dh
  • int21h
  • ret

  • GetRealTime:
  • mov ah,2int1Ah
  • 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

  • ; -----------------------------------------------------------------------
  • ; Displaystring
  • ColorPrintStr:
  • lodsb
  • mov bh, al ; color
  • xor cx, cx
  • mov dx,014fh
  • mov ax,0600h
  • int10h

  • mov ah,02; GotoXY (0,0)
  • xor dx, dx
  • mov bh,0int10h
  • PrintStr:
  • push cs
  • pop ds
  • xor bx, bx
  • @@1: lodsb
  • cmp al,'

  • jz @@2
  • or al, al
  • jz @@2
  • mov ah,0eh
  • int10h
  • jmpshort@@1
  • @@2: mov al, cs:clsStrcolor
  • mov cs:clsStr, al
  • ret

  • ; -----------------------------------------------------------------------
  • Self dw0
  • clsStrcolor db17h
  • clsStr db17h ; Color (White in Blue)
  • db' RAMinit Version 2.12 (c) 1989-1994 by KingSoft Ltd. Mr. Leijun'
  • db0dh,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+526+4+1030h +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'2bytes
  • ; Environment Segment1word
  • ; Free MCBs <=710bytes
  • ; MCB segment1word
  • ; MCB5bytes
  • ; End flag'MM'1word
  • ; COM LPT ports10h bytes
  • ; LEDs status1bytes
  • ; Packed vectorslist<=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
  • ; XMSfreehandle counter 2 bytes
  • ; EMSfreehandlelist<=100h4 bytes
  • ; Flag 'EM' 2 bytes
  • ; EMSfreehandle counter 2 bytes
  • ; EMSfreehandlelist<=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 anewRAMinit 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,/? Displaythisscreen',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 anewdata 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 (defaultis "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 andthisRI',0dh,0ah
  • db 0ah
  • db 'Contact meforRAMinit 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, 'DefinesnewHotkey successful !',0dh,0ah,0ah,'

  • tsrOK db False

  • Main0:
  • cld
  • Print instMsg
  • call IsWinDos
  • or ax, ax
  • jz @@1
  • Print WinErr
  • mov ax, 4c00h
  • int21h
  • @@1:
  • call HotKeyValid
  • mov cs:Status, 0
  • call EMS_test
  • call CmpDosVer
  • call CmpSideKick
  • call GetMachineID
  • call ModifyHotKeyPrompt

  • mov ax, 0c0d7h
  • int2fh
  • 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
  • int27h

  • ; ----------------------------------------------------------------------------
  • 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
  • int21h ; 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, 1int16h
  • 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, 1int16h
  • ret

  • ; --------------------------------------------------------------------------
  • SetSelfInt:
  • push es
  • push di

  • cmp cs:self, 0
  • jnz @@1
  • push cs
  • pop ds
  • mov ax,3509h
  • int21h
  • mov word ptr cs:oldInt9_addr,bx
  • mov word ptr cs:oldInt9_addr[2],es
  • mov dx,offset NewInt9
  • mov ax,2509h
  • int21h

  • mov ax,352Fh
  • int21h
  • mov word ptr cs:oldInt2F_addr,bx
  • mov word ptr cs:oldInt2F_addr[2],es
  • mov dx,offset newInt2F
  • mov ax,252Fh
  • int21h

  • mov ax,351Ch
  • int21h
  • mov word ptr cs:oldInt1C_addr,bx
  • mov word ptr cs:oldInt1C_addr[2],es
  • mov dx,offset newInt1C
  • mov ax,251ch
  • int21h
  • 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, 9int21h
  • 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
  • int21h
  • @@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+1int2fh

  • @@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+2int2fh
  • @@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+3int2fh
  • @@9:
  • cmp al, ' '
  • jnz @Err
  • ret

  • @Err:
  • Print ErrMsg
  • @help:
  • Print HelpMsg
  • mov ax, 4c00h
  • int21h

  • ;---------------------------------------------------------------------------
  • 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, 1int21h

  • push ax
  • Print crlf
  • pop ax

  • cmp al, 'y'
  • jz @@3 cmp al, 'Y'
  • jz @@3
  • @@2: ; Print Msg_1
  • mov ax, 4c01h
  • int21h
  • @@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
  • int21h ; 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
  • int67h
  • 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
  • int2fh
  • cmp al, 80h
  • jnz @@9
  • mov ax, 4310h
  • int2fh
  • 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
  • int21h
  • jc @@2
  • mov bx, ax
  • mov ah, 3eh
  • int21h
  • 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
  • int21h
  • jc @@10
  • push cs
  • pop ds
  • mov bx, ax
  • mov cx, 4
  • mov dx, 100h
  • mov ah, 40h
  • int21h
  • jc @@10
  • mov ax, 4200h
  • xor cx, cx
  • mov dx, 17h
  • int21h
  • jc @@10
  • mov cx, 1
  • mov dx, offset AuxHotKey
  • mov ah, 40h
  • int21h
  • jc @@10
  • mov ah, 3eh
  • int21h
  • @@10:
  • ret


  • ; -----------------------------------------------------------------------
  • GetRunFileName:
  • ; Return:
  • ; DS:DX Pointer ofthisrun file name ASCIIZstring
  • 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, 124
  • 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
  • ;int21h
  • 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
  • int10h
  • mov ah, 3int10h
  • inc dl
  • mov ah, 2int10h
  • pop cx
  • jmpshort@@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
  • int21h
  • 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
  • int21h

  • 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
  • int21h
  • @@_1: ret

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


  • eof:
  • ends
  • end Start

  • ; ------------- The End !---------------------------------------------------
  • 复制代码