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

📄 iop.asm

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 ASM
📖 第 1 页 / 共 5 页
字号:
            bne      Qcodenochange
            lda      #8
            sta      rQcodebitcount
            inx
Qcodenochange:
            smb      Q_SQCK,QCODE_SQCK_PORT
            bra      Qcodetestok
Qcodeclklow:
            rmb      Q_SQCK,QCODE_SQCK_PORT
Qcodetestok:
            dec      rQcodecount
            bne      Qcodereturn
Qcodereadok:
           ; stz      rQcodestate
             bbr      4,IOP_DATA5_H,Qcodereturn1
           ; bbr      0,rQcodecrc,Qcodereturn1
           ; bbr      2,rQcodestatus,Qcodereturn1
            ldx      #0
xxyy:
            lda      rQcodedata,x
            sta      QCODE_BUFFER,x
            inx
            cpx      #10
            bne      xxyy
           
            jsr      Flashinout
            smb      2,IOP_DATA5_H
Qcodereturn1:
            stz      rQcodestatus
            rmb      3,IOP_DATA5_H    ;;qcode read free
Qcodereturn:
            rts
  .endif  ;;uper is not SUPPORT_QCODE_PTOW
.endif  ;;SUPPORT_QCODE

;;**************************************************************************;;
;; main loop                                                                ;;
;;**************************************************************************;;
lToMainLoop:
.ifnz SUPPORT_QCODE
Enableqcode:
            jsr     Qcodeservice
.endif

Notserviceqcode:
            jsr     Irservice
           
.ifnz SUPPORT_QCODE
            bbs      1,rQcodestatus,lToMainLoop
.endif
           
.ifnz SUPPORT_LCD
            jsr     Lcdwservice
.endif

.ifnz SUPPORT_SPL10
            lda spl10_scan_time
            bne scan_spl10_interval
			jsr do_spl10_service
            bcc scan_spl10_interval
            lda #70
            sta spl10_scan_time
scan_spl10_interval:            
.endif

.ifnz 0;;SUPPORT_VFD
            lda     rVfdstatus           ;;if high  vfd can write
            bne     Vfdreadkey        
            
            jsr     Vfdwservice
                        
Vfdreadkey:
            lda     rVfdscantime
            bne     Vfdserviceend           ;lToMainLoop
            lda     rVfdstate
            cmp     #2           
            bcs     Vfdreadswitch
            
            jsr     Vfdrservice            
            
            bra     Vfdserviceend    ;lToMainLoop            
            
Vfdreadswitch:
  .ifnz SUPPORT_VFD_SW
            jsr      vfd_read_sw_sr
  .endif ;SUPPORT_VFD_SW
            inc      rVfdstate
            stz      rVfdstatus 
Vfdserviceend:            
 		
.endif  ;;SUPPORT_VFD
            
.ifnz  SUPPORT_DSA
Dsadoing:
            jsr    Dsaservice
.endif

            bbs     5,IOP_DATA5_H,lToMainLoop
            smb     5,IOP_DATA5_H
            jsr     SettimerB
            bra     lToMainLoop


.ifnz SUPPORT_VFD
.ifnz FOR_IOPSN164
.else
;;**************************************************************************;;
;; VFD get key/switch code subroute                                                   ;;
;;**************************************************************************;;
Vfdgetcode:
            bbr      7,rVfdkeydata,Vfdexitrepeat
            ;lda      rVfddataold
            ;bne      Vfdisrepeat
            lda      rVfdkeydata
            ;and      #%00111111
            ;cmp      rVfddataold
            ;beq      Vfdisrepeat
            ;beq      Vfdexitrepeat
            ;sta      rVfddataold
            ;and      #!VFD_REPEAT        ;;bit 6
            ora      #VFD_READY           ;;set ready flag bit7
            sta      IOP_DATA5_L
            rts
Vfdisrepeat:
            ;lda      rVfdreptime
            ;cmp      #11                 ;;11*10=110ms for vfd key repeat
            ;bcc      Vfdexitrepeat
            ;stz      rVfdreptime
            ;lda      rVfddataold        
            ;ora      #(VFD_REPEAT.or.VFD_READY)           ;;clear repeat flag
            ;ora      #VFD_READY           ;;set ready flag
            ;sta      IOP_DATA5_L
Vfdexitrepeat:
            rts

.endif
.endif

.ifnz SUPPORT_SPL10
do_spl10_sync:
			bbs  0,spl10_sync_status,sn_wait_ack_low
			smb  VFDB_DAT,Vfd_init1
			lda  Vfd_init1
			sta  VFD_PORT_CFG
			rmb  VFDB_DAT,VFD_PORT
			smb  0,spl10_sync_status              
			bra  sync_exit
sn_wait_ack_low:              
			bbs 1,spl10_sync_status,sn_wait_ack_high
			bbr VFDB_CLK,VFD_PORT,ack_is_low
			bra sync_exit
ack_is_low:   
			smb  1,spl10_sync_status
			rmb  VFDB_DAT,Vfd_init1
			lda  Vfd_init1
			sta  VFD_PORT_CFG              
			bra sync_exit
sn_wait_ack_high:              
			bbs VFDB_CLK,VFD_PORT,sn_ack_is_high
			bra sync_exit
sn_ack_is_high: 
			stz spl10_sync_status
             sec
			rts
sync_exit:
             clc
			rts
.endif



;;**************************************************************************;;
GAMEPAD_PG:     .section                                                    ;;
;;**************************************************************************;;



            .CODE
;;**************************************************************************;;
;;Reset entry                                                               ;;
;;**************************************************************************;;
vReset:
            sei                            ;;initialize stack point              
            ldx     #FFH
            txs
                                           ;;Clear work ram 
            lda     #0                     ;;( all variable =0 form reset )
            ldx     #RAM_TOP
lClearAllRAM:
            sta     0,x
            inx
            cpx     #RAM_BOTTOM
            bne     lClearAllRAM
           ; lda     #22
           ; sta     VFD_COUNT_BASE

;;**************************************************************************;;
;;initialize I/O                                                            ;;
;;**************************************************************************;;
.ifnz  SUPPORT_DEMO
            lda     #(!QCODE_SCOR)
            sta     QCODE_PORT_CFG
            lda     #((QCODE_SQCK)&(!IR_IN))
            sta     IR_PORT_CFG            ;;IR and SQCK init
  .ifnz  SUPPORT_VFD
            lda     #!(VFD_DATA.or.VFD_CLK.or.VFD_STB)
            sta     Vfd_init1 
                                           ;;VFD STB=pin21 
            sta     VFD_PORT_CFG           ;;VFD DAT=pin23
                                           ;;VFD ACK=pin22
  .endif   ;;SUPPORT_VFD                            

            lda     #!(GAME_D1.or.GAME_D2.or.QCODE_SQDT)
            sta     GAME_PORT_CFG

.else  ;;upper is SUPPORT_DEMO

            lda     #QCODE_SQCK
            sta     QCODE_PORT_CFG
            lda     #((VFD_STB)&(!IR_IN))
            sta     VFD_PORT_CFG1          ;;IR and VFD_STB init
            lda     #(VFD_DATA.or.VFD_CLK)
            sta     Vfd_init1              ;;SQCK is port2.bit
            sta     VFD_PORT_CFG           ;;VFD,I2C all pin is output
                                           ;; IR pin is input (Port 7)
                                           ;;STB=1,CLK=1,DATA=?,SDA=0,SCL=0
            lda     #!(GAME_D1.or.GAME_D2)
            sta     GAME_PORT_CFG
.endif  ;;upper is not SUPPORT_DEMO


.ifnz  SUPPORT_DSA
            stz     DSA_PORT_CFG
.endif

.ifnz  SUPPORT_QCODE
            lda    #QCODE_SHOCK
            sta    QCODE_SHOCK_CFG
.endif

            smb     5,IOP_DATA5_H          ;;disable timerB change

            lda     #.low. IR_SCAN_TIME
            sta     TimerB_Lo  
                                           ;; and clear counter
            lda     #.high.IR_SCAN_TIME
            sta     TimerB_Hi
            
            lda     #INT_TIMER_B           ;;enable INTR mask
            sta     IntMask                ;;enable IRQ

            cli
            jmp     lToMainLoop

SettimerB:
            sei
            lda     IOP_DATA0_L
            sta     TimerB_Lo  
            lda     IOP_DATA0_H     
            sta     TimerB_Hi
            cli
            rts


;;====================VFD START=====================
.ifnz SUPPORT_VFD

  .ifnz    INDEPENDENT_GAME_PORT  
;;==================================================
;; just set I/O pin as input,then
;; use external pull high resister to get 5v output
;; SUNPLUS huziqin 2003-7-17
;;==================================================
set_game_stb_h:
		lda #((!QCODE_SCOR)&(!GAME_STB))
		sta GAME_PORT_CFG_STB
		rts

