📄 iop.asm
字号:
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 + -