⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iop.asm

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 ASM
📖 第 1 页 / 共 5 页
字号:
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
            bra read_exit
rd_set_stb_high:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -