📄 pmp_mcu810_diver.asm
字号:
.ifnz PMP_MCU810_DRIVER
fProcessPMP_MCU810:
;;get the cmd value
lda IOP_DATA0_L
and #VFD_DAT_LN_MASK
sta rDataLen_spl10
lda rDataLen_spl10
cmp #4
bcc OnlySentCmd
fSentCmdData:
rmb 0,rSpl10CtrlFlag
jsr fspl10synch
bbs 0,rSpl10CtrlFlag,fDataNotWrite
lda IOP_DATA2_H ;;send cmd
sta rOutBuffer
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,fDataNotWrite
lda IOP_DATA2_L ;;send data
sta rOutBuffer
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,fDataNotWrite
bra fDataIsWrite
OnlySentCmd:
rmb 0,rSpl10CtrlFlag
jsr fspl10synch
bbs 0,rSpl10CtrlFlag,fDataNotWrite
lda IOP_DATA2_H ;;send cmd
sta rOutBuffer
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,fDataNotWrite
fDataIsWrite:
fDataNotWrite:
smb VFD_DATA_bit,VFD_DATA_PORT ;;DATA=1
smb VFD_CLK_bit,VFD_PORT ;;CLK=1
rts
;;*************************************************************
;;Function : spl10 fProcessReadKey
;;Description : process read key data from MCU810
;;Input : parameter on memory
;;Output : data memory
;;**************************************************************
fProcessReadKey:
lda ReadKeyCmd
sta rOutBuffer
rmb 0,rSpl10CtrlFlag
jsr fspl10synch
bbs 0,rSpl10CtrlFlag,PMPReadkeyfail
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,PMPReadkeyfail
jsr fReceiveOneByte
bbs 0,rSpl10CtrlFlag,PMPReadkeyfail
lda rOutBuffer
sta IOP_DATA3_L
lSkipUpVfdData:
PMPReadkeyfail:
smb VFD_DATA_bit,VFD_DATA_PORT ;;DATA=1
smb VFD_CLK_bit,VFD_PORT ;;CLK=1
rts
;;*************************************************************
;;Function : spl10 fProcessReadBat
;;Description : process read bat from MCU810
;;Input : parameter on memory
;;Output : data memory
;;**************************************************************
fProcessReadBat:
lda ReadBatCmd
sta rOutBuffer
rmb 0,rSpl10CtrlFlag
jsr fspl10synch
bbs 0,rSpl10CtrlFlag,PMPReadBATfail
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,PMPReadBATfail
jsr fReceiveOneByte
bbs 0,rSpl10CtrlFlag,PMPReadBATfail
lda rOutBuffer
sta IOP_DATA7_H ;;for MP4 not correct
PMPReadBATfail:
smb VFD_DATA_bit,VFD_DATA_PORT ;;DATA=1
smb VFD_CLK_bit,VFD_PORT ;;CLK=1
rts
;;**************************************************************
;;Function : spl10 synchronization
;;Description : if rSpl10CtrlFlag=1,indication spl10 not ready
;;Input : NONE
;;Output : NONE
;;**************************************************************
fspl10synch:
;;data=0
rmb VFD_DATA_bit,VFD_DATA_PORT
jsr fCheckAckLow
bbs 0,rSpl10CtrlFlag,fspl10synchfail
;;data=1
smb VFD_DATA_bit,VFD_DATA_PORT
jsr fCheckAckHigh
bbs 0,rSpl10CtrlFlag,fspl10synchfail
fspl10synchok:
fspl10synchfail:
rts
;;**************************************************************
;;Function : sent byte to spl10
;;Description : if rSpl10CtrlFlag=1 ,indication communication fail
;;Input : rOutBuffer
;;Output : NONE
;;**************************************************************
fSentOneByte:
ldy #8
SentOneBit:
rol rOutBuffer
bcs lDataIsHigh
rmb VFD_DATA_bit,VFD_DATA_PORT ;; DATA=0
bra DataIsSet
lDataIsHigh:
smb VFD_DATA_bit,VFD_DATA_PORT ;; DATA=1
DataIsSet:
jsr fDelay1
jsr fDelay1
rmb VFD_CLK_bit,VFD_PORT ;; CLK=0
jsr fCheckAckLow
bbs 0,rSpl10CtrlFlag,SentOneBytefail ;;flag come from fCheckAckLow
smb VFD_CLK_bit,VFD_PORT ;;CLK=1
jsr fCheckAckHigh
bbs 0,rSpl10CtrlFlag,SentOneBytefail
dey
bne SentOneBit
SentOneBytefail:
rts
;;**************************************************************
;;Function : receive one byte from spl10
;;Description : if rSpl10CtrlFlag=1 indication no receive
;;Input :NONE
;;Output :rOutBuffer
;;**************************************************************
fReceiveOneByte:
rmb VFD_DATA_bit,VFD_DATA_PORT_CFG ;;set DATA input
ldy #8
lReceiveOneBit:
rmb VFD_CLK_bit,VFD_PORT ;; CLK=0
jsr fCheckAckLow
bbs 0,rSpl10CtrlFlag,lRecvIsfail
bbs VFD_DATA_bit,VFD_DATA_PORT,lRevDataIsHigh
lRevDataIsLow:
clc
rol rOutBuffer
bra lRevOk
lRevDataIsHigh:
sec
rol rOutBuffer
lRevOk:
jsr fDelay1
smb VFD_CLK_bit,VFD_PORT ;;CLK=1
jsr fCheckAckHigh
bbs 0,rSpl10CtrlFlag,lRecvIsfail
dey
bne lReceiveOneBit
lRecvIsOk:
lRecvIsfail:
smb VFD_DATA_bit,VFD_DATA_PORT_CFG ;;set DATA output
rts
;;**************************************************************
;;Function : check SPL10 ACK
;;Description : if rSpl10CtrlFlag=1 ,indication no ack fail
;;Input : NONE
;;Output : NONE
;;**************************************************************
fCheckAckHigh:
phx
lda #$ff
sta rCounter
checkloopfirst:
ldx #$ff
checkloop:
nop
nop
bbs VFD_STB_bit,VFD_PORT,lspl10ackok
dex
bne checkloop
dec rCounter
bne checkloopfirst
smb 0,rSpl10CtrlFlag ;;it's ack fail flag
bra hackreturn
lspl10ackok:
rmb 0,rSpl10CtrlFlag ;;it's ack ok flag
hackreturn:
plx
rts
fCheckAckLow:
phx
lda #$ff
sta rCounter
checkloop1first:
ldx #$ff
checkloop1:
nop
nop
bbr VFD_STB_bit,VFD_PORT,lspl10Lackok
dex
bne checkloop1
dec rCounter
bne checkloop1first
smb 0,rSpl10CtrlFlag
bra lackreturn
lspl10Lackok:
rmb 0,rSpl10CtrlFlag
lackreturn:
plx
rts
.endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -