?? hiduart.asm
字號(hào):
;===============================================================================================
; HIDUART.asm :RS232-USB轉(zhuǎn)換的主程序。
;===============================================================================================
CPU 63001
include "63001.inc"
include "ram.inc"
;***********************************************************************************************
; ROM代碼段 Code Segment (ROM)
;***********************************************************************************************
org 00h
jmp Reset_ISR
jmp 128us_ISR
jmp 1024us_ISR
jmp USB_EP0_ISR
jmp USB_EP1_ISR
jmp Cext_ISR
jmp SerialReceiveByte
jmp Cext_ISR
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Reset_ISR:復(fù)位中斷
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Reset_ISR:
mov a,DATA_STACK_POINTER_START
swap a,dsp
;iord StatusControl
;and a,RESET_MASK
;cmp a,SC_POR
;jz por_reset
jmp por_reset
;and a,SC_USBReset
;jnz usb_reset
;mov a,00h
;iowr Cext
;jmp wdog_reset
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 128us_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128us_ISR:
push a
mov a,[interrupt_mask]
ipret Global_Interrupt
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 1024us_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1024us_ISR:
push a
mov a,[interrupt_mask]
ipret Global_Interrupt
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; USB_EP0_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
USB_EP0_ISR:
push a
mov a,0
mov [suspend_counter],a
iord EP0_Rx_Status
and a,EP0_Rx_Setup
jz NotSetup
call DecodeRequest
jmp Reti
NotSetup:
iord EP0_Rx_Status
and a,EP0_Rx_Out
jz InPacketReceived
iord EP0_Rx_Status
and a,D0h
jz Reti
iord USB_Control
and a,~USBC_EnableOuts
iowr USB_Control
call ControlWriteRamDataStage
jmp Reti
InPacketReceived:
iord EP0_Tx_Config
and a,EP0_Tx_Respond
jnz Reti
mov a,[current_reportid]
cmp a,RID_TRANSMIT
jz ep0_reportdone
cmp a,RID_COMMAND
jnz readINdata
ep0_reportdone:
mov a,00h
mov a,[current_reportid]
mov a,~BUSY_TRANSMITTING
and [fwcr],a
mov a,SERIAL0RXBIT
iowr P0_IntEnable
mov a,ENUMERATED_MASK
mov [interrupt_mask],a
FLOW_ON
jmp Reti
readINdata:
call ControlReadDataStage
Reti:
mov a,[interrupt_mask]
ipret Global_Interrupt
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; USB_EP1_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
USB_EP1_ISR:
push a
iord EP1_Tx_Config
xor a,EP1_Tx_Toggle
iowr EP1_Tx_Config
mov a,[interrupt_mask]
ipret Global_Interrupt
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Cext_ISR()
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Cext_ISR:
push a;
mov a,[interrupt_mask]
ipret Global_Interrupt
;***********************************************************************************************
; 各種Reset的處理程序
;***********************************************************************************************
por_reset:
mov a,ffh
iowr P0_Data
iowr P1_Data
mov a,00h
iowr P0_IntEnable
iowr P1_IntEnable
iowr P0_PullUp
iowr P1_PullUp
mov a, 0fh
iowr P0_SinkPin0
iowr P0_SinkPin1
iowr P0_SinkPin2
iowr P0_SinkPin3
iowr P0_SinkPin4
iowr P0_SinkPin5
iowr P0_SinkPin6
iowr P0_SinkPin7
iowr P1_SinkPin0
iowr P1_SinkPin1
iowr P1_SinkPin2
iowr P1_SinkPin3
iowr WDT
mov a,bottom_of_ram
mov x,top_of_ram
ram_clr_loop:
mov [x+0],a
dec x
jnc ram_clr_loop
iord StatusControl
and a,SC_USBReset
;jnz usb_reset
jmp usb_reset
suspend_reset:
iowr WDT
mov a,01h
iowr Cext
mov a,(SC_RUN + SC_SUSPEND)
iowr StatusControl
nop
jmp suspend_reset
wdog_reset:
jmp suspend_reset
usb_reset:
;mov a,SC_RUN
;iowr StatusControl
mov a,00h
iowr Cext
mov a,ENUMERATE_MASK
mov [interrupt_mask],a
iowr Global_Interrupt
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;與本例子有關(guān)的一些初始化。
;-------------------------------------------------------------------------------------------
mov a, 0
mov [rx_inptr],a
mov [rx_outptr],a
mov A,00h
mov [fwcr],A
mov a,BAUD_BITDELAY_DEFAULT
mov [baud_bitdelay],a
;-------------------------------------------------------------------------------------------
mov a,00h
iowr P0_PullUp
mov a,0FDh
iowr P0_Data
iord P0_Data
or a,(SERIAL0TXBIT+SERIAL0RXBIT)
iowr P0_Data
iord P1_Data
and a,~nRST
iowr P1_Data
FLOW_OFF
DELAY10MS
iord P1_Data
or a,nRST
iowr P1_Data
mov a, 00h
iowr P1_PullUp
holdoff:
iowr WDT
mov a,[interrupt_mask]
cmp a,ENUMERATED_MASK
jnz holdoff
iord P1_Data
and a,F7h
iowr P1_Data
FLOW_ON
mov a,SERIAL0RXBIT
iowr P0_IntEnable
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 循環(huán)主程序。
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
main:
iowr WDT
call SuspendCounter
call CheckSuspend
iord EP1_Tx_Config
and a,EP1_Tx_Respond
jnz main
mov a,[rx_inptr]
cmp a,[rx_outptr]
jz main
mov a,0
mov [ep1_byte_count],a
mgetbyte:
mov x,[rx_outptr]
mov a,[x+RX_BUF_PTR_START]
inc x
swap a,x
cmp a,SERIAL_BUF_SIZE
jnz .nextdptr
mov a,0
.nextdptr:
mov [rx_outptr],a
swap a,x
mov x,[ep1_byte_count]
mov [x+(EP1_FIFO+2)], a
inc [ep1_byte_count]
mov a,[ep1_byte_count]
cmp a,6
jz msendem
mov a,[rx_inptr]
cmp a,[rx_outptr]
jnz mgetbyte
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -