               ORG 0
NXTDV          DD -1
ATTRIBUTE      DW 08000                 ;character driver
DV_STRATEGY    DW 000A                  ;strategy offset
DV_INTERRUPT   DW 0015                  ;interrupt offset
STRATEGY:      CS: MOV H_OFF,BX         ;save it
               CS: MOV H_SEG,ES         ;save it
               RETF                     ;function return
INTERRUPT:     PUSHF                    ;save everything
               PUSH AX
               PUSH BX
               PUSH CX
               PUSH DX
               PUSH SI
               PUSH DI
               PUSH BP
               PUSH DS
               PUSH ES
               PUSH CS
               POP DS                   ;make ds = cs
               LES DI,H_OFF
               ES CMP B[DI+2],0
               JNE EXIT1
               CALL LOCAL
               ES MOV B[DI+0D],0        ;no error status word
               ES MOV W[DI+0E],0
               ES MOV W[DI+010],CS
EXIT1:         ES MOV W[DI+3],0100      ;signals end
               POP ES                   ;restore everything
               POP DS
               POP BP
               POP DI
               POP SI
               POP DX
               POP CX
               POP BX
               POP AX
               POPF
               RETF                     ;function return
DATA_SEG       SEGMENT   PUBLIC
REQUEST        DB 07,0A,0D,"This System is protected by SECURITY.SYS"
               DB 0D,0A,"The Required Password is case-sensitive."
               DB 0D,0A,"It will not be displayed as you type it."
               DB 0D,0A,"Type your Password, then press ENTER."
               DB 0D,0A,"Password: "
COUNTER        DB 0                     ;character counter
NUMBER_0       DB 08,0                  ;chars. in password
PASSWD         DB "SeCuRiTy       ",0   ;password
PASSBUFF       DB "                 "   ;password buffer
COPYRIGHT      DB 07,0D,0A,"Copyright 1992, Robert Wallingford, P.E.",0D,0A
               DB          "Vers. 2.00      2338 N. McVicker Avenue",0D,0A
               DB          "                Chicago, IL  60639-2216",0D,0A
               DB          "Serial Number   318340928",0D,0A
H_OFF          DW ?                     ;header offset
H_SEG          DW ?                     ;header segment
DATA_SEG       ENDS
LOCAL:         CLD                      ;forward
               MOV AH,6
               MOV AL,0
               MOV BH,7
               MOV CX,0
               MOV DH,18H
               MOV DL,4FH
               INT 10H
               MOV BX,0
               MOV AH,2
               MOV DX,0
               INT 010                  ;set cursor
               MOV SI,OFFSET REQUEST    ;set si
               MOV CX,0B2               ;message size.
MSGLP:         PUSH CX
               LODSB
               MOV AH,0E
               INT 010                  ;print request
               POP CX
               LOOP MSGLP
               PUSH DI                  ;save ES:DI
               PUSH ES
               PUSH CS
               POP ES                   ;make es = cs
               CLD                      ;forward
SETUP:         MOV SI,OFFSET PASSWD     ;initialize
               MOV DI,OFFSET PASSBUFF   ; everything
               MOV COUNTER,0            ; about password
PSWLP:         MOV AH,0
               INT 016                  ;get character
               CMP AL,08
               JNE BAKSP
               CMP COUNTER,0            ;service backspace
               JE PSWLP
               DEC COUNTER
               DEC DI
               JMP PSWLP
BAKSP:         CMP AL,0D
               JE CARRT
               CMP COUNTER,0E           ;service carriage ret.
               JE PSWLP
               INC COUNTER
               STOSB
               JMP PSWLP
CARRT:         MOV CX,W[NUMBER_0]
               JCXZ SETUP
               CMP CL,COUNTER           ;check char. count
               JNE SETUP
               MOV DI,OFFSET PASSBUFF
               REPE CMPSB               ;check characters
               JNE SETUP
               MOV SI,OFFSET COPYRIGHT
               MOV CX,09A
CPRLP:         PUSH CX
               LODSB
               MOV AH,0E
               INT 010
               POP CX
               LOOP CPRLP
               POP ES                   ;recover ES:DI
               POP DI
               RET                      ;normal return