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

📄 iop.asm

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