<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          雷軍 1994 年寫的代碼,你見過嗎?

          共 14127字,需瀏覽 29分鐘

           ·

          2020-12-24 01:09

          作為小米科技的創(chuàng)始人、董事長和首席執(zhí)行官,雷軍的名字如雷貫耳。網(wǎng)上出現(xiàn)一篇“劉強東的代碼水平如何”的文章,有網(wǎng)友在下面回復(fù)“代碼只服雷軍”。雷軍的代碼水平真的很牛嗎?


          原來雷軍年輕的時候,也是一名程序員,而且一干就是10年。雷軍在22年前的作文中寫道:我會當(dāng)一輩子程序員,由此可以看出雷軍對編程有著狂熱的愛好。


          還有網(wǎng)友分享了一篇雷軍22年前寫的代碼,廢話不多說,直接貼代碼。




          雷軍寫的這篇代碼,是不是看起來很牛逼?簡直就是亮瞎眼!

          前方高能……


          ;
          ; 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:[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
          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, 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
          @@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:[33h4+2], 0
          jz @@0 cmp word ptr es:[33h4], 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 + 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
          @@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

          ; ----------------------------------------------------------------------------
          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
          int 21h ; 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, 1 int 16h
          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, 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
          @@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, 9 int 21h
          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
          int 21h
          @@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+1 int 2fh

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

          @Err:
          Print ErrMsg
          @help:
          Print HelpMsg
          mov ax, 4c00h
          int 21h

          ;---------------------------------------------------------------------------
          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, 1 int 21h

          push ax
          Print crlf
          pop ax

          cmp al, 'y'
          jz @@3 cmp al, 'Y'
          jz @@3
          @@2: ; Print Msg_1
          mov ax, 4c01h
          int 21h
          @@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
          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
          @@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
          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
          @@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
          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
          @@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
          int 21h
          jc @@2
          mov bx, ax
          mov ah, 3eh
          int 21h
          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
          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
          @@10:
          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
          @@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
          ; int 21h
          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
          int 10h
          mov ah, 3 int 10h
          inc dl
          mov ah, 2 int 10h
          pop cx
          jmp short @@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
          int 21h
          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
          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
          @@_1: ret

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

          eof:
          ends
          end Start

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



          電腦是雷軍人生中的最愛,電腦的世界對于雷軍而言實在太美妙。雷軍覺得,電腦的世界沒有人那么復(fù)雜。只要你程序?qū)懙煤茫涂梢院碗娔X處好關(guān)系,也可以指揮電腦,做一些你想做的事情。

          雷軍認(rèn)為,電腦的世界很大,程序員都是活在自己的王國里。在這里,程序員可以主宰一切。正是因為熱愛,所以雷軍一干就是10年。

          雷軍心愛的代碼被新程序員格式化

          對于雷軍來說,雖然現(xiàn)在他更加 專注在產(chǎn)品開發(fā)以及管理方面,但是曾經(jīng)他對心愛的代碼視為珍寶。之前來了一位技術(shù)支持人員,而這位技術(shù)人員進(jìn)公司的第一份工作,就是幫雷軍整理他的硬盤。?

          一位理解錯誤,原本只要覆蓋式的安裝系統(tǒng)就可以的事情,這位程序員卻把雷軍的硬盤格式化了。這些代碼是雷軍多年來積累下來,而且也是他的最愛,就這樣成為 炮灰,相信雷軍非常難過。

          編程是技術(shù),也是一種藝術(shù)

          雷軍認(rèn)為,編程的工作同石匠的工作相類似,即是技術(shù)活,也是體力活,而編寫優(yōu)秀的軟件,算是一件比較難得事。

          編程是一門技術(shù)活,因此才有可能大規(guī)模的進(jìn)行,進(jìn)而才會有軟件工程。此外,因為編程是一種藝術(shù),因此有很多好的產(chǎn)品。

          雷軍關(guān)愛下屬 親自指導(dǎo)女程序員

          因為自己是程序員出身,雷軍在技術(shù)方面的水平不用質(zhì)疑。雷軍對于下面的程序員,也是很關(guān)照的。


          早前,雷軍親自指導(dǎo)美女程序員的一張圖片爆紅。從曝光的圖片來看,這名由雷總親自指導(dǎo)的女程序員,竟是位前端開發(fā)工程師。雷總下基層,還親自指導(dǎo)碼農(nóng),小米不強大都說不過去。


          當(dāng)然,上面的只是雷軍生活中的一個小插曲。曾經(jīng),雷軍認(rèn)為自己會干一輩子的編程。但是現(xiàn)在,雷軍作為小米董事長,身價已經(jīng)不能用數(shù)字來衡量了。他接觸程序的機會,相信是少之又少,因為下面有很多程序員幫他干活。

          來自:程序IT圈

          ——————END——————


          歡迎關(guān)注“Java引導(dǎo)者”,我們分享最有價值的Java的干貨文章,助力您成為有思想的Java開發(fā)工程師!

          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉伊人网视频 | 最新人妻视频 | 欧美黄色电影网 | AV黄色片 | 欧美精品成人一区二区在线观看 |