📄 spl10.asm
字号:
.ifnz SPL10
fProcessVfdWrite:
lda IOP_DATA0_L
and #VFD_DAT_LN_MASK
sta rDataLen_spl10
;;lda #0
;;cmp rDataLen
;;beq OnlySentCmd
ldx #0
lda IOP_DATA1_L
and #VFD_FIRST_DATA_ADDR
sta rAddress
fSentDataloop:
;;sent cmd and address,address evry time sent!
lda IOP_DATA1_L;;#$A0
and #F0H
ora rAddress
sta rOutBuffer
rmb 0,rSpl10CtrlFlag ;;first clear err flag
jsr fspl10synch ;;
bbs 0,rSpl10CtrlFlag,fDataNotWrite
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,fDataNotWrite
lda IOP_DATA2_L,x
sta rOutBuffer
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,fDataNotWrite
inc rAddress
inx
cpx rDataLen_spl10
bne fSentDataloop
;;jmp fDataIsWrite
bra fDataIsWrite
OnlySentCmd:
lda IOP_DATA1_L
sta rOutBuffer
rmb 0,rSpl10CtrlFlag ;;it first clear err flag
jsr fspl10synch
bbs 0,rSpl10CtrlFlag,fDataNotWrite
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,fDataNotWrite
fDataIsWrite:
fDataNotWrite:
smb VFD_DATA_bit,bPortBuff_data
lda bPortBuff_data
sta VFD_DATA_PORT
smb VFD_CLK_bit,bPortBuff_clk
lda bPortBuff_clk
sta VFD_PORT
rts
;;*************************************************************
;;Function : spl10 fProcessVfdRead
;;Description : process VFD read function
;;Input : parameter on memory
;;Output : data memory
;;**************************************************************
fProcessVfdRead:
lda VfdScanCode
sta rOutBuffer
rmb 0,rSpl10CtrlFlag
jsr fspl10synch
bbs 0,rSpl10CtrlFlag,VfdReadfail
jsr fSentOneByte
bbs 0,rSpl10CtrlFlag,VfdReadfail
;;now chang data input
;;lda rPort7Cfg
;;and #VFD_DATA_IN
;;sta rPort7Cfg
rmb VFD_DATA_bit,VFD_DATA_PORT_CFG
jsr fReceiveOneByte
bbs 0,rSpl10CtrlFlag,VfdReadfail
lda rOutBuffer
sta VfdResponse
beq lSkipUpVfdData
lUpVfdData: sta VfdResponse1 ;;it only one byte!
;;jmp VfdReadfail ;;because in VfdReadfail it only chang port output
lSkipUpVfdData:
VfdReadfail:
;;lda rPort7Cfg
;;ora #VFD_DATA_OUT
;;sta rPort7Cfg
smb VFD_DATA_bit,VFD_DATA_PORT_CFG
;;smb VFD_DATA_bit,VFD_DATA_PORT
;;smb VFD_CLK_bit,VFD_PORT
smb VFD_DATA_bit,bPortBuff_data
lda bPortBuff_data
sta VFD_DATA_PORT
smb VFD_CLK_bit,bPortBuff_clk
lda bPortBuff_clk
sta VFD_PORT
rts
;;**************************************************************
;;Function : spl10 synchronization
;;Description : if rSpl10CtrlFlag=1,indication spl10 not ready
;;Input : NONE
;;Output : NONE
;;**************************************************************
fspl10synch:
;;data=0
rmb VFD_DATA_bit,bPortBuff_data
lda bPortBuff_data
sta VFD_DATA_PORT
jsr fCheckAckLow
bbs 0,rSpl10CtrlFlag,fspl10synchfail
;;data=1
smb VFD_DATA_bit,bPortBuff_data
lda bPortBuff_data
sta VFD_DATA_PORT
jsr fCheckAckHigh
bbs 0,rSpl10CtrlFlag,fspl10synchfail
fspl10synchok:
fspl10synchfail:
;;smb 0,rSpl10CtrlFlag
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,bPortBuff_data
lda bPortBuff_data
sta VFD_DATA_PORT
bra DataIsSet
lDataIsHigh:
smb VFD_DATA_bit,bPortBuff_data
lda bPortBuff_data
sta VFD_DATA_PORT
DataIsSet:
;;spl10 clk=0
jsr fDelay1
jsr fDelay1
rmb VFD_CLK_bit,bPortBuff_clk
lda bPortBuff_clk
sta VFD_PORT
jsr fCheckAckLow
bbs 0,rSpl10CtrlFlag,SentOneBytefail ;;flag come from fCheckAckLow
smb VFD_CLK_bit,bPortBuff_clk
lda bPortBuff_clk
sta VFD_PORT
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:
ldy #8
lReceiveOneBit:
;;clk=0
;; rmb VFD_CLK_bit,VFD_PORT
rmb VFD_CLK_bit,bPortBuff_clk
lda bPortBuff_clk
sta VFD_PORT
jsr fCheckAckLow
bbs 0,rSpl10CtrlFlag,lRecvIsfail
bbs VFD_DATA_bit,VFD_DATA_PORT,lRevDataIsHigh
lRevDataIsLow:
clc
rol rOutBuffer
;;jmp lRevOk
bra lRevOk
lRevDataIsHigh:
sec
rol rOutBuffer
lRevOk:
;;clk=1
;;smb VFD_CLK_bit,VFD_PORT
jsr fDelay1;;;;;;;;;========================
smb VFD_CLK_bit,bPortBuff_clk
lda bPortBuff_clk
sta VFD_PORT
jsr fCheckAckHigh
bbs 0,rSpl10CtrlFlag,lRecvIsfail
dey
bne lReceiveOneBit
lRecvIsOk:
lRecvIsfail:
;;smb 0,rSpl10CtrlFlag
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
clc
dec rCounter
bne checkloopfirst
smb 0,rSpl10CtrlFlag ;;it's ack fail flag
bra hackreturn
;;jmp lspl10ackfail
;;bra lspl10ackfail
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
clc
dec rCounter
bne checkloop1first
;;jmp lspl10ackfail
smb 0,rSpl10CtrlFlag
bra lackreturn
lspl10Lackok:
rmb 0,rSpl10CtrlFlag
lackreturn:
plx
rts
.endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -