<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="iso-8859-1" %> COE 25 FINAL DEFENSE
MPU-BASED ENCROACHMENT SECURITY ACCESS SYSTEM
TOPIC OUTLINE
SOURCE CODE
BACK
BACK TO MAIN

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;                                               ;
        ;          COE-25  PROJECT DESIGN               ;
        ; MPU-BASED ENCROACHMENT SECURITY ACCESS SYSTEM ;
        ;                                               ;
        ;             EDISIM SEGUNDINO                  ;
        ;             RODORA KHO                        ;
        ;             JOSE DOLIENTE                     ;
        ;                                               ;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


start:
    xor ax,ax              ; clear all register (AX BC CX DX DS)
    xor bx,bx
    xor cx,cx
    xor dx,dx
    

    call detect_mem_store  ; detect if memory has stored data
    call initPPI1          ;
    call init_LCD          ;
    call initPPI2          ; INITIALIZE ALL PPI AND LCD
    call initPPI3          ;
    call initPPI4          ;
    call intro             ; print message to printer


restart:
    call delay
    call menu

kpad:
    in al,21h          ; in switch status
    test al,01h        ; detect backdoor switch status (bit 0)
    cmp al,01h
    jne proceed

    in al,21h          ; in switch status (repeat input for right data)
    test al,01h        ; detect backdoor switch status (bit 0)
    cmp al,01h
    jne proceed
    call waitMSG       ; message
    call decs          ; decrement 7 segment display
    call open_motor    ; door opening

proceed:
    xor ax,ax
    in al,12h          ;detect key press and debounce
    test al,01h
    je kpad
    call delay
    in al,12h
    test al,01h
    je kpad

    cmp al,01h        ; do a job upon key press
    jne bbb
    mov [424h],al     ; store press data for printing cardCode/increment 7 seg.
    call num1         ; key#1
    jmp restart       ; restart if end process

bbb:
    cmp al,11h
    jne kpad
    call num2         ; key#2
    jmp restart       ; restart if end process


menu:
    call clr_dis
    call delay
    mov dl,084h       ;line1 Log Options
    call line

    mov al,'L'
    call dis_char

    mov al,'O'
    call dis_char

    mov al,'G'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'O'
    call dis_char

    mov al,'P'
    call dis_char

    mov al,'T'
    call dis_char

    mov al,'I'
    call dis_char

    mov al,'O'
    call dis_char

    mov al,'N'
    call dis_char

    mov al,'S'
    call dis_char

    mov dl,0c0h    ;line2 Room Entry
    call line

    mov al,'['
    call dis_char

    mov al,'1'
    call dis_char

    mov al,']'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'R'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,'m'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'E'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'y'
    call dis_char

    mov dl,94h     ;line3 Change Password
    call line

    mov al,'['
    call dis_char

    mov al,'2'
    call dis_char

    mov al,']'
    call dis_char

    mov al,' '
    call dis_char
             
    mov al,'C'
    call dis_char

    mov al,'h'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'g'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'P'
    call dis_char

    mov al,'I'
    call dis_char

    mov al,'N'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'e'
    call dis_char

    mov dl,0d7h     ;line4 Choose Number
    call line
            
    mov al,'C'
    call dis_char

    mov al,'h'
    call dis_char
             
    mov al,'o'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'N'
    call dis_char

    mov al,'u'
    call dis_char

    mov al,'m'
    call dis_char

    mov al,'b'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,':'
    call dis_char

    mov al,0ch      ; Cursor Off
    call command

ret

accept_code:        ; this procedure will be called if card is accepted

    call clr_dis
    call delay
    mov dl,0c2h
    call line

    mov al,'C'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'A'
    call dis_char

    mov al,'c'
    call dis_char

    mov al,'c'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'p'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay2

ret

