home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix CD 2.0
/
Phoenix_CD.cdr
/
24b
/
pw6at.zip
/
PW6AT.ASM
< prev
Wrap
Assembly Source File
|
1986-11-06
|
19KB
|
395 lines
.XLIST
PAGE 80,120
PAGE
TITLE èÄ PASSWORD - ROM PASSWORD ACCESS ROUTINEö
.LIST
SUBTTL ROUTINE TO REQUIRE PASSWORD TO BOOT PC/AT
COMMENT *
PASSWORD VERSION 1.00
Copyright 1986 Don Gentry
A limited license is granted to all users of this program,
to make copies of this program, and distribute them to
other users, on the following conditions:
1. The notice on this page is not to be removed or altered
2. No fee is to be charged for copying or distributing
the program.
3. No warranty of any kind is offered. This program is offered
on an "AS IS" basis. Each user should verify that it meets
his needs and verify correct operation.
4. No further restrictions on redristribution of any kind may
be required. This includes, but is not limited to,
COMPUSERVE or other program distribution services,
by electronic or other means. Free distribution MUST be
be preserved!
FOR HELP OR SUGGESTIONS WRITE:
DON GENTRY
183 BELLEGROVE CIRCLE
BRANDON, MS 39042
OR CALL (601) 992-0577
*
PAGE
PAGE_0 SEGMENT AT 0 ; DEFINE LOW MEMORY 08/24/86
; .....................................................................
; : :
; : VECTORS 86-F0 ARE USED MY THE BASIC INTERPRETER WHEN :
; : IT'S RUNNING, SO THEY SHOULD BE FREE NOW DURING THE :
; : ROM BIOS INITIALIZATION TIME & CAN BE USED FOR WORK :
; : :
; :...................................................................:
;
ORG 086H*4 ; SKIP TO BASIC VECTORS 08/24/86
PW_INPUT DB 5 DUP(?) ; AREA FOR PASSWORD INPUT 08/24/86
PW_TRYS DB ? ; NUMBER OF ATTEMPTS ALLOWED
PAGE_0 ENDS ; END OF SEGMENT 08/24/86
PAGE
;-----------------------------------------------------------------------
; ROM BIOS DATA AREAS
;-----------------------------------------------------------------------
DATA SEGMENT AT 40H
RS232_BASE DW 4 DUP(?) ;ADDRESSES OF RS232 ADAPTERS
PRINTER_BASE DW 4 DUP(?) ;ADDRESSES OF PRINTERS
EQUIP_FLAG DW ? ;INSTALLED HARDWARE
MFG_TST DB ? ;INITIALIZATION FLAG
MEMORY_SIZE DW ? ;MEMORY SIZE IN K BYTES
MFG_ERR_FLAG DB ? ;SCRATCH PAD FOR MANUFACTURING
DB ? ;ERROR CODES
;-----------------------------------------------------------------------
; KEYBOARD DATA AREAS
;-----------------------------------------------------------------------
KB_FLAG DB ? ; KEYBOARD STATUS
KB_FLAG_1 DB ? ; SECOND BYTE OF KEYBOARD STATUS
ALT_INPUT DB ? ; STORAGE FOR ALTERNATE KEYPAD ENTRY
;
; ----- SHIFT FLAG EQUATES WITHIN KB_FLAG
;
INS_STATE EQU 80H ;INSERT SATE IS ACTIVE
CAPS_STATE EQU 40H ;CAPS LOCK STATE HAS BEEN TOGGLED
NUM_STATE EQU 20H ;NUM LOCK STATE HAS BEEN TOGGLED
SCROLL_STATE EQU 10H ;SCROLL LOCK STATE HAS BEEN TOGGLED
ALT_SHIFT EQU 08H ;ALTERNATE SHIFT KEY DEPRESSED
CTL_SHIFT EQU 04H ;CONTROL SHIFT KEY DEPRESSED
LEFT_SHIFT EQU 02H ;LEFT SHIFT KEY DEPRESSED
RIGHT_SHIFT EQU 01H ;RIGHT SHIFT KEY DEPRESSED
ORG 001AH ;ORG TO KEYBOARD BUFFER
BUFFER_HEAD DW ? ;POINTER TO HEAD OF KEYBOARD BUFFER
BUFFER_TAIL DW ? ;POINTER TO TAIL OF KEYBOARD BUFFER
KB_BUFFER DW 16 DUP(?) ;ROOM FOR 15 ENTRIES
ORG 0049H ;ORG TO START OF DISPLAY DATA
;-----------------------------------------------------------------------
; VIDEO DISPLAY DATA AREA
;-----------------------------------------------------------------------
CRT_MODE DB ? ;CURRENT CRT MODE
CRT_COLS DW ? ;NUMBER OF COLS ON SCREEN
CRT_LEN DW ? ;LENGTH OF REGEN IN BYTES
CRT_START DW ? ;STARTING ADDRESS IN REGEN BUFFER
CURSOR_POSN DW 8 DUP(?) ;CURSOR FOR EACH OF UP TO 8 PAGES
CURSOR_MODE DW ? ;CURRENT CURSOR MODE SETTING
ACTIVE_PAGE DB ? ;CURRENT PAGE BEING DISPLAYED
ADDR_6845 DW ? ;BASE ADDRESS FOR ACTIVE DISPLAY CARD
CRT_MODE_SET DB ? ;CURRENT SETTING OF THE 3X8 REGISTER
CRT_PALETTE DB ? ;CURRENT PALETTE SETTING COLOR CARD
;-----------------------------------------------------------------------
; POST DATA AREA
;-----------------------------------------------------------------------
IO_ROM_INIT DW ? ;PNTR TO OPTIONAL I/O ROM INIT ROUTINE
IO_ROM_SEG DW ? ;POINTER TO I/O ROM SEGMENT
INTR_FLAG DB ? ;FLAG TO INDICATE AN INTERRUPT HAPPENE
;-----------------------------------------------------------------------
; POST DATA AREA
;-----------------------------------------------------------------------
ORG 0080H ;ORG TO START OF ADDITIONAL KB DATA
BUFFER_START DW ?
BUFFER_END DW ?
DATA ENDS
;
PAGE
PW_CODE SEGMENT PARA PUBLIC 'CODE' ; CODE SEGMENT 08/24/86
PASSWORD PROC FAR ; BEGINNING OF CODE SEGMENT 08/24/86
ASSUME CS:PW_CODE ; INFORM ASSEMBLER 08/24/86
DB 055H,0AAH ; ROM MARKER 08/24/86
DB 16 ; NUMBER OF 512 BYTE BLOCKS 08/24/86
PW_ENTRY: ; ENTRY POINT FOR PASSWORD 08/24/86
JMP PW_GO ; JUMP TO CODE START 08/24/86
PW_MSG0 DB 0AH,0AH,0AH,0DH,' PASSWORD Version 1.00 ' ; 08/24/86
DB '- Copyright 1986, Don Gentry',0AH
DB 0DH,' System Security ROM in control',0AH,0AH
DB 0AH,0DH,'This Computer Is The Property of:',0AH
DB 0AH,0DH,' Bill Jarrett'
DB 0AH,0DH,' 234 River Road North'
DB 0AH,0DH,' Jackson, MS 39xxx',0AH,00H
PW_MSG1 DB 0AH,0DH,' Please Enter Password: ',00H ; 08/24/86
PW_MSG2 DB 0AH,0DH,' Invalid Password Entered',00H ; 08/24/86
PW_MSG3 DB 0AH,0DH,' Password Verified, System Initialization '
DB 'Will Proceed',0AH,0DH
DB 00H
PW_MSG4 DB 'SECURITY VIOLATION DETECTED ',00H
; .....................................................................
; : :
; : The encoded password (5 characters) follows at label :
; : PW_VALID. To chose your password select 5 characters :
; : and subtract 10H from each and then replace those at :
; : PW_VALID with your new ones. :
; : :
; : Example: You choose LMNOP for your password :
; : :
; : L = 4CH - 10H = 3CH = "<" :
; : M = 4DH - 10H = 3DH = "=" :
; : N = 4EH - 10H = 3EH = ">" :
; : O = 4FH - 10H = 3FH = "?" :
; : P = 50H - 10H = 40H = "@" :
; : :
; : You code PW_VALID DB '<=>?@' :
; : :
; :...................................................................:
;
PW_VALID DB '29<<@' ; VALID PASSWORD encoded 08/24/86
DB 0
PW_GO: ; 08/24/86
;
; ----- SAVE DOS' REGISTERS TO STACK
;
PUSHF
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
;
; ----- INITIALIZE OUR SEGMENT REGISTERS
;
MOV AX,CS ; GET CS IN AX 08/24/86
MOV DS,AX ; SET UP DATA SEG REGISTER 08/24/86
XOR AX,AX ; ZERO AX 08/24/86
MOV ES,AX ; SET EXTRA SEG TO LOW MEMORY 08/24/86
ASSUME ES:PAGE_0,DS:PW_CODE ; INFORM ASSEMBLER 08/24/86
CLD ; CLEAR DIRECTION FLAG 08/25/86
MOV PW_TRYS,00H ; ZERO RETRY COUNT
;
; ----- INITIALIZE BIOS KEYBOARD HANDLER
;
CALL PW_KINIT ; INIT KEYBOARD HANDLER
;
; ----- CLEAR THE SCREEN
;
CALL PW_CLS ; CALL CLEAR SCREEN ROUTINE
;
; ----- WRITE THE COPYRIGHT MESSAGE
;
LEA DX,PW_MSG0 ; GET ADDR OF MSG 08/24/86
CALL PW_OUT ; WRITE IT 08/24/86
PW_LOOP:
CMP PW_TRYS,03H ; 3 TRIES ALREADY ??
JE PW_DEAD ; ... YES - ALARM !!
;
; ----- WRITE THE PASSWORD MESSAGE
;
LEA DX,PW_MSG1 ; GET ADDR OF MSG 08/24/86
CALL PW_OUT ; WRITE IT 08/24/86
;
; ----- BEEP FOR PASSWORD
;
MOV BX,1 ; BEEP COUNT
CALL PW_BEEP ; CALL BEEPER
;
; ----- READ THE PASSWORD
;
CALL PW_IN ; READ PASSWORD 08/24/86
;
; ----- VALIDATE THE PASSWORD
;
XOR BX,BX ; GET INDEX TO PASSWORDS 08/24/86
MOV CX,5 ; NUMBER OF CHARS 08/24/86
PW_VAL1: ; LOOP TO COMPARE 08/24/86
MOV AL,PW_INPUT[BX] ; GET 1ST INPUT CHAR 08/24/86
SUB AL,10H
CMP AL,PW_VALID[BX] ; COMPARE CHARS 08/24/86
JNE PW_BAD ; NOT EQUAL, WRITE MSG 08/24/86
INC BX ; INCREMENT INDEX TO CHARS 08/24/86
LOOP PW_VAL1 ; LOOP 'TIL ALL DONE 08/24/86
LEA DX,PW_MSG3
CALL PW_OUT
;
; ----- BEEP FOR VALID PASSWORD
;
MOV BX,1 ; BEEP COUNT
CALL PW_BEEP ; CALL BEEPER
;
; ----- CLEAR PASSWORD FROM MEMORY
;
MOV BX,00H ; INIT BX REG 11/05/86
MOV CX,05H ; NUMBER OF BYTES TO CLEAR 11/05/86
PW_ZAP: ; ZAP A BYTE 11/05/86
MOV PW_INPUT[BX],00H ; ZERO A BYTE 11/05/86
INC BX ; BUMP TO NEXT BYTE 11/05/86
LOOP PW_ZAP ; CLEAR ALL BYTES 11/05/86
;
; ----- RESTORE DOS' REGISTERS FROM THE STACK
;
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
POPF
;
; ----- RETURN TO DOS & CONTINUE INITIALIZATION
;
RET ; RETURN IF EQUAL 08/24/86
PAGE
PW_BAD: ; WRITE ERROR MSG 08/24/86
LEA DX,PW_MSG2 ; GET @MSG 08/24/86
CALL PW_OUT ; WRITE MSG 08/24/86
INC PW_TRYS ; INCREMENT RETRY COUNT
;
; ----- BEEP FOR INVALID PASSWORD
;
MOV BX,3 ; BEEP COUNT
CALL PW_BEEP ; CALL BEEPER
MOV CX,8000H ; WAIT COUNT
PW_BAD1:
LOOP PW_BAD1
MOV BX,1 ; BEEP COUNT
CALL PW_BEEP ; CALL BEEPER
MOV CX,8000H ; WAIT COUNT
PW_BAD2:
LOOP PW_BAD2
JMP PW_LOOP ; TRY AGAIN 08/24/86
PAGE
PW_DEAD PROC NEAR ; KILL THE INITIALIZATION 08/24/86
MOV CX,75 ; LOOP COUNT TO FILL SCREEN
PW_DEAD0:
LEA DX,PW_MSG4 ; GET ADDRESS OF MSG
CALL PW_OUT ; DISPLAY IT
LOOP PW_DEAD0
;
; ----- BEEP FOR INVALID PASSWORD
;
PW_DEAD3:
MOV BX,3 ; BEEP COUNT
CALL PW_BEEP ; CALL BEEPER
MOV CX,8000H ; WAIT COUNT
PW_DEAD1:
LOOP PW_DEAD1
MOV BX,1 ; BEEP COUNT
CALL PW_BEEP ; CALL BEEPER
MOV CX,8000H ; WAIT COUNT
PW_DEAD2:
LOOP PW_DEAD2
JMP PW_DEAD3 ; LOOP FOREVER 08/24/86
PW_DEAD ENDP ; END OF PROC 08/24/86
PAGE
PW_OUT PROC NEAR ; MESSAGE OUT PROC 08/24/86
;
; ----- SEND A MESSAGE TO THE SCREEN (DX HAS THE MSG ADDR)
;
MOV BX,DX ; GET INDEX VALUE 08/24/86
MOV AL,0[BX] ; GET A CHARACTER 08/24/86
CMP AL,0 ; EOM ? 08/24/86
JNE PW_OUT1 ; ...NO - CONTINUE 08/24/86
RET ; ...YES - EXIT 08/24/86
PW_OUT1: ; OUTPUT THE CHARACTER 08/24/86
MOV BL,07 ; NORMAL ATTRIBUTE 08/24/86
MOV AH,14 ; WRITE TTY FUNCTION 08/24/86
INT 10H ; BIOS VIDEO RUPT 08/24/86
INC DX ; BUMP TO NEXT CHAR 08/24/86
JMP PW_OUT ; 08/24/86
PW_OUT ENDP ; END OF PROC 08/24/86
PAGE
PW_IN PROC NEAR ; PASSWORD IN PROC 08/24/86
;
; ----- READ THE PASSWORD INPUT
;
MOV CX,5 ; LENGTH OF PASSWORD 08/24/86
XOR BX,BX ; ZERO INDEX REG 08/24/86
PW_IN1: ; LOOP FOR 5 KEYS 08/24/86
MOV AH,0 ; READ KEY FUNCTION 08/24/86
STI ; INSURE RUPTS ON 08/25/86
INT 16H ; BIOS KB READ 08/24/86
MOV PW_INPUT+[BX],AL ; SAVE THE ASCII CODE 08/24/86
INC BX ; BUMP TO NEXT LOCATION 08/24/86
LOOP PW_IN1 ; READ 5 KEYS 08/24/86
RET ; RETURN TO CALLER 08/24/86
PW_IN ENDP ; END OF PROC 08/24/86
PAGE
PW_CLS PROC NEAR
;
; ----- SUBROUTINE TO CLEAR THE VIDEO DISPLAY
;
MOV AH,06H ; SCROLL FUNCTION 08/24/86
MOV AL,0 ; ENTIRE WINDOW 08/24/86
MOV CH,0 ; UPPER 08/24/86
MOV CL,0 ; LEFT 08/24/86
MOV DH,23 ; LOWER 08/24/86
MOV DL,79 ; RIGHT 08/24/86
MOV BH,07 ; ATTRIBUTE NORMAL 08/24/86
INT 10H ; BIOS VIDEO RUPT 08/24/86
RET ; RETURN TO CALLER
PW_CLS ENDP ; END OF PROC 08/24/86
PAGE
PW_KINIT PROC NEAR ; PROC TO INITIALIZE KEYBD 08/26/86
;
; ----- SUBROUTINE TO INITIALIZE THE KEYBOARD HANDLER
;
PUSH ES ; SAVE ES REGISTER
MOV AX,0040H ; GET ADDRESS OF DATA SEG
MOV ES,AX ; SET IN ES REG
ASSUME ES:DATA ; INFORM ASSEMBLER
MOV KB_FLAG,00H ; RESET KEYBOARD FLAG
MOV KB_FLAG_1,00H ; RESET KEYBOARD FLAG 1
IN AL,021H ; ENABLE KB RUPTS
AND AL,0FDH ; SET RUPT FLAG
JMP SHORT $+2 ; I/O DELAY
OUT 021H,AL ; FLAG TO PORT
POP ES ; RESTORE ES REG
PW_KEXIT: ; RETURN TO CALLER
RET
PW_KINIT ENDP
PAGE
;
; ----- SUBROUTINE TO BEEP THE SPEAKER
; ----- BX HAS A VALUE FOR DURATION OF THE BEEP
;
PW_BEEP PROC NEAR ; ROUTINE TO BEEP THE SPEAKER
CLI ; RUPTS OFF
MOV AL,0B6H ; SEL TIM 2,LSB,MSB 08/27/86
OUT 043H,AL ; SET TIMER MODE REG 08/27/86
MOV AX,0533H ; DIVISOR FOR 1000HZ 08/27/86
OUT 042H,AL ; TIMER CNT - LSB 08/27/86
MOV AL,AH ; TIMER 2 CNT - MSB 08/27/86
OUT 042H,AL ; SEND THE BYTE 08/27/86
IN AL,061H ; GET CURRENT PORT VALUE 08/27/86
MOV AH,AL ; SAVE IN AH 08/27/86
OR AL,03H ; SPEAKER ON 08/27/86
OUT 061H,AL ; SEND SPKR ON VAL 08/27/86
SUB CX,CX ; ZERO CX REG 08/27/86
PW_BEEP1: ; LOOP TO BEEP 08/27/86
LOOP PW_BEEP1 ; LOOP 'TIL CX 0 08/27/86
DEC BL ; COUNT DONE ?? 08/27/86
JNZ PW_BEEP1 ; 08/27/86
MOV AL,AH ; RESTORE SAVED VALUE 08/27/86
OUT 061H,AL ; SEND TO PORT 08/27/86
RET ; 08/27/86
PW_BEEP ENDP ; END OF PROC 08/24/86
PASSWORD ENDP ; END OF PROC 08/24/86
PW_CODE ENDS ; CODE SEGMENT END 08/24/86
END