home *** CD-ROM | disk | FTP | other *** search
/ Phoenix CD 2.0 / Phoenix_CD.cdr / 24b / pw6at.zip / PW6AT.ASM < prev   
Assembly Source File  |  1986-11-06  |  19KB  |  395 lines

  1.          .XLIST
  2.          PAGE  80,120
  3.          PAGE
  4.          TITLE èÄ PASSWORD - ROM PASSWORD ACCESS ROUTINEö
  5.          .LIST
  6.          SUBTTL ROUTINE TO REQUIRE PASSWORD TO BOOT PC/AT
  7.          COMMENT *
  8.  
  9.          PASSWORD VERSION 1.00
  10.  
  11.          Copyright 1986 Don Gentry
  12.  
  13.          A limited license is granted to all users of this program,
  14.          to make copies of this program, and distribute them to
  15.          other users, on the following conditions:
  16.  
  17.          1. The notice on this page is not to be removed or altered
  18.  
  19.          2. No fee is to be charged for copying or distributing
  20.             the program.
  21.  
  22.          3. No warranty of any kind is offered. This program is offered
  23.             on an "AS IS" basis. Each user should verify that it meets
  24.             his needs and verify correct operation.
  25.  
  26.          4. No further restrictions on redristribution of any kind may
  27.             be required. This includes, but is not limited to,
  28.             COMPUSERVE or other program distribution services,
  29.             by electronic or other means. Free distribution MUST be
  30.             be preserved!
  31.  
  32.          FOR HELP OR SUGGESTIONS WRITE:
  33.  
  34.          DON GENTRY
  35.          183 BELLEGROVE CIRCLE
  36.          BRANDON, MS  39042
  37.  
  38.          OR CALL (601) 992-0577
  39.                                                                 *
  40.          PAGE
  41. PAGE_0   SEGMENT AT 0             ; DEFINE LOW MEMORY           08/24/86
  42. ; .....................................................................
  43. ; :                                                                   :
  44. ; :      VECTORS 86-F0 ARE USED MY THE BASIC INTERPRETER WHEN         :
  45. ; :      IT'S RUNNING, SO THEY SHOULD BE FREE NOW DURING THE          :
  46. ; :      ROM BIOS INITIALIZATION TIME & CAN BE USED FOR WORK          :
  47. ; :                                                                   :
  48. ; :...................................................................:
  49. ;
  50.          ORG   086H*4             ; SKIP TO BASIC VECTORS       08/24/86
  51. PW_INPUT DB    5 DUP(?)           ; AREA FOR PASSWORD INPUT     08/24/86
  52. PW_TRYS  DB    ?                  ; NUMBER OF ATTEMPTS ALLOWED
  53. PAGE_0   ENDS                     ; END OF SEGMENT              08/24/86
  54.          PAGE
  55. ;-----------------------------------------------------------------------
  56. ; ROM BIOS DATA AREAS
  57. ;-----------------------------------------------------------------------
  58. DATA     SEGMENT AT 40H
  59. RS232_BASE       DW 4 DUP(?)      ;ADDRESSES OF RS232 ADAPTERS
  60. PRINTER_BASE     DW 4 DUP(?)      ;ADDRESSES OF PRINTERS
  61. EQUIP_FLAG       DW ?             ;INSTALLED HARDWARE
  62. MFG_TST          DB ?             ;INITIALIZATION FLAG
  63. MEMORY_SIZE      DW ?             ;MEMORY SIZE IN K BYTES
  64. MFG_ERR_FLAG     DB ?             ;SCRATCH PAD FOR MANUFACTURING
  65.                  DB ?             ;ERROR CODES
  66. ;-----------------------------------------------------------------------
  67. ; KEYBOARD DATA AREAS
  68. ;-----------------------------------------------------------------------
  69. KB_FLAG          DB ?             ; KEYBOARD STATUS
  70. KB_FLAG_1        DB ?             ; SECOND BYTE OF KEYBOARD STATUS
  71. ALT_INPUT        DB ?             ; STORAGE FOR ALTERNATE KEYPAD ENTRY
  72. ;
  73. ; ----- SHIFT FLAG EQUATES WITHIN KB_FLAG
  74. ;
  75. INS_STATE        EQU 80H          ;INSERT SATE IS ACTIVE
  76. CAPS_STATE       EQU 40H          ;CAPS LOCK STATE HAS BEEN TOGGLED
  77. NUM_STATE        EQU 20H          ;NUM LOCK STATE HAS BEEN TOGGLED
  78. SCROLL_STATE     EQU 10H          ;SCROLL LOCK STATE HAS BEEN TOGGLED
  79. ALT_SHIFT        EQU 08H          ;ALTERNATE SHIFT KEY DEPRESSED
  80. CTL_SHIFT        EQU 04H          ;CONTROL SHIFT KEY DEPRESSED
  81. LEFT_SHIFT       EQU 02H          ;LEFT SHIFT KEY DEPRESSED
  82. RIGHT_SHIFT      EQU 01H          ;RIGHT SHIFT KEY DEPRESSED
  83.                  ORG 001AH        ;ORG TO KEYBOARD BUFFER
  84. BUFFER_HEAD      DW  ?            ;POINTER TO HEAD OF KEYBOARD BUFFER
  85. BUFFER_TAIL      DW  ?            ;POINTER TO TAIL OF KEYBOARD BUFFER
  86. KB_BUFFER        DW  16 DUP(?)    ;ROOM FOR 15 ENTRIES
  87.                  ORG 0049H        ;ORG TO START OF DISPLAY DATA
  88. ;-----------------------------------------------------------------------
  89. ; VIDEO DISPLAY DATA AREA
  90. ;-----------------------------------------------------------------------
  91. CRT_MODE         DB  ?            ;CURRENT CRT MODE
  92. CRT_COLS         DW  ?            ;NUMBER OF COLS ON SCREEN
  93. CRT_LEN          DW  ?            ;LENGTH OF REGEN IN BYTES
  94. CRT_START        DW  ?            ;STARTING ADDRESS IN REGEN BUFFER
  95. CURSOR_POSN      DW  8 DUP(?)     ;CURSOR FOR EACH OF UP TO 8 PAGES
  96. CURSOR_MODE      DW  ?            ;CURRENT CURSOR MODE SETTING
  97. ACTIVE_PAGE      DB  ?            ;CURRENT PAGE BEING DISPLAYED
  98. ADDR_6845        DW  ?            ;BASE ADDRESS FOR ACTIVE DISPLAY CARD
  99. CRT_MODE_SET     DB  ?            ;CURRENT SETTING OF THE 3X8 REGISTER
  100. CRT_PALETTE      DB  ?            ;CURRENT PALETTE SETTING COLOR CARD
  101. ;-----------------------------------------------------------------------
  102. ; POST DATA AREA
  103. ;-----------------------------------------------------------------------
  104. IO_ROM_INIT      DW  ?            ;PNTR TO OPTIONAL I/O ROM INIT ROUTINE
  105. IO_ROM_SEG       DW  ?            ;POINTER TO I/O ROM SEGMENT
  106. INTR_FLAG        DB  ?            ;FLAG TO INDICATE AN INTERRUPT HAPPENE
  107.  
  108. ;-----------------------------------------------------------------------
  109. ; POST DATA AREA
  110. ;-----------------------------------------------------------------------
  111.                  ORG 0080H        ;ORG TO START OF ADDITIONAL KB DATA
  112. BUFFER_START     DW  ?
  113. BUFFER_END       DW  ?
  114. DATA     ENDS
  115. ;
  116.          PAGE
  117. PW_CODE  SEGMENT PARA PUBLIC 'CODE'  ; CODE SEGMENT             08/24/86
  118. PASSWORD PROC  FAR                ; BEGINNING OF CODE SEGMENT   08/24/86
  119.          ASSUME CS:PW_CODE        ; INFORM ASSEMBLER            08/24/86
  120.          DB    055H,0AAH          ; ROM MARKER                  08/24/86
  121.          DB    16                 ; NUMBER OF 512 BYTE BLOCKS   08/24/86
  122. PW_ENTRY:                         ; ENTRY POINT FOR PASSWORD    08/24/86
  123.          JMP   PW_GO              ; JUMP TO CODE START          08/24/86
  124. PW_MSG0  DB    0AH,0AH,0AH,0DH,' PASSWORD Version 1.00 '  ;     08/24/86
  125.          DB    '-  Copyright 1986, Don Gentry',0AH
  126.          DB    0DH,' System Security ROM in control',0AH,0AH
  127.          DB    0AH,0DH,'This Computer Is The Property of:',0AH
  128.          DB    0AH,0DH,'                     Bill Jarrett'
  129.          DB    0AH,0DH,'                     234 River Road North'
  130.          DB    0AH,0DH,'                     Jackson, MS  39xxx',0AH,00H
  131. PW_MSG1  DB    0AH,0DH,' Please Enter Password: ',00H  ;               08/24/86
  132. PW_MSG2  DB    0AH,0DH,' Invalid Password Entered',00H ;        08/24/86
  133. PW_MSG3  DB    0AH,0DH,' Password Verified, System Initialization '
  134.          DB    'Will Proceed',0AH,0DH
  135.          DB    00H
  136. PW_MSG4  DB    'SECURITY VIOLATION DETECTED ',00H
  137. ; .....................................................................
  138. ; :                                                                   :
  139. ; :      The encoded password (5 characters) follows at label         :
  140. ; :      PW_VALID. To chose your password select 5 characters         :
  141. ; :      and subtract 10H from each and then replace those at         :
  142. ; :      PW_VALID with your new ones.                                 :
  143. ; :                                                                   :
  144. ; :      Example: You choose LMNOP for your password                  :
  145. ; :                                                                   :
  146. ; :      L = 4CH - 10H = 3CH = "<"                                    :
  147. ; :      M = 4DH - 10H = 3DH = "="                                    :
  148. ; :      N = 4EH - 10H = 3EH = ">"                                    :
  149. ; :      O = 4FH - 10H = 3FH = "?"                                    :
  150. ; :      P = 50H - 10H = 40H = "@"                                    :
  151. ; :                                                                   :
  152. ; :      You code PW_VALID DB   '<=>?@'                               :
  153. ; :                                                                   :
  154. ; :...................................................................:
  155. ;
  156. PW_VALID DB    '29<<@'            ; VALID PASSWORD encoded      08/24/86
  157.          DB    0
  158. PW_GO:                            ;                             08/24/86
  159. ;
  160. ; -----  SAVE DOS' REGISTERS TO STACK
  161. ;
  162.          PUSHF
  163.          PUSH  DS
  164.          PUSH  ES
  165.          PUSH  AX
  166.          PUSH  BX
  167.          PUSH  CX
  168.          PUSH  DX
  169.          PUSH  SI
  170.          PUSH  DI
  171.          PUSH  BP
  172. ;
  173. ; -----  INITIALIZE OUR SEGMENT REGISTERS
  174. ;
  175.          MOV   AX,CS              ; GET CS IN AX                08/24/86
  176.          MOV   DS,AX              ; SET UP DATA SEG REGISTER    08/24/86
  177.          XOR   AX,AX              ; ZERO AX                     08/24/86
  178.          MOV   ES,AX              ; SET EXTRA SEG TO LOW MEMORY 08/24/86
  179.          ASSUME ES:PAGE_0,DS:PW_CODE ; INFORM ASSEMBLER         08/24/86
  180.          CLD                      ; CLEAR DIRECTION FLAG        08/25/86
  181.          MOV   PW_TRYS,00H        ; ZERO RETRY COUNT
  182. ;
  183. ; -----  INITIALIZE BIOS KEYBOARD HANDLER
  184. ;
  185.          CALL  PW_KINIT           ; INIT KEYBOARD HANDLER
  186. ;
  187. ; -----  CLEAR THE SCREEN
  188. ;
  189.          CALL  PW_CLS             ; CALL CLEAR SCREEN ROUTINE
  190. ;
  191. ; -----  WRITE THE COPYRIGHT MESSAGE
  192. ;
  193.          LEA   DX,PW_MSG0         ; GET ADDR OF MSG             08/24/86
  194.          CALL  PW_OUT             ; WRITE IT                    08/24/86
  195. PW_LOOP:
  196.          CMP   PW_TRYS,03H        ; 3 TRIES ALREADY ??
  197.          JE    PW_DEAD            ; ... YES - ALARM !!
  198. ;
  199. ; -----  WRITE THE PASSWORD MESSAGE
  200. ;
  201.          LEA   DX,PW_MSG1         ; GET ADDR OF MSG             08/24/86
  202.          CALL  PW_OUT             ; WRITE IT                    08/24/86
  203. ;
  204. ; -----  BEEP FOR PASSWORD
  205. ;
  206.          MOV   BX,1               ; BEEP COUNT
  207.          CALL  PW_BEEP            ; CALL BEEPER
  208. ;
  209. ; -----  READ THE PASSWORD
  210. ;
  211.          CALL  PW_IN              ; READ PASSWORD               08/24/86
  212. ;
  213. ; -----  VALIDATE THE PASSWORD
  214. ;
  215.          XOR   BX,BX              ; GET INDEX TO PASSWORDS      08/24/86
  216.          MOV   CX,5               ; NUMBER OF CHARS             08/24/86
  217. PW_VAL1:                          ; LOOP TO COMPARE             08/24/86
  218.          MOV   AL,PW_INPUT[BX]    ; GET 1ST INPUT CHAR          08/24/86
  219.          SUB   AL,10H
  220.          CMP   AL,PW_VALID[BX]    ; COMPARE CHARS               08/24/86
  221.          JNE   PW_BAD             ; NOT EQUAL, WRITE MSG        08/24/86
  222.          INC   BX                 ; INCREMENT INDEX TO CHARS    08/24/86
  223.          LOOP  PW_VAL1            ; LOOP 'TIL ALL DONE          08/24/86
  224.          LEA   DX,PW_MSG3
  225.          CALL  PW_OUT
  226. ;
  227. ; -----  BEEP FOR VALID PASSWORD
  228. ;
  229.          MOV   BX,1               ; BEEP COUNT
  230.          CALL  PW_BEEP            ; CALL BEEPER
  231. ;
  232. ; -----  CLEAR PASSWORD FROM MEMORY
  233. ;
  234.          MOV   BX,00H             ; INIT BX REG                 11/05/86
  235.          MOV   CX,05H             ; NUMBER OF BYTES TO CLEAR    11/05/86
  236. PW_ZAP:                           ; ZAP A BYTE                  11/05/86
  237.          MOV   PW_INPUT[BX],00H   ; ZERO A BYTE                 11/05/86
  238.          INC   BX                 ; BUMP TO NEXT BYTE           11/05/86
  239.          LOOP  PW_ZAP             ; CLEAR ALL BYTES             11/05/86
  240. ;
  241. ; -----  RESTORE DOS' REGISTERS FROM THE STACK
  242. ;
  243.          POP   BP
  244.          POP   DI
  245.          POP   SI
  246.          POP   DX
  247.          POP   CX
  248.          POP   BX
  249.          POP   AX
  250.          POP   ES
  251.          POP   DS
  252.          POPF
  253. ;
  254. ; -----  RETURN TO DOS & CONTINUE INITIALIZATION
  255. ;
  256.          RET                      ; RETURN IF EQUAL             08/24/86
  257.          PAGE
  258. PW_BAD:                           ; WRITE ERROR MSG             08/24/86
  259.          LEA   DX,PW_MSG2         ; GET @MSG                    08/24/86
  260.          CALL  PW_OUT             ; WRITE MSG                   08/24/86
  261.          INC   PW_TRYS            ; INCREMENT RETRY COUNT
  262. ;
  263. ; -----  BEEP FOR INVALID PASSWORD
  264. ;
  265.          MOV   BX,3               ; BEEP COUNT
  266.          CALL  PW_BEEP            ; CALL BEEPER
  267.          MOV   CX,8000H           ; WAIT COUNT
  268. PW_BAD1:
  269.          LOOP  PW_BAD1
  270.          MOV   BX,1               ; BEEP COUNT
  271.          CALL  PW_BEEP            ; CALL BEEPER
  272.          MOV   CX,8000H           ; WAIT COUNT
  273. PW_BAD2:
  274.          LOOP  PW_BAD2
  275.          JMP   PW_LOOP            ; TRY AGAIN                   08/24/86
  276.          PAGE
  277. PW_DEAD  PROC  NEAR               ; KILL THE INITIALIZATION     08/24/86
  278.          MOV   CX,75              ; LOOP COUNT TO FILL SCREEN
  279. PW_DEAD0:
  280.          LEA   DX,PW_MSG4         ; GET ADDRESS OF MSG
  281.          CALL  PW_OUT             ; DISPLAY IT
  282.          LOOP  PW_DEAD0
  283. ;
  284. ; -----  BEEP FOR INVALID PASSWORD
  285. ;
  286. PW_DEAD3:
  287.          MOV   BX,3               ; BEEP COUNT
  288.          CALL  PW_BEEP            ; CALL BEEPER
  289.          MOV   CX,8000H           ; WAIT COUNT
  290. PW_DEAD1:
  291.          LOOP  PW_DEAD1
  292.          MOV   BX,1               ; BEEP COUNT
  293.          CALL  PW_BEEP            ; CALL BEEPER
  294.          MOV   CX,8000H           ; WAIT COUNT
  295. PW_DEAD2:
  296.          LOOP  PW_DEAD2
  297.          JMP   PW_DEAD3           ; LOOP FOREVER                08/24/86
  298. PW_DEAD  ENDP                     ; END OF PROC                 08/24/86
  299.          PAGE
  300. PW_OUT   PROC  NEAR               ; MESSAGE OUT PROC            08/24/86
  301. ;
  302. ; -----  SEND A MESSAGE TO THE SCREEN (DX HAS THE MSG ADDR)
  303. ;
  304.          MOV   BX,DX              ; GET INDEX VALUE             08/24/86
  305.          MOV   AL,0[BX]           ; GET A CHARACTER             08/24/86
  306.          CMP   AL,0               ; EOM ?                       08/24/86
  307.          JNE   PW_OUT1            ; ...NO - CONTINUE            08/24/86
  308.          RET                      ; ...YES - EXIT               08/24/86
  309. PW_OUT1:                          ; OUTPUT THE CHARACTER        08/24/86
  310.          MOV   BL,07              ; NORMAL ATTRIBUTE            08/24/86
  311.          MOV   AH,14              ; WRITE TTY FUNCTION          08/24/86
  312.          INT   10H                ; BIOS VIDEO RUPT             08/24/86
  313.          INC   DX                 ; BUMP TO NEXT CHAR           08/24/86
  314.          JMP   PW_OUT             ;                             08/24/86
  315. PW_OUT   ENDP                     ; END OF PROC                 08/24/86
  316.          PAGE
  317. PW_IN    PROC  NEAR               ; PASSWORD IN PROC            08/24/86
  318. ;
  319. ; -----  READ THE PASSWORD INPUT
  320. ;
  321.          MOV   CX,5               ; LENGTH OF PASSWORD          08/24/86
  322.          XOR   BX,BX              ; ZERO INDEX REG              08/24/86
  323. PW_IN1:                           ; LOOP FOR 5 KEYS             08/24/86
  324.          MOV   AH,0               ; READ KEY FUNCTION           08/24/86
  325.          STI                      ; INSURE RUPTS ON             08/25/86
  326.          INT   16H                ; BIOS KB READ                08/24/86
  327.          MOV   PW_INPUT+[BX],AL   ; SAVE THE ASCII CODE         08/24/86
  328.          INC   BX                 ; BUMP TO NEXT LOCATION       08/24/86
  329.          LOOP  PW_IN1             ; READ 5 KEYS                 08/24/86
  330.          RET                      ; RETURN TO CALLER            08/24/86
  331. PW_IN    ENDP                     ; END OF PROC                 08/24/86
  332.          PAGE
  333. PW_CLS   PROC  NEAR
  334. ;
  335. ; -----  SUBROUTINE TO CLEAR THE VIDEO DISPLAY
  336. ;
  337.          MOV   AH,06H             ; SCROLL FUNCTION             08/24/86
  338.          MOV   AL,0               ; ENTIRE WINDOW               08/24/86
  339.          MOV   CH,0               ; UPPER                       08/24/86
  340.          MOV   CL,0               ;   LEFT                      08/24/86
  341.          MOV   DH,23              ; LOWER                       08/24/86
  342.          MOV   DL,79              ;   RIGHT                     08/24/86
  343.          MOV   BH,07              ; ATTRIBUTE NORMAL            08/24/86
  344.          INT   10H                ; BIOS VIDEO RUPT             08/24/86
  345.          RET                      ; RETURN TO CALLER
  346. PW_CLS   ENDP                     ; END OF PROC                 08/24/86
  347.          PAGE
  348. PW_KINIT PROC  NEAR               ; PROC TO INITIALIZE KEYBD    08/26/86
  349. ;
  350. ; -----  SUBROUTINE TO INITIALIZE THE KEYBOARD HANDLER
  351. ;
  352.          PUSH  ES                 ; SAVE ES REGISTER
  353.          MOV   AX,0040H           ; GET ADDRESS OF DATA SEG
  354.          MOV   ES,AX              ; SET IN ES REG
  355.          ASSUME ES:DATA           ; INFORM ASSEMBLER
  356.          MOV   KB_FLAG,00H        ; RESET KEYBOARD FLAG
  357.          MOV   KB_FLAG_1,00H      ; RESET KEYBOARD FLAG 1
  358.          IN    AL,021H            ; ENABLE KB RUPTS
  359.          AND   AL,0FDH            ; SET RUPT FLAG
  360.          JMP   SHORT $+2          ; I/O DELAY
  361.          OUT   021H,AL            ; FLAG TO PORT
  362.          POP   ES                 ; RESTORE ES REG
  363. PW_KEXIT:                         ; RETURN TO CALLER
  364.          RET
  365. PW_KINIT ENDP
  366.          PAGE
  367. ;
  368. ; -----  SUBROUTINE TO BEEP THE SPEAKER
  369. ; -----  BX HAS A VALUE FOR DURATION OF THE BEEP
  370. ;
  371. PW_BEEP  PROC  NEAR               ; ROUTINE TO BEEP THE SPEAKER
  372.          CLI                      ; RUPTS OFF
  373.          MOV   AL,0B6H            ; SEL TIM 2,LSB,MSB           08/27/86
  374.          OUT   043H,AL            ; SET TIMER MODE REG          08/27/86
  375.          MOV   AX,0533H           ; DIVISOR FOR 1000HZ          08/27/86
  376.          OUT   042H,AL            ; TIMER CNT - LSB             08/27/86
  377.          MOV   AL,AH              ; TIMER 2 CNT - MSB           08/27/86
  378.          OUT   042H,AL            ; SEND THE BYTE               08/27/86
  379.          IN    AL,061H            ; GET CURRENT PORT VALUE      08/27/86
  380.          MOV   AH,AL              ; SAVE IN AH                  08/27/86
  381.          OR    AL,03H             ; SPEAKER ON                  08/27/86
  382.          OUT   061H,AL            ; SEND SPKR ON VAL            08/27/86
  383.          SUB   CX,CX              ; ZERO CX REG                 08/27/86
  384. PW_BEEP1:                         ; LOOP TO BEEP                08/27/86
  385.          LOOP  PW_BEEP1           ; LOOP 'TIL CX 0              08/27/86
  386.          DEC   BL                 ; COUNT DONE ??               08/27/86
  387.          JNZ   PW_BEEP1           ;                             08/27/86
  388.          MOV   AL,AH              ; RESTORE SAVED VALUE         08/27/86
  389.          OUT   061H,AL            ; SEND TO PORT                08/27/86
  390.          RET                      ;                             08/27/86
  391. PW_BEEP  ENDP                     ; END OF PROC                 08/24/86
  392. PASSWORD ENDP                     ; END OF PROC                 08/24/86
  393. PW_CODE  ENDS                     ; CODE SEGMENT END            08/24/86
  394.          END
  395.