PROGRAMSKA KODA ČITALCA
IRLOCK ldab K_STAT ; 4 naloži statusni in kontrolni register
andb #%00010000 ; 2 preveri bit za odpiranje
beq K_TOTA ; 3 če ni postavljen skoči navzdol
rts ; 5 drugače končaj rutino
  ;--------ZADRŽEVANJE NAPAK ZA 2 SEKUNDI(TOE)---------
K_TOTA ldab K_STAT ; 4 naloži statusni in kontrolni register
andb #%00000011 ; 2 preveri napake
beq K_TOTB ; 3 če ni napak skoči navzdol
inc K_TO11 ; 6 povečaj števec delčkov T0E (Time Out for Errors)
bne K_TOTB ; 3 če ni preliva skoči navzdol
inc K_TO12 ; 6 povečaj števec delcev TOE (delec =1 sekunda)
ldaa #$02 ; 2 naloži število delcev za 2 sekundi
cmpa K_TO12 ; 4 in jih primerjaj z števcem delcev TOE
bne K_TOTB ; 3 če nista pretekli 2 sekundi skoči navzdol
ldab K_STAT ; 4 naloži statusni in kontrolni register
andb #%11111100 ; 2 izbriši napake
stab K_STAT ; 4 in shrani v statusni in kontrolni register
clr K_TO11 ; 6 izbriši TOE delčke
clr K_TO12 ; 6 izbriši TOE delce
  ;-----------TIME OUT TIMER (TOT)--------------------------------------------
K_TOTB ldab K_STAT ; 4 naloži statusni in kontrolni register
andb #%01000000 ; 2 preveri ce poteka branje ključa
beq K_START ; 3 če ne poteka skoči navzdol
inc K_TO21 ; 6 povečaj števec delčkov T0T (Time Out Timer)
bne K_START ; 3 če ni preliva skoči navzdol
inc K_TO22 ; 6 povečaj števec delcev T0T (delec = 1 sekunda)
  ldaa #$04 ; 2 naloži število delcev za 4 sekunde
  cmpa K_TO22 ; 4 in jih primerjaj z števcem delcev TOT
bne K_START ; 3 če niso pretekle 4 sekunde skoči navzdol
  ldab #%00000011 ; 2 izbriši kontrolne bite in postavi napako preliva TOT
  stab K_STAT

; 4 in shrani v statusni in kontrolni register

clr K_TO21 ; 6 izbriši TOT delčke
clr K_TO22 ; 6 izbriši TOT delce
clr POINTR ; 6 izbriši števec bitov
;-----------ANALIZA URE IN SMERI KLJUČA------------------------------
K_START ldab K_STAT ; 4 naloži statusni in kontrolni register
ldaa _DPRA ; 4 preberi vrata A v PIA
bmi CLK_1 ; 3 če je postavljen b7 (ura ključa) skoči navzdol
orab #%01000000 ; 2 postavi bit za potek branja ključa
  stab K_STAT ; 4 in shrani v statusni in kontrolni register
bmi CLKK_1 ; 3 če je ura 1 skoči navzdol
rts ; 5 drugače končaj rutino
CLK_1 orab #%10000000 ; 2 postavi uro na 1
stab K_STAT ; 4 in shrani v statusni in kontrolni register
  rts   ; 5 končaj rutino
CLKK_1 andb #%01111111 ; 2 postavi uro na 0
stab K_STAT ; 4 in shrani v statusni in kontrolni register
andb #%00100000 ; 2 preveri smer ključa
beq DIR_0 ; 3 če gre noter skoči navzdol
jmp DIR_1 ; 3 če gre ven skoči navzdol
;---------------KLJUČ GRE V KLJUČAVNICO----------------------------------------
DIR_0 lsla   ; 2 premakni podatke iz PIA v levo
  bmi DATAK_1 ; 3 če je postavljen b6 (koda ključa) skoči navzdol
  clra   ; 2
  jmp DATAK_0 ; 3 skoči navzdol
DATAK_1 ldaa #$01 ; 2 postavi LSB
DATAK_0 ldab CODE ; 4 naloži CODE (prebrano kodo ključa ob vsavitvi ključa)
  lslb   ; 2 in jo pripravi za naslednji bit
  aba   ; 2
  staa CODE ; 4 shrani jo v CODE
  inc POINTR ; 6 povečaj števec bitov
  ldaa POINTR ; 4 nalozi števec bitov
  cmpa #$08 ; 3 preveri vrednost števca
  bne POIN_8 ; 3 če je manjši od 8 skoči navzdol
  ldab K_STAT ; 4 naloži statusni in kontrolni register
  orab #%00100000 ; 2 postavi smer ključa na 1
stab K_STAT ; 4 in shrani v statusni in kontrolni register
POIN_8 rts   ; 5 končaj rutino
;---------------KLJUČ GRE IZ KLJUČAVNICE----------------------------------
DIR_1 lsla   ; 2 premakni podatke iz PIA v levo
  bmi DATA_1 ; 3 če je postavljen b7 (koda ključa) skoči navzdol
  clra   ; 2
  jmp DATA_0 ; 3 skoči navzdol
DATA_1 ldaa #$80 ; 2 postavi MSB
DATA_0 ldab EDOC ; 4 naloži EDOC (prebrano kodo ključa ob izvleku ključa)
  lsrb   ; 2 in jo pripravi za naslednji bit
  aba   ; 2
  staa EDOC ; 4 shrani jo v EDOC
  dec POINTR ; 6 zmanjšaj števec bitov
  ldaa POINTR ; 4 nalozi števec bitov
  beq POIN_0 ; 3 če je 0 skoči navzdol
  rts   ; 5 končaj rutino
;---------------ANALIZA KOD------------------------------------------------------
POIN_0 ldaa CODE ; 4 naloži CODE
cmpa EDOC ; 4 primerjaj z EDOC
bne CODE_E ; 3 če kodi nista enaki skoči navzdol
cmpa CODE_1 ; 4 primerjaj z prvo veljavno kodo
beq C_1_OK ; 3 če se kodi ujemata skoči navzdol
cmpa CODE_2 ; 4 primerjaj z drugo veljavno kodo
beq C_2_OK ; 3 če se kodi ujemata skoči navzdol
ldab K_STAT ; 4 naloži statusni in kontrolni register
orab #%00000001 ; 2 postavi napako napačen ključ
  stab K_STAT ; 4 in shrani v statusni in kontrolni register
rts ; 5 končaj rutino
CODE_E ldab K_STAT ; 4 naloži statusni in kontrolni register
orab #%00000010 ; 2 postavi napako napaka v kodi
  stab K_STAT ; 4 in shrani v statusni in kontrolni register
rts ; 5 končaj rutino
C_1_OK ldab #%00010100 ; 2 postavi bit za odklepanje, 2 bita za identifikacijo ključa in izbriši kontrolni register
  stab K_STAT ; 4 in shrani v statusni in kontrolni register
rts ; 5 končaj rutino
C_2_OK ldab #%00011000 ; 2 postavi bit za odklepanje, 2 bita za identifikacijo ključa in izbriši kontrolni register
  stab K_STAT ; 4 in shrani v statusni in kontrolni register
rts ; 5 končaj rutino
      ;=< 204 rutina porabi v najslabšem primeru 204 ciklov
       
;-----------------------------------------------------------------------------------------------------
INICIALIZACIA PIA (Peripherial interface adapter)
INI_PIA ldaa #%00000000
staa _CRA ; onemogoči vse prekinitve, ki ji generira PIA vmesnik A
staa _CRB ; onemogoči vse prekinitve, ki ji generira PIA vmesnik B
ldaa #%00111111
staa _DPRA ; vmesnik A ima b7 in b6 vhoda, ostalo so izhodi
ldaa #%11111111
staa _DPRB ; vmesnik B ima vse bite izhodne
ldaa #%00000100
staa _CRA ; ob branju vmesnika A dobim stanje podatkovnega registra A
staa _CRB ; ob branju vmesnika B dobim stanje podatkovnega registra B
rts ; končaj podprogram
       
;-----------------------------------------------------------------------------------------------------
UPORABNIKOVE SPREMENLJIVKE (izsek programa)
~
K_STAT rmb 1 ;kontrolno - b7 - ura ključa b3 - identifikacija ključa MSB
; statusni register b6 - potek branja b2 - identifikacija ključa LSB
; b5 - smer ključa b1 - napaka MSB
; b4 - odklepaje b0 - napaka LSB
; identifikacija MSB LSB
; ključa 0 0 ni ključa
; 0 1 ključ 1
; 1 0 ključ 2
; 1 1 kombinacija ni uporabljena
; napaka MSB LSB
; 0 0 ni napak
      ; 0 1 napačen ključ
      ; 1 0 napaka pri prebiranju kode ključa
      ; 1 1 prekoračitev časa branja ključa
      (ključ ni bil izvlečen ali pa
      ni bil vstavljen pravilno)
K_TO11 rmb 1 ; števec delčkov TOE(Time Out for Errors)
K_TO12 rmb 1 ; števec delcev TOE(Time Out for Errors)
K_TO21 rmb 1 ; števec delčkov TOT(Time Out Timer)
K_TO22 rmb 1 ; števec delcev TOT(Time Out Timer)
POINTR rmb 1 ; števec bitov kode prebrane iz ključa
CODE rmb 1 ; koda prebrana pri vstavljanju ključa
EDOC rmb 1 ; koda prebrana pri izvleku ključa
CODE_1 rmb 1 ; koda prvega ključa
CODE_2 rmb 1 ; koda drugega ključa
       
;-----------------------------------------------------------------------------------------------------
INICIALIZACIJA SPREMENLJIVK (izsek podprograma)
~
ldx #$0000
stx K_STAT ; izbriši kontrolno-statusni register in števec delčkov TOE
stx K_TO12 ; izbriši števec delcev TOE in števec delčkov TOT
stx K_TO22 ; izbriši števec delcev TOT in stevec bitov kode ključa
ldaa #%01100000
staa CODE_1 ; nastavimo kodo prvega ključa
ldaa #%01000110
staa CODE_2 ; nastavimo kodo drugega ključaključa
~
rts