📄 glq.asm
字号:
;================================
; GLQ-ID Server For 89C52
; FIRST UPDATE 2002.11.29(use 89c55)
; SECOND UPDATE 2003.01.03(use 89c55)
; THIRD UPDATE 2003.01.06(use 89c55)
; (1)添加加密功能
; (2)添加靠卡后若尚未消费,不能在其他POS上二次靠卡,否则显示出错"ERR 000"
; (3)添加每到0时0分0秒,将持卡人信息区的预留字节标志清0,防止意外情况发生。
; (4)存款机有出错信息,由POS改程序送消费流过来修正
; (5)调用w_sale子过程中处理预留字节
; (6)管理器发送正确或错误应答时分开处理
; (7)管理器收到标志为03的消费流时不保存直接返回
; (8)增添读,写8区信用额度区,将信用额度发送至POS处理-(2003.11.29)
; (9)POS脱机下载个人信息时管理器发送信用额度和尾指针字节
; (10)脱机数据和联机数据均以管理器时间为准--------(2003.01.03)
; (11)上传数据时接收流类型最高位为0:联机数据/为1:脱机数据
; (12)上传数据时以接收流类型字节的第6位作为是否已读取的标志
; (13)增添POS下载数据前请求校时,管理器发送时间---(2003.01.06)
;*******ID售饭系统江阴利港电厂V8.0版本*********
;================================
org 0000h
;************************************
; Adress Define
;************************************
d_374 equ 8000h
w_2051 equ 0a000h ;Write 2051 Control
r_2051 equ 0a000h ;Read 2051 Control
rsec equ 0c000h ;DS12887 Second Address
rmin equ 0c002h ;DS12887 Second Address
rhor equ 0c004h ;DS12887 Second Address
rwek equ 0c006h ;DS12887 Second Address
rday equ 0c007h ;DS12887 Second Address
rmon equ 0c008h ;DS12887 Second Address
ryer equ 0c009h ;DS12887 Second Address
r18a equ 0c00ah ;DS12887 Control A Address
r18b equ 0c00bh ;DS12887 Control B Address
r18c equ 0c00ch ;DS12887 Control C Adress
r18d equ 0c00dh ;DS12887 Control D Address
;-------------------
d_run_yer equ 0c070h ;Run Year Address
d_run_mon equ 0c071h ;Run Month Address
d_run_day equ 0c072h ;Run Day Address
d_idsc equ 0c010h ;UserID && CradSC Copy
;
d_record equ 1000h ;the Last Sale/Save Record Bakup Address
d_comm equ 2700h ;Pos Test Comm S/F Store Address
d_pos_in equ 0100h ;Pos In Port Address
d_pos_menu equ 0400h ;Pos Current Menu Send Address
;1Byte/Pos:MenuNumber
;
adr_offset equ 3000h ;Address Offset
;
area_offset equ 3020h ;Area Address Offset
;************************************
; Bit Define
;************************************
;-------------------
;r887 equ 0b2h ;DS12887 /IRQ
bp equ 0b3h
led equ 0b4h
b_chk equ 0b5h ;Battery Error
;-------------------
f_rx equ 00h ;Receive End
f_tx equ 01h ;Transmit End
f_ri equ 02h ;Receive Interrupt
f_day equ 03h ;New Date
f_s00 equ 04h ;No.0 Function Transmit
f_s16 equ 05h ;No.0 Function 16
f_ecs equ 06h ;Error CheckSum
f_upt equ 07h ;Second Update
f_wck equ 08h ;PC Requst Special Pos Clock
f_win equ 09h ;PC Requst Special Pos UserID&&CardSC
bit_c equ 0ah
f_ini equ 0bh ;Initi Succ
f_new equ 0ch ;New Day
f_bat equ 0dh ;Battery Bad Flag
f_none equ 0eh
;----------------------------------
f_bit equ 0fh ;加密功能中用到该标志位
f_sme equ 10h ;若为管理卡或挂失卡,该标志置位
;----------------------------------
;*************************************
; Regist Define
;*************************************
dyer equ 08h
dmon equ 09h
dday equ 0ah
dwek equ 0bh
dhor equ 0ch
dmin equ 0dh
dsec equ 0eh
dcoun equ 0fh
;
r_mod equ 10h
ricon equ 11h ;Receive Count
rir0 equ 12h ;Receive Data Address
;richk equ 13h ;Receive CheckSum
;
ticon equ 11h ;Transmit Count
tir0 equ 12h ;Transmit Data Address
tichk equ 13h ;Transmit CheckSum
;
region equ 14h ;Area
repeat equ 15h
rtchk equ 16h ;CheckSum
shn equ 17h ;Port
;
r_nme equ 18h
subsq equ 19h ;Sub-squence
r_win equ 1ah ;PosName Regist
r_s00 equ 1bh ;No.0 Function
id_limit equ 1ch ;Identity Limit
close equ 1dh ;Pos Power Off
idsc equ 1eh ;UserID && CardSC
uptim equ 1fh ;UpdateTime
;
rc374 equ 23h ;Record Offset
;----------------------------------------
; D7 D6 D5 D4 D3 D2 D1 D0
; ** ** ** ** A18 A17 A16 A15
;-----------------------------------------
h_adr equ 24h ;High-Adress
l_adr equ 25h ;Low-Adress
max_h equ 26h ;Record Total
max_l equ 27h
beg_h equ 28h ;Begin Point
beg_l equ 29h
end_h equ 2ah ;End Point
end_l equ 2bh
reclen equ 2ch ;Record Length
;
r_374 equ 2dh
;----------------------------------------
; D7 D6 D5 D4 D3 D2 D1 D0
; ** ** ** ** A18 A17 A16 A15
;-----------------------------------------
rec_h equ 2eh ;Record Number
rec_l equ 2fh
rcdpl equ 30h ;dpl copy
rcdph equ 31h ;dph copy
menu equ 32h ;Pos Menu
r_err equ 33h ;Error
r_ecs equ 34h ;CheckSum Err
credit equ 35h ;信用等级字节
f16cnt equ 36h
;----------------------------------------modify
dat_h equ 37h ;整数高位字节
dat_l equ 38h ;整数低位字节
sdph equ 39H ;dptr复制字节
sdpl equ 3aH
rr_374 equ 3bH ;r_374复制字节
;----------------------------------------modify
r_sp equ 3ch
b_buf equ 58h ;Backup Buffer
;
r_buf equ 88h ;Receive Buffer (2051)
t_buf equ 88h ;Send Buffer (2051)
t_dat equ 89h ;=r_buf+1: 31Byte=89h--0a7h
t_dt1 equ 0a8h ;32Byte=0a8h--0c7h
tibuf equ 0c8h ;TI Buffer
tihed equ 0cbh ;TI Head
tidat equ 0d1h ;TI Data
ribuf equ 0cbh ;RI buffer
ridat equ 0d1h ;RI Data
;********************************
; special regist
;********************************
th2 equ 0cdh
tl2 equ 0cch
rcap2h equ 0cbh
rcap2l equ 0cah
t2con equ 0c8h
;********************************
; Const Define
;********************************
postab equ 1 ;Pos Table
acctab equ 2 ;Accounts Table
recetab equ 3 ;Receive Table
limitab equ 4 ;Identity Limit Table
statutab equ 5 ;Status Table
menutab equ 6 ;Menu Table
;---------------------------------------------------------
areatab equ 7 ;area table
credtab equ 8
;---------------------------------------------------------
hedlen equ 11 ;RegionHead Record Length
ratfunc equ 17
dti_h equ 80h ;34.4ms
dti_l equ 0
dt1_h equ 0 ;65ms
dt1_l equ 0
over equ 16 ;Address Over
cserr equ 17 ;CheckError
;****************************
ljmp main
org 0003h ;int0
ljmp timer
org 000bh ;t0
mov r_mod,#0
clr f_ri
clr tr0
reti
org 0013h ;int1
ljmp main
org 001bh ;t1
ljmp m_t1
org 0023h
;-------------------------------------------------------------
; Frame=Head+Command+Repeat+ChipS+Region+Record(2)+Data(16)+CheckS
; +Command+Repeat+ChipS+Region+Record(2)+Data(16)+CheckS
; Head=ECh+ECh+ECh
; Command=ComNum*16+SubFrameSquence
; ComNum=0: format
; 1: Read Record
; 2: Write Record
; 3: OK Answer
; 4: Error Answer
; Repeat=ErrType*16+RepCount
;-------------------------------------------------------
push acc ;2
push psw ;2
push 00h
push 01h
push 02h
push 03h
push 04h
push 05h
push 06h
push 07h
;2
jbc ri,r_recv ;2 =8
jbc ti,r_send
ljmp d_reti
;--------------
; Transmit
;--------------
r_send: mov a,ticon
jnz r_se00
clr tr0
setb f_tx
ljmp d_reti
r_se00: mov r0,tir0
mov a,@r0
mov sbuf,a
inc tir0
dec ticon
ljmp d_reti
;------------------
; Receive
;------------------
r_recv: mov r0,sbuf ;2
clr tr0 ;2
jb f_tx,r_re0 ;2
jbc ti,r_send
ljmp d_reti
;
r_re0: push dph ;2
push dpl ;2
mov a,r_mod ;1
rl a ;1
mov dptr,#ritab ;2
jmp @a+dptr ;2
ritab: sjmp r_md00 ;2 =18
sjmp r_md00
sjmp r_md00
sjmp r_md30
;-----------------
; Asys Head
;-----------------
r_md00: mov a,r0 ;1
cjne a,#0ech,r_md01 ;2
setb f_ri
mov rir0,#ribuf
mov ricon,#46
inc r_mod
sjmp r_md20
r_md01: mov r_mod,#0
clr f_ri
sjmp d_iret
;--------------
; Data
;--------------
r_md30: mov a,r0 ;1
mov r0,rir0 ;2
mov @r0,a ;1
inc rir0 ;1
djnz ricon,r_md20 ;2 =7
clr f_ri ;2
setb f_rx ;2
clr f_tx ;2
mov r_mod,#0 ;2
sjmp d_iret ;2 =10
r_md20: mov th0,#dti_h ;2
mov tl0,#dti_l ;2
setb tr0 ;2 =6
d_iret: pop dpl ;2
pop dph ;2 =4
d_reti: pop 07h
pop 06h
pop 05h
pop 04h
pop 03h
pop 02h
pop 01h
pop 00h ;2
pop psw ;2
pop acc
;2
reti ;2 =8
;****************************
;****************************
;****************************
main: mov sp,#r_sp
mov th2,#0ffh ;115200 57600 38400 28800 19200 9600=BPS
mov tl2,#0eeh ;ff:fd ff:fa ff:f7 ff:f4 ff:ee ff:dc
mov rcap2h,#0ffh
mov rcap2l,#0eeh
mov t2con,#00110100b ;tf2 exf2 rclk tclk exen2 tr2 c/t2 cp/rl2
mov scon,#01010000b ;sm0 sm1 sm2 ren tb8 rb8 ti ri
;------
mov tmod,#11h
mov tcon,#00000001b ;TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
mov ip,#00010000b ; * * pt2 ps pt1 px1 pt0 px0
mov ie,#00011011b ; ea * et2 es et1 ex1 et0 ex0
lcall ini_t1
setb ea ;eanbl interrupt
mov r_mod,#0
clr f_rx
clr f_tx
clr f_ri
clr f_day
clr f_ecs
clr f_bit
clr f_s00
clr f_s16
clr f_wck
clr f_win
clr f_ini
clr f_sme
clr bit_c
;
mov dsec,#60
;
mov dptr,#w_2051 ;Init 2051
mov a,#0ffh
movx @dptr,a
;--------------------
; Test Ram
;--------------------
lcall verfity_ram
jnb bit_c,t_clk
mov repeat,#2
ljmp error
t_clk: ;---------------------
; Reset D12887 && Test
;---------------------
mov dptr,#r18a
mov a,#00100000b ;UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
movx @dptr,a
mov dptr,#r18b
mov a,#00010110b ;SET PIE AIE UIE SQWE DM 24/12 DSE
movx @dptr,a
mov dptr,#r18d
movx a,@dptr
mov dptr,#r18c
movx a,@dptr
mov b,dsec
mov r2,#10
lcall sleep
mov a,dsec
cjne a,b,mmain
mov repeat,#3
ljmp error
mmain: clr bp
clr led
mov r2,#4
lcall sleep
setb bp
mov r2,#8
lcall sleep
lcall inial
mov repeat,#0
mov region,#0fh
mov uptim,#0
mov close,#0
mov idsc,#0
mov f16cnt,#0
lcall go_off
lcall comp_date
setb f_tx
setb f_upt
clr f_bat
loop: jb f_ecs,er_chk
lcall rd2051 ;Read 2051
jb f_rx,rece_d
m_887: jb f_ini,loop
jnb f_day,lop2 ;每到00时,f_day置位
clr f_day
lcall clr_count ;在这里添加清预留字节功能
lop2: jnb f_bat,lop3
mov a,dsec
anl a,#0fh
jnz lop3 ;16S
clr bp
mov r2,#2
lcall sleep
setb bp
lop3: jnb f_upt,loop
clr f_upt
lcall update
sjmp loop
;----------------
;----------------
er_chk: clr f_tx
clr ea
mov dptr,#w_2051
mov a,#0ffh
movx @dptr,a
;
ljmp errcs
;===================================
; Dispose Receive Data
;===================================
rece_d: clr f_rx
mov a,#23
add a,#ribuf
mov r1,a
mov r0,#ribuf
mov r2,#23
mov r3,#0
re_d1: mov a,@r0
mov b,@r1
cjne a,b,re_d3
add a,r3
mov r3,a
inc r0
inc r1
djnz r2,re_d1
dec r0
mov a,@r0
add a,@r0
mov b,r3
cjne a,b,re_d3
sjmp receok
re_d3: setb f_tx
ljmp m_887
receok: mov r0,#ribuf
mov a,@r0
anl a,#0fh
mov subsq,a
jz d_deal
mov a,@r0
swap a
anl a,#0fh
cjne a,#2,d_deal
mov a,subsq
dec a
anl a,#3
swap a
add a,#b_buf
mov r1,a
mov r0,#ridat
mov r2,#16
lcall copy_s
mov r_err,#0
lcall ok_ans
ljmp m_887
d_deal: ;------------------
; Receive Data Deal
;------------------
mov a,@r0
swap a
anl a,#0fh
cjne a,#0,dl_01 ;(A)≠0,转dl_01
;(A)=0,格式化管理器命令
dl_00: inc r0
cjne @r0,#0,dl_08 ;repeat
inc r0
cjne @r0,#0,dl_08 ;chips
inc r0
cjne @r0,#0,dl_08 ;region
inc r0
cjne @r0,#0,dl_08 ;record(h)
inc r0
cjne @r0,#0,dl_08 ;record(l)
;5字节均等于0
lcall format
mov subsq,#0
mov r_err,#0
lcall ok_ans
ljmp m_887
dl_01: cjne a,#1,dl_03
lcall read
ljmp m_887
dl_03: cjne a,#2,dl_06
lcall write
ljmp m_887
dl_06: cjne a,#3,dl_08
lcall answer
setb f_tx
ljmp m_887
dl_08: setb f_tx
ljmp m_887
;****************************
; Error Alrm
;****************************
error: mov r5,repeat
err00: clr bp
clr led
;
mov r2,#1
lcall sleep
;
setb bp
setb led
mov r2,#1
lcall sleep
djnz r5,err00
;
mov r2,#30
lcall sleep
sjmp error
;*************************************
; Record CheckSum Error Alrm
;*************************************
errcs: mov r5,r_ecs
ercs0: clr bp
clr led
;
mov r2,#1
lcall sleep
;
setb bp
setb led
mov r2,#1
lcall sleep
djnz r5,ercs0
;
mov r2,#4
lcall sleep
;
clr bp
clr led
mov r2,#3
lcall sleep
setb bp
setb led
;
mov r2,#30
lcall sleep
sjmp errcs
;****************************
;****************************
; Read Record
;****************************
read: inc r0
inc r0
mov a,@r0
anl a,#7
mov b,a
rl a
add a,b
mov dptr,#rd_tab
jmp @a+dptr
rd_tab: ljmp r_chipin
ljmp r_date_time
ljmp r_pos_date
ljmp r_pos_idsc
ljmp card_server
ljmp special_read
ljmp second_read
read_end:
setb f_tx
ret
second_read:
;------------------------------
; Special Read Second Region
;-------------------------------
inc r0
mov a,@r0
anl a,#0fh
cjne a,#2,read_end
mov region,a
lcall quhead
;
inc r0
mov rec_h,@r0
inc r0
mov rec_l,@r0
mov a,rec_h
cjne a,max_h,s_read1
mov a,rec_l
cjne a,max_l,s_read1
s_read1: jc s_read5
mov r0,#tihed
mov @r0,#20h
inc r0
mov @r0,#0
;
mov r0,#tidat
dec r0
dec r0
mov @r0,#0ffh
inc r0
mov @r0,#0ffh
inc r0
mov @r0,#over
inc r0
lcall chktis
mov ticon,#49
mov tir0,#tibuf
setb ti
ret
s_read5: lcall get_ar
;
mov r2,#7
lcall n_dptr
mov r2,#12
mov r0,#tidat
s_read7: movx a,@dptr
mov @r0,a
lcall indptr
inc r0
djnz r2,s_read7
;
mov r1,#tihed
mov @r1,#20h
inc r1
mov @r1,#0
;
lcall chktis
mov ticon,#49
mov tir0,#tibuf
setb ti
ret
;-------------------
; ChipIn Read
;-------------------
r_chipin:
inc r0
mov a,@r0
;
anl a,#0fh
mov region,a
rl a
add a,region
mov dptr,#rcitb
jmp @a+dptr
rcitb: ljmp r_area0
ljmp r_area1
ljmp r_area1 ;=r_area2
ljmp r_area3
ljmp r_area4
ljmp r_area5
ljmp r_area4 ;=r_area6
ljmp r_area7 ;read 7 qu(new)
ljmp r_area8 ;read 8 qu(new)
r_area9: setb f_tx
ret
r_area0: ;-------------------
; Read Region 0
;-------------------
mov a,#00000000b
mov dptr,#d_374
movx @dptr,a
mov r_374,a
inc r0
inc r0
mov a,@r0
jnz rarea03
mov dptr,#adr_offset
mov r0,#b_buf
mov r2,#32
mov reclen,#33
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -