2

雷军在今天以小米科技而闻名业界。

但现在可能不太为人所知的是:雷军更是中国老一代的优秀程序员,尤其以他与求伯君作为金山软件元老的经历而广为人知。

我们今天和您一起欣赏一份雷军在加入金山前(自己首次创业期间),在1992年以“黄玫瑰小组”一员的身份写的汇编代码。领略当时的技术手段和老一代程序员的程序人生。

参阅:雷军的首次创业

受《硅谷之火》中创业故事影响,在大学四年级的时候,雷军开始和同学王全国、李儒雄等人创办三色公
司。当时的产品是一种仿制金山汉卡,可是随后出现一家规模比他们更大的公司,把他们的产品盗版了,而且这家公司可以把同类的产品做得量更大,价格也更低。

三色公司度日维艰,不要说公司运营,即使他们生活上也面临着等无米下锅的局面。半年以后,三色公司决定解散。清点公司资产时,雷军和王全国分到了一台286电脑和打印机,李儒雄分到了一台386电脑。

“在三色公司工作期间,雷军与王全国合作编写了雷军的第一个正式作品BITLOCK加密软件并组建了黄玫瑰小组;除此还用PASCAL编写免疫90,此产品获得了湖北省大学生科技成果一等奖。”

;
; RI.ASM  Revision 2.12         [ July 12, 1994 ]
Revision        equ     'V2.12 '
;
; **************************************************************************
; *                                                                        *
; *  RAMinit  Release 2.0                                                  *
; *  Copyright (c) 1989-1994 by Yellow Rose Software Co.                   *
; *  Written by Mr. Leijun                                                 *
; *                                                                        *
; *  Function:                                                             *
; *    Press HotKey to remove all TSR program after this program           *
; *                                                                        *
; **************************************************************************

; ..........................................................................
; Removed Softwares by RI:
;   SPDOS v6.0F, WPS v3.0F
;   Game Busters III, IV
;   NETX ( Novell 3.11 )
;   PC-CACHE
;   Norton Cache
;   Microsoft SmartDrv
;   SideKick 1.56A
;   MOUSE Driver
;   Crazy (Monochrome simulate CGA program)
;   RAMBIOS v2.0
;   386MAX Version 6.01
; ..........................................................................
; No cancel softwares:
;   Windows 3.1 MSD
;
; No removed TSR softwares:
;   MS-DOS fastopen
;   Buffers, Files ... (QEMM 6.0)
;   QCache (386MAX 6.01)
; ..........................................................................
;
COMMENT *

 V2.04  Use mouse driver software reset function to initiation mouse
        2/17/1993 by  Mr. Lei and Mr. Feng
 V2.05  RI cannot work in Windows DOS prompt
        3/9/1993  by Mr. Lei
 V2.06  1. When XMS cannot allocate 1K memory, RI halts.
        2. RI repeat deallocates EMS memory.
 V2.07  HotKey Setup Error
        4/25/1993 by Mr. Lei
 V2.08  KB Buffer
 V2.10  1. Release high memory blocks (EMM386 QEMM386 S-ICE 386MAX)
        2. RI copies flag
 V2.12  1. Exists a critical error in Init 8259 procedure
        2. Save [40:F0--FF] user data area

*

                dosseg
                .model tiny
                .code
                locals  @@
                org     100h

Start:          jmp     Main
                org     103h

  True          equ     1
  False         equ     0
  MaxHandles    equ     100h

        INT3    macro
                out     0ffh,al
                endm
  ;
  ;             HotKey Status                             Test Var
  ;            ---------------                         ---------------
  ;
  ;  7 6 5 4 3 2 1 0                                    417  418  496
  ;  . . x . x . . .    Left Alt is pressed              8    2
  ;  x . . . x . . .    Right Alt is pressed             8         8
  ;  . . . x . x . .    Left Ctrl is pressed             4    1
  ;  . x . . . x . .    Right Ctrl is pressed            4         4
  ;  . . . . . . x .    Left Shift is pressed            2
  ;  . . . . . . . x    Right Shift is pressed           1
  ;
  LeftAlt       equ     00101000b
  RightAlt      equ     10001000b
  LeftCtrl      equ     00010100b
  RightCtrl     equ     01000100b
  LeftShift     equ     00000010b
  RightShift    equ     00000001b
  HotKey        db      LeftCtrl or RightCtrl

  DataBegin     dw      0
  NextDataSeg   dw      0ffffh
  oldInt2F_addr dw      0, 0
  XMS_control   dw      0, 0
  Handle_begin  dw      0
  cvtOfs        dw      0       ; DOS 3.0 equ 0 and above DOS 4.0 is 1
                org     104h
                db      0dh
                db      Revision
                db      ??date
                db      26
                org     114h
  tsrLength     dw      0
  MachineID     db      0FCh    ; IBM PC/AT

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

  Status        dw      0
  XMSbit        equ     00000001b
  EMSbit        equ     00000010b
  SKbit         equ     10000000b

GoINT1C:        db      0eah
  oldInt1C_addr dw      0, 0
newINT1C:
                test    cs:Status, SKbit
                jnz     GoINT1C
                cmp     cs:StopFlag, 0
                jz      @@0
;
; Mr. Lei  2/8/1993
; Problem: if WPS quit and reenter, old RI cann't control keyboard.
;
                push    ds
                push    ax
                xor     ax, ax
                mov     ds, ax
                mov     ax, ds:[9*4]
                cmp     ax, offset NewInt9
                pop     ax
                pop     ds
                jnz     GoINT1C
                mov     cs:StopFlag, 0

        @@0:    push    ax
                push    ds
                push    es
                xor     ax, ax
                mov     ds, ax
                mov     es, ds:[9*4+2]
                cmp     word ptr es:[101h], 'IE'        ; 'LEI'
                jz      @@1
                cli
                mov     cs:StopFlag, 1
                mov     ax, ds:[9*4]
                mov     cs:oldINT9_addr2, ax
                mov     ax, ds:[9*4+2]
                mov     cs:oldINT9_addr2[2], ax
                mov     ds:[9*4], offset newINT9_2
                mov     ds:[9*4+2], cs
                sti
        @@1:    pop     es
                pop     ds
                pop     ax
                jmp     GoINT1C

; ----------------------------------------------------------------------
;  INT2F Func
;
;     AX = C0D7h   Return RI segment in AX
;     AX = C0D8h   Removes all TSR programs after RI
;     AX = C0D9h   Removes all TSR programs include RI
;     AX = C0DAh   Removes all RI copies
; ----------------------------------------------------------------------

newINT2F:
                cmp     ax, 0c0d7h      ; LEI Hanzi GB Code
                jnz     @@1
                push    cs
                pop     ax
                iret
        @@1:    cmp     ax, 0c0d7h+1
                jnz     @@2
                jmp     KeepSelf
        @@2:    cmp     ax, 0c0d7h+2
                jnz     @@3
                jmp     NoKeepSelf
        @@3:    cmp     ax, 0c0d7h+3
                jnz     @@9
                mov     cs:NextDataSeg, -1
                mov     cs:Copies, '1'
                jmp     NoKeepSelf
        @@9:    jmp     dword ptr cs:oldInt2F_addr


CallInt9:
                ret


newINT9_2:
                mov     cs:NoFlag, 1
                pushf
                db      9ah             ; call far ptr oldint9_addr
  oldInt9_Addr2 dw      0, 0
                jmp     newINT9_proc

newINT9:
                pushf
                db      9ah             ; call far ptr oldint9_addr
  oldInt9_Addr  dw      0, 0
                cmp     cs:NoFlag, 0
                jz      newINT9_proc
                mov     cs:NoFlag, 0
                iret
newINT9_proc:
                cmp     cs:Flag, '!'    ; busy ?
                jnz     @@0
                iret
        @@0:
                mov     cs:Flag, '!'    ; set busy flag
                push    ax              ; cmp hot key
                push    bx
                push    es
                mov     ax,40h
                mov     es,ax

                cmp     cs:AuxHotKey, 0
                jz      @@_1
                mov     bx, es:[1ah]
                cmp     bx, es:[1ch]
                jz      @@10
                push    bx
                mov     bl, es:[bx+1]
                cmp     bl, cs:AuxHotKey
                pop     bx
                jnz     @@10
        @@_1:
                mov     ah,es:[17h]     ; test CTRL SHIFT ALT
                mov     al,cs:HotKey
                push    ax
                and     ax,0f0fh
                cmp     al,ah
                pop     ax
                jnz     @@10
                cmp     cs:Kbd102, True
                jnz     @@1
                shr     al, 1
                shr     al, 1
                shr     al, 1
                shr     al, 1
                push    ax
                mov     ah, es:[18h]
                and     ax, 303h
                cmp     al, ah
                pop     ax
                jnz     @@10
                mov     ah, es:[96h]
                shr     ax, 1
                shr     ax, 1
                and     ax, 303h
                cmp     al, ah
                jnz     @@10

                cmp     cs:AuxHotKey, 0
                jz      @@_3
                inc     bx
                inc     bx
                cmp     bx, 3eh
                jb      @@_2
                mov     bx, 1eh
        @@_2:
                mov     es:[1ah], bx
        @@_3:
                call    IsWinDos
                or      ax, ax
                jz      @@1
                call    Beep
        @@10:
                sti
                pop     es
                pop     bx
                pop     ax
                mov     cs:Flag, ' '    ; no busy
                iret
        @@1:                                            ; OK
                pop     es
                pop     bx
                pop     ax

KeepSelf:
                call    RemoveTSR
                push    es
                mov     es,cs:WorkSeg
                mov     dx,es:tsrLength
                mov     di,dx
                mov     al,0h           ; Aug 24, 1993
                mov     cx,100h
                rep     stosb
                pop     es
                int     27h

NoKeepSelf:
                mov     ax,0e07h
                int     10h
                mov     cs:clsStr, 47h  ; Color (White in Red)
                call    RemoveTSR
                dec     cs:Copies
                call    RestoreSelfIntVec
                push    es
                cmp     cs:PrevDataSeg, 0
                jz      @@1
                mov     es, cs:PrevDataSeg
                mov     es:NextDataSeg, -1
        @@1:    pop     es
                mov     ax, 4c00h
                int     21h

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

IsWinDOS:
                mov     ax, 1600h
                int     2fh
                cmp     al, 01h
                jz      @@9
                cmp     al, 0ffh
                jz      @@9                     ; Windows/386 Version 2.X
                cmp     al, 00h
                jz      @@1
                cmp     al, 80h
                jnz     @@9                     ; Windows 3 in enhanced mode
                                                ; Version number in AL/AH
        @@1:
                mov     ax, 4680h
                int     2fh
                cmp     al, 80h
                jnz     @@9
                xor     ax, ax
                jmp     @@10
        @@9:    mov     ax, 1
        @@10:   ret

; -----------------------------------------------------------------------
RestoreSelfIntVec:
                cmp     Copies, '0'
                jz      @@0
                ret
        @@0:
                cli
                push    cs
                pop     ds
                xor     ax, ax
                mov     es, ax
                mov     si, offset oldInt9_Addr
                mov     di, 9*4
                movsw
                movsw
                mov     si, offset oldInt2F_Addr
                mov     di, 2Fh*4
                movsw
                movsw
                mov     si, offset oldInt1C_Addr
                mov     di, 1Ch*4
                movsw
                movsw
                sti
                ret

; ------------- KERNEL PROGRAM ----------------------------------------------
RemoveTSR:
                pop     ax
                cli                     ; Set stack
                mov     sp, cs
                mov     ss, sp
                mov     sp, 100h
                sti
                push    ax

                cmp     cs:Power, True
                jnz     @@1
                call    Init8259
        @@1:
                push    cs
                pop     ds
        @@_0:
                mov     ax,ds:NextDataSeg
                cmp     ax, -1
                jz      @@_1
                mov     cs:PrevDataSeg, ds
                mov     ds, ax
                jmp     @@_0
        @@_1:   mov     si,ds:DataBegin
                mov     cs:WorkSeg, ds
                lodsw
                cmp     ax, 'XX'
                jz      @@_2
                call    Beep
                ret
        @@_2:
                call    RestoreEnvStr
                call    RestoreMCB         ; restore current mcb
                call    CloseFiles
                call    RestorePort
                call    RestoreLEDs
                call    RestoreVecList     ; Restore vectors list
                call    RestoreFloppyParam
                cmp     cs:Power, True
                jnz     @@2
                call    RestoreCVTchain    ; Restore cvt chain
                call    RestoreMemoryManager
        @@2:
                call    RestoreBiosData
                call    Enable8259
                mov     ah, 1
                int     16h

                call    RestoreClockSpeed
                call    CloseSpeaker
                call    ResetDisk
                call    UpdateTime

                call    ClosePRN
                mov     bx,cs:WorkSeg
                mov     ah,50h
                int     21h                ; Set PSP segment
                mov     ax,3
                int     10h                ; Set display mode

                call    InitPRN
                call    InitMouse
                mov     al, cs:Copies
                cmp     al, '1'
                ja      @@_sh1
                mov     cs:ShowCopies, '*'
                jmp     @@_sh2
        @@_sh1: mov     cs:ShowCopies, al
        @@_sh2:
                mov     si, offset clsStr
                call    ColorPrintStr
                mov     cs:Flag, ' '       ; no busy
                cmp     Copies, '1'
                jnz     @@_end
                mov     cs:StopFlag, 0
        @@_end:
                call    ClearKB_buffer
                ret

Beep:
                mov     ax,0e07h
                int     10h
                ret

; #########################################################################

ClearKB_Buffer:
                push    es
                push    bx
                mov     bx, 0040h
                mov     es, bx
                cli
                mov     bx, es:[1ah]
                mov     es:[1ch], bx
                sti
                pop     bx
                pop     es
                ret


Init8259:
        ;       cmp     cs:Copies, '1'
        ;       jz      @@1
        ;       ret
        @@1:
                cmp     cs:MachineID, 0fch
                ja      @@pc_xt
        @@AT:
                mov     bx,870h         ;
                mov     al,0            ;
                out     0F1h,al         ;
                jcxz    $+2
                jcxz    $+2
                mov     al,11h          ; ICW1
                out     0A0h,al
                jcxz    $+2
                jcxz    $+2
                out     20h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,bl           ; ICW2
                out     0A1h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,bh
                out     21h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,2            ; ICW3
                out     0A1h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,4
                out     21h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,1            ; ICW4
                out     0A1h,al
                jcxz    $+2
                jcxz    $+2
                out     21h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,0FFh         ; OCW1
                out     0A1h,al
                jcxz    $+2
                jcxz    $+2
                out     21h,al
                ret
        @@PC_XT:
                mov     al,13h          ; ICW1
                out     20h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,8            ; ICW2
                out     21h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,9            ; ICW4
                out     21h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,0FFh         ; OCW1
                out     21h,al
                ret

Enable8259:
                mov     ax, word ptr cs:old_8259
                out     021h,al
                jcxz    $+2
                jcxz    $+2
                mov     al,ah
                out     0a1h,al         ; DEC PC Bus Mouse
                ret                     ; July 1994 by Mr. Lei

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

RestoreBiosData:
                lodsw
                cmp     ax, '--'
                jz      @@1
                call    Beep
                ret
        @@1:    push    es
                push    di
                mov     di, 40h
                mov     es, di

                mov     di, 10h
                movsw
                mov     di, 0a8h         ; [40h:a8h]
                movsw
                movsw
                mov     di, 49h
                mov     cx, 1dh
                rep     movsb

                mov     di, 0f0h         ; User data
                mov     cx, 8
                rep     movsw

                pop     di
                pop     es
                ret

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

RestoreMCB:
                push    ds
                push    es
                lodsw                           ; 'MZ'
        @@0:    lodsw
                cmp     ax, 'MM'
                jz      @@1
                mov     es,ax
                xor     di,di
                movsb
                movsw
                movsw
                inc     ax
                mov     bx, ds
                cmp     ax, bx
                jz      @@10
                mov     byte ptr es:[8], 0      ; Aug 24, 1993
        @@10:   cmp     byte ptr es:[0], 'Z'
                jnz     @@0
                mov     byte ptr es:[10h], 0
                jmp     @@0
        @@1:
                pop     es
                pop     ds
                ret

