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

📄 iop.asm

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 ASM
📖 第 1 页 / 共 5 页
字号:
             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                               

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

            .else

            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


            .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     IOP_DATA0_L     
            sta     TimerB_Lo  
                                           ;; and clear counter
            lda     #.high.IR_SCAN_TIME
            ;sta     IOP_DATA0_H     
            sta     TimerB_Hi
            
            lda     #INT_TIMER_B           ;;enable INTR mask
            sta     IntMask                ;;enable IRQ

            .ifnz  SUPPORT_LCD
            ;jsr     Vfdreset
            .endif
            .ifnz  SUPPORT_VFD
            ;jsr     Vfdreset
            .endif


          ;  lda    #0bh
          ;  sta    IOP_DATA3_H
          ;  lda    #00h
          ;  sta    IOP_DATA3_L
          ;  smb    6,IOP_DATA4_H
          ;  rmb    7,IOP_DATA4_H

            cli
            jmp     lToMainLoop

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


            ;  .org    (($+15)/16)*16
.ifnz SUPPORT_VFD

;;**************************************************************************;;
;; Set VFD STB high and VFD DATA input                                      ;;
;;**************************************************************************;;
Vfdsetstbhigh:
            .ifnz SUPPORT_DEMO
            ;lda      Vfd_init1
            lda      #!(VFD_DATA.or.VFD_CLK.or.VFD_STB)
            sta      Vfd_init1
            sta      VFD_PORT_CFG

            .else
            lda      Vfd_init1
            ora      #(VFD_DATA.or.VFD_CLK)
            sta      VFD_PORT_CFG
            smb      VFDB_STB,VFD_PORT1
            smb      VFDB_DAT,VFD_PORT
            .endif
            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
             smb     VFDB_STB,Vfd_init1
             smb     VFDB_CLK,Vfd_init1 ;;kevinlu
             lda     Vfd_init1
             sta     VFD_PORT_CFG           ;;IR and VFD_STB init
             rmb     VFDB_CLK,VFD_PORT
             rmb     VFDB_STB,VFD_PORT
             .else
             rmb     VFDB_STB,VFD_PORT1
             .endif
             rts

.ifnz SUPPORT_QCODE
;;**************************************************************************;;
;; Send one byte VFD command or data    ssdd                                ;;
;;**************************************************************************;;
Vfdsendonebyte:
             lda     rVfdsendcount
             beq     Vfdsendreturn
             dec     rVfdsendcount
             bbs     0,rVfdsendcount,Vfdclklow

             lda     rVfdstatus
             bne     Vfdclkhigh

             lda     rVfdloopcount
             cmp     #1
             bne     Vfdclkhigh

             ;lda     IOP_DATA5_H
             ;and     #%00100000
             ;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     IOP_DATA7_H  ;GAME_PAD1_BASE
             ror     rGamepad1_data 
             sec
             bbs     GAMEP_D2,GAME_PORT, Game2high
             clc     
Game2high:
             ror     rGamepad2_data 
             ;ror     IOP_DATA7_L  ;GAME_PAD2_BASE
             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

             rmb     VFDB_CLK,Vfd_init1
             lda     Vfd_init1
             sta     VFD_PORT_CFG          ;;set VFD_CLK output

             .else
             smb     VFDB_CLK,VFD_PORT             
             .endif

             ;rts
             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
             ror     rVfddata
             bcc     Vfddatalow
             .ifnz SUPPORT_DEMO
             ;smb     VFDB_DAT,VFD_PORT
             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
             ;rts
Vfddatalow:
             .ifnz SUPPORT_DEMO
             smb     VFDB_DAT,Vfd_init1
             lda     Vfd_init1
             sta     VFD_PORT_CFG          ;;set VFD_DAT output
             .endif

             rmb     VFDB_DAT,VFD_PORT
Vfdsendreturn:
             lda     rVfdsendcount
             rts
.endif


;;**************************************************************************;;
;; Write  VFD command and data                                              ;;
;;**************************************************************************;;
Vfdwservice:
             sec
             jsr     Vfdsendonebyte
             bne     Vfdwreturn
Vfdbyteok:
             lda     rVfdstate
             beq     Vfdsednext
             stz     rVfdstate
             stz     rVfdloopcount
             lda     #150
             sta     rVfdscantime
Vfdsednext:
             lda     rVfdloopcount
             cmp     VFD_COUNT_BASE 
             bcc     Vfdclearstb
             jsr     Vfdsetstbhigh
             inc     rVfdstatus
             rts
Vfdclearstb:
             inc     rVfdloopcount
             tax
             cmp     #3
             bcs     Vfdclearstb1
             jsr     Vfdsetstbhigh
Vfdclearstb1:
             lda     VFD_BUFFER_BASE,x
             sta     rVfddata
             ;sec
             jsr     Vfdsetcount
Vfdwreturn:
             rts


;;**************************************************************************;;
;; VFD read data subroute                                                   ;;
;;**************************************************************************;;
Vfdrservice:
            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
            ldy       #48
Vfdreadstart:
            jsr      Vfdsendonebyte
            bne      Vfdrreturn          
            tya
            beq      Vfdreadinok
            jsr      Vfdreadkeydata      ;;if data read back ok
            rts
Vfdreadinok:
            jsr      Vfdgetcode
Vfdkeyreturn:
            inc      rVfdstate
            lda      #%11101111        ;;init vfd switch read
            sta      rVfdswdata
            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
            bbs     7,rVfdkeydata,Vfdkeyisready  
            bbr      VFDB_DAT,VFD_PORT,Vfddataislow  
            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
            bra      Vfdkeyisready1
Vfdkeyisready:
            bbr      VFDB_DAT,VFD_PORT,Vfdkeyisready1
            lda     rVfddataold
            bne     Vfdkeyisready1
            sta     rVfdkeydata
Vfdkeyisready1:
            .ifnz SUPPORT_DEMO
            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 input
            .endif

            rmb      VFDB_CLK,VFD_PORT
Vfddatalow1:
            dey
            rts

;;**************************************************************************;;
;; VFD switch read                                                          ;;
;;**************************************************************************;;
Vfdswservice:
.ifnz     SUPPORT_VFD_SWITCH
            cmp      #3
            bcs      Vfdswreadstart
            inc      rVfdstate
            lda      #41H                ;;16312 write led command
Vfdsendled:
            sta      rVfddata
            ;sec                          ;;set STB low
            jsr      Vfdsetcount         ;;count = 16 bits
            ldy      #16
Vfdswreadstart:
            jsr      Vfdsendonebyte
            bne      Vfdswreturn
            bbs       1,rVfdcmdcount,Vfdreadswdata
            bra      Vfdswsendinok
Vfdreadswdata:
            tya
            beq      Vfdswreadinok

⌨️ 快捷键说明

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