set_game_stb_l:
		rmb GAMEB_STB,GAME_PORT_STB	
		lda #((!QCODE_SCOR).or.(GAME_STB))
		sta GAME_PORT_CFG_STB
		rts

set_game_clk_h:
		lda #(!GAME_CLK)
		sta GAME_PORT_CFG_CLK
		rts

set_game_clk_l:
		rmb GAMEB_CLK,GAME_PORT_CLK	
		lda #(GAME_CLK)
		sta GAME_PORT_CFG_CLK
		rts
  .endif  ;;INDEPENDENT_GAME_PORT


;;**************************************************************************;;
;; Set VFD STB high and VFD DATA input                                      ;;
;;**************************************************************************;;
.ifnz FOR_IOPSN164
			 
.else
Vfdsetstbhigh:
  .ifnz SUPPORT_DEMO
            lda      #!(VFD_DATA.or.VFD_STB)       ;;rbhung set VFD_CLK output high
            sta      Vfd_init1
            sta      VFD_PORT_CFG
            smb      VFDB_CLK,VFD_PORT
    .ifnz    INDEPENDENT_GAME_PORT  
			jsr      set_game_stb_h
			jsr      set_game_clk_h 
    .endif  ;;.ifnz    INDEPENDENT_GAME_PORT
  .else ;;SUPPORT_DEMO
            lda      Vfd_init1
            ora      #(VFD_DATA.or.VFD_CLK)
            sta      VFD_PORT_CFG
            smb      VFDB_STB,VFD_PORT1
            smb      VFDB_DAT,VFD_PORT
  .endif  ;;not SUPPORT_DEMO
            rts


;;**************************************************************************;;
;; Set STB for VFD command or data                                          ;;
;; if c=1 then    VFD_STB = low ,else c=0 VFD_STB = high                    ;;
;;**************************************************************************;;
Vfdsetcount:
             jsr     Flashinout
             lda     #16
             sta     rVfdsendcount
             
  .ifnz SUPPORT_DEMO
             rmb     VFDB_STB,VFD_PORT      ;;rbhung set VFD_STB to low before output 
             smb     VFDB_STB,Vfd_init1
             lda     Vfd_init1
             sta     VFD_PORT_CFG           ;;IR and VFD_STB init
             rmb     VFDB_CLK,VFD_PORT
    .ifnz    INDEPENDENT_GAME_PORT
             jsr     set_game_stb_l 
             jsr     set_game_clk_l
    .endif  ;;.ifnz    INDEPENDENT_GAME_PORT
  .else  ;;SUPPORT_DEMO
             rmb     VFDB_STB,VFD_PORT1
  .endif ;;not SUPPORT_DEMO 
             rts


;;**************************************************************************;;
;; Send one byte VFD command or data    ssdd     
;; in: rVfddata rVfdsendcount
;; out: none                          ;;
;;**************************************************************************;;
Vfdsendonebyte:
             lda     rVfdsendcount
             beq     Vfdsendreturn
             dec     rVfdsendcount
             bbs     0,rVfdsendcount,Vfdclklow

             lda     rVfdstatus
             bne     Vfdclkhigh

             lda     rVfdloopcount
             cmp     #1
             bne     Vfdclkhigh
             bbs      5,rGameflag,Vfdclkhigh

             lda      #(GAME_D1.or.GAME_D2)
             sta      GAME_PORT_CFG
             sta      GAME_PORT
             stz      GAME_PORT_CFG

             sec
             bbs     GAMEP_D1,GAME_PORT, Game1high
             clc
Game1high:
             ror     rGamepad1_data 
             sec
             bbs     GAMEP_D2,GAME_PORT, Game2high
             clc     
Game2high:
             ror     rGamepad2_data 
             lda     rVfdsendcount
             bne     Vfdclkhigh
             jsr     Flashinout

             smb     5,rGameflag
             lda     rGamepad1_data
             sta     IOP_DATA7_H
             lda     rGamepad2_data
             sta     IOP_DATA7_L
Vfdclkhigh:
             
             .ifnz SUPPORT_DEMO
             smb     VFDB_CLK,VFD_PORT      ;;rbhung set VFD_CLK output high
.ifnz    INDEPENDENT_GAME_PORT             
            jsr      set_game_clk_h
.endif
             .else
             smb     VFDB_CLK,VFD_PORT             
             .endif
             bra     Vfdsendreturn
Vfdclklow:             
             .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
.ifnz    INDEPENDENT_GAME_PORT
             jsr     set_game_clk_l
.endif
             ror     rVfddata

⌨️ 快捷键说明

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