; File: MOVBLOCK.A51 Date: 04/12/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ ERRORPRINT PAGELENGTH (60) ; Assembler controls $ XREF DEBUG TITLE (High Speed 8051 Block Move Subroutine) $ REGISTERBANK (0) PAGEWIDTH (110) $ DATE (04/12/92) NOGEN ; ----------------------------------------------------------------------------- ; High speed 8051 Block move subroutine for external RAM ; Written by Tom Hiniker, Blue Earth Research, Mankato, MN 56001 ; ----------------------------------------------------------------------------- ; Source code is compatible with Franklin A51 Macro Assembler. ; <<< EXAMPLE SHOWING USE OF BLOCK MOVE ROUTINE WITH BASIC INTERPRETER >>> ; This example would move 259 (1*256+3) bytes starting at address 4423H ; to destination starting at 4A75H. ; 10 DBY(19H)=3 : DBY(1AH)=1 : DBY(1BH)=23H : DBY(1CH)=44H ; 20 DBY(1DH)=75H : DBY(1EH)=4AH ; CALL 7000H ; <<< ---------------------------------------------------------------- >>> ; Block parameters are stored in available directly addressable RAM. ; User may relocate if necessary. DSEG AT 19H ByteCountLo: DS 1 ; Reserve space for block ByteCountHi: DS 1 ; move parameters SourceLo: DS 1 SourceHi: DS 1 DestinationLo: DS 1 DestinationHi: DS 1 $ EJECT ; Code segment starts at address 7000H. User may relocate. CSEG AT 7000H MoveBlock: PUSH PSW ; Save registers to stack PUSH ACC MOV A,R0 PUSH ACC PUSH DPL PUSH DPH MOV R0,SourceLo ; Load Source pointer MOV P2,SourceHi MOV DPL,DestinationLo ; Load Destination pointer MOV DPH,DestinationHi INC ByteCountHi ; (For correct loop operation) Loop: MOVX A,@R0 ; Get Source byte MOVX @DPTR,A ; Move to Destination INC R0 ; Increment Source pointer CJNE R0,#0,IncDPTR INC P2 IncDPTR: INC DPTR ; Increment Destination pointer DJNZ ByteCountLo,Loop ; Loop until done DJNZ ByteCountHi,Loop Restore: POP DPH ; Restore registers POP DPL POP ACC MOV R0,A POP ACC POP PSW RET ; Return to CALLer END ; Following is the HEX file derived from the assembled source ; file. This can be used for directly loading the program via ; MONITOR-51 and almost any terminal program. :10700000C0D0C0E0E8C0E0C082C083A81B851CA03F :10701000851D82851E83051AE2F008B8000205A0CE :10702000A3D519F4D51AF1D083D082D0E0F8D0E0FE :03703000D0D0229B :00000001FF