ask_pin:                 ; ask PIN Code
    call clr_dis
    call delay
    mov dl,080h
    call line

    mov al,'E'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'P'
    call dis_char

    mov al,'I'
    call dis_char

    mov al,'N'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,':'
    call dis_char

    mov dl,0d4h
    call line

    mov al,'P'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'#'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'V'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'l'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,0eh     ; cursor ON
    call command

    mov dl,0c0h    ; PIN Line
    call line

    call PIN_ASK
    mov al,[300h]  ; retrieve card code

    cmp al,02h
    jne x1
    call code2
    jmp x4
x1:
    cmp al,04h
    jne x2
    call code4
    jmp x4
x2:
    cmp al,06h
    jne x3
    call code6
    jmp x4
x3:
    call code8
x4:
    nop
ret

ch_pin:               ; procedure called when key2 is press
    call clr_dis
    call delay
    mov dl,080h
    call line

    mov al,'E'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'u'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'P'
    call dis_char

    mov al,'I'
    call dis_char

    mov al,'N'
    call dis_char

    mov al,':'
    call dis_char

    mov dl,0d4h
    call line

    mov al,'P'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'#'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'V'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'l'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,0eh      ;cursor ON
    call command

    mov dl,0c0h    ; PIN Line
    call line

    call PIN_ASK
    mov al,[300h]  ;retrieve card code

    cmp al,02h
    jne xx1
    call code2
    jmp xx4
xx1:
    cmp al,04h
    jne xx2
    call code4
    jmp xx4
xx2:
    cmp al,06h
    jne xx3
    call code6
    jmp xx4
xx3:
    call code8
xx4:
   call longdelay2
   call new_PIN
ret

new_PIN:                   ; Procedure for asking new PIN Code
    call clr_dis
    call delay
    mov dl,080h
    call line

    mov al,'E'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'N'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'w'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'P'
    call dis_char

    mov al,'I'
    call dis_char

    mov al,'N'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,':'
    call dis_char

    mov dl,0d4h
    call line

    mov al,'P'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'#'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'V'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'l'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'e'
    call dis_char

    mov dl,094h
    call line

    mov al,'P'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'*'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'E'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'c'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'p'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,0eh      ;cursor ON
    call command

    mov dl,0c0h    ; PIN Line
    call line

    call PIN_ASK1
    mov al,[300h]  ;retrieve card code

    cmp al,02h
    jne g1
    call code_2
    jmp g4
g1:
    cmp al,04h
    jne g2
    call code_4
    jmp g4
g2:
    cmp al,06h
    jne g3
    call code_6
    jmp g4
g3:
    call code_8
g4:
   call pin_save
   nop
ret

pin_save:
    call clr_dis
    call delay
    mov dl,0c2h
    call line

    mov al,0ch      ;      Cursor Off
    call command

    mov al,'S'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'v'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'g'
    call dis_char

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char

ret

;;;;;;;;;;;;;;;;; PROCEDURES FOR SAVING NEW PIN CODE ;;;;;;;;;;;;;;;;;;;;;

code_2:                ; CODE2   new PIN
    mov si,405h
    mov bl,[301h]
    mov [si],bl

    inc si
    mov bl,[302h]
    mov [si],bl

    inc si
    mov bl,[303h]
    mov [si],bl

    inc si
    mov bl,[304h]
    mov [si],bl

    inc si
    mov bl,[305h]
    mov [si],bl
ret

code_4:               ; CODE4 new PIN
    mov si,40ah
    mov bl,[301h]
    mov [si],bl

    inc si
    mov bl,[302h]
    mov [si],bl

    inc si
    mov bl,[303h]
    mov [si],bl

    inc si
    mov bl,[304h]
    mov [si],bl

    inc si
    mov bl,[305h]
    mov [si],bl
ret

code_6:              ; CODE6 new PIN
    mov si,40fh
    mov bl,[301h]
    mov [si],bl

    inc si
    mov bl,[302h]
    mov [si],bl

    inc si
    mov bl,[303h]
    mov [si],bl

    inc si
    mov bl,[304h]
    mov [si],bl

    inc si
    mov bl,[305h]
    mov [si],bl
ret

code_8:             ; CODE8 new PIN
    mov si,414h
    mov bl,[301h]
    mov [si],bl

    inc si
    mov bl,[302h]
    mov [si],bl

    inc si
    mov bl,[303h]
    mov [si],bl

    inc si
    mov bl,[304h]
    mov [si],bl

    inc si
    mov bl,[305h]
    mov [si],bl
ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PIN_ASK:              ; Procedure used in "Room Entry" Option
    mov si,301h
    call key_PIN      ;
    inc si
    call key_PIN      ;
    inc si
    call key_PIN      ; key-in 5 digit PIN Code
    inc si
    call key_PIN      ;
    inc si
    call key_PIN      ;
    call delay

number_sign:
    in al,12h         ; detect key press and debounce
    test al,01h
    je number_sign
    call delay
    in al,12h
    test al,01h
    je number_sign

    cmp al,0e1h
    jne number_sign

still3:
    xor ax,ax
    in al,12h
    test al,01h
    jne still3

ret

PIN_ASK1:             ; Procedure used in "Change PIN" Option
    mov si,301h       ;
    call key_PIN      ;
    inc si            ;
    call key_PIN      ;
    inc si            ; key-in 5 digit PIN Code
    call key_PIN      ;
    inc si            ;
    call key_PIN      ;
    inc si            ;
    call key_PIN      ;
    call delay        ;

sign:
    in al,12h     ;detect key press and debounce
    test al,01h
    je sign
    call delay
    in al,12h
    test al,01h
    je sign

    cmp al,0c1h   ; * to escape
    jne sign_1
    jmp restart

sign_1:
    cmp al,0e1h   ;# to validate
    jne sign

still4:
    xor ax,ax
    in al,12h
    test al,01h
    jne still4

ret

key_PIN:
    in al,12h     ;detect key press and debounce
    test al,01h   ;
    je key_PIN    ;
    call delay    ;
    in al,12h     ; Loop key_PIN until key is press
    test al,01h   ;
    je key_PIN    ;

    mov [si],al   ; load press data to a mem location
    call embed

still2:
    xor ax,ax
    in al,12h
    test al,01h
    jne still2

ret

code2:            ; code2 procedure for PIN validation (compare keyed pin)
    mov si,405h
    mov al,[si]
    mov bl,[301h]
    cmp al,bl
    je y1
    jmp deny
y1:
    inc si
    mov al,[si]
    mov bl,[302h]
    cmp al,bl
    je y2
    jmp deny
y2:
    inc si
    mov al,[si]
    mov bl,[303h]
    cmp al,bl
    je y3
    jmp deny
y3:
    inc si
    mov al,[si]
    mov bl,[304h]
    cmp al,bl
    je y4
    jmp deny
y4:
    inc si
    mov al,[si]
    mov bl,[305h]
    cmp al,bl
    jne deny
    call granted
    jmp ennd

deny:
    call denied
ennd:

ret

code4:            ; code4 procedure for pin validation (compare keyed pin)
    mov si,40ah
    mov al,[si]
    mov bl,[301h]
    cmp al,bl
    je yy1
    jmp deny1
yy1:
    inc si
    mov al,[si]
    mov bl,[302h]
    cmp al,bl
    je yy2
    jmp deny1
yy2:
    inc si
    mov al,[si]
    mov bl,[303h]
    cmp al,bl
    je yy3
    jmp deny1
yy3:
    inc si
    mov al,[si]
    mov bl,[304h]
    cmp al,bl
    je yy4
    jmp deny1
yy4:
    inc si
    mov al,[si]
    mov bl,[305h]
    cmp al,bl
    jne deny1
    call granted
    jmp end1

deny1:
    call denied
end1:

ret

code6:            ; code6 procedure for pin validation (compare keyed pin)
    mov si,40fh
    mov al,[si]
    mov bl,[301h]
    cmp al,bl
    je yyy1
    jmp deny2
yyy1:
    inc si
    mov al,[si]
    mov bl,[302h]
    cmp al,bl
    je yyy2
    jmp deny2
yyy2:
    inc si
    mov al,[si]
    mov bl,[303h]
    cmp al,bl
    je yyy3
    jmp deny2
yyy3:
    inc si
    mov al,[si]
    mov bl,[304h]
    cmp al,bl
    je yyy4
    jmp deny2
yyy4:
    inc si
    mov al,[si]
    mov bl,[305h]
    cmp al,bl
    jne deny2
    call granted
    jmp end2

deny2:
    call denied
end2:

ret

code8:             ; code8 procedure for pin validation (compare keyed pin)
    mov si,414h
    mov al,[si]
    mov bl,[301h]
    cmp al,bl
    je yyyy1
    jmp deny3
yyyy1:
    inc si
    mov al,[si]
    mov bl,[302h]
    cmp al,bl
    je yyyy2
    jmp deny3
yyyy2:
    inc si
    mov al,[si]
    mov bl,[303h]
    cmp al,bl
    je yyyy3
    jmp deny3
yyyy3:
    inc si
    mov al,[si]
    mov bl,[304h]
    cmp al,bl
    je yyyy4
    jmp deny3
yyyy4:
    inc si
    mov al,[si]
    mov bl,[305h]
    cmp al,bl
    jne deny3
    call granted
    jmp end3

deny3:
   call denied
end3:

ret

denied:
    call clr_dis
    call delay
    mov dl,0c3h
    call line

    mov al,'A'
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'E'
    call dis_char

    mov al,'S'
    call dis_char

    mov al,'S'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'D'
    call dis_char

    mov al,'E'
    call dis_char

    mov al,'N'
    call dis_char

    mov al,'I'
    call dis_char

    mov al,'E'
    call dis_char

    mov al,'D'
    call dis_char

    mov al,0ch      ;      Cursor Off
    call command

    call longdelay2
    call longdelay2

    jmp restart
ret

granted:
    mov al,[424h] ; retrieve keypress
    cmp al,01h
    jne grant
    call incs
    mov al,00h
    mov [424h],al ; clear mem[424h]

    ;;;;;;  print user card code ;;;;;;;;;;;

    mov al,[300h]
    cmp al,02h               ; card code2
    jne prn1
    call code2_IN_print
    jmp grant

prn1:
    cmp al,04h               ; card code4
    jne prn2
    call code4_IN_print
    jmp grant

prn2:
    cmp al,06h               ; card code6
    jne prn3
    call code6_IN_print
    jmp grant

prn3:
    call code8_IN_print      ; card code8


grant:
    call clr_dis
    call delay
    mov dl,0c3h
    call line

    mov al,'A'
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'E'
    call dis_char

    mov al,'S'
    call dis_char

    mov al,'S'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'G'
    call dis_char

    mov al,'R'
    call dis_char

    mov al,'A'
    call dis_char

    mov al,'N'
    call dis_char

    mov al,'T'
    call dis_char

    mov al,'E'
    call dis_char

    mov al,'D'
    call dis_char

    mov al,0ch      ; Cursor Off
    call command

    mov bl,0cdh     ; force data = 0cdh
    mov [421h],bl   ; store data to [421h] (for motor rotation)

ret

embed:
    mov al,'*'
    call dis_char
ret

notify:
    call clr_dis
    call delay
    mov dl,080h
    call line

    mov al,'N'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'I'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'d'
    call dis_char

    mov dl,0c0h
    call line

    mov al,'P'
    call dis_char

    mov al,'l'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'I'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'V'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'l'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'d'
    call dis_char

    mov dl,94h
    call line

    mov al,'C'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'F'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,0ch      ;      Cursor Off
    call command

ret

invalid_card:
    call clr_dis
    call delay
    mov dl,0c4h
    call line

    mov al,'I'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'v'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'l'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,0ch      ;      Cursor Off
    call command
    call longdelay2

ret

waitMSG:
    call clr_dis
    call delay
    mov dl,0c4h
    call line

    mov al,'P'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,'c'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'S'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'o'
    call dis_char

    mov al,'p'
    call dis_char

    mov dl,96h
    call line

    mov al,'P'
    call dis_char

    mov al,'l'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'s'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'W'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'t'
    call dis_char

    mov al,'.'
    call dis_char

    mov al,'.'
    call dis_char

    mov al,'.'
    call dis_char

    mov al,0ch      ; Cursor Off
    call command

ret

num1:
    call clr_dis
    call delay
    mov dl,0c3h    ;  LCD initial line >> key_1
    call line

    mov al,'R'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'g'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay2

    mov al,0ch       ;cursor off / bink off
    call command

    xor ax,ax
    in al,22h        ;Port C PPI2 Card Slot (input)
    mov [300h],al    ;save DATA for CARD & PIN Validation
    cmp al,00h
    jne ccc
    call notify
    call longdelay2
    jmp iii

ccc:
    cmp al,02h
    jne ddd
    jmp ggg
ddd:
    cmp al,04h
    jne eee
    jmp ggg
eee:
    cmp al,06h
    jne fff
    jmp ggg
fff:
    cmp al,08h
    je ggg
    call invalid_card
    jmp iii

ggg:
    call accept_code     ; procedure called if card is valid
    call ask_pin
hhh:
    mov al,[421h]        ; retrieve data from mem.[421h]
    cmp al,0cdh          ; if access granted then data should be <0cdh>
    if e call open_motor ; door open
iii:
    nop
ret


num2:
    call clr_dis
    call delay
    mov dl,0c3h    ;  LCD initial line >> key_1
    call line

    mov al,'R'
    call dis_char

    mov al,'e'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'i'
    call dis_char

    mov al,'n'
    call dis_char

    mov al,'g'
    call dis_char

    mov al,' '
    call dis_char

    mov al,'C'
    call dis_char

    mov al,'a'
    call dis_char

    mov al,'r'
    call dis_char

    mov al,'d'
    call dis_char

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay
    call longdelay
    call longdelay

    mov al,'.'
    call dis_char
    call longdelay2

    mov al,0ch         ;cursor off / bink off
    call command

    xor ax,ax
    in al,22h        ;Port C PPI2 Card Slot (input)
    mov [300h],al    ;save DATA for CARD & PIN Validation
    cmp al,00h
    jne a1
    call notify
    call longdelay2
    jmp a6

a1:
    cmp al,02h
    jne a2
    jmp a5
a2:
    cmp al,04h
    jne a3
    jmp a5
a3:
    cmp al,06h
    jne a4
    jmp a5
a4:
    cmp al,08h
    je a5
    call invalid_card
    jmp a6

a5:
    call accept_code    ; procedure called if card is accepted
    call ch_pin         ; procedure called for changing PIN
a6:
    nop
ret

clr_dis:
    mov al,01h     ; clear current display
    call command
ret

initPPI1:
    mov al,89h     ;(PortA-OUT PortB-OUT PortC-IN)
    out 13h,al
ret

initPPI2:
    mov al,9bh     ;(PortA-IN PortB-IN PortC-IN)
    out 23h,al
ret

initPPI3:
    mov al,80h     ;(PortA-OUT PortB-OUT PortC-OUT)
    out 33h,al
ret

initPPI4:
    mov al,82h     ;(PortA-OUT PortB-IN PortC-OUT)
    out 43h,al
ret