; -------------------------------------------------------------------------
CloseFiles:
                mov     ax, 5           ; Begin handle
                push    ds
                push    si
                mov     cx, 15          ; Max handle
                sub     cx, ax
                inc     cx
                mov     bx, ax
        @@1:    push    bx
                push    cx
                mov     ah, 3eh
                int     21h
                pop     cx
                pop     bx
                inc     bx
                loop    @@1
                pop     si
                pop     ds
                ret

; -------------------------------------------------------------------------
RestorePort:
                mov     di, 40h            ; restore port
                mov     es, di
                xor     di, di
                mov     cx, 8
                rep     movsw
                ret

; -------------------------------------------------------------------------
RestoreLEDs:
                lodsb
                and     al, 11110000b      ; LED status
                mov     ah, es:[17h]
                and     ah, 00001111b
                or      ah, al
                and     ah, 0f0h           ; Clear CTRL ALT SHIFT
                mov     es:[17h], ah
                ret

; -------------------------------------------------------------------------
RestoreEnvStr:
                lodsw
                push    si
                push    di
                push    ds
                push    es
                mov     es, cs:DosEnv
                mov     ds, ax
                xor     si, si
                mov     di, si
        @@0:    lodsb
                or      al, al
                jnz     @@1
                cmp     byte ptr ds:[si], 0
                jz      @@2
        @@1:    stosb
                jmp     @@0
        @@2:    stosb
                stosb
                pop     es
                pop     ds
                pop     di
                pop     si
                ret

; -----------------------------------------------------------------------
RestoreVecList:
                xor     ax,ax
                mov     di,ax
                mov     es,ax
                mov     cx,100h
        @@0:    lodsw
                xchg    dx, ax
                lodsw
                cmp     dx, 'EL'
                jnz     @@1
                cmp     al, 'I'
                jnz     @@1
                sub     cl, ah
                push    cx
                mov     cl, ah
                mov     ax, es:[di-4]
                mov     dx, es:[di-2]
         @@a:   stosw
                xchg    ax, dx
                stosw
                xchg    ax, dx
                loop    @@a
                pop     cx
                or      cx, cx
                jz      @@9
                jmp     @@0
        @@1:
                xchg    ax, dx
                stosw
                xchg    ax, dx
                stosw
                loop    @@0
        @@9:
                ret

;----------------------------------------------------------------------------
RestoreFloppyParam:                                     ; Mr. Lei   2/10/1992
                push    es
                push    ax
                xor     ax, ax
                mov     es, ax
                mov     byte ptr es:[525h], 2
                pop     ax
                pop     es
                ret

;---------------------------------------------------------------------------
RestoreCVTchain:
                lodsw
                cmp     ax, 'VC'
                jz      @@_0
                call    Beep
                ret
        @@_0:
                push    ax
                push    cx
                push    es

        ; -----------------------------------------------------------------
                lodsw                   ; DPB
                mov     di, ax
                lodsw
                mov     es, ax
        @@1:    lodsb
                inc     di
                stosb
                add     di, cs:cvtOfs
                add     di, 10h
                movsw
                movsw
                les     di, es:[di+2]
                cmp     di, -1
                jnz     @@1

        ; -----------------------------------------------------------------
                lodsw                   ; DCB
                mov     di, ax
                lodsw
                mov     es, ax
                xor     ax, ax
                dec     ax
                stosw

        ; -----------------------------------------------------------------
                lodsw                   ; Device Driver Chain
                mov     di, ax
                lodsw
                mov     es, ax
                xor     cx, cx
        @@9:    push    di
                mov     cl, 5
                rep     movsw
                pop     di
                les     di, es:[di]
                mov     ax, di
                inc     ax
                jnz     @@9
                pop     es
                pop     cx
                pop     ax
                ret

; ----------------------------------------------------------------------------
RestoreMemoryManager:
                test    cs:Status, XMSbit
                jz      @@1
                call    LoadXMSstatus
        @@1:
                test    cs:Status, EMSbit
                jz      @@2
                call    LoadEMSstatus
        @@2:
                ret


LoadEMSstatus:
                lodsw
                cmp     ax, 'ME'
                jz      @@_0
                call    Beep
                ret
        @@_0:
                lodsw
                mov     cx, ax
                xor     dx, dx
        @@_1:   push    ds
                push    si
                push    dx
                push    cx

        @@0:    cmp     dx, ds:[si]
                jz      @@1
                add     si, 4
                loop    @@0

                push    cx
                mov     cx, 5
        @@__0:  mov     ah, 45h         ; Deallocate Handle and Memory
                int     67h
                or      ah, ah
                jz      @@__1
                loop    @@__0
        @@__1:  pop     cx

        @@1:
                pop     cx
                pop     dx
                pop     si
                pop     ds
                inc     dx
                cmp     dx, 100h
                jb      @@_1
                shl     cx, 1
                shl     cx, 1
                add     si, cx
                ret


LoadXMSstatus:
                lodsw
                cmp     ax, 'MX'
                jz      @@_0
                call    Beep
                ret
        @@_0:
                lodsw
                mov     cx, ax
                jcxz    @@5
        @@1:
                lodsw
                mov     dx, ax
        @@2:    push    dx
                mov     ah, 0ah                 ; free
                call    dword ptr cs:xms_control
                or      ax, ax
                pop     dx
                jnz     @@4
                cmp     bl, 0abh
                jnz     @@4
                push    dx
                mov     ah, 0dh                 ; unlock
                call    dword ptr cs:xms_control
                or      ax, ax
                pop     dx
                jmp     @@2
        @@4:    loop    @@1
        @@5:    ret
                endp

; -----------------------------------------------------------------------
CloseSpeaker:
                in      al, 61h
                and     al, 0fch
                out     61h, al
                ret

; -----------------------------------------------------------------------
RestoreClockSpeed:
                mov     al, 00110110b
                out     43h, al
                xor     ax, ax
                out     40h, al
                out     40h, al
                ret

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



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

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

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

; ------------- CMOS CLOCK set to System -----------------------------------
UpdateTime:
                call    GetRealTime
                mov     ah, 2dh
                int     21h
                ret

GetRealTime:
                mov     ah,2
                int     1Ah
                mov     al,ch
                call    bcdxchg
                mov     ch,al
                mov     al,cl
                call    bcdxchg
                mov     cl,al
                mov     al,dh
                call    bcdxchg
                mov     dh,al
                mov     dl,0
                ret

BCDxchg:
                push    ax
                push    cx
                mov     cl,4
                shr     al,cl
                pop     cx
                mov     bl,0Ah
                mul     bl
                pop     bx
                and     bl,0Fh
                add     al,bl
                ret

; -----------------------------------------------------------------------
; Display string
ColorPrintStr:
                lodsb
                mov     bh, al          ; color
                xor     cx, cx
                mov     dx, 014fh
                mov     ax, 0600h
                int     10h

                mov     ah, 02          ; GotoXY (0, 0)
                xor     dx, dx
                mov     bh, 0
                int     10h
PrintStr:
                push    cs
                pop     ds
                xor     bx, bx
        @@1:    lodsb
                cmp     al, '$'
                jz      @@2
                or      al, al
                jz      @@2
                mov     ah, 0eh
                int     10h
                jmp     short @@1
        @@2:    mov     al, cs:clsStrcolor
                mov     cs:clsStr, al
                ret

; -----------------------------------------------------------------------
  Self          dw      0
  clsStrcolor   db      17h
  clsStr        db      17h             ; Color (White in Blue)
    db ' RAMinit  Version 2.12  (c) 1989-1994 by KingSoft Ltd.  Mr. Leijun'
    db 0dh,0ah
    db ' ['
  ShowCopies    db      '*'
    db '] Activate...',0ah,0dh,'$'

endTSR  equ     $
mcbList equ     offset endTSR + 2 + 2
vecList equ     mcbList + 7*10 + 2 + 10h + 1 + 400h
devLink equ     vecList + 4 + 5 * 26 + 4 + 10 * 30h + 4
xmsList equ     devLink + 2 + MaxHandles * 2
emsList equ     xmsList + 4 + 1024
crtMode equ     emsList + 2 + 1Dh + 4 + 10h
tsrLen  equ     crtMode + 1
;
; DOS Environment Reserved by RI
; --------------------------------------------------
;   Flag                        'XX'       2 bytes
;   Environment Segment                    1 word
;   Free MCBs                         <=7*10 bytes
;     MCB segment               1 word
;     MCB                       5 bytes
;   End flag                    'MM'       1 word
;   COM LPT ports                        10h bytes
;   LEDs status                            1 bytes
;   Packed vectors list               <=400h bytes
;   Flag                        'CV'       2 bytes
;   CVT First DPB pointer                  4 bytes
;       DPBs data                     <=5*26 bytes
;       First DCB pointer                  4 bytes
;       Pointer to NUL                     4 bytes
;       All device driver datas     <=30h*10 bytes
;   Flag                        'XM'       2 bytes
;   XMS free handle counter                2 bytes
;   EMS free handle list            <=100h*4 bytes
;   Flag                        'EM'       2 bytes
;   EMS free handle counter                2 bytes
;   EMS free handle list              <=1024 bytes
;       EMS handle              1 word
;       Number of pages         1 word
;   Flag                        '--'       1 word
;   Equipment List                         1 word
;   CRT 40:49h-66h                       1dh bytes
;       40:A8h                             1 dword
;   BIOS User Data Area  40:F0--FF       10h bytes
; ***************************************************************************
;
main:           jmp     main0

Print           Macro   Str
                Lea     dx, Str
                call    DisplayStr
                endm

InstMsg db  'RAMinit  Version 2.12 '
        db  'Copyright (c) 1989-1994  by KingSoft Ltd. ',0dh,0ah,'$'
Msg0    db  'Already installed !',0dh,0ah,0ah
        db  'For Help, type "RI /?". ',0dh,0ah,'$'
Msg_0   db  0ah,'Residents a new RAMinit copy [y/n] ? $'
Msg_2   db  'OK, RI No.'
Msg_RI  db  '2'
        db  ' residents successful !', 0dh,0ah,'$'
Msg1    db  'Activate with:  $'
KeyMsg  db  'Right_Shift$'
        db  'Left_Shift$ '
  KMsg1 db  'Left_Ctrl$  '
        db  'Left_Alt$   '
        db  'Right_Ctrl$ '
        db  'Right_Alt$  '
  KMsg2 db  'Ctrl$       '
        db  'Alt$        '
        db  'Ctrl$       '
        db  'Alt$        '
PlusMsg db  ' + $'
crlf    db  0dh,0ah,'$'

HelpMsg db  'Programmed by Mr. Leijun    Dec 1992', 0dh,0ah,0ah
        db  'Usage:   RI [options]',0dh,0ah,0ah
        db  '/H,/?    Display this screen',0dh,0ah
        db  '/CLS     Removes all TSR programs after current RI',0dh,0ah
        db  '/RET     Removes TSR programs include current RI',0dh,0ah
        db  '/NEW     Residents a new data copy of current environment',0dh,0ah
        db  '/ALL     Removes all RI copies and all other tsr programs',0dh,0ah
        db  '/Sxyy..  Define Hotkey   x=AuxHotkey   yy..=shift status',0dh,0ah
        db  '         x=auxiliary hotkey (default is "X") ',0dh,0ah
        db  '           x equ "1" means need AuxHotkey',0dh,0ah
        db  '         yy..=shift status  [CAScas]',0dh,0ah
        db  '           C: Left Ctrl    A: Left Alt    S: Left Shift',0dh,0ah
        db  '           c: Right Ctrl   a: Right Alt   s: Right Shift',0dh,0ah,0ah
        db  'Example: "RI /S1c"  means Hotkey is Right_Ctrl+X',0dh,0ah
        db  '         "RI /S0Cc" means HotKey is Left_Ctrl+Right_Ctrl',0dh,0ah
        db  '         "RI /CLS"  equals simply press hotkey',0dh,0ah
        db  '         "RI /RET"  Removes all TSRs after current RI and this RI',0dh,0ah
        db  0ah
        db  'Contact me for RAMinit problems: (01)2561155 Call 1997',0dh,0ah
        db  '$'
ErrMsg  db  'ERROR: Invalid options !',0dh,0ah,0ah,'$'
WinErr  db  7, 'Sorry, I cannot work in Windows DOS environment.',0dh,0ah,'$'
SetMsg  db  7, 'Defines new Hotkey successful !',0dh,0ah,0ah,'$'
tsrOK   db  False

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

                mov     ax, 0c0d7h
                int     2fh
                mov     es, ax
                cmp     word ptr es:[101h], 'IE'        ; 'LEI'
                jnz     @@0
                mov     cs:Self, ax
        @@0:
                call    CmdLine
                call    PrintHotKeyPrompt

                cmp     cs:tsrOK, true
                jz      @@2
                call    tsrReplyOK
        @@2:    cmp     cs:tsrOK, true
                jnz     @@_2
                call    PrintCopies
        @@_2:
                mov     word ptr cs:[100h], 'EL'
                mov     byte ptr cs:[102h], 'I'

                push    cs
                pop     es
                push    cs
                pop     ds
                std
                mov     si, offset eof
                mov     cx, eof - offset Here
                mov     di, tsrLen
                add     di, cx
                inc     cx
                rep     movsb
                cld
                mov     bx, tsrLen
                jmp     bx

Here:
                mov     ax,cs
                mov     es,ax
                mov     di,offset endTSR
                mov     cs:DataBegin, di
                mov     cs:NextDataSeg, -1
                mov     ax, 'XX'
                stosw
                in      al, 0a1h
                mov     ah, al
                in      al, 21h
                push    ax
                mov     word ptr cs:old_8259, ax
                xor     ax, ax
                out     21h,al                  ; CLI
                call    SaveOthers
                call    SetSelfInt
                call    BackupVecList
                cmp     cs:Power, true
                jnz     @@20
                call    BackupCVTchain
                call    BackupMemoryManager
        @@20:
                call    BackupBiosData

                sti
                mov     cs:Flag, ' '    ; no busy
                mov     cs:StopFlag, 0  ;

                mov     cs:tsrLength, di
                call    SetDosEnvSeg
                cmp     cs:Self, 0
                jz      @@29
                push    cs
                pop     ds
                push    cs
                pop     es
                cld
                mov     cx, cs:tsrLength
                mov     si, cs:DataBegin
                sub     cx, si
                mov     di, 120h
                mov     cs:DataBegin, di
                rep     movsb
                mov     cs:tsrLength, di
        @@29:
                pop     ax
                out     21h, al                         ; STI
                mov     al, ah
                out     0a1h, al
                mov     dx, cs:tsrLength
                inc     dx
                int     27h

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

以下子过程由于代码过长而省略,请点击:https://gist.github.com/anonymous/f7e0675d360d5767c75d

  • SetDosEnvSeg
  • SaveOthers
  • backupMCB
  • SaveFreeMCB
  • OpenLEDs
  • SetSelfInt
  • SaveCounter
  • DisplayStr
  • CmdLine
  • tsrReplyOK
  • PrintCopies
  • BackupVecList
  • BackupCVTchain
  • BackupBiosData
  • BackupMemoryManager
  • SaveEMSstatus
  • SaveXMSstatus
  • XMS_test
  • XMS_stat
  • XMS_alloc
  • XMS_lock
  • XMS_unlock
  • XMS_bstat
  • XMS_free
  • EMS_test
  • SetHotKey
  • GetRunFileName
  • GetMachineID
  • ModifyHotKeyPrompt
  • PrintHotKeyPrompt
  • ColorDisplayStr
  • CmpSideKick
  • CmpDosVer
  • HotKeyValid

代码来源:http://mailp.in/rXX7XrVR/ 作者:雷军
新闻创作:SegmentFault
责任编辑:沙渺


沙渺
21.8k 声望1.1k 粉丝

1998年入行,普通的电脑老玩家。Web、嵌入式Linux和电子产品设计研究者。