📄 bootrst6.a66
字号:
;$INCLUDE(MONITOR.INC)
;
;-----------------------------------------------------------------------------
; This file is part of the C166 Compiler package
; Copyright KEIL ELEKTRONIK GmbH 1993
;-----------------------------------------------------------------------------
; 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)
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
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
; Initialization for BUSCON1 or ADDRSEL1 when additional RAM or ROM is
; connected to CS1
; Example:
; 2 * 32 KByte RAM's are connected to CS#0 (00000H - 07FFFH)
; 2 * 32 KByte RAM's are connected to CS#1 (08000H - 0FFFFH)
; ---> BUSCON1 and ADDRSEL1 must be initialized
; MOV ADDRSEL1,#0082H
; MOV R0,SYSCON
; AND R0,#014FFH
; MOV BUSCON1,R0
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 + -