📄 82930ha.cod
字号:
mov TXCON, #0$$TXCON2$h
mov RXCON, #0$$RXCON2$h
mov EPCON, #0$$EPCON2$h
mov EPINDEX, #03h ; initialize EP3
mov TXCON3, #0$$TXCON3$h
mov RXCON, #0$$RXCON3$h
mov EPCON, #0$$EPCON3$h
mov IPL1, #0$$IPL1$h ;init priority registers
mov IPH1, #0$$IPH1$h
mov IPL0, #0$$IPL0$h
mov IPH0, #0$$IPH0$h
mov FIE, #0$$FIE$h
mov IEN1, #0$$IEN1$h ;init interrupt registers
mov IEN0, #0$$IEN0$h
mov SOFH, #0$$SOFH$h
ret
##82930H enum1#
; ----------------------------
; USB 8x930Ax enumeration code
; ----------------------------
DISABLED equ 0
ENABLED equ 1
RISM equ ENABLED
; When converting between RISM and EPROM, The user
; Needs to first change this variable from ENABLED to
; DISABLED
; The user also needs to change the address in the
; Target Setup
; Window for DATA, CODE and VECTOR address.
; For RISM, DATA = 41h..XXXX, CODE = 4000h - 0FFFFh,
; VECTOR = 4000h
; For ROM, DATA = 21h..XXXX, CODE = FF0000h - 0FFFFFFh,
; VECTOR = FF0000h
i82930HAX equ 1
PROC equ i82930HAX
; These include file are located in <install>\usb\code\
INCLUDE "Ax_regs.inc"
INCLUDE "equates.inc"
GET_COMMAND equ 080h
SETUP_PHASE equ 000h
DATA_PHASE equ 001h
STATUS_PHASE equ 002h
EP0_MAX_PACKET_SIZE equ 0$$MAXPACKET$h
NULL_DATA_PACKET equ 000h
IF RISM == DISABLED
; These lines will not be used if using RISM
; These CCBs are located for a 32K EPROM
; For a 64K EPROM, they need to be placed at ffFFF8
DEFINE CCB_SEGMENT, SPACE=CODE, ORG=FF7ff8H
SEGMENT CCB_SEGMENT
db 0D0h ;Original Binary Mode-Paged Mode
db 0F7h
ENDIF
;----------------------------------------------------
;-
;- Place the reset & ISR Vectors based on RISM or ROM
;----------------------------------------------------
IF RISM == ENABLED
DEFINE RESET_SEGMENT, SPACE=CODE, ORG=004000H
SEGMENT RESET_SEGMENT
ljmp main
$$IF$ TXCON1.3 || TXCON2.3 || TXCON3.3 || RXCON1.3 || RXCON2.3 || RXCON3.3
DEFINE ASOF_SEGMENT, SPACE=CODE, ORG=004043H
SEGMENT ASOF_SEGMENT
ljmp SOF_ISR
$$END$
DEFINE FUNCTION_ISR_SEGMENT, SPACE=CODE, ORG=00404BH
SEGMENT FUNCTION_ISR_SEGMENT
ljmp FUNCTION_ISR
DEFINE SUSPEND_SEGMENT, SPACE=CODE, ORG=004053H
SEGMENT SUSPEND_SEGMENT
ljmp FUNCTION_ISR
ELSE
DEFINE RESET_SEGMENT, SPACE=CODE, ORG=FF0000H
SEGMENT RESET_SEGMENT
ljmp main
$$IF$ TXCON1.3 || TXCON2.3 || TXCON3.3 || RXCON1.3 || RXCON2.3 || RXCON3.3
DEFINE ASOF_SEGMENT, SPACE=CODE, ORG=FF0043H
SEGMENT ASOF_SEGMENT
ljmp SOF_ISR
$$END$
DEFINE FUNCTION_ISR_SEGMENT, SPACE=CODE, ORG=FF004BH
SEGMENT FUNCTION_ISR_SEGMENT
ljmp FUNCTION_ISR
DEFINE SUSPEND_SEGMENT, SPACE=CODE, ORG=FF0053H
SEGMENT SUSPEND_SEGMENT
ljmp FUNCTION_ISR
ENDIF
;----------------------------------------------------
;- Main Segment is ORGed at 100, but the linker will
;- Place the rest of the significant figures
;----------------------------------------------------
IF RISM == ENABLED
DEFINE CODE_SEGMENT, SPACE=CODE, ORG=4080H
ELSE
DEFINE CODE_SEGMENT, SPACE=CODE, ORG=FF0080H
ENDIF
SEGMENT CODE_SEGMENT
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
;M---------------------------------------------------------------------M
;M MAIN M
;M---------------------------------------------------------------------M
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
main:
mov P1, #011h
mov SP, #00h
mov SPH, #05h ; Set the stack to start @ 00:0500h
mov P1, #025h
mov DPXL, #0ffh ; Set DPXL to point at the FLASH
; device to access constants
lCall INIT_VARIABLES ; Initialize the RAM space as
; required
lCall INIT_USB
ljmp ActiveLoop ; Jump over the ISR stubs to the
; main loop.
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
;A---------------------------------------------------------------------A
;A ACTIVE LOOP A
;A---------------------------------------------------------------------A
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
COMMENT *------------------------------------------------------------
ISR Registers
IF the user makes this into an ISR, they will need to save certain registers
upon entry into this code. The firmware has been writen such that the
only registers which are modified in this code are A, R0, R1 & EPINDEX.
While DPX is used within the code, it is saved locally only when needed.
This will allow the ISR to run slightly faster.
--------------------------------------------------------------------*
COMMENT *------------------------------------------------------------
Function name : ActiveLoop
Brief Description : This routine simply sets and clears P1.3 at a periodic rate
: It's purpose is to let the user know the part is alive.
:
Regs preserved : No reg. is saved
--------------------------------------------------------------------*
SCOPE
ActiveLoop:
;------------------------------------------------------------------
;-- Heart Beat
;------------------------------------------------------------------
CLR LC ; Nothing to do so reduce current draw
; by dropping the clk frequency by 75%
mov WR0, Heart1
inc WR0, #1
mov Heart1, WR0
cmp WR0, #7FFFh
jl ClearBit
setb P1.3
jmp ActiveLoop
ClearBit:
clr P1.3
jmp ActiveLoop
;----------------------------------------------------------------
;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
;FF FUNCTION ISR
;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
;----------------------------------------------------------------
COMMENT *------------------------------------------------------------
Function name : FUNCTION_ISR
Brief Description : Service the FUNCTION_ISR Interrupt
: This routine scans the interrupt pending bits in order
: and branches to any routines that have pending interrupts.
: After finishing the routine jumps back to the top of
: the scanning loop to preserve interrupt priority.
:
: NOTE: The order of precidence is set by the order in which
: the user places the checks.
:
Regs preserved : Reg. A, B & EPINDEX are saved
--------------------------------------------------------------------*
SCOPE
FUNCTION_ISR:
push ACC
push B
push EPINDEX
CLR LC ; Reduce simulation time.
ProcessFunctionEndpoints:
;----------------------------------------------------------------
;-- NOTE: Priority of the check sequence determines priority. --
;----------------------------------------------------------------
First_Check:
jnb FRXD0, ISRCheck1
mov P1, #0FFh
mov P1, #40h
CLR LC ; Reduce simulation time.
mov EPINDEX,#00
lCall ProcessOutToken ; 82930H has received a packet
; from HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
ISRCheck1:
jnb FTXD0, ISRCheck2
mov P1, #0FFh
mov P1, #41h
CLR LC ; Reduce simulation time.
mov EPINDEX,#00
lCall ProcessInToken ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
ISRCheck2:
$$IF$ (BENCFG11 == 1)
$$IF$ (EPADDR11 == 129)
$$IFN$ (EPATT11 == 1)
jnb FTXD1, ISRCheck3
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG12 == 1)
$$IF$ (EPADDR12 == 129)
$$IFN$ (EPATT12 == 1)
jnb FTXD1, ISRCheck3
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG13 == 1)
$$IF$ (EPADDR13 == 129)
$$IFN$ (EPATT13 == 1)
jnb FTXD1, ISRCheck3
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG14 == 1)
$$IF$ (EPADDR14 == 129)
$$IFN$ (EPATT14 == 1)
jnb FTXD1, ISRCheck3
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG15 == 1)
$$IF$ (EPADDR15 == 129)
$$IFN$ (EPATT15 == 1)
jnb FTXD1, ISRCheck3
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG16 == 1)
$$IF$ (EPADDR16 == 129)
$$IFN$ (EPATT16 == 1)
jnb FTXD1, ISRCheck3
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
ISRCheck3:
$$IF$ (BENCFG11 == 1)
$$IF$ (EPADDR11 == 1)
$$IFN$ (EPATT11 == 1)
jnb FRXD1, ISRCheck4
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_RX_ISR ; 82930H has receoved a packet
; from HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG12 == 1)
$$IF$ (EPADDR12 == 1)
$$IFN$ (EPATT12 == 1)
jnb FRXD1, ISRCheck4
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_RX_ISR ; 82930H has receoved a packet
; from HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG13 == 1)
$$IF$ (EPADDR13 == 1)
$$IFN$ (EPATT13 == 1)
jnb FRXD1, ISRCheck4
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_RX_ISR ; 82930H has receoved a packet
; from HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG14 == 1)
$$IF$ (EPADDR14 == 1)
$$IFN$ (EPATT14 == 1)
jnb FRXD1, ISRCheck4
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_RX_ISR ; 82930H has receoved a packet
; from HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG15 == 1)
$$IF$ (EPADDR15 == 1)
$$IFN$ (EPATT15 == 1)
jnb FRXD1, ISRCheck4
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_RX_ISR ; 82930H has receoved a packet
; from HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG16 == 1)
$$IF$ (EPADDR16 == 1)
$$IFN$ (EPATT16 == 1)
jnb FRXD1, ISRCheck4
CLR LC ; Reduce simulation time.
mov EPINDEX,#01
lCall EP1_RX_ISR ; 82930H has receoved a packet
; from HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
ISRCheck4:
$$IF$ (BENCFG11 == 1)
$$IF$ (EPADDR11 == 130)
$$IFN$ (EPATT11 == 1)
jnb FTXD2, ISRCheck5
CLR LC ; Reduce simulation time.
mov EPINDEX,#02
lCall EP2_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG12 == 1)
$$IF$ (EPADDR12 == 130)
$$IFN$ (EPATT12 == 1)
jnb FTXD2, ISRCheck5
CLR LC ; Reduce simulation time.
mov EPINDEX,#02
lCall EP2_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG13 == 1)
$$IF$ (EPADDR13 == 130)
$$IFN$ (EPATT13 == 1)
jnb FTXD2, ISRCheck5
CLR LC ; Reduce simulation time.
mov EPINDEX,#02
lCall EP2_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG14 == 1)
$$IF$ (EPADDR14 == 130)
$$IFN$ (EPATT14 == 1)
jnb FTXD2, ISRCheck5
CLR LC ; Reduce simulation time.
mov EPINDEX,#02
lCall EP2_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG15 == 1)
$$IF$ (EPADDR15 == 130)
$$IFN$ (EPATT15 == 1)
jnb FTXD2, ISRCheck5
CLR LC ; Reduce simulation time.
mov EPINDEX,#02
lCall EP2_TX_ISR ; 82930H has sent a packet to HC
jmp ProcessFunctionEndpoints ; Look at all Interrupt flags again
$$END$
$$END$
$$END$
$$IF$ (BENCFG16 == 1)
$$IF$ (EPADDR16 == 130)
$$IFN$ (EPATT16 == 1)
jnb FTXD2, ISRCheck5
CLR LC ; Reduce simulation time.
mov EPINDEX,#02
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -