dflt 16 org 1510 MEMPROG: bctr,un Mprog FROM ACON 0000 TO ACON 0C00 FLASH ACON 4000 Mprog lodr,r0 FROM stra,r0 PFROM lodr,r0 FROM+1 stra,r0 PFROM+1 lodr,r0 FLASH stra,r0 PTO lodr,r0 FLASH+1 stra,r0 PTO+1 NextBlock: ; Calculate the #bytes to program: TO-PFROM PPSL WC+CAR lodr,r0 TO+1 suba,r0 PFROM+1 strz,r2 lodr,r0 TO suba,r0 PFROM strz,r1 CPSL WC ; R1,R2 now contain the number of bytes to program lodz,r1 bcfr,z Maxblock comi,r2 0 bcta,eq RETU comi,r2 d'64' bcfr,gt GoProgram MaxBlock: lodi,r2 d'64' GoProgram: strr,r2 PLen bsta,un PROGRAM comi,r3 h'ff' bcfr,eq IncAddrs bsta,un ProgError bcta,un RETU IncAddrs: PPSL WC CPSL CAR lodr,r0 PLen adda,r0 PFrom+1 stra,r0 PFrom+1 eorz,r0 adda,r0 PFrom stra,r0 PFrom CPSL CAR lodr,r0 PLen adda,r0 PTo+1 stra,r0 PTo+1 eorz,r0 adda,r0 PTo stra,r0 PTo CPSL WC bcta,un NextBlock Plen DB 0 Msg DB "Error at block \00" MSgC DB 0 ProgError: lodi,r1 0 Ploop loda,r0 Msg,r1 bctr,z Paddr strr,r1 MsgC strz,r3 bsta,un WCHR lodr,r1 MsgC birr,r1 PLoop retc,un Paddr loda,r2 PFROM bsta,un HXOT loda,r2 PFROM+1 bsta,un HXOT bsta,un LFCR retc,un ; Subroutine PROGRAM: Copy a block of bytes into Flash ; In: ; R2: number of bytes to copy (max 64) ; FROM: address containing the data ; TO: address of the Flash memory ; Return: ; r3: contains FF on error, any other number on success ; PROGRAM: subi,r2 1 lodi,r1 h'ff' eorz,r0 strz,r3 Counter LOOP loda,r0 *PFROM,r1,+ stra,r0 *PTO,r1 lodz,r1 comz,r2 bcfr,eq LOOP ; All written. Now compare the last byte written wait loda,r0 *PFROM,r1 coma,r0 *PTO,r1 bctr,eq Done ; Not yet ready, increment the counter addi,r3 1 comi,r3 h'ff' bcfr,eq wait Done: retc,un PFROM dw 0 PTO dw 0 HXOT EQU 006a LFCR EQU 0024 RETU EQU 0083 WCHR EQU 0396