📄 tm_card_lock.asm
字号:
.INCLD APARTN.INC
;Constant
M24WOP = X'A0:BYTE ; Write 24C16 Command
M24ROP = X'A1:BYTE ; Read 24C16 Command
ICYCLE = R0 ; Inner Cycle
OCYCLE = R4 ; Outer Cycle
LENGTH = R1 ; Length
HADDR = R2 ; 24C16 High Address
LADDR = R3 ; 24C16 Low Address
TMRECO = R5 ; TM Key Pointer
TMNUM = R6 ; TM Key Number
HCOUNT = R7 ;
NCOUNT = R8 ;
TMKSER = R9 ;
CRC8 = RA
FLG1 = RB
;.SECT ECON,CONF
; .DB X'7C
; .DB 'DAVID'
;.ENDSECT
.SECT DATA,RAM,ABS=0
RDBUF: .DSB 8 ; 24C16 Read Buffer
ROMSN: .DSB 8 ; TM ROM Read Buffer
SETSN: .DSB 8 ; SETCARD SNO
TEMP: .DSB 8 ;
.ENDSECT
; FLAG
FTMWAKE = 0 ; TM Wake PND Flag
FKEYOPN = 4 ; Key Wake PND Flag
; FLG1
FLBLANK = 1 ; LED On,Off
FPVFLAG = 2 ; Voltage, 1 H,0 L
FSETCTI = 3 ;
FDOPEN = 5 ; Open Door Flag
;===============================================
.SECT CODE,ROM,ABS=0
START: RPND
LD FLG1,#0
LD SP,#STACK
JSR INIT ; Init Port
JSR PVDET ; Voltage Detect
JSR LEDBEEP
JSR CDLON ; Close Door,Clear For Ever Flag
LD B,#SETSN
LD [B+],#X'55
LD [B],#X'AA
WD24L SETSN,2,MCHECK
RD24L MCHECK
MSCMP SETSN,RDBUF,2 ; Check 24C16
JP M24ERR
MAINLOOP:
LD SP,#STACK
JSR RDDLON
IFEQ A,#USABLE
JP DNTOFF
IFBIT FDOPEN,FLG1
JSR DCLOSE
DNTOFF:JSR INIT
WAITTO:LD R2,#5 ; Wait TM Out
WATOLP:JSR TMRDSNO ; Read TM
JP WTNEXT
JP WAITTO
WTNEXT:DRSZ R2
JP WATOLP
LD WKPND,#0
SBIT 7,PORTGD ; HALT
NOP
NOP
NOP
LD SP,#STACK
; L7 L6 L5 L4 L3 L2 L1 L0
; MF ON RD KO 24C 24W BZ TM
LD PORTLD,#B'01111100 ; 0 1 1 1 1 1 0 0
LD PORTLC,#B'10001110 ; 1 0 0 0 1 1 1 0
; NO NO NO NO 24D VDT LR LG
LD PORTFD,#B'00000100 ; 0 0 0 0 0 1 0 0
CLR A
X A,WKPND
IFBIT FTMWAKE,A
JP TMWAKEUP
IFBIT FKEYOPN,A
JP KOWAKEUP
JP MAINLOOP
NTMKEY: JSR YLLBEEP
M24ERR: JSR YLLBEEP ; 24C16 Error
JSR YLLBEEP ; Yellow LED,BEEP 3
JP MAINLOOP
;***********************************************
; Initialize Port
INIT: RPND
; D7 D6 D5 D4 D3 D2 D1 D0
; NO NO NO NO LG LR MR ME
LD PORTD, #B'00000000 ; 0 0 0 0 0 0 0 0
; G7 G6 G5 G4 G3 G2 G1 G0
; HT GD NU NU NU SA NU NU
LD PORTGD,#B'00000100 ; 0 0 0 0 0 1 0 0
LD PORTGC,#B'00111011 ; 1 0 1 1 1 0 1 1
; F7 F6 F5 F4 F3 F2 F1 F0
; NO NO NO NO 24D VDT LR LG
LD PORTFD,#B'00000000 ; 0 0 0 0 0 0 0 0
LD PORTFC,#B'11110000 ; 1 1 1 1 0 0 0 0
; L7 L6 L5 L4 L3 L2 L1 L0
; MF ON RD KO 24C 24W BZ TM
LD PORTLD,#B'00011100 ; 0 0 0 1 1 1 0 0
LD PORTLC,#B'11101110 ; 1 1 1 0 1 1 1 0
; PW7 PW6 PW5 PW4 PW3 PW2 PW1 PW0
; HC C T1P T1E EIP BSY EIE GIE
LD PSW, #B'00000000 ; 0 0 0 0 0 0 0 0
; IT7 IT6 IT5 IT4 IT3 IT2 IT1 IT0
; LEN T0P T0E UWP UWE T1P T1E
LD ICNTRL,#B'00000000 ; 0 0 0 0 0 0 0 0
; CT7 CT6 CT5 CT4 CT3 CT2 CT1 CT0
; T13 T12 T11 T10 MSL EID SL1 SL0
LD CNTRL, #B'00000000 ; 0 0 0 0 0 0 0 0
LD WKEN, #B'00000000 ; L7 L6 L5 L4 L3 L2 L1 L0
LD WKEDG, #B'11111111 ; 1 1 1 1 1 1 1 1 Negative Edge
LD WKPND, #B'00000000 ; KO TM
LD WKEN, #B'00010001 ; 0 0 0 1 0 0 0 1
RET
;=========================================================
;***********************************************
;
KOWAKEUP:JSR DLY100
JSR KSDET ; Detect Key Status
JP MAINLOOP ; Key Release,return
JSR LEDBEEP ; BEEP ONE
JSR PVDET ; Voltage Detect
JSR GRLEDON ; LED ON
KONOTM:MSFL8 SETSN ; NO TM
KODETK:JSR DLY100 ; Delay 100ms
JSR KSDET ; Detect Key Status
JP MAINLOOP ; Key Release,return
JSR TMRDSNO ; Read TM
JP KONOTM ; No TM
MSCM7 SETSN
JP KOSETS ; New TM
JP KODETK
KOSETS:CPSNO SETSN ; Copy TMSNO
JSR SETSC ; SET SETCARD
JSR BEEP ; BEEP ONE
JP KODETK ; Continue,Wait Key Release
;============================================================
;************ CHECK IS TM IN OR KEY ***********************
TMWAKEUP:LD R4,#X'FF ; Touch TM
TWRSLP:DRSZ R4
JP TWDETK
JP MAINLOOP ; No TM,Return
TWDETK:JSR KSDET ; Detect Key Status,Open?
JP TWRSN1 ; No,Detect TM
JP KOWAKEUP ; Yes
TWRSN1:JSR TMRDSNO ; Read TM,Has ?
JP TWRSLP ; No,Continue Read
RD24L SETFLG ; Yes,Read SETCARD Exist Flag
IFEQ RDBUF,#H(EXSETC) ; Comp EXSETC High Byte
JP CSETFL
TSETSC:JSR SETSC ; No SETCARD,SET SETCARD
JSR BEEP
JP TMWAKEUP
CSETFL:IFEQ RDBUF+1,#L(EXSETC) ; Comp EXSETC Low Byte
JP THASSC ; Has SETCARD
JP TSETSC
;==== === === === === === ===
;****** TM PROCESS *********
THASSC:RD24L SETCNO ; Read SETCARD SNO
MSCP8 SETSN,RDBUF ; Copy SETCARD SNO To SETSN
JSR SNOTOTP ; Copy TM SNO To TEMP
LD FLG1,#0
LD NCOUNT,#0
LD HCOUNT,#1
JSR PVDET
JSR CMPSETTM ; Is SETCARD ?
JP NSETSC ; No
LD B,#FLG1 ; Is SETCARD
SBIT FLBLANK,[B]
SBIT FSETCTI,[B] ; Set FLAG
JSR BEEP ; Beep One
;=== === === === === === ===
WDOTM: IFBIT FSETCTI,FLG1
JSR BLANK
JSR DLY100
OSDET: IFBIT NOROPEN,PORTLP ; Open Status Detect,Door Open ?
JP WDORTM ; No,Detect TM
JSR DLY10 ; Yes,Delay 10ms,Second Detect
IFBIT NOROPEN,PORTLP
JP WDORTM
JP MAINLOOP ; Door Open,Return
;=== === === === === === ====
WDORTM:JSR TMRDSNO ; Read TM,Has ?
JP WDOTMN ; NO
LD NCOUNT,#0 ; Yes,Clear NCOUNT
MSCM7 TEMP ; Compare TMSNO, = ?
JP WTMNEW ; No,is New; To New TM Handle
LD A,HCOUNT ; Yes,Old TM
IFGT A,#30 ;#45 ; HCOUNT > 70 ?
JP TMGT70 ; Yes
INC A ; No, HCOUNT+1
X A,HCOUNT ; Save HCOUNT
LD A,12 ;#20
IFGT A,HCOUNT ; HCOUNT > 30 ?
JP WDOTM ; No,Continue Wait TM In and Open Door
IFBIT FSETCTI,FLG1 ; Yes,Is Set Status ?
JP SCGT30 ; Yes
IFEQ HCOUNT,#18 ;#21 ; No,HCOUNT = 31,Beep One
JP BEEPT1
IFEQ HCOUNT,#24 ;#34 ; HCOUNT = 51,Beep One
JP BEEPT1
SCGT30:JSR CMPSETTM ; Is SETCARD ?
JP WDOTM ; No,Continue
;=== === === === === === === === =
;*********
BEEPT1:JSR BEEP ; Is SETCARD,Beep One,Continue
JP WDOTM
TMGT70:IFBIT FSETCTI,FLG1 ; HCOUNT > 70,Is Set Status ?
JP SCGT70 ; Yes
JSR WCDLON ; No,Clear Or Set Forever Flag
JP BPLRET ; Long Beep One,Return
SCGT70:JSR CMPSETTM ; Is SETCARD ?
JP WDOTM ; No,Continue
JSR CLRSC ; Is SETCARD,Clear SETCARD
BPLRET:JSR BEEPL ; Long Beep One,Return
JP MAINLOOP
WTMNEW:LD HCOUNT,#0 ; New TM,Clear HCOUNT
JSR SNOTOTP ; Copy SNO To TEMP
IFBIT FSETCTI,FLG1 ; Is Set status ?
JP SCTMNE ; Yes
;=== === === === === === ===
;******** KEY CARD ************
NSETSC:JSR FKREC ; No,Find Key ?
JP NTMKEY ; No,
IFBIT REVLOCK,PORTLP
JP DOOROP
JSR GREBEEP
JSR DLY100
JSR GREBEEP
JP MAINLOOP
DOOROP: JSR GRLEDON ; Yes,LED On
JSR DOPEN ; Enable Open Door
JP BEEPT1 ; Beep One,Continue
SCTMNE:JSR CMPSETTM ; Is SETCARD ?
JSR KSCREC ; No, Set Or Clear Key
JP BEEPT1 ; Yes,Continue
;=== === === === === ===
;*******
WDOTMN:LD A,NCOUNT ; No TM
INC A ; NCOUNT+1
IFGT A,#60 ; NCOUNT > 60 ?
JP MAINLOOP ; Yes, Return
X A,NCOUNT ; No,Save NCOUNT
LD A,NCOUNT
IFNE A,#5 ; NCOUNT = 5 ?
JP WDOTM ; No,Continue Wait TM In and Open Door
LD HCOUNT,#0 ; Yes,Clear HCOUNT
IFBIT FSETCTI,FLG1 ; Is Set Status ?
JSR TEMPFL0 ; Yes,Clear TEMP
JP WDOTM ; No,Continue Wait TM In and Open Door
;***********************************************
RDDLON: LD R3,#L(LONGON)
JP M24RDL8
;***********************************************
WCDLON: JSR RDDLON
IFNE A,#USABLE
JP SDLON
CDLON: JSR DCLOSE ; Clear For Ever Flag
LD RDBUF,#0
JP WRDLON
SDLON: LD RDBUF,#USABLE ; Set For Ever Flag
WRDLON: LD R3,#L(LONGON)
JP M24WD1
;***********************************************
M24RWREC:LD A,R9
ADD A,#(KEYCNO/8)
CALSADDR:RC
RLC A
RLC A
RLC A
X A,R2
LD A,R2
RLC A
AND A,#X'07
X A,R2
AND A,#X'F8
X A,R3 ; * 8
LD R1,#8
RET
;***********************************************
; Set Or Clear TM Key
KSCREC: JSR FKREC ; Find Key ?
JP SETUPK ; No,Set Key
LD A,R5 ;
X A,R9
JSR CKREC ; Yes,Delete Key
KBEEP1:JSR BEEP
RET
SETUPK:LD A,R5 ; Set Key
X A,R9
IFEQ R5,#MAXNUM
JP KBEEP2
JSR WKREC
RET
KBEEP2:JSR BEEP
JP KBEEP1
;***********************************************
CKREC: JSR RDBUFL0 ; Delete TMKEY Record
LD B,#RDBUF
JP WCKREC
;***********************************************
WKREC: LD ROMSN+7,#USABLE ; Write TMKEY Record
LD B,#ROMSN
WCKREC:JSR M24RWREC
JP M24WD
;***********************************************
; R5 Record No., Find RETSK; No Find, RET
FKREC: LD R6,#MAXNUM ; Load Loop Times
LD R9,#0
LD R5,#X'FF
FKLP: JSR M24RWREC ; Calculate Start Address
JSR M24RD ; Read TMKEY Record,RKREC
IFEQ RDBUF+7,#USABLE ; Is Used Key ?
JP FDUSEK ; Yes,Find Using TMKEY Record
FKSDRN:LD A,R9 ; No,Find Deleted TMKEY Record
IFEQ R5,#X'FF ; Is The First Record ?
X A,R5 ; Yes,Save The First Deleted Recno
IFEQ R6,#0 ; End ?
RET ; Yes
FKNEXT:LD A,R9 ; No,Read Next
INC A
X A,R9
DRSZ R6
JP FKLP
JP FKSDRN ; Not Find TMKEY Record
FDUSEK:MSCM7 RDBUF ; Find Using TMKEY Record
JP FKNEXT
LD A,R9 ; Find TMKEY Record
X A,R5 ; Save Recno
JSR RDBUFL0 ; RDBUF Fill 0
RETSK
;***********************************************
CLRSC: JSR WCDLON ; Clear SETCARD,Clear Forever Open Flag
JSR RDBUFL0 ; RDBUF Fill 0
CLR A
CLRSLP:PUSH A
JSR CALSADDR
LD B,#RDBUF
JSR M24WD ; Clear 24C16
POP A
INC A
IFGT A,#( MAXNUM + KEYCNO/8 + 1 )
RET
JP CLRSLP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -