📄 start.s
字号:
;**********************************************************************
;
; Startup code for the 68332 family to initialize RAM
; and call the user function main().
;
;
;**********************************************************************
;#define __ROM_128K
;#define __ROM_256K
#define __ROM_512K
;#define __ROM_1024K
#define _ETHER_INI_
;**********************************************************************
; 本程序为 PSG-304A-A-2000,05 设计
;***************硬件摘要:
; 系统时钟: 20MHz
; ROM地址: 000000H-03FFFFH //ROM=256k
; RAM地址: 700000H-7FFFFFH //Debug && NoBDM 700000-7fffff
; 片内RAM定值:800000H-8007ffH //Debug && NoBDM 800000-8007ff
; FLASH地址: 200000H-300000H
; DI地址: FF8800H
; HDI地址: FF8000H
; LAN地址: 410000H(data),412000(add)
; HDI地址: FFF000H
;***************中断设置摘要:
; 中断优先级:6-A/D同步中断(TPU0) 2-周期中断 3-SCI中断,
; 4-LAN中断, -故障处理程序, 1-正常运行
; 中断裁决级别:SIM-7,QSM-A,TPU-F
; 中断向量: A/D同步中断(TPU0)-40H,SCI中断-51H,周期中断-60H
;**********************************************************************
;**********************************************************************
; RAM地址常量设置
;**********************************************************************
D_RAM_CSBAR EQU 0x7007 //1M
D_IRAM_BAR EQU 0x8000
D_RAM_ADD EQU 0x700000
D_RAM_SIZE EQU 0x100000
D_IRAM_ADD EQU 0x800000
///////////////////////////////////////////////////////
XDEF D_RAM_ADD
XDEF D_RAM_SIZE
XDEF D_IRAM_ADD
;**********************************************************************
; 全局标识符说明
;**********************************************************************
XDEF START,__brkp,__brksz,__exit
XDEF _INT_Vectors ; Nucleus USE
XREF DATA,_main
XREF STKTOP
XREF INT_TPU0
XREF _INT_User_0
XREF _INT_User_16
XREF _INT_Timer_Interrupt
XREF _INT_Level_4_Auto
XREF __ResetCpu
.FDEF _RegisterErrorProcess,0 ;控制寄存器出错处理程序
.FREF BIOSInit,0 ;BIOS初始化程序
#define GJ_ID #$5AA5A30C
XREF __PutDoX
XREF __PutDoY
;**********************************************************************
; 包含文件说明
;**********************************************************************
NOLIST
INCLUDE "mc68332c.hs"
INCLUDE "start.hs"
LIST
;***********************************************************************
; If C++ style startup code is not desired, then
; define CPLUSPLUS to 0
;***********************************************************************
CPLUSPLUS = 0
;***********************************************************************
; If alloc memory function be used,then define
; MALLOC_USED to 1;
;***********************************************************************
MALLOC_USED = 0
;**********************************************************************
; Define variables to track memory allocations for mbrk().
;**********************************************************************
SECTION ram
__brkp DS.L 1 ; point to available memory
__brksz DS.L 1 ; number of available bytes
;***************************************************************
; Bdm use area (4 BYTE,address:0x400);
;***************************************************************
SECTION bdmuse
dBdmUseArea DC.L 0
;***************************************************************
; The reset vector will point to this code (START).
;***************************************************************
SECTION code
.STK "none" ; terminate call chain for -OG
;************************************************************
; 硬件复位向量
;************************************************************
START:
.IF BDM_USED==1
MOVE.L #STKTOP,A7 ;初始化系统堆栈
MOVE.L #`BASE(reset),D0
MOVEC D0,VBR ;初始化中断向量表基址
MOVE.L D0,A0
MOVE.L #INT_TPU0,($40*4,A0) ; TPU0
MOVE.L #_INT_User_16,($50*4,A0) ; SCI
MOVE.L #_INT_Timer_Interrupt,($60*4,A0)
MOVE.L #_INT_Level_4_Auto,($70,A0)
.ENDIF
.IF BDM_USED==0
;************************************************************
; Initialize SIM Register for hardware setting
;************************************************************
/*MCR 设置:%1000 0000 1100 0111
CLKOUT disable
freeze'signle no disable software and bus monitor,
Slave mode disable,
SIM reside suppervisor space,
MM set to reside SIM at $fffa00-$ffffff
IARB SET %0111
*/
MOVE.W #$80c7,SIM_BASE+SIM_MCR
;SYNCR 设置: 因使用外部振荡器,该寄存器不使用
/*系统保护控制寄存器设置: 1100 1100
软件WATCHDOG溢出时间52毫秒
HALT MOITOR 开放
BUS MONITOR 溢出时间64时钟周期
*/
MOVE.B #$DC,SIM_BASE+SIM_SYPCR
; MOVE.B #$5C,SIM_BASE+SIM_SYPCR
MOVE.L #`BASE(reset),D0
MOVEC D0,VBR
.ENDIF
;清软件WatchDog计数器
MOVE.B #$55,SIM_BASE+SIM_SWSR
MOVE.B #$AA,SIM_BASE+SIM_SWSR
;************************************************************
; I/0口设置:
;************************************************************
;PE口数据寄存器设置为%0100 0000
MOVE.B #$40,SIM_BASE+SIM_PORTE //PE.6=C\O\N\V\S\T=1
;PE口方向寄存器设置为%1111 1111(1-OUTPUT,0-INPUT)
MOVE.B #$FB,SIM_BASE+SIM_DDRE ;WAAA_NEW PE.2=0 0FB=1111 1011
;PE口分配寄存器设置为%0000 0000(1-FUNCTION,0-I/O)
MOVE.B #$04,SIM_BASE+SIM_PEPAR ;WAAA_NEW
;PF口数据寄存器设置为%1110 1110
MOVE.B #$EE,SIM_BASE+SIM_PORTF //PF.4=LAN_IR=0,PF.0=GND=0
;PF口方向寄存器设置为%1110 1110(1-OUTPUT,0-INPUT)
MOVE.B #$EE,SIM_BASE+SIM_DDRF
;PF口分配寄存器设置为%0001 0001(1-FUNCTION,0-I/O)
MOVE.B #$11,SIM_BASE+SIM_PFPAR
#ifdef _ETHER_INI_
MOVE.B #$01,SIM_BASE+SIM_PFPAR
#endif
;PC口数据寄存器设置为%1111 1111
MOVE.B #$FF,SIM_BASE+SIM_PORTC
;************************************************************
; 片选线设置
;************************************************************
;片选分配寄存器设置:CSPAR0- %0011 1010 1010 1010
; CSPAR1- %0000 0011 1111 1101
;CS3,CS4,为8位片选
;CSBOOT,CS0-CS2,CS5,CS7,CS8,CS9,CS10(NOT USED)为16位片选
;CS6为A19
MOVE.W #$3AFF,SIM_BASE+SIM_CSPAR0
MOVE.W #$03FD,SIM_BASE+SIM_CSPAR1
;Boot ROM 片选基址寄存器设置:Addr=$000000, #$0005: Size=256K
#ifdef __ROM_128K
D_ROM_SIZE EQU 0X0004
#endif
#ifdef __ROM_256K
D_ROM_SIZE EQU 0X0005
#endif
#ifdef __ROM_512K
D_ROM_SIZE EQU 0X0006
#endif
#ifdef __ROM_1024K
D_ROM_SIZE EQU 0X0007
#endif
MOVE.W #D_ROM_SIZE,SIM_BASE+SIM_CSBARBT ;ROM读128k,256K,512K,1024K
;Boot ROM 片选控制寄存器设置:异步,双字节,地址选通,S/U空间,不插入等待状态
;IPL=0,AVEC禁止 #$6830
MOVE.W #$6830,SIM_BASE+SIM_CSORBT ;读:%0110 1000 0011 0000
;RAM 片选基址寄存器设置:Addr=$0C0000,size=128k
MOVE.W #D_RAM_CSBAR,SIM_BASE+SIM_CSBAR0 ;RAM写
MOVE.W #D_RAM_CSBAR,SIM_BASE+SIM_CSBAR1 ;RAM读
MOVE.W #D_RAM_CSBAR,SIM_BASE+SIM_CSBAR2 ;
;FLASH 片选基址寄存器设置:Addr=$200000,Size=1M
MOVE.w #$2007,SIM_BASE+SIM_CSBAR3 ;FLASH读
MOVE.w #$2007,SIM_BASE+SIM_CSBAR4 ;FLASH写
;DI 片选基址寄存器设置:Addr=$FF8800,size=2k
MOVE.W #$FF88,SIM_BASE+SIM_CSBAR5
;LAN 片选自动向量基址寄存器设置:Addr=$FFF000,size=64k
MOVE.W #$FFF3,SIM_BASE+SIM_CSBAR6
;HDI 片选基址寄存器设置:Addr=$FF8000,size=2k
MOVE.W #$FF80,SIM_BASE+SIM_CSBAR7
;LAN(data) 片选基址寄存器设置:Adr=$410000,$412000,size=8k
MOVE.W #$4101,SIM_BASE+SIM_CSBAR8
;AD(add) 片选基址寄存器设置:Addr=$FF000,$FFF800,size=2k
MOVE.W #$FFF0,SIM_BASE+SIM_CSBAR9
MOVE.W #$0006,SIM_BASE+SIM_CSBAR10
;RAM 片选控制寄存器设置:
;MODE=0异步,BYTE=单字节,R/W=10写,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
MOVE.W #$5030,SIM_BASE+SIM_CSOR0 ;RAM高写:%0101 0000 0011 0000
MOVE.W #$3030,SIM_BASE+SIM_CSOR1 ;RAM低写:%0011 0000 0011 0000
MOVE.W #$6830,SIM_BASE+SIM_CSOR2 ;RAM 读:%0110 1000 0011 0000
;FLASH 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=10写,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
MOVE.W #$7030,SIM_BASE+SIM_CSOR3 ;写:%0111 0000 0011 0000
;MODE=0异步,BYTE=11双字节,R/W=01读,....
MOVE.W #$6830,SIM_BASE+SIM_CSOR4 ;读:%0110 1000 0011 0000
;DI 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=01读,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
MOVE.W #$6830,SIM_BASE+SIM_CSOR5 ;%0110 1000 0011 0000
;LAN 片选自动向量控制寄存器设置:
;MODE=0异步,BYTE=01低字节,R/W=01读,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=00CPU空间,IPL=4,AVE=1内部中断
MOVE.W #$2809,SIM_BASE+SIM_CSOR6
;HDI 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=01读,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
MOVE.W #$6830,SIM_BASE+SIM_CSOR7 ;%0110 1000 0011 0000
;LAN,CS8900 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=11读写,STRB=0地址选通,DSACK=0001插入1等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
MOVE.W #$7870,SIM_BASE+SIM_CSOR8 ;%0111 1000 0111 0000
;AD7865AS 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=01读,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
MOVE.W #$6830,SIM_BASE+SIM_CSOR9 ;%0111 0000 0011 0000
;CS10 片选控制寄存器设置: Disable
MOVE.W #$7030,SIM_BASE+SIM_CSOR10 ;%0000 0000 0000 0000
;片内RAM区设置:正常操作模式,位于S/U空间,地址100000H,RAM阵列允许
MOVE.W #$0000,SIM_BASE+RAM_MCR
MOVE.W #D_IRAM_BAR,SIM_BASE+RAM_BAR
RAMCHECK:
MOVE.L #`BASE(ram),D0
MOVE.L #STKTOP,D1
SUB.L D0,D1
LSR.L #2,D1
MOVEA.L D0,A0
NEXTCHECK:
MOVE.B #$55,SIM_BASE+SIM_SWSR
MOVE.B #$AA,SIM_BASE+SIM_SWSR
MOVE.B SIM_BASE+SIM_PORTE,D3
BTST #7,D0
BNE SETHIGH
ANDI.B #$7F,D3
BRA.B OUTPORTE
SETHIGH:
ORI.B #$80,D3
OUTPORTE:
MOVE.B D3,SIM_BASE+SIM_PORTE
CMPI.L #0,D1
BEQ.S QUITCHECK
MOVE.L (A0),D2
MOVE.L #$5A5A5A5A,(A0)
CMPI.L #$5A5A5A5A,(A0)
BNE.S ERRORRAM
MOVE.L #$A5A5A5A5,(A0)
CMPI.L #$A5A5A5A5,(A0)
BNE.S ERRORRAM
MOVE.L #0,(A0)+
SUBI.L #1,D1
BRA NEXTCHECK
ERRORRAM:
MOVE.L GJ_ID,D0
MOVE.L D0,-(A7)
BSR.L __PutDoX
MOVE.L GJ_ID,D0
MOVE.L D0,-(A7)
BSR.L __PutDoY
JMP.L __ResetCpu
QUITCHECK:
;************************************************************
; TPU 初始化程序:
;************************************************************
;TPU_TMCR设置:STOP=0,TCR1P=00,TCP2P=00,EMU=0,T2CG=0,STF=0,SUPV=1,PSCK=1,IARB=1111
;TCR1时钟源为1/4系统时钟(5MHZ)
MOVE.W #$00CE,SIM_BASE+TPU_TMCR ;%0000 0000 1100 1111
.IF BDM_USED==1
;TPU_DSCR设置:FRZ=11(Freeze at Next Time-Slot Boundary),others set 0
MOVE.W #$0180,SIM_BASE+TPU_DSCR
.ELSE
MOVE.W #$0000,SIM_BASE+TPU_DSCR
.ENDIF
;TPU_CISR清零
AND.W #$0000,SIM_BASE+TPU_CISR
;清TPU中断允许字节
MOVE.W #$0000,SIM_BASE+TPU_CIER
;设置TPU中断优先级为6,中断向量为40H-4FH
MOVE.W #$0640,SIM_BASE+TPU_TICR
;TPU各通道功能设置:
;TPU0为A/D采样中断,用于读取TCR1值,设置为OC输出比较,优先级为高
;TPU1-TPU12 为分离输出,优先级为低,并初始化为低电平
;TPU13,TPU14,TPU15 ,设置为ITC输入捕捉,优先级为中
.IF BDM_USED==1
MOVE.W #$AAAE,SIM_BASE+TPU_CFSR0 ;A:ITC
.ELSE
MOVE.W #$AAA8,SIM_BASE+TPU_CFSR0 ;A:ITC
.ENDIF
MOVE.W #$8888,SIM_BASE+TPU_CFSR1 ;8:DIO
MOVE.W #$8888,SIM_BASE+TPU_CFSR2
MOVE.W #$888E,SIM_BASE+TPU_CFSR3 ;E:OC
;TPU_HSQR设置:
;TPU0=%01(只读TCR1和TCR2)
;TPU1-TPU12=%00(该字段在通道为分离输出时不使用)
;TPU13,14,15=%01(连续,无LINK)
MOVE.W #$5400,SIM_BASE+TPU_HSQR0 ;0101 0100 0000 0000
MOVE.W #$0000,SIM_BASE+TPU_HSQR1 ;0000 0000 0000 0010
;TPU_RAM设置:
;TPU0:%0000 0000 100 011 11不强迫任何状态,符合时翻转,捕捉TCR1,比较TCR1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -