📄 iop.asm
字号:
.endif
.endif
.ifnz UART_SUPPORT
;;initizlize timer A for UART and clear counter
;;check IOP_DATA7_H for incoming UART value
lda IOP_DATA7_H
bne lUseOuterUart
lda #.low. UART_TIME ;;use default value
sta TimerA_Lo
lda #.high.UART_TIME
sta TimerA_Hi
jmp lInitUartIO
lUseOuterUart:
lda IOP_DATA7_L
sta TimerA_Lo
lda IOP_DATA7_H
sta TimerA_Hi
lInitUartIO:
;;initalize I/O port
lda #UART_TXD_OUT
sta UART_PORT_CFG
.endif
;;initizlize timer B ( 112 us ), and clear counter
;;check IOP_DATA7_H for incoming UART value
lda IOP_DATA7_H
cmp #0
bne lUseOuterIR
.ifnz PCA9564
lda #.low. PCA9564_SCAN_TIME
sta TimerB_Lo
lda #.high.PCA9564_SCAN_TIME
sta TimerB_Hi
.else
lda #.low. IR_SCAN_TIME ;;use default
sta TimerB_Lo
lda #.high.IR_SCAN_TIME
sta TimerB_Hi
.endif
jmp lEndIRTimer
lUseOuterIR:
lda IOP_DATA6_L
sta TimerB_Lo
lda IOP_DATA6_H
sta TimerB_Hi
;;Reset IOP_DATA6_L & IOP_DATA6_H for later using
lda #0
sta IOP_DATA6_L
sta IOP_DATA6_H
lEndIRTimer:
;;enable INTR mask
.ifnz UART_SUPPORT
lda #(INT_TIMER_A .or. INT_TIMER_B)
sta IntMask
.else
lda #INT_TIMER_B
sta IntMask
.endif
;;set VFD read polling time
lda #100
sta rVfdPollingTm
.ifnz IOP_RESET_RISC
lda #0
sta awakeup_time_1
lda #0
sta awaken_flag
.endif
.ifnz IR_THOMSON
stz markcount
stz spacecount
stz synccount
stz bit01count
stz repeattimes
stz datacount
stz IrStateFlag
.endif
.ifnz IR_M50560
stz IrStateFlag
stz RepTimes
stz DataCode
stz CustomCode
stz BitsCounter
stz Flag4Ms
.endif
.ifnz IR_AS1213
lda #BEGIN_FROM_HEAD
sta IrStateFlag
stz RepRate
stz Repdata
stz rReceive1
stz rReceive2
stz rReceive3
stz rReceive4
stz BitsCounter
.endif
.ifnz IR_M3004
lda #IR_IDLE_STATE
sta IrStateFlag
stz First_pulse_flag
stz Idle_counter
stz Bit01_counter
stz Level_high_flag
stz Data_bit_counter
stz First_5bit_data
stz Last_8bit_data
stz Prev_last8bit
stz Prev_first5bit
stz DataRepeatCounter
.endif
.ifnz IR_KONKA
stz IrStateFlag
stz IO_high_counter
stz IO_low_counter
stz Data_Customer_Code
stz Data_IR_Code
stz First_send_data_flag
stz Repeat_counter
stz Prev_ir_data
stz Idle_counter
.endif
.ifnz IR_TDP101
stz IrStateFlag
stz IO_high_counter
stz IO_low_counter
stz Data_bit_counter
stz Repeat_counter
stz Separate_flag
stz Separate_counter
.endif
.ifnz GT1128
jsr init_gt1128
.endif
.ifnz AD7312
jsr init_ad7312
.endif
.ifnz NEC16312
jsr init_16312 ;;for solve cs16312 don't display when power on
.endif
.ifnz STANDBY_6313
stz standby_flag_first
stz standby_flag_end
.endif
.ifnz PCA9564
lda PCA9564_beginning_state
sta pca9564_state
stz rx_buffer_full_flag
stz tx_buffer_empty_flag
stz pca9564_rx_in_ptr
stz pca9564_tx_out_ptr
stz stop_timeout_counter
jsr PCA9564_Init ;;enable PCA9564 normal work
.endif
;;enable IRQ
cli
jmp lToMainLoop
.org (($+31)/32)*32
;;===================================================================
;;main loop
;;===================================================================
lToMainLoop:
.ifnz STANDBY_6313
lda standby_flag_end
cmp #1
beq lToMainLoop
.endif
.ifnz IOP_RESET_RISC
lda IOP_DATA0_H
and #$f0
cmp #0
bne bagain
lda #1
sta awaken_flag
lda awakeup_time_1
cmp #100
bne check_end
lda #0
sta awakeup_time_1
inc awakeup_time_2
cmp #50
bne check_next
jmp reset_risc
check_next:
lda #0
sta awakeup_time_2
check_end:
bra ProcessStart
bagain:
lda #0
sta awaken_flag
ProcessStart:
.endif
.ifnz UART_SUPPORT
jsr fCheckUart
.endif
.ifz PCA9564
.ifz HT1621
lda rVfdPollingTm
bne lRunOthersFun
.ifnz PMP_MCU810_DRIVER
jsr fProcessReadKey
jsr fProcessReadBat
.else
jsr fProcessVfdRead
.endif
lda #100
sta rVfdPollingTm
.endif
lRunOthersFun:
.ifnz NEC16312_SW
jsr fProcessVfdReadsw
.endif
.ifnz SPL10 ;;if spl10 write fail,we write one time again
bbs 0,rSpl10CtrlFlag,lSpl10WriteAgain
;;bra lSpl10WriteOk
jmp lSpl10WriteOk
lSpl10WriteAgain:
jsr fDelay1
jsr fProcessVfdWrite
lSpl10WriteOk:
.endif
.endif ;;pca9564
;;check request function
lda IOP_DATA0_H
and #FUN_MASK
beq lToMainLoop
tax
and #FUN_MAIN_MASK
bne lChkMainFun01
lda IOP_DATA0_H
and #FUN_SUB_MASK
cmp #FUN_VFD_REQ_W
bne lToMainLoop
.ifz (HC164+PCA9564+PMP_MCU810_DRIVER)
jsr fProcessVfdWrite
.endif
lFunComplete:
;;clear function request ( free )
lda IOP_DATA0_H
and #!FUN_MASK
sta IOP_DATA0_H
jmp lToMainLoop
lChkMainFun01:
txa
cmp #FUN_GPAD_READ ;;1001 = read game pad
bne lCheckNext01
.ifnz GAMEPAD_SUPPORT
jsr fReadGamePad
.ifnz SPHE8202R_128PIN
smb VFD_STB_bit,VFD_PORT_CFG
smb VFD_CLK_bit,VFD_PORT_CFG
smb VFD_DATA_bit,VFD_DATA_PORT_CFG
rmb VFD_STB_bit,VFD_PORT
smb VFD_CLK_bit,VFD_PORT
rmb VFD_DATA_bit,VFD_DATA_PORT
.endif
.endif
jmp lFunComplete
lCheckNext01:
cmp #FUN_UART_TXD
bne lCheckNext02
.ifnz UART_SUPPORT
jsr fSendByUart ;;0110 = transform data by UART
.endif
jmp lFunComplete
lCheckNext02:
cmp #FUN_I2C_WRITE
bne lCheckNext03
.ifnz I2C_SUPPORT
jsr fProcessI2cWrite ;;0111 = I2C write
.endif
jmp lFunComplete
lCheckNext03:
cmp #FUN_I2C_READ
bne lCheckNext04
.ifnz I2C_SUPPORT
jsr fProcessI2cRead ;;1000 = I2C read
.endif
jmp lFunComplete
lCheckNext04:
.ifnz PMP_MCU810_DRIVER
cmp #FUN_PMP_MCU810
bne lFunComplete
jsr fProcessPMP_MCU810
.endif
jmp lFunComplete
;;===================================================================
;;UART interface function
;;===================================================================
.ifnz UART_SUPPORT
;;===================================================================
;;Function : fCheckUart
;;Description : Send data to UART port
;;Input : IOP_DATA1_L
;;Output : NONE
;;===================================================================
fCheckUart:
lda rUartSendLen
bne lUartBusy
ldx TxdPointR
cpx TxdPointW
beq lUartBusy ;;nothing to send
;;set tranfrom data
lda TxdBuffer,x
clc ;;insert start bit
rol a
sta rTxdRegister
lda rTxdRegister+1
rol a
ora #$fe ;;insert 1 stop bit
sta rTxdRegister+1
;;lda #10
lda #13 ;;10 bit + 3 dummy bit
sta rUartSendLen
inc TxdPointR
lUartBusy:
rts
;;===================================================================
;;Function : fSendByUart
;;Description : Send data to UART port
;;Input : IOP_DATA1_L
;;Output : NONE
;;===================================================================
fSendByUart:
ldx TxdPointW
;;set tranfrom data
lda IOP_DATA1_L
sta TxdBuffer,x
inx
lWaitBufferEmpty:
cpx TxdPointR
bne lUartSendNextByte
phx
jsr fCheckUart
plx
bra lWaitBufferEmpty
lUartSendNextByte:
stx TxdPointW
rts
.endif
;;--------------------------------------------------------------
;;I2C interface function
;;--------------------------------------------------------------
.ifnz I2C_SUPPORT
.include I2C.asm
.endif
;;--------------------------------------------------------------
;;VFD interface function
;;--------------------------------------------------------------
.ifnz NEC16312
.include .\VFD\NEC16312.asm
.endif
;;--------------------------------------------------------------
.ifnz HT1621
.include .\VFD\HT1621.asm
.endif
;;--------------------------------------------------------------
.ifnz SPL10
.include .\VFD\SPL10.asm
.endif
;;--------------------------------------------------------------
.ifnz PMP_MCU810_DRIVER
.include .\VFD\pmp_mcu810_diver.asm
.endif
;;--------------------------------------------------------------
.ifnz HC164
.include .\VFD\HC164.asm
.endif
;;--------------------------------------------------------------
.ifnz HC164_2
.include .\VFD\HC164_2.asm
.endif
;;--------------------------------------------------------------
.ifnz PT6554
.include .\VFD\PT6554.asm
.endif
;;--------------------------------------------------------------
.ifnz SPL10308
.include .\VFD\SPL10308.asm
.endif
;;--------------------------------------------------------------
.ifnz AD7312
.include .\VFD\AD7312.asm
.endif
;;--------------------------------------------------------------
.ifnz GT1128
.include .\VFD\GT1128.asm
.endif
.ifnz PCA9564
.include .\VFD\PCA9564_init.asm
.endif
.ifnz IOP_RESET_RISC
reset_risc:
lda #$de
sta Reset_RISC_L
lda #$ad
sta Reset_RISC_H
rts
.endif
;;--------------------------------------------------------------
;;Function : fDelay
;;Description : Null delay
;;Input : NONE
;;Output : NONE
;;--------------------------------------------------------------
fDelay:
phx
;;check IOP_DATA7_H for deciding delay counter
lda IOP_DATA7_H
cmp #0
bne lDefaultDelay
clc
adc #1
asl A
tax
bra lDelayLoop1
lDefaultDelay:
ldx #32
bra lDelayLoop1
fDelay1:
phx
ldx #2
lDelayLoop1:
dex
bne lDelayLoop1
plx
rts
fDelay2:
phx
ldx #20
lDelayLoop2:
dex
bne lDelayLoop2
plx
rts
.ifnz SPL10308
fDelayX10us:
phx
NextDelay10us:
ldx #23
Delay10usLoop:
nop
nop
nop
nop
nop
nop
nop
nop
dex
bne Delay10usLoop
dec DelayLoopCnt
lda DelayLoopCnt
bne NextDelay10us
plx
rts
.endif
;;===================================================================
;;vector
;;===================================================================
Vector: .section ;;$200
DW vReset
DW vNmi
DW vIrq
.DATA
;;default is key scan
.ifnz NEC16312
VfdScanCode: db $42
.endif
.ifnz AD7312
VfdScanCode: db $42
.endif
.ifnz SPL10
VfdScanCode: db $c0
.endif
.ifnz HT1621
VfdScanCode: db $42
.endif
.ifnz HC164
VfdScanCode: db $00
.endif
.ifnz SPL10308
VfdScanCode: db $20
.endif
.ifnz GT1128
VfdScanCode: db $00 ;;NO USE
.endif
.ifnz PMP_MCU810_DRIVER
ReadKeyCmd db $c0
ReadBatCmd db $60
.endif
.ifnz GET_5BYTES_KEY_DATA
VfdRespLen: db 5
.else
VfdRespLen: db 3
.endif
;;tmp read
VfdResponse: blkb 6,$0
.ifnz PCA9564
VfdScanCode: db $00 ;;no use
Rx_buffer: blkb MAX_RX_BUF_LEN,$0
Tx_buffer: blkb MAX_TX_BUF_LEN,$0
.else
;;the last latch value
.ifnz GET_5BYTES_KEY_DATA
VfdResponse1: blkb 4,$0
VfdResponse2: blkb 4,$0
.else
VfdResponse1: blkb 6,$0
.endif
.endif
.ifnz UART_SUPPORT
TxdPointR: db 0
TxdPointW: db 0
TxdBuffer: blkb 256,66
RxdPointR: db 0
RxdPointW: db 0
RxdBuffer: blkb 256,66
.endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -