📄 iop.asm
字号:
Irkeepstatus:
rts
;;**************************************************************************;;
SRAM_PG1: .section ;;PAGE1 start ;;
;;**************************************************************************;;
;;**************************************************************************;;
;; Collect IR command and data ;;
;;**************************************************************************;;
Irdatacollect:
lda rIrCountLbuf
cmp #3
bcc Irdataerr
cmp #11
bcs Irdataerr
lda rIrCountH
cmp #3
bcc Irdataerr
cmp #22
bcs Irdataerr
cmp #11
ror rIrReceiver
ror rIrReceiver+1
ror rIrReceiver+2
ror rIrReceiver+3
Irdataset:
dec rIrLoopcount
bne Irdatareturn
lda rIrReceiver+1
eor rIrReceiver
cmp #FFH
bne Irdataerr
lda rIrReceiver+3
sta IOP_DATA6_H ;;save to IOP_DATA5_L
lda rIrReceiver+1
sta IOP_DATA6_L ;;save to IOP_DATA5_L
smb IR_RD,IOP_DATA5_H
rmb IR_RP,IOP_DATA5_H
lda #14
sta rIrIncount
rts
Irdataerr:
stz rIrLoopcount
Irdatareturn:
rts
.endif
.ifnz SUPPORT_QCODE
.ifnz SUPPORT_QCODE_PTOW
Qcodeservice:
sei
bbs Q_SCOR,QCODE_SCOR_PORT,Qcodereadstart
inc rQcodecountL
bbs 1,rQcodebitcount,Qcodereturn
sec
rol rQcodebitcount
bbr 0,rQcodebitcount,Qcodereturn
lda rQcodecountL
adc #8
rol a
cmp rQcodecountH
bcs Qcodenotsync
lda rQcodecount
cmp #96
bne Qcodeerror
smb 3,IOP_DATA5_H ;;qcode read busy
ldx #0
xxyy:
lda rQcodedata,x
sta QCODE_BUFFER,x
inx
cpx #12
bne xxyy
jsr Flashinout
smb 2,IOP_DATA5_H
rmb 3,IOP_DATA5_H ;;qcode read free
Qcodeerror:
;stz rQcodebitcount
stz rQcodecount
Qcodenotsync:
smb Q_SQCK,QCODE_SQCK_PORT
cli
stz rQcodecountL
stz rQcodecountH
rts
Qcodereadstart:
cli
inc rQcodecountH
bbr 1,rQcodebitcount,Qcodereturn
stz rQcodebitcount
lda rQcodecount
cmp #96
bcs Qcodereturn1
lda rQcodecount
lsr a
lsr a
lsr a
tax
Qcodeaddbyte:
;ldx rQcodebitcount
clc
bbr Q_SQDT,QCODE_SQDT_PORT,Qcodecrcnotok
sec
Qcodecrcnotok:
rol rQcodedata,x
inc rQcodecount
Qcodereturn1:
rmb Q_SQCK,QCODE_SQCK_PORT
Qcodereturn:
rts
.else
;;**************************************************************************;;
;; Collect Qcode data qqqq ;;
;;**************************************************************************;;
Qcodeservice:
bbs Q_SHOCK,QCODE_SHOCK_PORT,Qcodeshock
stz rQcodetimer
Qcodeshock:
inc rQcodetimer
bbr 7,rQcodetimer,Qcodenotshock
smb 7,IOP_DATA4_L ;;shock happen
Qcodenotshock:
bbr Q_SCOR,QCODE_SCOR_PORT,Qcodereadstart
stz rQcodestatus
smb 0,rQcodestatus
smb 3,IOP_DATA5_H ;;qcode read busy
rts
Qcodereadstart:
bbr 0,rQcodestatus,Qcodereturn
Qcode1:
bbs 1,rQcodestatus,Qcodereadstart1
;stz rQcodecrc
rmb 4,IOP_DATA5_H
bbr Q_SQDT,QCODE_SQDT_PORT,Qcodecrcnotok
;smb 2,rQcodestatus
smb 4,IOP_DATA5_H
;smb 0,rQcodecrc
Qcodecrcnotok:
smb 1,rQcodestatus
lda #160
sta rQcodecount
ldx #0
lda #8
sta rQcodebitcount
Qcodereadstart1:
bbr 0,rQcodecount,Qcodeclklow
clc
bbr Q_SQDT,QCODE_SQDT_PORT,Qcodedataiszero
sec
Qcodedataiszero:
ror rQcodedata,x
;ror QCODE_BUFFER,x ;IOP_DATA0_L,x
dec rQcodebitcount
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
.else
;;**************************************************************************;;
;; 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
;;**************************************************************************;;
;; main loop ;;
;;**************************************************************************;;
lToMainLoop:
.ifnz SUPPORT_QCODE
Enableqcode:
jsr Qcodeservice
.endif
Notserviceqcode:
jsr Irservice
.ifnz SUPPORT_QCODE
.ifnz SUPPORT_QCODE_PTOW
.else
bbs 1,rQcodestatus,lToMainLoop
.endif
.endif
.ifnz SUPPORT_LCD
jsr Lcdwservice
;bra lToMainLoop
.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:
;bra lToMainLoop
.endif
.ifnz 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:
jsr Vfdswservice
Vfdserviceend:
.endif
.ifnz SUPPORT_DSA
; bbr 5,IOP_DATA4_H,Dsadoing
; rmb 5,IOP_DATA4_H
; stz DSA_PORT_CFG
; stz rDsastatus
; stz rDsastate
Dsadoing:
jsr Dsaservice
.endif
bbs 5,IOP_DATA5_H,lToMainLoop
smb 5,IOP_DATA5_H
jsr SettimerB
bra lToMainLoop
.ifnz SUPPORT_VFD
;;**************************************************************************;;
;; VFD get key/switch code subroute ;;
;;**************************************************************************;;
Vfdgetcode:
bbr 7,rVfdkeydata,Vfdexitrepeat
lda rVfddataold
bne Vfdisrepeat
lda rVfdkeydata
and #%00111111
cmp rVfddataold
beq Vfdisrepeat
sta rVfddataold
and #!VFD_REPEAT
ora #VFD_READY ;;set ready flag
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
.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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -