📄 iop.asm
字号:
bcc Vfddatalow
.ifnz SUPPORT_DEMO
rmb VFDB_DAT,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG ;;set VFD_DAT input
.else
smb VFDB_DAT,VFD_PORT
.endif
bra Vfdsendreturn
Vfddatalow:
rmb VFDB_DAT,VFD_PORT ;;rbhung set VFD_DAT to low before output
.ifnz SUPPORT_DEMO
smb VFDB_DAT,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG ;;set VFD_DAT output
.endif
Vfdsendreturn:
lda rVfdsendcount
rts
.endif ;;FOR_IOPSN164
;;**************************************************************************;;
;; Write VFD command and data ;;
;;**************************************************************************;;
Vfdwservice:
.ifnz FOR_IOPSN164
rts
.else
sec
jsr Vfdsendonebyte
bne Vfdwreturn01 ;;rbhung for jump to near return
Vfdbyteok:
lda rVfdstate
beq Vfdsednext
stz rVfdstate
lda rVfdUpdateTime
cmp #5
bcc lSkipUpdateWrite
stz rVfdloopcount
stz rVfdUpdateTime
lSkipUpdateWrite:
lda #150
sta rVfdscantime
Vfdsednext:
lda rVfdloopcount
.ifnz FOR_IOPSN6311
cmp #30
.else
cmp #18;;共18个字节。
.endif
bcc Vfdclearstb
jsr Vfdsetstbhigh
inc rVfdstatus
Vfdwreturn01:
rts
Vfdclearstb:
inc rVfdloopcount
tax
cmp #3 ;;sent 3 command,then data
bcs check_1
jsr Vfdsetstbhigh
check_1:
lda rVfdloopcount
cmp #1 ;;第1个是命令0x02,用于控制显示模式
bne check_2
jsr Vfdsetstbhigh
.ifnz FOR_IOPSN6311
lda #00H
.else
lda #02H
.endif
jmp sta_and_sent
check_2:
lda rVfdloopcount
cmp #2 ;;第2个是命令0x40,用于发送数据
bne check_3
jsr Vfdsetstbhigh
lda #40H
jmp sta_and_sent
check_3:
lda rVfdloopcount
cmp #3 ;;第3个是命令0xc0,用于设定地址
bne check_16
jsr Vfdsetstbhigh
lda #c0H
jmp sta_and_sent
check_16:
lda rVfdloopcount
.ifnz FOR_IOPSN6311
cmp #28
.else
cmp #16 ;;第16个是命令0x8f,用于控制显示
.endif
bne check_17;Vfdclearstb1
jsr Vfdsetstbhigh
lda $401 ;;从共享区读进来,便于顶层调用。
jmp sta_and_sent
check_17:
lda rVfdloopcount
.ifnz FOR_IOPSN6311
cmp #29
.else
cmp #17 ;;第17个也是命令0x41,用于LED
.endif
bne check_18
jsr Vfdsetstbhigh
lda #41H
jmp sta_and_sent
check_18:
lda rVfdloopcount
.ifnz FOR_IOPSN6311
cmp #30;;#18 ;;第17个是LED data
.else
cmp #18
.endif
bne Vfdclearstb1
lda $400 ;;上层把LED data放在这里
jmp sta_and_sent
Vfdclearstb1:
lda VFD_BUFFER_BASE,x
sta_and_sent:
sta rVfddata
jsr Vfdsetcount
Vfdwreturn:
rts
.endif ;;for iopsn164
;;**************************************************************************;;
;; VFD read data subroute ;;
;;**************************************************************************;;
Vfdrservice:
.ifnz FOR_IOPSN164
rts
.else
lda rVfdstate ;;init read key
bne Vfdreadstart ;;if read first is set
sta rVfdkeydata ;;clear vfd key data
inc rVfdstate ;;set first read
;sec ;;set STB low
rmb 5,rGameflag
jsr Vfdsetcount ;;count = 16 bits
lda #42H ;;16312 read key command
sta rVfddata
inc rVfdUpdateTime ;;rbhung for increase VFD read count
ldy #48
Vfdreadstart:
jsr Vfdsendonebyte
bne Vfdrreturn
tya
beq Vfdreadinok
jsr Vfdreadkeydata ;;if data read back ok
rts
Vfdreadinok:
jsr Vfdgetcode
Vfdkeyreturn:
inc rVfdstate
jsr Vfdsetstbhigh
.ifnz SUPPORT_VFD_ROLL
lda #1
sta rVfdloopcount
.else
.ifnz SUPPORT_VFD_SWITCH
lda #4
sta rVfdloopcount
.endif
.endif
Vfdrreturn:
rts
;;**************************************************************************;;
;; VFD read 24 bits ;;
;;**************************************************************************;;
Vfdreadkeydata:
lda Vfd_init1
and #!VFD_DATA
sta VFD_PORT_CFG
tya
and #%00000001 ;;VFD CLK clear to low
beq Vfdclklow1
.ifnz SUPPORT_VFD_SWITCH
lda rVfdstate ;;vfdstate >=2 is read switch
cmp #2
bcs Vfdreadsw
.endif
.ifnz SUPPORT_VFD_SW
lda rVfdstate ;;vfdstate >=2 is read switch
cmp #2
bcs Vfdreadsw
.endif
bbs 7,rVfdkeydata,Vfdkeyisready
bbr VFDB_DAT,VFD_PORT,Vfddataislow
tya
;sta vfd_key_data
smb 7,rVfdkeydata
Vfddataislow:
inc rVfdkeydata
Vfdreadsw: ;;direct read VFD DATA 8 bit data
.ifnz SUPPORT_VFD_SWITCH
bbs VFDB_DAT,VFD_PORT,Vfdswdataishigh
clc
Vfdswdataishigh:
;ror rVfdtempdata
.endif
.ifnz SUPPORT_VFD_SW
bbs VFDB_DAT,VFD_PORT,Vfdswdataishigh
clc
Vfdswdataishigh:
ror vfd_sw_data
.endif
bra Vfdkeyisready1
Vfdkeyisready:
bbr VFDB_DAT,VFD_PORT,Vfdkeyisready1
lda rVfddataold
bne Vfdkeyisready1
sta rVfdkeydata
Vfdkeyisready1:
.ifnz SUPPORT_DEMO
smb VFDB_CLK,VFD_PORT ;;rbhung set VFD_CLK output high
;rmb VFDB_CLK,Vfd_init1
;lda Vfd_init1
;sta VFD_PORT_CFG ;;set VFD_CLK input
.else
smb VFDB_CLK,VFD_PORT
.endif
bra Vfddatalow1
Vfdclklow1:
.ifnz SUPPORT_DEMO
smb VFDB_CLK,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG ;;set VFD_CLK output
.endif
rmb VFDB_CLK,VFD_PORT
Vfddatalow1:
dey
rts
;;**************************************************************************;;
;; VFD get sw code ;;
;;**************************************************************************;;
Vfdswgetdata:
.ifnz SUPPORT_VFD_ROLL
;lda rVfdswbuf+1
;and #%00000011
;sta rVfdswbuf+1
;cmp rVfdswbuf+2
beq Vfdswexit
;lda rVfdswbuf+1
;sta rVfdswbuf+2
beq Vfdswexit
clc
adc #24
ora #%10000000
sta rVfdkeydata
jsr Vfdgetcode
Vfdswexit:
rts
.else
.ifnz SUPPORT_VFD_SWITCH
ldy #16
Vfdswloop0:
ldx #4
Vfdswloop1:
;lsr rVfdswbuf,x
bcs Vfdhaveswdata
dey
beq Vfdswexit
dex
bne Vfdswloop1
bra Vfdswloop0
Vfdhaveswdata:
tya
adc #23
ora #%10000000
sta rVfdkeydata
jsr Vfdgetcode
Vfdswexit:
rts
.endif
.endif
.endif ;;FOR_IOPSN164
.endif
.ifnz SUPPORT_LCD
;;**************************************************************************;;
;; Lcd send data service llcc ;;
;;**************************************************************************;;
Lcdwservice:
sec
jsr Lcdsendbyte
bne Lcdwreturn
lda rLcdscantime
bne Lcdsednext
smb 0,rLcdstate
stz rLcdloopcount
;lda #70
lda #250
sta rLcdscantime
lda #8
sta rLcdgamecount
Lcdsednext:
bbr 0,rLcdstate,Lcdwreturn
lda rLcdloopcount
cmp VFD_COUNT_BASE
bcc Lcdclearstb
jsr Lcdsetstbhigh
stz rLcdstate
rts
Lcdclearstb:
lda rLcdloopcount
tax
cmp #10
beq Lcdisdata
bcs Lcdclearstb1
lda #0fH
sta rLcdtemp
lda #24
bra Lcdiscommand
Lcdisdata:
lda #01H
sta rLcdtemp
lda #18
Lcdiscommand:
sta rLcdsendcount
jsr Lcdsetstbhigh
lda rLcdloopcount
tax
lda VFD_BUFFER_BASE,x
sta rLcddata
inc rLcdloopcount
lda rLcdloopcount
tax
lda VFD_BUFFER_BASE,x
sta rLcddata+1
inc rLcdloopcount
sec
jsr Lcdsetcount
rts
Lcdclearstb1:
stz rLcdtemp
lda rLcdloopcount
tax
lda VFD_BUFFER_BASE,x
sta rLcddata
inc rLcdloopcount
lda #16
sta rLcdsendcount
sec
jsr Lcdsetcount
Lcdwreturn:
rts
;;**************************************************************************;;
;; Set STB for LCD command or data ;;
;; if c=1 then VFD_STB = low ,else c=0 VFD_STB = high ;;
;;**************************************************************************;;
Lcdsetcount:
jsr Flashinout
bcs Lcdsetstbok
.ifnz SUPPORT_DEMO
;.ifnz 0
rmb VFDB_STB,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG ;;set VFD_STB input
.endif
;smb VFDB_STB,VFD_PORT
rts
Lcdsetstbok:
rmb VFDB_STB,VFD_PORT
.ifnz SUPPORT_DEMO
;.ifnz 0
smb VFDB_STB,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG ;;set VFD_STB output
.endif
;rmb VFDB_STB,VFD_PORT
rts
;;**************************************************************************;;
;; Set LCD STB high and VFD DATA input ;;
;;**************************************************************************;;
Lcdsetstbhigh:
.ifnz SUPPORT_DEMO
;.ifnz 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -