📄 intelhex.a51
字号:
$NOMOD51
$include (REG1210.INC)
NAME INTEL_HEX
PUBLIC _read_and_write_intel_hex;
EXTRN CODE (_fpm, _tx_byte, rx_byte_echo, rx_hex_echo)
INTEL_HEX_ROUTINES SEGMENT CODE
RSEG INTEL_HEX_ROUTINES
CPUA EQU 80H
CPUS EQU 40H
FWR EQU 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Get, write & report result for a Intel Hex File
; R7 define which CPU: CPUA or CPUS
_read_and_write_intel_hex:
mov BPL,R7
rw_intelhex:
call intel_hex_transform
;R7.3/R7.1/R7.0= EOF/ CheckSum Err/ Write Err
;if R7= xx1b / x10b / 100b / 000b then print X / E / T / .
mov a,r7
mov r7,#'X'
jb acc.0,intel_wr_error
mov r7,#'E'
jb acc.1,intel_chksum_error
mov r7,#'T'
jb ACC.3,intel_eof ;end of file
mov R7, #'.' ; Successful
call _tx_byte
jnb acc.3, rw_intelhex
ret
intel_wr_error:
intel_chksum_error:
intel_eof:
call _tx_byte
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Get, write & report result for a Intel Hex Line
intel_hex_transform:
call rx_byte_echo ; wait for ':'
cjne r7,#':',intel_hex_transform
MOV R4, #0 ; reset checksum
call rx_hex_echo_cs ; get byte count
MOV R2, Reg7 ; store byte count in R2
call rx_hex_echo_cs ; get dest address-hi
MOV DPH, R7
call rx_hex_echo_cs ; get dest address-lo
MOV DPL, R7
call rx_hex_echo_cs ; get line type (data line/last line)
MOV B, #00H ; B has receive line status
cjne r7,#01, iht_data_loop
orl b,#08h ; last line
iht_data_loop:
call rx_hex_echo_cs ; get a data OR checksum byte
CJNE R2, #00h, iht_data_byte ; check_byte_count
SJMP iht_checksum ; R2==00h
iht_data_byte:
;MOV R5, AR7 ; PLACE DATA BYTE IN R5
;MOV R3, #0H ; FPM mode
;MOV R6, DPH ; Set write address
;MOV R7, DPL
PUSH DPH
PUSH DPL
PUSH REG4
PUSH REG2
PUSH REGB
MOV R3,REG7 ; pd
MOV R4,DPH ; a
MOV R5,DPL
MOV R7,#41H ;BPL ; cmd
iht_skip_translate:
lcall _fpm
; call _write_src
POP REGB
POP REG2
POP REG4
iht_write_result:
CJNE R7, #01H, iht_good_write
ORL b, #01H ; write error
iht_good_write:
POP DPL
POP DPH
INC DPTR
DJNZ R2, iht_data_loop
call rx_hex_echo_cs
iht_checksum:
MOV A, R4;
jz iht_chksum_pass
iht_chksum_error:
ORL B, #02
iht_chksum_pass:
MOV R7, B
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Get a byte from serial port with
; hex convert/echo/checksum cal
rx_hex_echo_cs:
call rx_hex_echo;
MOV A, R4;
ADD A, R7; ADD received byte to checksum
MOV R4, A;
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -