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