⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot166.a66

📁 keilc pic的版本 才搞到的 希望对大家有帮助
💻 A66
字号:
;$INCLUDE(MONITOR.INC)
;
;-----------------------------------------------------------------------------
;  This file is part of the C166 Compiler package
;  Copyright KEIL ELEKTRONIK GmbH 1993 - 1999
;-----------------------------------------------------------------------------
;  BOOT166.A66:  This code is executed after processor reset when the
;                bootstrap mode is enabled and provides the initialization 
;                of the 80C166 processor and downloading of MONITOR166.
;-----------------------------------------------------------------------------
;
;
; WATCHDOG is always disabled when using MON166!
; 
;
;-----------------------------------------------------------------------------
; Definitions for SYSCON Register (System Configuration):
; -------------------------------------------------------
$INCLUDE(CONFIG.INC)

%*DEFINE (ADDR (Val, Start, Range)) (
%SET (adr, %SUBSTR(%Start,1,(%LEN(%Start)- 3))%SUBSTR(%Start,%LEN(%Start),1))
%IF (%EQS (%Range,2K))     THEN (%SET (adr, (%adr AND 0FFF8H) + 0)) FI
%IF (%EQS (%Range,16K))    THEN (%SET (adr, (%adr AND 0FFC0H) + 1)) FI
%IF (%EQS (%Range,32K))    THEN (%SET (adr, (%adr AND 0FF80H) + 2)) FI
%IF (%EQS (%Range,64K))    THEN (%SET (adr, (%adr AND 0FF00H) + 3)) FI
%IF (%EQS (%Range,128K))   THEN (%SET (adr, (%adr AND 0FE00H) + 4)) FI
%Val	EQU 	%adr
)

; Setup SYSCON Register
SYS_L           SET     (_MTTC << 5) OR (_RWDC << 4) OR ((NOT _MCTC) AND 0FH)
SYS_L           SET     SYS_L AND (NOT (_RDYEN << 2))
SYS_L           SET     SYS_L OR (_RDY_AS << 2)
SYS_H           SET     (_STKSZ << 5) OR (_RDYEN << 4) OR (_SGTDIS << 3)
SYS_H           SET     SYS_H OR (_BYTDIS << 1) OR _CLKEN
$IF (BTYP_ENABLE == 1)
SYS_L           SET     SYS_L OR (_BTYP << 6)
SYS_H           SET     SYS_H OR (_BUSACT << 2)
$ENDIF


WR_MEM		EQU	1	; write memory
GO_COMMAND	EQU	6	; go command
GET_MON_SUM	EQU	16	; get monitor checksum


E_NOERROR	EQU	0	; no error                     ACK
E_UNKNOWN	EQU	1	; unknown command              len = 1
E_CHECKSUM	EQU	2	; checksum error               len = 1
E_NORAM		EQU	3	; no RAM at address            len = 4

STX		EQU	02H	; Start of TeXt
ENQ		EQU	05H	; ENQuiry
ACK		EQU	06H	; ACKnowledge
DC1		EQU	11H	; Ctrl+Q
NACK		EQU	15H	; Negative ACKnowledge

; Historic Parameter for old CPU's
; BOOT960 = 0: C167 CPU with 32 Byte Bootstrap loader is used
; BOOT960 = 1: C167 CPU with 960 Byte Bootstrap loader is used
$SET (BOOT960 = 0)


BOOTSTRAP  SECTION CODE AT 0FA40H

BOOT		PROC	NEAR
$IF NOT (BOOT960)
START:		MOV	R0,#0FA60H		; Start of bootstrap code
LAB1:		JNB	S0RIC.7,LAB1		; when CPU expects 32 Bytes
		MOVB	[R0],S0RBUF
		BCLR	S0RIC.7
		CMPI1	R0,#ENDBOOT-1
		JMPR	CC_NZ,LAB1
$ENDIF
		DISWDT  			; Start of bootstrap code
		MOV	STKOV,#0FA00H		; when CPU expects 960 Bytes
		MOV	STKUN,#0FC00H
		MOV     SP,#0FC00H		; at address 0FA60H
		MOV	CP,#0FC00H
		MOV	TFR,ZEROS
		MOV	PSW,ZEROS

                BSET	P3.12
                BSET	P3.13
                BSET	DP3.12
                BSET	DP3.13

		MOV	R0,SYSCON
		AND	R0,#0FB3FH
		OR	R0,#0080H		; disable ROM
		MOV	SYSCON,R0

$IF (BTYP_ENABLE == 0)
		BFLDL	SYSCON,#03FH,#SYS_L
		BFLDH	SYSCON,#07BH,#SYS_H
$ELSE
		BFLDL	SYSCON,#0FFH,#SYS_L
		BFLDH	SYSCON,#07FH,#SYS_H
$ENDIF

$IF (BUSCON1 = 1)
BCON1		SET     (_MTTC1 << 5) OR (_RWDC1 << 4)
BCON1		SET	BCON1 OR ((NOT _MCTC1) AND 0FH)
BCON1		SET	BCON1 AND (NOT (_RDYEN1 << 3))
BCON1 		SET	BCON1 OR (_RDY_AS << 3)  OR (_BTYP1 << 6)
BCON1 		SET	BCON1 OR (_ALECTL1 << 9) OR (_BUSACT1 << 10)
BCON1		SET	BCON1 OR (_RDYEN1 << 12) 

%ADDR (ADDR1,%ADDRESS1,%RANGE1)
		MOV	ADDRSEL1,#ADDR1 
		MOV	BUSCON1,#BCON1
$ENDIF

		BSET	P3.13				; ENABLE WR/ OUTPUT
		BSET	DP3.13

		MOV	DPP0,#0000H
		MOV	DPP1,#0001H
		MOV	DPP2,#0002H
		MOV	DPP3,#0003H

		EINIT   

CMD_LOOP:	CALL	GETCHAR			; GETCHAR
		CMPB	RL4,#WR_MEM		; MEMORY WRITE
		JMPR	CC_EQ,WRITE_MEM
		CMPB	RL4,#GO_COMMAND		; START MONITOR
		JMPR	CC_EQ,START_MON
		CMPB	RL4,#GET_MON_SUM	; MONITOR LOADED?
		JMPR	CC_EQ,MON_CHECKSUM

		MOV	R4,#00AAH		; SEND A SYNC 'AA'
		CALL	PUTCHAR			; PUTCHAR
		JMPR	CC_UC,CMD_LOOP


START_MON:	MOV	R14,#GO_COMMAND	; START MONITOR
		CALL	GETCHAR
		MOVBZ	R5,RL4
		CALL	GETCHAR
		MOV	RH6,RL4
		CALL	GETCHAR
		MOV	RL6,RL4
		CALL	GETCHAR
		CALL	GETCHAR
		CALL	GETCHAR
		CALL	GETCHAR		; READ FOR CHECKSUM
		MOV	R15,#E_CHECKSUM
		AND	R14,#00FFH
		JMP	CC_NZ,STATUS_MSG
		MOV	R4,#ACK	; SEND STATUS OK
		CALL	PUTCHAR
		PUSH	R5	; INDIRECT JUMP SEGMENTED
		PUSH	R6
;		RETS
		DB	0DBH, 000H	; CODE FOR RETS TO AVOID WARNING



MON_CHECKSUM:	MOV	R14,#GET_MON_SUM	; check if monitor already
		CALL	GETCHAR			; present
		MOVBZ	R5,RL4
		CALL	GETCHAR
		MOV	RH6,RL4
		CALL	GETCHAR
		MOV	RL6,RL4
		CALL	GETCHAR
		MOV	RH7,RL4
		CALL	GETCHAR
		MOV	RL7,RL4
		CALL	GETCHAR
		MOV	R15,#E_CHECKSUM
		AND	R14,#00FFH
		JMP	CC_NZ,STATUS_MSG

		MOV	R3,#0

MC_1:		MOV	R1,R5
		SHL	R1,#2
		MOV	R2,R6
		SHR	R2,#14
		OR	R1,R2
		MOV	DPP0,R1			; load DPP0
		MOV	R2,R6
		AND	R2,#03FFFH		; address in R2 for DPP0
		ADD	R3,[R2]			; no overflow possible
		ADD	R6,#2
		SUB	R7,#2
		JMP	CC_UGT,MC_1

		MOV	R14,ZEROS
		MOV	R4,#STX
		CALL	PUTCHAR
		MOV	RL4,#02		; length of error message
		CALL	PUTCHAR
		MOV	RL4,RH3
		CALL	PUTCHAR
		MOV	RL4,RL3
		CALL	PUTCHAR
		MOV	R4,ZEROS
		SUB	R4,R14		; CALCULATE CHECKSUM
		CALL	PUTCHAR
		MOV	DPP0,#0
		JMP	CC_UC,CMD_LOOP



WRITE_MEM:	MOV	R14,#WR_MEM	; DELETE CHECKSUM
		CALL	GETCHAR
		MOVBZ	R5,RL4
		CALL	GETCHAR
		MOV	RH6,RL4
		CALL	GETCHAR
		MOV	RL6,RL4
		CALL	GETCHAR
		MOV	RL7,RL4
		MOV	R15,#E_NORAM	; ERROR: NO MEMORY AT ADDRESS

WM_1:		CALL	GETCHAR
		MOVBZ	R1,RL5
		SHL	R1,#2
		MOV	R2,R6
		SHR	R2,#14
		OR	R1,R2
		MOV	DPP0,R1			; load DPP0
		MOV	R2,R6
		AND	R2,#03FFFH		; address in R2 for DPP0
		MOV	[R2],RL4
		MOVB	RL3,[R2]
		CMP	RL3,RL4
		JMP	CC_NE,STATUS_MSG
		ADD	R6,#1
		ADDC	RL5,#0
		SUB	RL7,#1
		JMP	CC_NZ,WM_1

		CALL	GETCHAR		; READ FOR CHECKSUM
		AND	R14,#00FFH
		JMP	CC_Z,STATUS_OK
		MOV	R15,#E_CHECKSUM
;		JMP	CC_UC,STATUS_MSG

STATUS_MSG:	MOV	DPP0,#0
		MOV	R14,ZEROS
		MOV	R4,#NACK
		CALL	PUTCHAR
		MOV	RL4,#01		; length of error message
		CALL	PUTCHAR
		MOV	R4,R15
		CALL	PUTCHAR
		MOV	R4,ZEROS
		SUB	R4,R14		; CALCULATE CHECKSUM
		CALL	PUTCHAR
		JMP	CC_UC,CMD_LOOP

STATUS_OK:	MOV	R4,#ACK
		CALL	PUTCHAR
		JMP	CC_UC,CMD_LOOP


; RETURN VALUE IN RL4
GETCHAR:	JNB     S0RIC.7,$
		BCLR    S0RIC.7
		MOVB    RL4,S0RBUF
		ADD     R14,R4		; R14 = CHECKSUM
		RET

; VALUE IN RL4
PUTCHAR:	JNB     S0TIC.7,$
		BCLR    S0TIC.7
		MOVBZ   R4,RL4
		MOV     S0TBUF,R4
		ADD     R14,R4		; R14 = CHECKSUM
		RET
ENDBOOT:

BOOT	ENDP

BOOTSTRAP	ENDS


		END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -