blob: cd3eb3d9a4237fac5ce07ab74bcde3b88c8e78bc (
plain)
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
**************************************************************************
* Parameter Declearation Section
*
* Export Symbols
xdef pgstart ; export 'pgstart' symbol
absentry pgstart ; for assembly entry point
* Symbols and Macros
PORTA equ $0000 ; i/o port A addresses
DDRA equ $0002 ; data direction register for PORTA
PORTB equ $0001 ; i/o port B addresses
DDRB equ $0003 ; data direction register for PORTB
**************************************************************************
* Data Section: address used [ $3000 to $30FF ] RAM Memory
*
org $3000 ; Reserved RAM memory starting address
; for Data for CMPEN 472 class
SOURCE ds.b $000C ; 12 Byte source array
LENSRC dc.w $000C ; Length of the Source Array
DEST ds.b $000C ; 12 Byte destination array
LENDST dc.w $000C ; Length of the destination array
StackSP dc.w $3100 ; Address of the stack
*
**************************************************************************
* Program Section: address used [ $3100 to $3FFF ] RAM Memory
*
org $3100 ; Program start address, in RAM
pgstart lds StackSP ; initialize the stack pointer
ldaa #1 ; Load 1 into A
ldx #SOURCE ; Load the address of SOURCE into X
ldy LENSRC ; Load the length of SOURCE into Y
fillLoop tbeq Y,doneLoop ; If Y==0, jump to done loop
staa 1,X+ ; Copy A into address of X, add 1 to X
inca ; Increment A by 1
dey ; Decrement Y by 1
bra fillLoop ; Jump to fillLoop
doneLoop jsr memcpy ; Call memcpy
bra done
memcpy pshy ; Save Y to the stack
pshx ; Save X to the stack
pshd ; Save D to the stack
ldy #SOURCE ; Load the address of the source array into Y
ldx #DEST ; Load the address of the destination array into X
ldd LENSRC ; Load the length of the source array into D
loop tbeq D,EXIT ; If d==0, jump to EXIT
movb Y,X ; Copy data from address in Y to address in X
inx ; Increment X by 1
iny ; Increment Y by 1
subd #1 ; Decrement D by 1
bra loop ; Branch always to loop
EXIT puld ; Restore D from the stack
pulx ; Restore X from the stack
puly ; Restore Y from the stack
rts ; Return to caller
done
|