home *** CD-ROM | disk | FTP | other *** search
/ CD-X 1 / cdx_01.iso / shareuti / secdev13 / source / sdtsr.asm < prev    next >
Encoding:
Assembly Source File  |  1994-05-02  |  45.4 KB  |  1,179 lines

  1. ; This file is a part of SecureDevice 1.3
  2. ; Copyright (C) 1994 by Max Loewenthal and Arthur Helwig
  3.  
  4. ; This program is free software; you can redistribute it and/or modify
  5. ; it under the terms of the GNU General Public License as published by
  6. ; the Free Software Foundation; either version 2 of the License, or
  7. ; (at your option) any later version.
  8.  
  9. ; This program is distributed in the hope that it will be useful,
  10. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ; GNU General Public License for more details.
  13.  
  14. ; You should have received a copy of the GNU General Public License
  15. ; along with this program; if not, write to the Free Software
  16. ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. IDEAL
  19. MODEL       TINY,C
  20. JUMPS
  21.  
  22. INCLUDE     'GLOBALS.ASM'
  23. INCLUDE     'DVSTRUCS.ASM'
  24.  
  25. MinorName   EQU         'SDTSR'
  26. MinorVer    EQU         '1.01'
  27.  
  28. MaxDrives   =           26
  29. WinWidth    =           MaxPwdLen+10
  30. WinHeight   =           9
  31.  
  32. STRUC       ColorMap
  33.             EnterBox    DB          ?
  34.             WrongBox    DB          ?
  35.             EnterText   DB          ?
  36.             WrongText   DB          ?
  37.             Password    DB          ?
  38. ENDS        ColorMap
  39.  
  40. PwdX        =           5
  41. PwdY        =           4
  42. StackSize   =           512
  43. TimerFreq   =           1193180
  44.  
  45.  
  46. MACRO       UpcaseChar  Ch
  47.             LOCAL       @@0
  48.  
  49.                         CMP         Ch,'a'
  50.                         JB          @@0
  51.                         CMP         Ch,'z'
  52.                         JA          @@0
  53.                         SUB         Ch,'a'-'A'
  54.             @@0:
  55. ENDM        UpcaseChar
  56.  
  57. STRUC       DriveKeys
  58.             Key         DB          0
  59.             ShiftState  DW          0
  60. ENDS        DriveKeys
  61.  
  62. EXTRN       MD5Init:PROC,MD5Update:PROC,MD5Final:PROC
  63. EXTRN       Write:PROC,InitScreen:PROC,MovePart:PROC
  64. EXTRN       ScreenHeight:WORD,ScreenWidth:WORD,Graphic:BYTE
  65.  
  66. CODESEG
  67.             ASSUME       CS:@CODE-10h
  68. ORG         100h
  69. START:
  70.             JMP         Install
  71.  
  72.             ASSUME      ES:@CODE,DS:@CODE,SS:@CODE,CS:@CODE
  73. PROC        InputPassword
  74.             ; CF = Escaped
  75.             LOCAL       InsertOn:BYTE
  76.  
  77.                         PUSH        AX BX CX DX SI DI
  78.  
  79.  
  80.             @@2:
  81.  
  82.                         MOV         BX,0                    ; pointer in buffer
  83.  
  84.             @@Next:     CMP         [ShowBox],0
  85.                         JE          @@0
  86.                         CALL        @@Display
  87.             @@0:        MOV         AH,0
  88.                         INT         16h
  89.                         CMP         AL,8
  90.                         JE          @@BackSpace
  91.                         CMP         AL,13
  92.                         JE          @@Entered
  93.                         CMP         AL,27
  94.                         JE          @@Escaped
  95.                         CMP         AL,0
  96.                         JE          @@Next
  97.  
  98.             @@1:        CMP         BX,MaxPwdLen
  99.                         JAE         @@Next
  100.                         MOV         [Password+BX],AL
  101.                         INC         BX
  102.                         JMP         @@Next
  103.  
  104.             @@Backspace:CMP         BX,0
  105.                         JE          @@Next
  106.                         DEC         BX
  107.                         JMP         @@Next
  108.  
  109.             @@Entered:  CMP         BX,0
  110.                         JE          @@Escaped
  111.                         MOV         [PasswordLen],BX
  112.                         CLC
  113.             @@Exit:     POP         DI SI DX CX BX AX
  114.                         RET
  115.             @@Escaped:  STC
  116.                         MOV         [PasswordLen],0
  117.                         JMP         @@Exit
  118.  
  119.  
  120.             @@Stars     DB          MaxPwdLen DUP ('?')
  121.             @@EndStars  DB          0
  122.  
  123.             @@Display:  PUSH        AX DI CX
  124.                         MOV         CX,BX
  125.                         LEA         DI,[@@Stars]
  126.                         MOV         AL,'*'
  127.                         CLD
  128.                         REP         STOSB
  129.                         MOV         CX,MaxPwdLen
  130.                         SUB         CX,BX
  131.                         JCXZ        @@4
  132.                         MOV         AL,' '
  133.                         REP         STOSB
  134.  
  135.             @@4:        LEA         AX,[@@Stars]
  136.                         PUSH        AX
  137.                         MOV         AL,[Colors.Password]
  138.                         PUSH        AX
  139.                         MOV         AX,[WinY]
  140.                         ADD         AX,PwdY
  141.                         PUSH        AX
  142.                         MOV         AX,[WinX]
  143.                         ADD         AX,PwdX
  144.                         PUSH        AX
  145.                         CALL        Write
  146.                         ADD         SP,8
  147.                         POP         CX DI AX
  148.                         RETN
  149. ENDP        InputPassword
  150. PROC        DrawBox
  151.             ; DL = Attr
  152.                         PUSH        AX BX CX DX SI DI
  153.  
  154.                         MOV         AX,[WinX]
  155.                         MOV         BX,[WinY]
  156.                         LEA         DI,[BoxTop]
  157.                         PUSH        DI DX BX AX
  158.                         CALL        Write
  159.                         ADD         SP,8
  160.                         MOV         CX,WinHeight-2
  161.                         LEA         DI,[BoxMiddle]
  162.                         PUSH        DI DX
  163.  
  164.             @@NextLine: INC         BX
  165.                         PUSH        BX AX
  166.                         CALL        Write
  167.                         POP         SI SI
  168.                         LOOP        @@NextLine
  169.  
  170.                         POP         SI SI
  171.  
  172.                         LEA         DI,[BoxBottom]
  173.                         INC         BX
  174.                         PUSH        DI DX BX AX
  175.                         CALL        Write
  176.                         ADD         SP,8
  177.  
  178.                         POP         DI SI DX CX BX AX
  179.                         RET
  180. ENDP        DrawBox
  181.             BoxTop       DB           '╔',WinWidth-2 DUP ('═'),'╗',0
  182.             BoxMiddle    DB           '║',WinWidth-2 DUP (' '),'║',0
  183.             BoxBottom    DB           '╚',WinWidth-2 DUP ('═'),'╝',0
  184.  
  185. PROC        MakeKey
  186.             ASSUME      DS:@CODE,ES:@CODE,SS:@CODE,CS:@CODE
  187.             LOCAL       MD5Buf:BYTE:88,TempKey:WORD:8
  188.  
  189.                         PUSH        AX BX CX DX DI SI ES
  190.  
  191.                         LEA         DI,[TempKey]            ; BC preserves SI DI
  192.                         LEA         SI,[MD5Buf]
  193.  
  194.                         LEA         AX,[Password]
  195.                         PUSH        [PasswordLen] DS AX SS SI
  196.                         CALL        MD5Init
  197.                         CALL        MD5Update
  198.                         PUSH        SS DI                   ; SS:SI->MD5Buf still on the stack
  199.                         CALL        MD5Final
  200.                         ADD         SP,0Eh
  201.  
  202.                         POP         ES
  203.  
  204.                         LEA         SI,[TempKey]
  205.                         LEA         DI,[Key]
  206.                         MOV         CX,8
  207.                         REP         MOVSW
  208.  
  209.                         MOV         SI,2
  210.                         MOV         DI,4
  211.                         MOV         BX,0
  212.                         MOV         CX,44
  213.  
  214.             @@Next:     PUSH        BX
  215.                         AND         BX,NOT 15
  216.                         MOV         AX,[Key+BX+SI]
  217.                         MOV         DX,[Key+BX+DI]
  218.                         POP         BX
  219.                         PUSH        CX
  220.                         MOV         CL,9
  221.                         SHL         AX,CL
  222.                         MOV         CL,7
  223.                         SHR         DX,CL
  224.                         POP         CX
  225.                         OR          AX,DX
  226.  
  227.                         MOV         [Key+BX+16],AX
  228.             REPT        2
  229.                         INC         BX
  230.                         INC         SI
  231.                         INC         DI
  232.             ENDM
  233.                         AND         DI,14
  234.                         AND         SI,14
  235.                         LOOP        @@Next
  236.  
  237.                         MOV         CX,52
  238.                         MOV         BX,0
  239.             @@Nxt:      XOR         [Key+BX],0DAEh
  240.                         ADD         BX,2
  241.                         LOOP        @@Nxt
  242.  
  243.                         POP         SI DI DX CX BX AX
  244.                         RET
  245. ENDP        MakeKey
  246. PROC        Sound
  247.             ; IN: BX=TimerFreq/frequency
  248.                         PUSH        AX
  249.                         IN          AL,61h
  250.                         OR          AL,3
  251.                         OUT         61h,AL
  252.                         MOV         AL,0B6h
  253.                         OUT         43h,AL
  254.                         MOV         AL,BL
  255.                         OUT         42h,AL
  256.                         MOV         AL,BH
  257.                         OUT         42h,AL
  258.                         POP         AX
  259.                         RET
  260. ENDP        Sound
  261. PROC        SoundOff
  262.                         PUSH        AX
  263.                         IN          AL,61H
  264.                         AND         AL,0fcH
  265.                         OUT         61H,AL
  266.                         POP         AX
  267.                         RET
  268. ENDP        SoundOff
  269. PROC        Pause
  270.             ; CX = nof ticks
  271.                         PUSHF
  272.                         PUSH        ES AX CX
  273.                         STI
  274.                         MOV         AX,0
  275.                         MOV         ES,AX
  276.             @@Next:     MOV         AX,[ES:46Ch]
  277.             @@Nothing:  CMP         [ES:46Ch],AX
  278.                         JE          @@Nothing
  279.                         LOOP        @@Next
  280.                         POP         CX AX ES
  281.                         POPF
  282.                         RET
  283. ENDP        Pause
  284.  
  285. PROC        EnterSound
  286.                         CMP         [Beeps],0
  287.                         JE          @@Exit
  288.                         PUSH        CX BX
  289.                         MOV         CX,4
  290.                         MOV         BX,2711     ; TimerFreq/440
  291.                         CALL        Sound
  292.                         CALL        Pause
  293.                         MOV         BX,3836     ; TimerFreq/311
  294.                         CALL        Sound
  295.                         CALL        Pause
  296.                         CALL        SoundOff
  297.                         POP         BX CX
  298.             @@Exit:     RET
  299. ENDP        EnterSound
  300. PROC        WrongSound
  301.                         CMP         [Beeps],0
  302.                         JE          @@Exit
  303.                         PUSH        CX BX
  304.                         MOV         CX,4
  305.                         MOV         BX,10847    ; TimerFreq/110
  306.                         CALL        Sound
  307.                         CALL        Pause
  308.                         MOV         BX,15297    ; TimerFreq/78
  309.                         CALL        Sound
  310.                         CALL        Pause
  311.                         CALL        SoundOff
  312.                         POP         BX CX
  313.             @@Exit:     RET
  314. ENDP        WrongSound
  315. PROC        GotitSound
  316.                         CMP         [Beeps],0
  317.                         JE          @@Exit
  318.                         PUSH        CX BX
  319.                         MOV         CX,2
  320.                         MOV         BX,1355     ; TimerFreq/880
  321.                         CALL        Sound
  322.                         CALL        Pause
  323.                         MOV         CX,4
  324.                         MOV         BX,1011     ; TimerFreq/1180
  325.                         CALL        Sound
  326.                         CALL        Pause
  327.                         CALL        SoundOff
  328.                         POP         BX CX
  329.             @@Exit:     RET
  330. ENDP        GotitSound
  331. PROC        WrongBox
  332.             ; CX = # of try
  333.                         PUSH        AX DX
  334.  
  335.                         MOV         DL,[Colors.WrongBox]
  336.                         CALL        DrawBox
  337.  
  338.                         LEA         AX,[@@Wrong]
  339.                         PUSH        AX
  340.                         MOV         AL,[Colors.WrongText]
  341.                         PUSH        AX
  342.                         MOV         AX,[WinY]
  343.                         ADD         AX,PwdY
  344.                         DEC         AX
  345.                         PUSH        AX
  346.                         MOV         AX,(WinWidth-17)/2
  347.                         ADD         AX,[WinX]
  348.                         PUSH        AX
  349.                         CALL        Write
  350.                         ADD         SP,8
  351.                         CMP         CX,1
  352.                         JE          @@0
  353.                         LEA         AX,[@@Again]
  354.                         PUSH        AX
  355.                         MOV         AL,[Colors.WrongText]
  356.                         PUSH        AX
  357.                         MOV         AX,[WinY]
  358.                         ADD         AX,PwdY
  359.                         PUSH        AX
  360.                         MOV         AX,(WinWidth-9)/2
  361.                         ADD         AX,[WinX]
  362.                         PUSH        AX
  363.                         CALL        Write
  364.                         ADD         SP,8
  365.  
  366.             @@0:        MOV         AH,0
  367.                         INT         16h
  368.                         CMP         AL,27h
  369.                         CLC
  370.                         JNE         @@Exit
  371.                         STC
  372.             @@Exit:     
  373.                         POP         DX AX
  374.                         RET
  375.             @@Wrong     DB          'Invalid password!',0
  376.             @@Again     DB          'Try again',0
  377. ENDP        WrongBox
  378. PROC        TestKey
  379.                         PUSH        AX DX SI
  380.                         CALL        MakeKey
  381.                         MOV         AX,0E200h
  382.                         MOV         DL,[Drive]
  383.                         LEA         SI,[Key]
  384.                         INT         2Fh
  385.                         CMP         AL,1
  386.                         CLC
  387.                         JE          @@Exit
  388.                         STC
  389.             @@Exit:     POP         SI DX AX
  390.                         RET
  391. ENDP        TestKey
  392. PROC        EnterBox
  393.                         PUSH        DX AX
  394.                         MOV         DL,[Colors.EnterBox]
  395.                         CALL        DrawBox
  396.                         MOV         AL,[Drive]
  397.                         MOV         [@@Drive],AL
  398.                         ADD         [@@Drive],'A'
  399.                         LEA         AX,[@@Question]
  400.                         PUSH        AX
  401.                         MOV         AL,[Colors.EnterText]
  402.                         PUSH        AX
  403.                         MOV         AX,[WinY]
  404.                         ADD         AX,PwdY
  405.                         DEC         AX
  406.                         PUSH        AX
  407.                         MOV         AX,(WinWidth-27)/2
  408.                         ADD         AX,[WinX]
  409.                         PUSH        AX
  410.                         CALL        Write
  411.                         ADD         SP,8
  412.                         POP         AX DX
  413.                         RET
  414.             @@Question  DB          'Enter password for drive '
  415.             @@Drive     DB          '?:',0
  416. ENDP        EnterBox
  417. PROC        DoPasswordThing
  418.                         PUSH        CX
  419.  
  420.                         CMP         [ShowBox],1
  421.                         JE          @@1
  422.                         CALL        EnterSound
  423.  
  424.             @@1:        MOV         CX,3
  425.                         
  426.             @@15:       CMP         [ShowBox],0
  427.                         JE          @@2
  428.                         CALL        EnterBox
  429.  
  430.             @@2:        CALL        InputPassword
  431.                         JC          @@Exit
  432.                         CALL        TestKey
  433.                         JNC         @@GotIt
  434.  
  435.                         CALL        WrongSound
  436.                         CMP         [ShowBox],0
  437.                         JE          @@3
  438.                         CALL        WrongBox
  439.                         JC          @@Exit
  440.             @@3:        
  441.                         LOOP        @@15
  442.                         JMP         @@Exit
  443.  
  444.             @@GotIt:    CALL        GotItSound
  445.  
  446.             @@Exit:     PUSH        ES DI AX
  447.                         PUSH        CS
  448.                         POP         ES
  449.                         MOV         AL,0
  450.                         CLD
  451.                         MOV         CX,SIZE Key
  452.                         LEA         DI,[Key]
  453.                         REP         STOSB
  454.                         MOV         CX,SIZE Password
  455.                         LEA         DI,[Password]
  456.                         REP         STOSB
  457.                         MOV         [PasswordLen],0
  458.                         POP         AX DI ES CX
  459.                         RET
  460. ENDP        DoPasswordThing
  461. PROC        PopUp
  462.                         PUSH        AX BX CX DX
  463.                         CALL        Initscreen
  464.                         MOV         [ShowBox],0
  465.                         
  466.                         CMP         [Graphic],0
  467.                         JNE         @@3
  468.                         CMP         [ScreenWidth],WinWidth
  469.                         JB          @@3
  470.                         MOV         [ShowBox],1
  471.                         
  472.                         MOV         AH,3
  473.                         INT         10h
  474.                         MOV         [@@OldCursor],CX
  475.                         MOV         CX,2020h
  476.                         MOV         AH,1
  477.                         INT         10h
  478.  
  479.                         MOV         AX,[ScreenHeight]
  480.                         SUB         AX,WinHeight
  481.                         SHR         AX,1
  482.                         MOV         BX,AX
  483.                         ADD         AX,WinHeight
  484.                         DEC         AX
  485.                         PUSH        AX                      ; Y2
  486.                         MOV         AX,[ScreenWidth]
  487.                         SUB         AX,WinWidth
  488.                         SHR         AX,1
  489.                         MOV         DX,AX
  490.                         ADD         AX,WinWidth
  491.                         DEC         AX
  492.                         PUSH        AX                      ; X2
  493.                         PUSH        BX DX                   ; Y1 X1
  494.                         MOV         [WinX],DX
  495.                         MOV         [WinY],BX
  496.                         LEA         AX,[SaveBuffer]
  497.                         PUSH        AX
  498.                         MOV         AX,0                    ; to buffer
  499.                         PUSH        AX
  500.                         CALL        MovePart
  501.                         POP         AX                      ; leave buffer+coords on stack
  502.  
  503.             @@3:        CALL        DoPasswordThing
  504.  
  505.                         CMP         [ShowBox],0
  506.                         JE          @@2
  507.  
  508.                         MOV         AX,1                    ; to screen
  509.                         PUSH        AX
  510.                         CALL        MovePart
  511.                         ADD         SP,0Ch
  512.                         MOV         CX,[@@OldCursor]
  513.                         MOV         AH,1
  514.                         INT         10h
  515.  
  516.             @@2:        POP         DX CX BX AX
  517.                         RET
  518.             @@OldCursor DW          ?
  519. ENDP        PopUp
  520. OldINT2F    DD          ?
  521. OldINT09    DD          ?
  522. OldINT15    DD          ?
  523.  
  524. PROC        NewINT2F
  525.             ; 1605:  windows in
  526.             ; 1606:  windows out
  527.  
  528.             ; DE0F:  DV/X in
  529.             ; DE03:  DV/X out
  530.  
  531.             ; E204:  installation check: returns AX=1DEAh, BX=0 if installed
  532.             ; E202:  ask password: DL=drive, called by SECDEV.SYS
  533.             ; E205:  set key: DL=drive (0FFh for all), SI = ShiftState, CL = scancode (0 for none)
  534.             ; E206:  set colors: BL BH CL CH DL = colormap
  535.             ; E207:  set quiet mode
  536.  
  537.             ASSUME      DS:NOTHING,ES:NOTHING,SS:NOTHING
  538.                         CMP         AH,0DEh
  539.                         JNE         @@7
  540.             @@DVX:      CMP         AL,0Fh
  541.                         JNE         @@8
  542.                         MOV         [InDVX],1
  543.                         JMP         @@DoOld
  544.             @@8:        CMP         AL,3
  545.                         JNE         @@DoOld
  546.                         MOV         [InDVX],0
  547.                         JMP         @@DoOld
  548.  
  549.             @@7:        CMP         AH,16h
  550.                         JNE         @@6
  551.             @@Windows:  CMP         AL,05
  552.                         JNE         @@4
  553.                         MOV         [InWindows],1
  554.                         JMP         @@DoOld
  555.             @@4:        CMP         AL,6
  556.                         JNE         @@DoOld
  557.                         MOV         [InWindows],0
  558.                         JMP         @@Doold
  559.  
  560.             @@6:        CMP         AH,0E2h
  561.                         JNE         @@DoOld
  562.                         CMP         [InWindows],0
  563.                         JNE         @@DoOld
  564.                         CMP         [InDVX],0
  565.                         JNE         @@DoOld
  566.  
  567.                         CMP         AX,0E206h
  568.                         JNE         @@3
  569.                         MOV         [Colors.EnterBox],BL
  570.                         MOV         [Colors.WrongBox],BH
  571.                         MOV         [Colors.EnterText],CL
  572.                         MOV         [Colors.WrongText],CH
  573.                         MOV         [Colors.Password],DL
  574.                         IRET
  575.  
  576.             @@3:        CMP         AX,0E207h
  577.                         JNE         @@9
  578.                         MOV         [Beeps],0
  579.                         IRET
  580.  
  581.             @@9:        CMP         AX,0E205h
  582.                         JNE         @@0
  583.                         PUSH        AX BX SI
  584.                         MOV         BX,DX
  585.                         MOV         BH,0
  586.                         INC         BL
  587.                         CMP         BX,MaxDrives
  588.                         JA          @@2
  589.                         MOV         AL,SIZE DriveKeys
  590.                         MUL         BL
  591.                         MOV         BX,AX
  592.                         MOV         [BX+KeyStrokes.Key],CL
  593.                         AND         SI,0F70Fh
  594.                         MOV         [BX+KeyStrokes.ShiftState],SI
  595.             @@2:        POP         SI BX AX
  596.                         IRET
  597.  
  598.             @@0:        CMP         AX,0E204h
  599.                         JNE         @@1
  600.                         MOV         AX,1DEAh
  601.                         MOV         BX,0
  602.                         IRET
  603.  
  604.             @@1:        CMP         AX,0E202h
  605.                         JNE         @@DoOld
  606.  
  607.                         MOV         [WORD PTR @@OldStack],SP
  608.                         MOV         [WORD PTR @@OldStack+2],SS
  609.  
  610.                         CLI
  611.                         PUSH        CS
  612.                         POP         SS
  613.                         MOV         SP,OFFSET EndOfCode+StackSize
  614.             ASSUME      SS:@CODE
  615.                         PUSH        DS ES
  616.                         PUSH        CS CS
  617.                         POP         ES DS
  618.             ASSUME      DS:@CODE,ES:@CODE
  619.                         MOV         [Drive],DL
  620.  
  621.                         PUSH        ES AX
  622.                         MOV         AX,0
  623.                         MOV         ES,AX
  624.             ASSUME      ES:NOTHING
  625.                         MOV         AX,[WORD PTR OldINT09]
  626.                         XCHG        AX,[ES:24h]
  627.                         MOV         [WORD PTR @@INT09],AX
  628.                         MOV         AX,[WORD PTR OldINT09+2]
  629.                         XCHG        AX,[ES:26h]
  630.                         MOV         [WORD PTR @@INT09+2],AX
  631.                         STI
  632.                         POP         AX ES
  633.                         CALL        Popup
  634.                         PUSH        ES AX
  635.                         CLI
  636.                         MOV         AX,0
  637.                         MOV         ES,AX
  638.                         MOV         AX,[WORD PTR @@INT09]
  639.                         MOV         [ES:24h],AX
  640.                         MOV         AX,[WORD PTR @@INT09+2]
  641.                         MOV         [ES:26h],AX
  642.                         STI
  643.                         POP         AX ES
  644.  
  645.                         POP         ES DS
  646.             ASSUME      DS:NOTHING,ES:NOTHING
  647.                         CLI
  648.                         MOV         SS,[WORD PTR @@OldStack+2]
  649.             ASSUME      SS:NOTHING
  650.                         MOV         SP,[WORD PTR @@OldStack]
  651.                         IRET
  652.  
  653.             @@DoOld:    JMP         [OldINT2F]
  654.             @@INT09     DD          ?
  655.             @@OldStack  DD          ?
  656.  
  657. ENDP        NewINT2F
  658. PROC        NewINT09
  659.             ASSUME      ES:NOTHING,DS:NOTHING,SS:NOTHING,CS:@CODE
  660.  
  661.                         PUSH        AX
  662.                         IN          AL,60h
  663.                         TEST        AL,80h
  664.                         JNE         @@DoOld
  665.  
  666.                         PUSH        SI DX CX BX ES DI
  667.                         MOV         BX,0
  668.                         MOV         ES,BX
  669.                         MOV         SI,[WORD PTR ES:417h]
  670.                         AND         SI,0F70Fh
  671.             ; this part is due to a bug in at least my BIOS:
  672.             ;   when a right alt or a right ctrl is pressed,
  673.             ;   the shift-states at 0:418 aren't properly set.
  674.  
  675.                         MOV         BX,SI
  676.                         AND         BX,0504h                ; = any+left+right ctrl
  677.                         CMP         BX,0004h                ; = any
  678.                         JNE         @@7
  679.                         OR          SI,0400h                ; = right
  680.  
  681.             @@7:        MOV         BX,SI
  682.                         AND         BX,0A08h                ; = any+left+right ctrl
  683.                         CMP         BX,0008h                ; = any
  684.                         JNE         @@A
  685.                         OR          SI,0800h                ; = right
  686.  
  687.             @@A:        MOV         CX,MaxDrives+1
  688.  
  689.             @@0:        CMP         [BX+KeyStrokes.Key],0
  690.                         JE          @@Next
  691.                         CMP         AL,[BX+KeyStrokes.Key]
  692.                         JNE         @@Next
  693.                         PUSH        SI
  694.                         TEST        [BX+KeyStrokes.ShiftState],0500h
  695.                         JNE         @@D
  696.                         AND         SI,NOT 0500h                     ; to support any (left or right) ctrl
  697.             @@D:        TEST        [BX+KeyStrokes.ShiftState],0A00h
  698.                         JNE         @@E
  699.                         AND         SI,NOT 0A00h                     ; to support any (left or right) alt
  700.             @@E:        CMP         SI,[BX+KeyStrokes.ShiftState]
  701.                         POP         SI
  702.                         JNE         @@Next
  703.  
  704.                         JMP         @@Capture
  705.  
  706.             @@Next:     ADD         BX,3
  707.                         LOOP        @@0
  708.                         POP         DI ES BX CX DX SI
  709.                         JMP         @@DoOld
  710.  
  711.             @@Capture:  PUSH        AX
  712.                         IN          AL,61h
  713.                         MOV         AH,AL
  714.                         OR          AL,80h
  715.                         OUT         61h,AL
  716.                         XCHG        AH,AL
  717.                         OUT         61h,AL
  718.                         MOV         AL,20h
  719.                         OUT         20h,AL
  720.                         POP         AX
  721.  
  722.                         MOV         DL,0FFh
  723.  
  724.             @@1:        CMP         [BX+KeyStrokes.Key],0
  725.                         JE          @@Next2
  726.                         CMP         AL,[BX+KeyStrokes.Key]
  727.                         JNE         @@Next2
  728.                         PUSH        SI
  729.                         TEST        [BX+KeyStrokes.ShiftState],0500h
  730.                         JNE         @@B
  731.                         AND         SI,NOT 0500h                     ; to support any (left or right) ctrl
  732.             @@B:        TEST        [BX+KeyStrokes.ShiftState],0A00h
  733.                         JNE         @@C
  734.                         AND         SI,NOT 0A00h                     ; to support any (left or right) alt
  735.             @@C:        CMP         SI,[BX+KeyStrokes.ShiftState]
  736.                         POP         SI
  737.                         JNE         @@Next2
  738.  
  739.                         PUSH        AX
  740.                         MOV         AX,0E203h
  741.                         INT         2Fh
  742.                         POP         AX
  743.  
  744.             @@Next2:    ADD         BX,3
  745.                         INC         DX
  746.                         LOOP        @@1
  747.                         POP         DI ES BX CX DX SI AX
  748.                         JMP         @@Exit
  749.  
  750.             @@DoOld:    POP         AX
  751.                         PUSHF
  752.                         CALL        [OldINT09]
  753.  
  754.                         PUSH        SI ES
  755.                         MOV         SI,0
  756.                         MOV         ES,SI
  757.  
  758.  
  759.                         MOV         SI,[WORD PTR ES:417h]   ; shift state
  760.                         AND         SI,0F70Fh
  761.                         CMP         SI,[OldShift]
  762.                         JE          @@9
  763.                         CMP         SI,0
  764.                         JE          @@8
  765.  
  766.                         PUSH        DX CX BX AX
  767.  
  768.             ; this part is due to a bug in at least my BIOS:
  769.             ;   when a right alt or a right ctrl is pressed,
  770.             ;   the shift-states at 0:418 aren't properly set.
  771.  
  772.                         MOV         BX,SI
  773.                         AND         BX,0504h                ; = any+left+right ctrl
  774.                         CMP         BX,0004h                ; = any
  775.                         JNE         @@3
  776.                         OR          SI,0400h                ; = right
  777.  
  778.             @@3:        MOV         BX,SI
  779.                         AND         BX,0A08h                ; = any+left+right ctrl
  780.                         CMP         BX,0008h                ; = any
  781.                         JNE         @@4
  782.                         OR          SI,0800h                ; = right
  783.  
  784.             @@4:        MOV         BX,0
  785.                         MOV         CX,MaxDrives+1
  786.                         MOV         DL,0FFh
  787.  
  788.             @@2:        CMP         [BX+KeyStrokes.Key],0
  789.                         JNE         @@Next3
  790.                         CMP         [BX+KeyStrokes.ShiftState],0
  791.                         JE          @@Next3
  792.                         PUSH        SI
  793.                         TEST        [BX+KeyStrokes.ShiftState],0500h
  794.                         JNE         @@5
  795.                         AND         SI,NOT 0500h                     ; to support any (left or right) ctrl
  796.             @@5:        TEST        [BX+KeyStrokes.ShiftState],0A00h
  797.                         JNE         @@6
  798.                         AND         SI,NOT 0A00h                     ; to support any (left or right) alt
  799.             @@6:        CMP         SI,[BX+KeyStrokes.ShiftState]
  800.                         POP         SI
  801.                         JNE         @@Next3
  802.  
  803.                         MOV         AX,0E203h
  804.                         INT         2Fh
  805.  
  806.             @@Next3:    ADD         BX,3
  807.                         INC         DX
  808.                         LOOP        @@2
  809.                         POP         AX BX CX DX
  810.  
  811.             @@8:        MOV         [OldShift],SI
  812.             @@9:        POP         ES SI
  813.             @@Exit:     IRET
  814. ENDP        NewINT09
  815. DATASEG
  816.             Drive       DB          ?
  817.             SaveBuffer  DW          WinWidth*WinHeight DUP (?)
  818.             WinX        DW          ?
  819.             WinY        DW          ?
  820.             ShowBox     DB          0
  821.             InWindows   DB          0
  822.             InDVX       DB          0
  823.             Beeps       DB          -1
  824.  
  825.             Colors      ColorMap    <1Fh,4Eh,1Eh,4Fh,0Fh>
  826.  
  827.             Key         DW          52 DUP (?)
  828.             PasswordLen DW          0
  829.             Password    DB          MaxPwdLen+1 DUP ('?')
  830.             Keystrokes  DriveKeys   MaxDrives+1 DUP (<>)                ; first = all
  831.             OldShift    DW          0
  832.  
  833.             LABEL       EndOfCode
  834.             AlreadyMsg  DB          'Already installed.',0Dh,0Ah,'$'
  835.             InstMsg     DB          'Installed.',0Dh,0Ah,'$'
  836.  
  837. PROC        NextWord
  838.             ASSUME      ES:NOTHING,DS:@CODE,CS:@CODE,SS:@CODE
  839.             ; entry:
  840.             ;   DI-> string
  841.             ; return:
  842.             ;   DI-> beginning of next word in string
  843.  
  844.                         CMP         [BYTE PTR DI],' '
  845.                         JE          @@Next
  846.                         CMP         [BYTE PTR DI],09h
  847.                         JE          @@Next
  848.                         RET
  849.  
  850.             @@Next:     INC         DI
  851.                         JMP         NextWord
  852. ENDP        NextWord
  853.  
  854. PROC        NextSpace
  855.             ASSUME      ES:NOTHING,DS:@CODE,CS:@CODE,SS:@CODE
  856.             ; entry:
  857.             ;   DI-> string
  858.             ; return:
  859.             ;   DI-> beginning of next space/tab in string
  860.                         CMP         [BYTE PTR DI],' '
  861.                         JE          @@Exit
  862.                         CMP         [BYTE PTR DI],09h
  863.                         JE          @@Exit
  864.                         CMP         [BYTE PTR DI],0Dh
  865.                         JE          @@Exit
  866.                         INC         DI
  867.                         JMP         NextSpace
  868.  
  869.             @@Exit:     RET
  870. ENDP        NextSpace
  871.  
  872. PROC        DeHex
  873.             ; in: AX = string in hex
  874.             ; out: AL = value, Carry set if error
  875.  
  876.                         CALL        @@DeHex
  877.                         JC          @@Error
  878.                         XCHG        AL,AH
  879.                         CALL        @@DeHex
  880.                         JC          @@Error
  881.                         SHL         AH,1
  882.                         SHL         AH,1
  883.                         SHL         AH,1
  884.                         SHL         AH,1
  885.                         OR          AL,AH
  886.                         RET
  887.  
  888.             @@Error:    STC
  889.                         RET
  890.  
  891.             @@DeHex:
  892.             ; in: AL = digit in hex
  893.             ; out: AL = value, Carry set if error
  894.                         UpcaseChar  AL
  895.                         CMP         AL,'0'
  896.                         JB          @@Error
  897.                         CMP         AL,'9'
  898.                         JA          @@Letter
  899.                         SUB         AL,'0'
  900.                         CLC
  901.                         RET
  902.             @@Letter:   CMP         AL,'A'
  903.                         JB          @@Error
  904.                         CMP         AL,'F'
  905.                         JA          @@Error
  906.                         SUB         AL,'A'-0Ah
  907.                         CLC
  908.                         RET
  909. ENDP        DeHex
  910.  
  911. PROC        DumpHex
  912.             ARG         Data:BYTE
  913.  
  914.                         PUSH        DX CX BX AX
  915.                         MOV         AH,2
  916.                         MOV         BH,0
  917.                         MOV         CL,[Data]
  918.                         MOV         CH,CL
  919.                         SHR         CL,1
  920.                         SHR         CL,1
  921.                         SHR         CL,1
  922.                         SHR         CL,1
  923.                         MOV         BL,CL
  924.                         MOV         DL,[HexDigits+BX]
  925.                         INT         21h
  926.                         MOV         BL,CH
  927.                         AND         BL,0Fh
  928.                         MOV         DL,[HexDigits+BX]
  929.                         INT         21h
  930.                         POP         AX BX CX DX
  931.                         RET
  932.  
  933.             HexDigits   DB          '0123456789ABCDEF'
  934. ENDP        DumpHex
  935.  
  936. PROC        DumpWord
  937.             ; DS:DI-> word
  938.                         PUSH        SI AX DX
  939.  
  940.                         MOV         AH,2
  941.                         MOV         SI,DI
  942.  
  943.             @@Next:     LODSB
  944.                         CMP         AL,' '
  945.                         JE          @@Exit
  946.                         CMP         AL,9
  947.                         JE          @@Exit
  948.                         CMP         AL,0Dh
  949.                         JE          @@Exit
  950.                         MOV         DL,AL
  951.                         INT         21h
  952.                         JMP         @@Next
  953.  
  954.             @@Exit:     POP         DX AX SI
  955.                         RET
  956. ENDP        DumpWord
  957.  
  958. PROC        ExtractParms
  959.             ASSUME      ES:NOTHING,DS:@CODE,CS:@CODE,SS:@CODE
  960.                         PUSH        AX BX CX DX DI SI
  961.  
  962.                         MOV         DI,81h
  963.  
  964.             @@Next:     CALL        NextWord
  965.                         CMP         [BYTE PTR DI],0Dh
  966.                         JE          @@Exit
  967.                         CMP         [BYTE PTR DI],'/'
  968.                         JNE         @@Error
  969.                         MOV         AL,[BYTE PTR DI+1]
  970.                         UpcaseChar  AL
  971.                         CMP         AL,'K'
  972.                         JE          @@Keys
  973.                         CMP         AL,'Q'
  974.                         JE          @@Quiet
  975.                         CMP         AL,'C'
  976.                         JNE         @@Error
  977.  
  978.             @@Colors:   LEA         SI,[DI+2]
  979.                         CLD
  980.                         LODSW
  981.                         CALL        DeHex
  982.                         JC          @@Error
  983.                         MOV         BL,AL
  984.                         LODSW
  985.                         CALL        DeHex
  986.                         JC          @@Error
  987.                         MOV         BH,AL
  988.                         LODSW
  989.                         CALL        DeHex
  990.                         JC          @@Error
  991.                         MOV         CL,AL
  992.                         LODSW
  993.                         CALL        DeHex
  994.                         JC          @@Error
  995.                         MOV         CH,AL
  996.                         LODSW
  997.                         CALL        DeHex
  998.                         JC          @@Error
  999.                         MOV         DL,AL
  1000.                         LODSB
  1001.                         CMP         AL,' '
  1002.                         JE          @@Ok1
  1003.                         CMP         AL,9
  1004.                         JE          @@Ok1
  1005.                         CMP         AL,0Dh
  1006.                         JNE         @@Error
  1007.             @@Ok1:      MOV         AX,0E206h
  1008.                         INT         2Fh
  1009.                         PUSH        DX
  1010.                         LEA         DX,[@@ColorsMsg]
  1011.                         MOV         AH,9
  1012.                         INT         21h
  1013.                         POP         DX
  1014.                         MOV         AL,BL
  1015.                         PUSH        AX
  1016.                         CALL        DumpHex
  1017.                         POP         AX
  1018.                         MOV         AL,BH
  1019.                         PUSH        AX
  1020.                         CALL        DumpHex
  1021.                         POP         AX
  1022.                         MOV         AL,CL
  1023.                         PUSH        AX
  1024.                         CALL        DumpHex
  1025.                         POP         AX
  1026.                         MOV         AL,CH
  1027.                         PUSH        AX
  1028.                         CALL        DumpHex
  1029.                         POP         AX
  1030.                         MOV         AL,DL
  1031.                         PUSH        AX
  1032.                         CALL        DumpHex
  1033.                         POP         AX
  1034.                         JMP         @@DoCRLF
  1035.  
  1036.             @@Quiet:    LEA         SI,[DI+2]
  1037.                         CLD
  1038.                         LODSB
  1039.                         CMP         AL,' '
  1040.                         JE          @@Ok2
  1041.                         CMP         AL,9
  1042.                         JE          @@Ok2
  1043.                         CMP         AL,0Dh
  1044.                         MOV         AX,0E207h
  1045.                         INT         2Fh
  1046.                         JNE         @@Error
  1047.  
  1048.             @@Ok2:      LEA         DX,[@@QuietMsg]
  1049.                         MOV         AH,9
  1050.                         INT         21h
  1051.                         JMP         @@DoCRLF
  1052.  
  1053.             @@Keys:     MOV         DL,[BYTE PTR DI+2]
  1054.                         UpcaseChar  DL
  1055.                         SUB         DL,'@'
  1056.                         CMP         DL,MaxDrives
  1057.                         JA          @@Error
  1058.                         DEC         DL
  1059.                         LEA         SI,[DI+3]
  1060.                         CLD
  1061.                         LODSW
  1062.                         CALL        DeHex
  1063.                         JC          @@Error
  1064.                         MOV         BH,AL
  1065.                         LODSW
  1066.                         CALL        DeHex
  1067.                         JC          @@Error
  1068.                         MOV         BL,AL
  1069.                         LODSW
  1070.                         CALL        DeHex
  1071.                         JC          @@Error
  1072.                         MOV         CL,AL
  1073.                         LODSB
  1074.                         CMP         AL,' '
  1075.                         JE          @@Ok
  1076.                         CMP         AL,9
  1077.                         JE          @@Ok
  1078.                         CMP         AL,0Dh
  1079.                         JNE         @@Error
  1080.             @@Ok:
  1081.                         MOV         SI,BX
  1082.                         MOV         AX,0E205h
  1083.                         INT         2Fh
  1084.  
  1085.                         MOV         BL,DL
  1086.                         LEA         DX,[@@KeyAllMsg]
  1087.                         CMP         BL,0FFh
  1088.                         JE          @@0
  1089.                         LEA         DX,[@@KeySetMsg]
  1090.                         ADD         BL,'A'
  1091.                         MOV         [@@Drive],BL
  1092.             @@0:        MOV         AH,9
  1093.                         INT         21h
  1094.                         MOV         AX,SI
  1095.                         XCHG        AL,AH
  1096.                         PUSH        AX
  1097.                         CALL        DumpHex
  1098.                         POP         SI
  1099.                         XCHG        AL,AH
  1100.                         PUSH        AX
  1101.                         CALL        DumpHex
  1102.                         POP         SI
  1103.                         MOV         AL,CL
  1104.                         PUSH        AX
  1105.                         CALL        DumpHex
  1106.                         POP         SI
  1107.                         JMP         @@DoCRLF
  1108.  
  1109.             @@Error:    LEA         DX,[@@ErrorMsg]
  1110.                         MOV         AH,9
  1111.                         INT         21h
  1112.                         CALL        DumpWord
  1113.             @@DoCRLF:   LEA         DX,[@@CRLF]
  1114.                         MOV         AH,9
  1115.                         INT         21h
  1116.  
  1117.             @@1:        CALL        NextSpace
  1118.                         JMP         @@Next
  1119.                         
  1120.             @@Exit:     POP         SI DI DX CX BX AX
  1121.                         RET
  1122.             @@ErrorMsg  DB          'Error in parameter: $'
  1123.             @@CRLF      DB          0Dh,0Ah,'$'
  1124.             @@KeysetMsg DB          'Key combination for drive '
  1125.             @@Drive     DB          '? set at: $'
  1126.             @@KeyAllMsg DB          'Key combination for all drives set at: $'
  1127.             @@ColorsMsg DB          'Colors set at $'
  1128.             @@QuietMsg  DB          'Quiet mode.$'
  1129.  
  1130. ENDP        ExtractParms
  1131.  
  1132. Install:                ASSUME      ES:NOTHING,DS:@CODE,CS:@CODE,SS:@CODE
  1133.  
  1134.                         MOV         AH,9
  1135.                         LEA         DX,[NameVersion]
  1136.                         INT         21h
  1137.                         MOV         AX,0E204h
  1138.                         INT         2Fh
  1139.                         CMP         AX,1DEAh
  1140.                         JE          @@AlreadyInst
  1141.  
  1142.                         CLI
  1143.                         MOV         AX,352Fh
  1144.                         INT         21h
  1145.                         MOV         [WORD PTR OldINT2F],BX
  1146.                         MOV         [WORD PTR OldINT2F+2],ES
  1147.                         MOV         AX,3509h
  1148.                         INT         21h
  1149.                         MOV         [WORD PTR OldINT09],BX
  1150.                         MOV         [WORD PTR OldINT09+2],ES
  1151.                         MOV         DX,OFFSET NewINT2F
  1152.                         MOV         AX,252Fh
  1153.                         INT         21h
  1154.                         MOV         DX,OFFSET NewINT09
  1155.                         MOV         AX,2509h
  1156.                         INT         21h
  1157.                         LEA         DX,[InstMsg]
  1158.                         MOV         AH,9
  1159.                         INT         21h
  1160.                         CALL        ExtractParms
  1161.                         MOV         ES,[2Ch]
  1162.                         MOV         AH,49h
  1163.                         INT         21h
  1164.                         MOV         DX,OFFSET EndOfCode+Stacksize
  1165.                         INT         27h
  1166.  
  1167.             @@AlreadyInst:
  1168.                         LEA         DX,[AlreadyMsg]
  1169.                         MOV         AH,9
  1170.                         INT         21h
  1171.                         CALL        ExtractParms
  1172.                         RET
  1173.  
  1174.             NameVersion DB          MajorName,' ',MajorVer,'''s ',MinorName,' ',MinorVer,0Dh,0Ah
  1175.                         DB          'Written by ',AuthorName,0Dh,0Ah,'$'
  1176.                         
  1177.  
  1178. END         START
  1179.