init_PIN:          ;default PIN >> 67890    initialize all PIN Code
  xor ax,ax

  mov [422h],ax    ; used for 7 segment display
  mov [423h],ax    ; used for 7 segment display

  mov si,420h
  mov al,0abh      ; data to compare if mem is already in use
  mov [si],al

  mov si,405h      ; start Address for CODE2
  mov al,61h
  mov [si],al
  inc si
  mov al,81h
  mov [si],al
  inc si
  mov al,91h
  mov [si],al
  inc si
  mov al,0a1h
  mov [si],al
  inc si
  mov al,0d1h
  mov [si],al

  mov si,40ah      ; start Address for CODE4
  mov al,61h
  mov [si],al
  inc si
  mov al,81h
  mov [si],al
  inc si
  mov al,91h
  mov [si],al
  inc si
  mov al,0a1h
  mov [si],al
  inc si
  mov al,0d1h
  mov [si],al

  mov si,40fh      ; start Address for CODE6
  mov al,61h
  mov [si],al
  inc si
  mov al,81h
  mov [si],al
  inc si
  mov al,91h
  mov [si],al
  inc si
  mov al,0a1h
  mov [si],al
  inc si
  mov al,0d1h
  mov [si],al

  mov si,414h      ; start Address for CODE8
  mov al,61h
  mov [si],al
  inc si
  mov al,81h
  mov [si],al
  inc si
  mov al,91h
  mov [si],al
  inc si
  mov al,0a1h
  mov [si],al
  inc si
  mov al,0d1h
  mov [si],al

  

ret

init_LCD:
        call delay
        mov al,38h     ;1st function set
        call command
        call delay
        mov al,38h     ;2nd function set
        call command
        mov al,38h     ;3rd function set
        call command
        call delay
        mov al,01h
        call command
        mov al,0eh     ;display on / cursor on / bink off
        call command
ret

dis_char:

    out 10h,al
    mov al,0a0h
    out 11h,al
    call delay
    mov al,01h
    out 11h,al

ret

command:
    out 10h,al
    call delay
    mov al,80h
    out 11h,al
    call delay
    mov al,00h
    out 11h,al
ret

delay:
    mov cx,0ffh
xxx:
    loop xxx
ret

delay2:
    mov cx,0fffh
yyy:
    loop yyy
ret

stepdelay:
    mov cx,02ffh
steps:
    loop steps
ret

longdelay:
    call delay2
    call delay2
    call delay2
    call delay2
    call delay2
ret

longdelay2:
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
    call longdelay
ret

line:
    xor ax,ax
    mov al,dl
    call command
ret

detect_mem_store:
   mov ds,ax
   mov si,420h
   mov al,[si]
   cmp al,0abh
   jne not_stored
   jmp stored
not_stored:
   call init_PIN
stored:
ret

open_motor:
    call longdelay2
    call clr_dis
    call menu

    xor ax,ax
    mov al,11h
    push ax
motor1:
    pop ax
    call stepdelay
    out 32h,al
    rol al,01h
    push ax

    in al,21h      ; in switch status
    and al,04h     ; get switch status (bit 2)
    cmp al,04h
    jne motor1

    call rotate_stop_and_close
ret

close_motor:
    mov al,11h
    push ax
motor2:
    pop ax
    call stepdelay
    out 32h,al
    ror al,01h
    push ax

    in al,21h      ; in switch status
    and al,02h     ; get switch status (bit 1)
    cmp al,02h
    jne motor2

    call delay2
    mov al,00h     ; set back to default value of port
    out 32h,al     ; to protect the step driver from high TEMPERATURE

ret

rotate_stop_and_close:
    mov al,00h        ; set back to default value of port
    out 32h,al        ; to protect the step driver from high TEMPERATURE

    call longdelay2
    call longdelay2

    call close_motor

    jmp restart
ret

incs:
   mov cx,[423h]   ; pop counter
   mov bx,[422h]   ; pop number of entries

   inc bl
   inc cl
   cmp cl,0ah
   jne incs_a
   call add1

incs_a:
   mov al,bl
   out 30h,al

   mov [422h],bl    ; store current number of entries
   mov [423h],cl    ; store current counter
full:
ret

add1:
    cmp bl,9ah
    jne add1_a
    call add2
    jmp add1_b
add1_a:
    add bl,06h
add1_b:
    xor cx,cx
ret

add2:
    add bx,66h
    mov al,bh
    out 31h,al
ret

decs:
   mov cx,[423h]   ; pop counter
   mov bx,[422h]   ; pop number of entries

   cmp cl,00h
   jne decs_a
   call sub1
   jmp decs_b

decs_a:
   dec bl
   dec cl
decs_b:
   mov al,bl
   out 30h,al

   mov [422h],bl    ; store current number of entries
   mov [423h],cl    ; store current counter
ret

sub1:
    cmp bl,00h
    jne sub1_a
    call sub2
    jmp sub1_b
sub1_a:
    sub bl,07h
sub1_b:
    mov cl,09h
ret

sub2:
    sub bx,67h
    mov al,bh
    out 31h,al
ret


code2_IN_print:
   call print_next_line
   mov al,'C'
   call printer

   mov al,'O'
   call printer

   mov al,'D'
   call printer

   mov al,'E'
   call printer

   mov al,' '
   call printer

   mov al,'2'
   call printer

ret


code4_IN_print:
   call print_next_line
   mov al,'C'
   call printer

   mov al,'O'
   call printer

   mov al,'D'
   call printer

   mov al,'E'
   call printer

   mov al,' '
   call printer

   mov al,'4'
   call printer

ret

code6_IN_print:
   call print_next_line
   mov al,'C'
   call printer

   mov al,'O'
   call printer

   mov al,'D'
   call printer

   mov al,'E'
   call printer

   mov al,' '
   call printer

   mov al,'6'
   call printer

ret

code8_IN_print:
   call print_next_line
   mov al,'C'
   call printer

   mov al,'O'
   call printer

   mov al,'D'
   call printer

   mov al,'E'
   call printer

   mov al,' '
   call printer

   mov al,'8'
   call printer

ret

intro:                       ; routine for introduction message

   mov al,'W'
   call printer

   mov al,'E'
   call printer

   mov al,'L'
   call printer

   mov al,'C'
   call printer

   mov al,'O'
   call printer

   mov al,'M'
   call printer

   mov al,'E'
   call printer

   mov al,'!'
   call printer

   mov al,'!'
   call printer


   mov al,' '
   call printer

   mov al,'T'
   call printer

   mov al,'E'
   call printer

   mov al,'A'
   call printer

   mov al,'M'
   call printer

   mov al,' '
   call printer

   mov al,'O'
   call printer

   mov al,'F'
   call printer

   mov al,' '
   call printer

   mov al,'I'
   call printer

   mov al,'N'
   call printer

   mov al,'S'
   call printer

   mov al,'T'
   call printer

   mov al,'R'
   call printer

   mov al,'U'
   call printer

   mov al,'C'
   call printer

   mov al,'T'
   call printer

   mov al,'O'
   call printer

   mov al,'R'
   call printer

   mov al,'S'
   call printer

   call print_next_line

   mov al,'C'
   call printer

   mov al,'O'
   call printer

   mov al,'L'
   call printer

   mov al,'L'
   call printer

   mov al,'E'
   call printer

   mov al,'G'
   call printer

   mov al,'E'
   call printer


   mov al,' '
   call printer

   mov al,'O'
   call printer

   mov al,'F'
   call printer

   mov al,' '
   call printer


   mov al,'C'
   call printer

   mov al,'O'
   call printer

   mov al,'M'
   call printer

   mov al,'P'
   call printer

   mov al,'U'
   call printer

   mov al,'T'
   call printer

   mov al,'E'
   call printer

   mov al,'R'
   call printer

   mov al,' '
   call printer

   mov al,'E'
   call printer

   mov al,'N'
   call printer

   mov al,'G'
   call printer

   mov al,'I'
   call printer

   mov al,'N'
   call printer

   mov al,'E'
   call printer

   mov al,'E'
   call printer

   mov al,'R'
   call printer

   mov al,'I'
   call printer

   mov al,'N'
   call printer

   mov al,'G'
   call printer

   call print_next_line

   mov al,'P'
   call printer

   mov al,'R'
   call printer

   mov al,'O'
   call printer

   mov al,'J'
   call printer

   mov al,'E'
   call printer

   mov al,'C'
   call printer

   mov al,'T'
   call printer


   mov al,' '
   call printer

   mov al,'D'
   call printer

   mov al,'E'
   call printer

   mov al,'S'
   call printer

   mov al,'I'
   call printer

   mov al,'G'
   call printer

   mov al,'N'
   call printer

   call print_next_line

   mov al,'M'
   call printer

   mov al,'P'
   call printer

   mov al,'U'
   call printer

   mov al,'-'
   call printer

   mov al,'B'
   call printer

   mov al,'A'
   call printer

   mov al,'S'
   call printer

   mov al,'E'
   call printer

   mov al,'D'
   call printer

   mov al,' '
   call printer

   mov al,'E'
   call printer

   mov al,'N'
   call printer

   mov al,'C'
   call printer

   mov al,'R'
   call printer

   mov al,'O'
   call printer

   mov al,'A'
   call printer

   mov al,'C'
   call printer

   mov al,'M'
   call printer

   mov al,'E'
   call printer

   mov al,'N'
   call printer

   mov al,'T'
   call printer

   call print_next_line

   mov al,'S'
   call printer

   mov al,'E'
   call printer

   mov al,'C'
   call printer

   mov al,'U'
   call printer

   mov al,'R'
   call printer

   mov al,'I'
   call printer

   mov al,'T'
   call printer

   mov al,'Y'
   call printer

   mov al,' '
   call printer

   mov al,'A'
   call printer

   mov al,'C'
   call printer

   mov al,'C'
   call printer

   mov al,'E'
   call printer

   mov al,'S'
   call printer

   mov al,'S'
   call printer

   mov al,' '
   call printer

   mov al,'S'
   call printer

   mov al,'Y'
   call printer

   mov al,'S'
   call printer

   mov al,'T'
   call printer

   mov al,'E'
   call printer

   mov al,'M'
   call printer

   call print_next_line
   call print_next_line
   call print_next_line
   call print_next_line

   mov al,' '
   call printer

   mov al,' '
   call printer

   mov al,' '
   call printer

   mov al,' '
   call printer

   mov al,'L'
   call printer

   mov al,'O'
   call printer

   mov al,'G'
   call printer

   mov al,' '
   call printer

   mov al,'L'
   call printer

   mov al,'I'
   call printer

   mov al,'S'
   call printer

   mov al,'T'
   call printer

ret

print_next_line:
    mov al,0Dh             ; carriage return
    call printer

    mov al,0Ah             ; line feed
    call printer
ret

printer:                   ; printer routine for printing
       mov dx,40h
       out dx,al

       mov al, 04h         ; selectIN=0 init=1 autofeed=0 strobe=0
       mov dx, 42h
       out dx, al
       call printer_timing
       mov al, 05h        ; let know the printer if data is transmitted
       out dx, al         ; where ( selectIN=0  init=1  autofeed=0 strobe=1)

ack:
       mov dx, 41h        ; detect if data has been acknowledge by the printer
       in al,dx
       and al, 01h
       jz ack

busy:
       mov dx,41h         ; detect if printer is busy
       in al, dx
       and al, 02h
       jnz busy

ret

printer_timing:
    mov    cx,0f00h
prn:
    loop   prn
ret