File: memcpy.6800.asm

package info (click to toggle)
crasm 1.11-2
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 520 kB
  • sloc: ansic: 4,562; asm: 3,371; makefile: 50
file content (36 lines) | stat: -rw-r--r-- 1,403 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
            page 66,264
            cpu 6800
          * = $1000

; memcpy --
; Copy a block of memory from one location to another.
; Called as a subroutine, note return to saved PC addr on exit
; Entry parameters
;      cnt - Number of bytes to copy
;      src - Address of source data block
;      dst - Address of target data block

cnt         dw      $0000       ; sets aside space for memory addr
src         dw      $0000       ; sets aside space for memory addr
dst         dw      $0000       ; sets aside space for memory addr

memcpy      ldab    cnt+1       ;Set B = cnt.L
            beq     check       ;If cnt.L=0, goto check
loop        ldx     src         ;Set IX = src
            ldaa    ,x          ;Load A from (src)
            inx                 ;Set src = src+1
            stx     src
            ldx     dst         ;Set IX = dst
            staa    ,x          ;Store A to (dst)
            inx                 ;Set dst = dst+1
            stx     dst
            decb                ;Decr B
            bne     loop        ;Repeat the loop
            stab    cnt+1       ;Set cnt.L = 0
check       tst     cnt+0       ;If cnt.H=0,
            beq     done        ;Then quit
            dec     cnt+0       ;Decr cnt.H
            ; loop back and do 256*(cnt.H+1) more copies (B=0) 
            bra     loop        ;Repeat the loop
done        rts                 ;Return