📄 iop.asm
字号:
jsr Vfdreadkeydata
rts
Vfdswsendinok:
lda rVfdcmdcount
bne Vfdsendledok
inc rVfdcmdcount
lda rVfdswdata ;;16312 write led port
ror rVfdswdata
bra Vfdsendled
Vfdsendledok:
jsr Vfdsetstbhigh
inc rVfdcmdcount
lda #43H ;;16312 write led command
bra Vfdsendled
Vfdswreadinok:
ldx rVfdswindex
lda rVfdtempdata
sta rVfdswbuf,x
.ifnz SUPPORT_VFD_ROLL
eor #%00000011
and #%00000011
.else
eor rVfdswbuf
.endif
ldx rVfdswindex
beq Vfdswnokey
sta rVfdswbuf,x
Vfdswnokey:
inc rVfdswindex
lda rVfdloopcount
beq Vfdswfinish
dec rVfdloopcount
dec rVfdstate
jsr Vfdsetstbhigh
bra Vfdswreturn0
.endif
Vfdswfinish:
inc rVfdreptime ;;inc repeat count
.ifnz SUPPORT_VFD_SWITCH
jsr Vfdswgetdata
.endif
bbs 7,rVfdkeydata,Vfdswnorep
stz rVfdreptime
stz rVfddataold
Vfdswnorep:
inc rVfdstate
stz rVfdstatus
stz rVfdswindex
Vfdswreturn0:
stz rVfdcmdcount
Vfdswreturn:
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
.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 #150
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_CLK output
.endif
;smb VFDB_STB,VFD_PORT
rts
Lcdsetstbok:
.ifnz SUPPORT_DEMO
;.ifnz 0
smb VFDB_STB,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG ;;set VFD_CLK output
.endif
rmb VFDB_STB,VFD_PORT
rts
;;**************************************************************************;;
;; Set LCD STB high and VFD DATA input ;;
;;**************************************************************************;;
Lcdsetstbhigh:
.ifnz SUPPORT_DEMO
;.ifnz 0
rmb VFDB_STB,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG ;;set VFD_CLK output
.endif
rts
.endif
.ifnz SUPPORT_SPL10
do_spl10_service:
bbs 0,spl10_service_status,spl10_read
jsr do_spl10_wr
bcc service_wr_not_ok
smb 0,spl10_service_status
service_wr_not_ok:
bra service_exit
spl10_read:
bbs 1,spl10_service_status,reset_spl10
jsr do_spl10_rd
bcc service_rd_not_ok
smb 1,spl10_service_status
lda #90
sta spl10_wr_data
lda #8
sta spl10_write_count
service_rd_not_ok:
bra service_exit
reset_spl10:
bbs 2,spl10_service_status,reset_write
jsr do_spl10_sync
bcc service_exit
smb 2,spl10_service_status
bra service_exit
reset_write:
jsr do_write_bytes
bcc service_exit
restart_service:
stz spl10_service_status
service_exit:
rts
do_spl10_wr:
bbs 0,spl10_wr_status,wr_write_cmd
jsr do_spl10_sync
bcc sync_not_ok
smb 0,spl10_wr_status
lda #SPL10_WR_CMD
ora spl10_buf_count
sta spl10_wr_data
lda #8
sta spl10_write_count
sync_not_ok:
bra wr_exit
wr_write_cmd:
bbs 1,spl10_wr_status,wr_write_data
jsr do_write_bytes
bcc write_cmd_not_ok
smb 1,spl10_wr_status
ldx spl10_buf_count
lda SPL10_BUFFER_BASE,x
sta spl10_wr_data
lda #8
sta spl10_write_count
inc spl10_buf_count
lda spl10_buf_count
cmp #SPL10_BUFFER_SIZE
bne count_is_free
stz spl10_buf_count
count_is_free:
write_cmd_not_ok:
bra wr_exit
wr_write_data:
bbs 2,spl10_wr_status,write_next
jsr do_write_bytes
bcc write_data_not_ok
smb 2,spl10_wr_status
write_data_not_ok:
bra wr_exit
write_next:
stz spl10_wr_status
sec
rts
wr_exit:
clc
rts
do_spl10_rd:
bbs 0,spl10_rd_status,rd_write_cmd
jsr do_spl10_sync
bcc rd_sync_not_ok
smb 0,spl10_rd_status
lda #SPL10_RD_CMD
sta spl10_wr_data
lda #8
sta spl10_write_count
rd_sync_not_ok:
bra rd_exit
rd_write_cmd:
bbs 1,spl10_rd_status,rd_read_data
jsr do_write_bytes
bcc rd_cmd_not_ok
smb 1,spl10_rd_status
lda #8
sta spl10_read_count
rd_cmd_not_ok:
bra rd_exit
rd_read_data:
bbs 2,spl10_rd_status,restart_read
jsr do_read_bytes
bcc rd_data_no_ok
smb 2,spl10_rd_status
rd_data_no_ok:
bra rd_exit
restart_read:
lda spl10_rd_data
;;cmp rd_old_data
;;beq key_is_null
;;lda spl10_rd_data
;;sta rd_old_data
;;beq key_is_null
and #!VFD_REPEAT
ora #VFD_READY
sta IOP_DATA5_L
key_is_null:
stz spl10_rd_status
sec
rts
rd_exit:
clc
rts
do_write_bytes:
bbs 0,write_byte_status,wr_set_stb_low
rol spl10_wr_data
bcs wr_set_data_high
smb VFDB_DAT,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG
rmb VFDB_DAT,VFD_PORT
smb 0,write_byte_status
bra write_exit
wr_set_data_high:
rmb VFDB_DAT,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG
smb 0,write_byte_status
bra write_exit
wr_set_stb_low:
bbs 1,write_byte_status,wr_wait_ack_low
smb VFDB_STB,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG
rmb VFDB_STB,VFD_PORT
smb 1,write_byte_status
bra write_exit
wr_wait_ack_low:
bbs 2,write_byte_status,wr_wait_ack_high
bbr VFDB_CLK,VFD_PORT,wr_ack_is_low
bra write_exit
wr_ack_is_low:
rmb VFDB_STB,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG
smb 2,write_byte_status
bra write_exit
wr_wait_ack_high:
bbs VFDB_CLK,VFD_PORT,wr_next_bit
bra write_exit
wr_next_bit:
stz write_byte_status
dec spl10_write_count
beq write_byte_ok
write_exit:
clc
rts
write_byte_ok:
sec
rts
do_read_bytes:
bbs 0,read_byte_status,rd_wait_ack_low
smb VFDB_STB,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG
rmb VFDB_STB,VFD_PORT
smb 0,read_byte_status
bra read_exit
rd_wait_ack_low:
bbs 1,read_byte_status,rd_set_stb_high
bbr VFDB_CLK,VFD_PORT,rd_ack_is_low
bra read_exit
rd_ack_is_low:
rmb VFDB_DAT,Vfd_init1
lda Vfd_init1
sta VFD_PORT_CFG
bbs VFDB_DAT,VFD_PORT,rd_dat_is_high
clc
rol spl10_rd_data
smb 1,read_byte_status
bra read_exit
rd_dat_is_high:
sec
rol spl10_rd_data
smb 1,read_byte_status
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -