📄 bootphy7.a66
字号:
$MOD167 ; Define 80C167 mode
$INCLUDE (REG167.INC)
;
;-----------------------------------------------------------------------------
; This file is part of the C166 Compiler package
; Copyright KEIL ELEKTRONIK GmbH 1993
;-----------------------------------------------------------------------------
; BOOT167.A66: This code is executed after processor reset when the
; bootstrap mode is enabled and provides the initialization
; of the 80C167 processor and downloading of MONITOR167.
;
;-----------------------------------------------------------------------------
;
; Definitions for SYSCON and BUSCON0 Register:
; --------------------------------------------
$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
$IF (BTYP_ENABLE == 0)
BFLDL BUSCON0,#03FH,#BCON0L
BFLDH BUSCON0,#012H,#BCON0H
$ELSE
BFLDL BUSCON0,#0FFH,#BCON0L
BFLDH BUSCON0,#016H,#BCON0H
$ENDIF
BFLDH SYSCON,#0FFH,#SYS_H
$IF (WRCFG_ENABLE == 1)
BFLDL SYSCON,#084H,#SYS_L
$ELSE
BFLDL SYSCON,#004H,#SYS_L
$ENDIF
; Initialization for BUSCON1-4 or ADDRSEL1-4 when additional RAM is
; connected to CS1-4
; Example:
; 2 * 4 MBit * 8 RAM's are connected to CS#1 (000000H - 0FFFFFH)
; 2 * 4 MBit * 8 RAM's are connected to CS#2 (100000H - 1FFFFFH)
; ---> BUSCON1 and ADDRSEL1 must be initialized
MOV ADDRSEL1,#0008H ; 1MB RAM BANK1 (00:0000H - 0F:FFFFH)
MOV BUSCON1,BUSCON0
MOV ADDRSEL2,#1008H ; 1MB RAM BANK2 (10:0000H - 1F:FFFFH)
MOV BUSCON2,BUSCON0
JMPS SEG NEXT, NEXT
NEXT: LABEL FAR
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 RH1,RL4
CALL GETCHAR
MOV RL1,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: EXTS R5,#1
ADD R3,[R1+] ; no overflow possible
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
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
EXTS R5,#2
MOVB [R6],RL4
MOVB RL3,[R6]
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 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 + -